mirror of
git://git.savannah.nongnu.org/eliot.git
synced 2025-02-06 08:48:21 +01:00
- Fixed compilation in debug mode
- Centralized navigation in the game history in the Navigation class - The Qt interface now has (very) basic controls to navigate in the history.
This commit is contained in:
parent
9e330cf83b
commit
675b534e77
15 changed files with 374 additions and 120 deletions
|
@ -43,6 +43,7 @@ libgame_a_SOURCES= \
|
||||||
board_cross.cpp \
|
board_cross.cpp \
|
||||||
board_search.cpp \
|
board_search.cpp \
|
||||||
settings.cpp settings.h \
|
settings.cpp settings.h \
|
||||||
|
navigation.cpp navigation.h \
|
||||||
game.cpp game.h \
|
game.cpp game.h \
|
||||||
game_move_cmd.h game_move_cmd.cpp \
|
game_move_cmd.h game_move_cmd.cpp \
|
||||||
turn_cmd.cpp turn_cmd.h \
|
turn_cmd.cpp turn_cmd.h \
|
||||||
|
|
|
@ -28,6 +28,11 @@
|
||||||
|
|
||||||
#ifdef DEBUG
|
#ifdef DEBUG
|
||||||
# include <iostream>
|
# include <iostream>
|
||||||
|
# include <cstdlib>
|
||||||
|
|
||||||
|
using std::cerr;
|
||||||
|
using std::endl;
|
||||||
|
|
||||||
// Assertion macro: if the condition is not verified, print a message on stderr
|
// Assertion macro: if the condition is not verified, print a message on stderr
|
||||||
// and stops execution, otherwise do nothing.
|
// and stops execution, otherwise do nothing.
|
||||||
# define ASSERT(cond, msg) \
|
# define ASSERT(cond, msg) \
|
||||||
|
|
|
@ -33,7 +33,6 @@
|
||||||
#include "game_move_cmd.h"
|
#include "game_move_cmd.h"
|
||||||
#include "ai_player.h"
|
#include "ai_player.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "turn_cmd.h"
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
|
||||||
|
@ -111,7 +110,7 @@ int Duplicate::start()
|
||||||
for (unsigned int i = 0; i < getNPlayers(); i++)
|
for (unsigned int i = 0; i < getNPlayers(); i++)
|
||||||
{
|
{
|
||||||
Command *pCmd = new PlayerRackCmd(*m_players[i], newRack);
|
Command *pCmd = new PlayerRackCmd(*m_players[i], newRack);
|
||||||
m_turnCommands[m_currTurn]->addAndExecute(pCmd);
|
accessNavigation().addAndExecute(pCmd);
|
||||||
// Nobody has played yet in this round
|
// Nobody has played yet in this round
|
||||||
m_hasPlayed[i] = false;
|
m_hasPlayed[i] = false;
|
||||||
}
|
}
|
||||||
|
@ -161,7 +160,7 @@ void Duplicate::tryEndTurn()
|
||||||
void Duplicate::recordPlayerMove(const Move &iMove, Player &ioPlayer)
|
void Duplicate::recordPlayerMove(const Move &iMove, Player &ioPlayer)
|
||||||
{
|
{
|
||||||
Command *pCmd = new PlayerMoveCmd(ioPlayer, iMove);
|
Command *pCmd = new PlayerMoveCmd(ioPlayer, iMove);
|
||||||
m_turnCommands[m_currTurn]->addAndExecute(pCmd);
|
accessNavigation().addAndExecute(pCmd);
|
||||||
|
|
||||||
m_hasPlayed[ioPlayer.getId()] = true;
|
m_hasPlayed[ioPlayer.getId()] = true;
|
||||||
}
|
}
|
||||||
|
@ -216,7 +215,7 @@ void Duplicate::endTurn()
|
||||||
// Play the best word on the board
|
// Play the best word on the board
|
||||||
Command *pCmd = new GameMoveCmd(*this, bestMove,
|
Command *pCmd = new GameMoveCmd(*this, bestMove,
|
||||||
getPlayer(imax).getLastRack(), imax);
|
getPlayer(imax).getLastRack(), imax);
|
||||||
m_turnCommands[m_currTurn]->addAndExecute(pCmd);
|
accessNavigation().addAndExecute(pCmd);
|
||||||
|
|
||||||
// Leave the same reliquate to all players
|
// Leave the same reliquate to all players
|
||||||
// This is required by the start() method which will be called to
|
// This is required by the start() method which will be called to
|
||||||
|
@ -227,11 +226,11 @@ void Duplicate::endTurn()
|
||||||
if (i != imax)
|
if (i != imax)
|
||||||
{
|
{
|
||||||
Command *pCmd = new PlayerRackCmd(*m_players[i], pld);
|
Command *pCmd = new PlayerRackCmd(*m_players[i], pld);
|
||||||
m_turnCommands[m_currTurn]->addAndExecute(pCmd);
|
accessNavigation().addAndExecute(pCmd);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
newTurn();
|
accessNavigation().newTurn();
|
||||||
|
|
||||||
// Start next turn...
|
// Start next turn...
|
||||||
start();
|
start();
|
||||||
|
|
|
@ -39,7 +39,6 @@
|
||||||
#include "ai_player.h"
|
#include "ai_player.h"
|
||||||
#include "settings.h"
|
#include "settings.h"
|
||||||
#include "turn.h"
|
#include "turn.h"
|
||||||
#include "turn_cmd.h"
|
|
||||||
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
@ -110,7 +109,7 @@ void FreeGame::playAI(unsigned int p)
|
||||||
void FreeGame::recordPlayerMove(const Move &iMove, Player &ioPlayer)
|
void FreeGame::recordPlayerMove(const Move &iMove, Player &ioPlayer)
|
||||||
{
|
{
|
||||||
Command *pCmd = new PlayerMoveCmd(ioPlayer, iMove);
|
Command *pCmd = new PlayerMoveCmd(ioPlayer, iMove);
|
||||||
m_turnCommands[m_currTurn]->addAndExecute(pCmd);
|
accessNavigation().addAndExecute(pCmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -124,7 +123,7 @@ int FreeGame::start()
|
||||||
const PlayedRack &newRack =
|
const PlayedRack &newRack =
|
||||||
helperSetRackRandom(getPlayer(i).getCurrentRack(), false, RACK_NEW);
|
helperSetRackRandom(getPlayer(i).getCurrentRack(), false, RACK_NEW);
|
||||||
Command *pCmd = new PlayerRackCmd(*m_players[i], newRack);
|
Command *pCmd = new PlayerRackCmd(*m_players[i], newRack);
|
||||||
m_turnCommands[m_currTurn]->addAndExecute(pCmd);
|
accessNavigation().addAndExecute(pCmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
m_currPlayer = 0;
|
m_currPlayer = 0;
|
||||||
|
@ -146,7 +145,7 @@ int FreeGame::endTurn()
|
||||||
Command *pCmd = new GameMoveCmd(*this, move,
|
Command *pCmd = new GameMoveCmd(*this, move,
|
||||||
getCurrentPlayer().getLastRack(),
|
getCurrentPlayer().getLastRack(),
|
||||||
m_currPlayer);
|
m_currPlayer);
|
||||||
m_turnCommands[m_currTurn]->addAndExecute(pCmd);
|
accessNavigation().addAndExecute(pCmd);
|
||||||
|
|
||||||
// Complete the rack for the player that just played
|
// Complete the rack for the player that just played
|
||||||
if (move.getType() == Move::VALID_ROUND ||
|
if (move.getType() == Move::VALID_ROUND ||
|
||||||
|
@ -158,7 +157,7 @@ int FreeGame::endTurn()
|
||||||
helperSetRackRandom(getCurrentPlayer().getCurrentRack(), false, RACK_NEW);
|
helperSetRackRandom(getCurrentPlayer().getCurrentRack(), false, RACK_NEW);
|
||||||
Command *pCmd = new PlayerRackCmd(*m_players[m_currPlayer],
|
Command *pCmd = new PlayerRackCmd(*m_players[m_currPlayer],
|
||||||
newRack);
|
newRack);
|
||||||
m_turnCommands[m_currTurn]->addAndExecute(pCmd);
|
accessNavigation().addAndExecute(pCmd);
|
||||||
}
|
}
|
||||||
catch (EndGameException &e)
|
catch (EndGameException &e)
|
||||||
{
|
{
|
||||||
|
@ -171,7 +170,7 @@ int FreeGame::endTurn()
|
||||||
// Next player
|
// Next player
|
||||||
nextPlayer();
|
nextPlayer();
|
||||||
|
|
||||||
newTurn();
|
accessNavigation().newTurn();
|
||||||
|
|
||||||
// If this player is an AI, make it play now
|
// If this player is an AI, make it play now
|
||||||
if (!getCurrentPlayer().isHuman())
|
if (!getCurrentPlayer().isHuman())
|
||||||
|
|
|
@ -55,8 +55,6 @@ Game::Game(const Dictionary &iDic):
|
||||||
m_points = 0;
|
m_points = 0;
|
||||||
m_currPlayer = 0;
|
m_currPlayer = 0;
|
||||||
m_finished = false;
|
m_finished = false;
|
||||||
m_currTurn = -1;
|
|
||||||
newTurn();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -66,10 +64,6 @@ Game::~Game()
|
||||||
{
|
{
|
||||||
delete p;
|
delete p;
|
||||||
}
|
}
|
||||||
BOOST_FOREACH(Command *c, m_turnCommands)
|
|
||||||
{
|
|
||||||
delete c;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -85,6 +79,12 @@ int Game::back(unsigned int n)
|
||||||
if (m_history.getSize() < n)
|
if (m_history.getSize() < n)
|
||||||
throw GameException("Cannot go back that far");
|
throw GameException("Cannot go back that far");
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < n+1; ++i)
|
||||||
|
{
|
||||||
|
m_navigation.prevTurn();
|
||||||
|
}
|
||||||
|
m_navigation.clearFuture();
|
||||||
|
#if 0
|
||||||
for (unsigned int i = 0; i < n; i++)
|
for (unsigned int i = 0; i < n; i++)
|
||||||
{
|
{
|
||||||
prevPlayer();
|
prevPlayer();
|
||||||
|
@ -113,6 +113,7 @@ int Game::back(unsigned int n)
|
||||||
m_players[m_currPlayer]->removeLastTurn();
|
m_players[m_currPlayer]->removeLastTurn();
|
||||||
m_history.removeLastTurn();
|
m_history.removeLastTurn();
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -198,7 +199,6 @@ void Game::realBag(Bag &ioBag) const
|
||||||
PlayedRack Game::helperSetRackRandom(const PlayedRack &iPld,
|
PlayedRack Game::helperSetRackRandom(const PlayedRack &iPld,
|
||||||
bool iCheck, set_rack_mode mode) const
|
bool iCheck, set_rack_mode mode) const
|
||||||
{
|
{
|
||||||
ASSERT(p < getNPlayers(), "Wrong player number");
|
|
||||||
// FIXME: RACK_MANUAL shouldn't be in the enum
|
// FIXME: RACK_MANUAL shouldn't be in the enum
|
||||||
ASSERT(mode != RACK_MANUAL, "Invalid rack mode");
|
ASSERT(mode != RACK_MANUAL, "Invalid rack mode");
|
||||||
|
|
||||||
|
@ -618,51 +618,3 @@ int Game::checkPlayedWord(const wstring &iCoord,
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*********************************************************
|
|
||||||
*********************************************************/
|
|
||||||
|
|
||||||
void Game::prevTurn()
|
|
||||||
{
|
|
||||||
if (m_currTurn > 0)
|
|
||||||
{
|
|
||||||
--m_currTurn;
|
|
||||||
m_turnCommands[m_currTurn]->undo();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Game::nextTurn()
|
|
||||||
{
|
|
||||||
if (m_currTurn + 1 < m_turnCommands.size())
|
|
||||||
{
|
|
||||||
m_turnCommands[m_currTurn]->execute();
|
|
||||||
++m_currTurn;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Game::firstTurn()
|
|
||||||
{
|
|
||||||
while (m_currTurn > 0)
|
|
||||||
{
|
|
||||||
prevTurn();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Game::lastTurn()
|
|
||||||
{
|
|
||||||
while (m_currTurn + 1 < m_turnCommands.size())
|
|
||||||
{
|
|
||||||
nextTurn();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
void Game::newTurn()
|
|
||||||
{
|
|
||||||
lastTurn();
|
|
||||||
m_turnCommands.push_back(new TurnCmd);
|
|
||||||
++m_currTurn;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
16
game/game.h
16
game/game.h
|
@ -28,6 +28,7 @@
|
||||||
#include "bag.h"
|
#include "bag.h"
|
||||||
#include "board.h"
|
#include "board.h"
|
||||||
#include "history.h"
|
#include "history.h"
|
||||||
|
#include "navigation.h"
|
||||||
|
|
||||||
class Dictionary;
|
class Dictionary;
|
||||||
class Player;
|
class Player;
|
||||||
|
@ -35,7 +36,6 @@ class PlayedRack;
|
||||||
class Round;
|
class Round;
|
||||||
class Rack;
|
class Rack;
|
||||||
class Turn;
|
class Turn;
|
||||||
class TurnCmd;
|
|
||||||
|
|
||||||
using namespace std;
|
using namespace std;
|
||||||
|
|
||||||
|
@ -222,10 +222,8 @@ public:
|
||||||
|
|
||||||
void addPoints(int iPoints) { m_points += iPoints; }
|
void addPoints(int iPoints) { m_points += iPoints; }
|
||||||
|
|
||||||
void prevTurn();
|
const Navigation & getNavigation() const { return m_navigation; }
|
||||||
void nextTurn();
|
Navigation & accessNavigation() { return m_navigation; }
|
||||||
void firstTurn();
|
|
||||||
void lastTurn();
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/// Variant
|
/// Variant
|
||||||
|
@ -239,8 +237,9 @@ private:
|
||||||
*/
|
*/
|
||||||
History m_history;
|
History m_history;
|
||||||
|
|
||||||
int m_points;
|
Navigation m_navigation;
|
||||||
|
|
||||||
|
int m_points;
|
||||||
|
|
||||||
// TODO: check what should be private and what should be protected
|
// TODO: check what should be private and what should be protected
|
||||||
protected:
|
protected:
|
||||||
|
@ -255,17 +254,12 @@ protected:
|
||||||
/// Bag
|
/// Bag
|
||||||
Bag m_bag;
|
Bag m_bag;
|
||||||
|
|
||||||
vector<TurnCmd *> m_turnCommands;
|
|
||||||
unsigned int m_currTurn;
|
|
||||||
|
|
||||||
bool m_finished;
|
bool m_finished;
|
||||||
|
|
||||||
/*********************************************************
|
/*********************************************************
|
||||||
* Helper functions
|
* Helper functions
|
||||||
*********************************************************/
|
*********************************************************/
|
||||||
|
|
||||||
void newTurn();
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Complete the given rack randomly.
|
* Complete the given rack randomly.
|
||||||
*
|
*
|
||||||
|
|
118
game/navigation.cpp
Normal file
118
game/navigation.cpp
Normal file
|
@ -0,0 +1,118 @@
|
||||||
|
/*******************************************************************
|
||||||
|
* Eliot
|
||||||
|
* Copyright (C) 2008 Olivier Teulière
|
||||||
|
* Authors: Olivier Teulière <ipkiss @@ gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#include <boost/foreach.hpp>
|
||||||
|
|
||||||
|
#include "navigation.h"
|
||||||
|
#include "turn_cmd.h"
|
||||||
|
#include "debug.h"
|
||||||
|
|
||||||
|
|
||||||
|
Navigation::Navigation()
|
||||||
|
: m_currTurn(0)
|
||||||
|
{
|
||||||
|
newTurn();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Navigation::~Navigation()
|
||||||
|
{
|
||||||
|
BOOST_FOREACH(Command *c, m_turnCommands)
|
||||||
|
{
|
||||||
|
delete c;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Navigation::newTurn()
|
||||||
|
{
|
||||||
|
lastTurn();
|
||||||
|
m_turnCommands.push_back(new TurnCmd);
|
||||||
|
++m_currTurn;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Navigation::addAndExecute(Command *iCmd)
|
||||||
|
{
|
||||||
|
ASSERT(isLastTurn(), "Trying to add a command to an old turn!");
|
||||||
|
ASSERT(m_currTurn >= 1, "Bug in the turns vector");
|
||||||
|
ASSERT(m_currTurn - 1 < m_turnCommands.size(), "Bug in the turns vector");
|
||||||
|
m_turnCommands[m_currTurn - 1]->addAndExecute(iCmd);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Navigation::prevTurn()
|
||||||
|
{
|
||||||
|
if (m_currTurn > 0)
|
||||||
|
{
|
||||||
|
--m_currTurn;
|
||||||
|
m_turnCommands[m_currTurn]->undo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Navigation::nextTurn()
|
||||||
|
{
|
||||||
|
if (m_currTurn < m_turnCommands.size())
|
||||||
|
{
|
||||||
|
m_turnCommands[m_currTurn]->execute();
|
||||||
|
++m_currTurn;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Navigation::firstTurn()
|
||||||
|
{
|
||||||
|
while (m_currTurn > 0)
|
||||||
|
{
|
||||||
|
prevTurn();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Navigation::lastTurn()
|
||||||
|
{
|
||||||
|
while (m_currTurn < m_turnCommands.size())
|
||||||
|
{
|
||||||
|
nextTurn();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void Navigation::clearFuture()
|
||||||
|
{
|
||||||
|
// When there is no future, don't do anything
|
||||||
|
if (isLastTurn())
|
||||||
|
return;
|
||||||
|
|
||||||
|
for (unsigned int i = m_currTurn; i < m_turnCommands.size(); ++i)
|
||||||
|
{
|
||||||
|
delete m_turnCommands[i];
|
||||||
|
}
|
||||||
|
while (m_turnCommands.size() > m_currTurn)
|
||||||
|
{
|
||||||
|
m_turnCommands.pop_back();
|
||||||
|
}
|
||||||
|
newTurn();
|
||||||
|
// Sanity check
|
||||||
|
ASSERT(isLastTurn(),
|
||||||
|
"After removing the next turns, we should be at the last turn");
|
||||||
|
}
|
||||||
|
|
62
game/navigation.h
Normal file
62
game/navigation.h
Normal file
|
@ -0,0 +1,62 @@
|
||||||
|
/*******************************************************************
|
||||||
|
* Eliot
|
||||||
|
* Copyright (C) 2008 Olivier Teulière
|
||||||
|
* Authors: Olivier Teulière <ipkiss @@ gmail.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
#ifndef _NAVIGATION_H
|
||||||
|
#define _NAVIGATION_H
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
|
class TurnCmd;
|
||||||
|
class Command;
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
|
|
||||||
|
class Navigation
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Navigation();
|
||||||
|
~Navigation();
|
||||||
|
|
||||||
|
void newTurn();
|
||||||
|
void addAndExecute(Command *iCmd);
|
||||||
|
|
||||||
|
unsigned int getCurrTurn() const { return m_currTurn; }
|
||||||
|
bool isFirstTurn() const { return m_currTurn == 0; }
|
||||||
|
bool isLastTurn() const { return m_currTurn == m_turnCommands.size(); }
|
||||||
|
|
||||||
|
void firstTurn();
|
||||||
|
void prevTurn();
|
||||||
|
void nextTurn();
|
||||||
|
void lastTurn();
|
||||||
|
/**
|
||||||
|
* Get rid of the future turns of the game, the current turn
|
||||||
|
* becoming the last one.
|
||||||
|
*/
|
||||||
|
void clearFuture();
|
||||||
|
|
||||||
|
private:
|
||||||
|
vector<TurnCmd *> m_turnCommands;
|
||||||
|
unsigned int m_currTurn;
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
|
@ -40,7 +40,6 @@
|
||||||
#include "game_move_cmd.h"
|
#include "game_move_cmd.h"
|
||||||
#include "training.h"
|
#include "training.h"
|
||||||
#include "encoding.h"
|
#include "encoding.h"
|
||||||
#include "turn_cmd.h"
|
|
||||||
|
|
||||||
#include "debug.h"
|
#include "debug.h"
|
||||||
|
|
||||||
|
@ -60,7 +59,7 @@ void Training::setRackRandom(bool iCheck, set_rack_mode mode)
|
||||||
const PlayedRack &newRack =
|
const PlayedRack &newRack =
|
||||||
helperSetRackRandom(getCurrentPlayer().getCurrentRack(), iCheck, mode);
|
helperSetRackRandom(getCurrentPlayer().getCurrentRack(), iCheck, mode);
|
||||||
Command *pCmd = new PlayerRackCmd(*m_players[m_currPlayer], newRack);
|
Command *pCmd = new PlayerRackCmd(*m_players[m_currPlayer], newRack);
|
||||||
m_turnCommands[m_currTurn]->addAndExecute(pCmd);
|
accessNavigation().addAndExecute(pCmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -131,7 +130,7 @@ void Training::recordPlayerMove(const Move &iMove, Player &ioPlayer)
|
||||||
// (called in this class in endTurn()).
|
// (called in this class in endTurn()).
|
||||||
// See the big comment in game.cpp, line 96
|
// See the big comment in game.cpp, line 96
|
||||||
Command *pCmd = new PlayerMoveCmd(ioPlayer, iMove);
|
Command *pCmd = new PlayerMoveCmd(ioPlayer, iMove);
|
||||||
m_turnCommands[m_currTurn]->addAndExecute(pCmd);
|
accessNavigation().addAndExecute(pCmd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -154,8 +153,8 @@ void Training::endTurn()
|
||||||
Command *pCmd = new GameMoveCmd(*this, move,
|
Command *pCmd = new GameMoveCmd(*this, move,
|
||||||
getCurrentPlayer().getLastRack(),
|
getCurrentPlayer().getLastRack(),
|
||||||
m_currPlayer);
|
m_currPlayer);
|
||||||
m_turnCommands[m_currTurn]->addAndExecute(pCmd);
|
accessNavigation().addAndExecute(pCmd);
|
||||||
newTurn();
|
accessNavigation().newTurn();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,13 @@
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
|
|
||||||
|
|
||||||
|
TurnCmd::TurnCmd()
|
||||||
|
{
|
||||||
|
// Fake execution
|
||||||
|
execute();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
TurnCmd::~TurnCmd()
|
TurnCmd::~TurnCmd()
|
||||||
{
|
{
|
||||||
BOOST_FOREACH(Command *cmd, m_commands)
|
BOOST_FOREACH(Command *cmd, m_commands)
|
||||||
|
|
|
@ -35,6 +35,7 @@ using namespace std;
|
||||||
class TurnCmd: public Command
|
class TurnCmd: public Command
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
|
TurnCmd();
|
||||||
virtual ~TurnCmd();
|
virtual ~TurnCmd();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -43,6 +44,8 @@ class TurnCmd: public Command
|
||||||
*/
|
*/
|
||||||
void addAndExecute(Command *iCmd);
|
void addAndExecute(Command *iCmd);
|
||||||
|
|
||||||
|
bool isEmpty() const { return m_commands.empty(); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
virtual void doExecute();
|
virtual void doExecute();
|
||||||
virtual void doUndo();
|
virtual void doUndo();
|
||||||
|
|
|
@ -86,6 +86,9 @@ MainWindow::MainWindow(QWidget *iParent)
|
||||||
|
|
||||||
QObject::connect(this, SIGNAL(gameChanged(const Game*)),
|
QObject::connect(this, SIGNAL(gameChanged(const Game*)),
|
||||||
this, SLOT(updateForGame(const Game*)));
|
this, SLOT(updateForGame(const Game*)));
|
||||||
|
QObject::connect(this, SIGNAL(gameUpdated()),
|
||||||
|
this, SLOT(refresh()));
|
||||||
|
refresh();
|
||||||
|
|
||||||
// Status bar
|
// Status bar
|
||||||
statusBar()->addWidget(new QLabel, 1);
|
statusBar()->addWidget(new QLabel, 1);
|
||||||
|
@ -150,6 +153,15 @@ MainWindow::MainWindow(QWidget *iParent)
|
||||||
emit gameChangedNonConst(NULL);
|
emit gameChangedNonConst(NULL);
|
||||||
emit gameChanged(NULL);
|
emit gameChanged(NULL);
|
||||||
|
|
||||||
|
QObject::connect(m_ui.buttonFirst, SIGNAL(clicked()),
|
||||||
|
this, SLOT(onGameFirst()));
|
||||||
|
QObject::connect(m_ui.buttonPrev, SIGNAL(clicked()),
|
||||||
|
this, SLOT(onGamePrev()));
|
||||||
|
QObject::connect(m_ui.buttonNext, SIGNAL(clicked()),
|
||||||
|
this, SLOT(onGameNext()));
|
||||||
|
QObject::connect(m_ui.buttonLast, SIGNAL(clicked()),
|
||||||
|
this, SLOT(onGameLast()));
|
||||||
|
|
||||||
// Load dictionary
|
// Load dictionary
|
||||||
QSettings qs(ORGANIZATION, PACKAGE_NAME);
|
QSettings qs(ORGANIZATION, PACKAGE_NAME);
|
||||||
QString dicPath = qs.value(PrefsDialog::kINTF_DIC_PATH, "").toString();
|
QString dicPath = qs.value(PrefsDialog::kINTF_DIC_PATH, "").toString();
|
||||||
|
@ -197,6 +209,31 @@ void MainWindow::destroyCurrentGame()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MainWindow::refresh()
|
||||||
|
{
|
||||||
|
if (m_game == NULL)
|
||||||
|
{
|
||||||
|
m_ui.buttonFirst->setEnabled(false);
|
||||||
|
m_ui.buttonPrev->setEnabled(false);
|
||||||
|
m_ui.buttonNext->setEnabled(false);
|
||||||
|
m_ui.buttonLast->setEnabled(false);
|
||||||
|
// XXX: tmp
|
||||||
|
m_ui.labelTurnNb->setText("");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
bool isFirstTurn = m_game->getNavigation().isFirstTurn();
|
||||||
|
bool isLastTurn = m_game->getNavigation().isLastTurn();
|
||||||
|
m_ui.buttonFirst->setEnabled(!isFirstTurn);
|
||||||
|
m_ui.buttonPrev->setEnabled(!isFirstTurn);
|
||||||
|
m_ui.buttonNext->setEnabled(!isLastTurn);
|
||||||
|
m_ui.buttonLast->setEnabled(!isLastTurn);
|
||||||
|
// XXX: tmp
|
||||||
|
m_ui.labelTurnNb->setText(QString("Turn: %1").arg(m_game->getNavigation().getCurrTurn()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
void MainWindow::updateForGame(const Game *iGame)
|
void MainWindow::updateForGame(const Game *iGame)
|
||||||
{
|
{
|
||||||
if (iGame == NULL)
|
if (iGame == NULL)
|
||||||
|
@ -715,3 +752,43 @@ void MainWindow::onHelpAbout()
|
||||||
aboutBox->exec();
|
aboutBox->exec();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MainWindow::onGameFirst()
|
||||||
|
{
|
||||||
|
if (m_game == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_game->accessNavigation().firstTurn();
|
||||||
|
emit gameUpdated();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MainWindow::onGamePrev()
|
||||||
|
{
|
||||||
|
if (m_game == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_game->accessNavigation().prevTurn();
|
||||||
|
emit gameUpdated();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MainWindow::onGameNext()
|
||||||
|
{
|
||||||
|
if (m_game == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_game->accessNavigation().nextTurn();
|
||||||
|
emit gameUpdated();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
void MainWindow::onGameLast()
|
||||||
|
{
|
||||||
|
if (m_game == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
m_game->accessNavigation().lastTurn();
|
||||||
|
emit gameUpdated();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
|
@ -73,6 +73,14 @@ private slots:
|
||||||
void onWindowsDicTools();
|
void onWindowsDicTools();
|
||||||
void onHelpAbout();
|
void onHelpAbout();
|
||||||
|
|
||||||
|
void onGameFirst();
|
||||||
|
void onGamePrev();
|
||||||
|
void onGameNext();
|
||||||
|
void onGameLast();
|
||||||
|
|
||||||
|
/** Perform some updates when the game is updated */
|
||||||
|
void refresh();
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Perform several updates when the game changes (title bar, status bar,
|
* Perform several updates when the game changes (title bar, status bar,
|
||||||
* grey out some menu items, ...)
|
* grey out some menu items, ...)
|
||||||
|
|
|
@ -17,15 +17,59 @@
|
||||||
<normaloff>:/images/eliot.xpm</normaloff>:/images/eliot.xpm</iconset>
|
<normaloff>:/images/eliot.xpm</normaloff>:/images/eliot.xpm</iconset>
|
||||||
</property>
|
</property>
|
||||||
<widget class="QWidget" name="centralwidget" >
|
<widget class="QWidget" name="centralwidget" >
|
||||||
<property name="geometry" >
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>26</y>
|
|
||||||
<width>747</width>
|
|
||||||
<height>568</height>
|
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
<layout class="QVBoxLayout" >
|
<layout class="QVBoxLayout" >
|
||||||
|
<item>
|
||||||
|
<layout class="QHBoxLayout" name="horizontalLayout" >
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="buttonFirst" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>First</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="buttonPrev" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Prev</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="buttonNext" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Next</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QPushButton" name="buttonLast" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Last</string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<widget class="QLabel" name="labelTurnNb" >
|
||||||
|
<property name="text" >
|
||||||
|
<string>Turn: </string>
|
||||||
|
</property>
|
||||||
|
</widget>
|
||||||
|
</item>
|
||||||
|
<item>
|
||||||
|
<spacer name="horizontalSpacer" >
|
||||||
|
<property name="orientation" >
|
||||||
|
<enum>Qt::Horizontal</enum>
|
||||||
|
</property>
|
||||||
|
<property name="sizeHint" stdset="0" >
|
||||||
|
<size>
|
||||||
|
<width>40</width>
|
||||||
|
<height>20</height>
|
||||||
|
</size>
|
||||||
|
</property>
|
||||||
|
</spacer>
|
||||||
|
</item>
|
||||||
|
</layout>
|
||||||
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<layout class="QHBoxLayout" >
|
<layout class="QHBoxLayout" >
|
||||||
<item>
|
<item>
|
||||||
|
@ -72,20 +116,11 @@
|
||||||
<x>0</x>
|
<x>0</x>
|
||||||
<y>0</y>
|
<y>0</y>
|
||||||
<width>747</width>
|
<width>747</width>
|
||||||
<height>26</height>
|
<height>25</height>
|
||||||
</rect>
|
|
||||||
</property>
|
|
||||||
</widget>
|
|
||||||
<widget class="QStatusBar" name="statusbar" >
|
|
||||||
<property name="geometry" >
|
|
||||||
<rect>
|
|
||||||
<x>0</x>
|
|
||||||
<y>594</y>
|
|
||||||
<width>747</width>
|
|
||||||
<height>23</height>
|
|
||||||
</rect>
|
</rect>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
|
<widget class="QStatusBar" name="statusbar" />
|
||||||
<action name="action_WindowsBag" >
|
<action name="action_WindowsBag" >
|
||||||
<property name="checkable" >
|
<property name="checkable" >
|
||||||
<bool>true</bool>
|
<bool>true</bool>
|
||||||
|
@ -146,4 +181,5 @@
|
||||||
<resources>
|
<resources>
|
||||||
<include location="../eliot.qrc" />
|
<include location="../eliot.qrc" />
|
||||||
</resources>
|
</resources>
|
||||||
|
<connections/>
|
||||||
</ui>
|
</ui>
|
||||||
|
|
|
@ -576,16 +576,16 @@ void loop_training(Training &iGame)
|
||||||
switch (token[0])
|
switch (token[0])
|
||||||
{
|
{
|
||||||
case L'p':
|
case L'p':
|
||||||
iGame.prevTurn();
|
iGame.accessNavigation().prevTurn();
|
||||||
break;
|
break;
|
||||||
case L'n':
|
case L'n':
|
||||||
iGame.nextTurn();
|
iGame.accessNavigation().nextTurn();
|
||||||
break;
|
break;
|
||||||
case L'f':
|
case L'f':
|
||||||
iGame.firstTurn();
|
iGame.accessNavigation().firstTurn();
|
||||||
break;
|
break;
|
||||||
case L'l':
|
case L'l':
|
||||||
iGame.lastTurn();
|
iGame.accessNavigation().lastTurn();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -705,16 +705,16 @@ void loop_freegame(FreeGame &iGame)
|
||||||
switch (token[0])
|
switch (token[0])
|
||||||
{
|
{
|
||||||
case L'p':
|
case L'p':
|
||||||
iGame.prevTurn();
|
iGame.accessNavigation().prevTurn();
|
||||||
break;
|
break;
|
||||||
case L'n':
|
case L'n':
|
||||||
iGame.nextTurn();
|
iGame.accessNavigation().nextTurn();
|
||||||
break;
|
break;
|
||||||
case L'f':
|
case L'f':
|
||||||
iGame.firstTurn();
|
iGame.accessNavigation().firstTurn();
|
||||||
break;
|
break;
|
||||||
case L'l':
|
case L'l':
|
||||||
iGame.lastTurn();
|
iGame.accessNavigation().lastTurn();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -842,16 +842,16 @@ void loop_duplicate(Duplicate &iGame)
|
||||||
switch (token[0])
|
switch (token[0])
|
||||||
{
|
{
|
||||||
case L'p':
|
case L'p':
|
||||||
iGame.prevTurn();
|
iGame.accessNavigation().prevTurn();
|
||||||
break;
|
break;
|
||||||
case L'n':
|
case L'n':
|
||||||
iGame.nextTurn();
|
iGame.accessNavigation().nextTurn();
|
||||||
break;
|
break;
|
||||||
case L'f':
|
case L'f':
|
||||||
iGame.firstTurn();
|
iGame.accessNavigation().firstTurn();
|
||||||
break;
|
break;
|
||||||
case L'l':
|
case L'l':
|
||||||
iGame.lastTurn();
|
iGame.accessNavigation().lastTurn();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1120,9 +1120,3 @@ int main(int argc, char *argv[])
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Local Variables:
|
|
||||||
/// mode: c++
|
|
||||||
/// mode: hs-minor
|
|
||||||
/// c-basic-offset: 4
|
|
||||||
/// indent-tabs-mode: nil
|
|
||||||
/// End:
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue