2 Copyright (c) 2006 Paolo Capriotti <p.capriotti@sns.it>
3 (c) 2006 Maurizio Monge <maurizio.monge@kdemail.net>
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 2 of the License, or
8 (at your option) any later version.
11 #include "gameentity.h"
15 #include "pgnparser.h"
16 #include "variants/xchess/piecetype.h"
18 using namespace boost
;
20 GameEntity::GameEntity(VariantInfo
* variant
, const boost::shared_ptr
<Game
>& game
,
21 Board
* chessboard
, AgentGroup
* group
)
22 : UserEntity(game
, QUEEN
)
24 , m_chessboard(chessboard
)
25 , m_dispatcher(group
, this) {
26 m_turn_test
= shared_ptr
<TurnTest
>(new NoTurnTest
);
29 QString
GameEntity::save() const {
33 void GameEntity::loadPGN(const PGN
& pgn
) {
37 AbstractPosition::Ptr
GameEntity::doMove(AbstractMove::Ptr move
) const {
38 AbstractPosition::Ptr newPosition
= position()->clone();
39 newPosition
->move(move
);
43 void GameEntity::executeMove(AbstractMove::Ptr move
) {
44 AbstractPosition::Ptr ref
= position();
45 AbstractPosition::Ptr pos
= doMove(move
);
46 m_game
->add(move
, pos
);
47 m_dispatcher
.move(move
, ref
);
50 void GameEntity::addPremove(const NormalUserMove
& m
) {
51 m_premoveQueue
= shared_ptr
<Premove
>(new Premove(m_variant
->createNormalMove(m
)));
54 void GameEntity::addPremove(const DropUserMove
& m
) {
55 m_premoveQueue
= shared_ptr
<Premove
>(new Premove(m_variant
->createDropMove(m
)));
58 void GameEntity::cancelPremove() {
59 m_premoveQueue
.reset();
60 m_chessboard
->cancelPremove();
63 void GameEntity::notifyMove(AbstractMove::Ptr
, AbstractPosition::Ptr
) {
64 // the other player moved: execute premove
66 AbstractMove::Ptr move
= m_premoveQueue
->execute(m_game
->position());
73 void GameEntity::notifyBack() { }
74 void GameEntity::notifyForward() { }
75 void GameEntity::notifyGotoFirst() { }
76 void GameEntity::notifyGotoLast() { }
78 AbstractMove::Ptr
GameEntity::testMove(const NormalUserMove
& move
) const {
79 AbstractMove::Ptr m
= m_variant
->createNormalMove(move
);
80 if (m
&& position()->testMove(m
))
83 return AbstractMove::Ptr();
86 AbstractMove::Ptr
GameEntity::testMove(const DropUserMove
& move
) const {
87 AbstractMove::Ptr m
= m_variant
->createDropMove(move
);
88 if (m
&& position()->testMove(m
))
91 return AbstractMove::Ptr ();
94 AbstractPiece::Ptr
GameEntity::moveHint(AbstractMove::Ptr move
) const {
95 return position()->moveHint(move
);
98 bool GameEntity::testPremove(const NormalUserMove
&) const {
102 bool GameEntity::testPremove(const DropUserMove
&) const {
106 InteractionType
GameEntity::validTurn(int pool
) const {
107 return position()->droppable(pool
);
110 InteractionType
GameEntity::validTurn(const Point
& point
) const {
111 return position()->movable(point
);
114 bool GameEntity::movable(const Point
& point
) const {
115 if (!m_enabled
) return false;
116 InteractionType action
= validTurn(point
);
117 return m_premove
? action
!= NoAction
: action
== Moving
;
120 bool GameEntity::oneClickMoves() const {
121 return m_variant
->simpleMoves();
124 bool GameEntity::gotoFirst() {
129 bool GameEntity::gotoLast() {
134 bool GameEntity::goTo(const Index
& index
) {
139 bool GameEntity::forward() {
140 return m_game
->forward();
143 bool GameEntity::back() {
144 return m_game
->back();
147 bool GameEntity::undo() {
153 bool GameEntity::redo() {
159 bool GameEntity::truncate() {
164 bool GameEntity::promoteVariation() {
166 m_game
->promoteVariation();
170 bool GameEntity::canDetach() const {