summaryrefslogtreecommitdiff
path: root/history.c
diff options
context:
space:
mode:
authorThomas Günther <tom@toms-cafe.de>2005-05-15 00:18:18 +0200
committerThomas Günther <tom@toms-cafe.de>2005-05-15 00:18:18 +0200
commit1b80a09e835a6cd68d4160f9799a7268e54a5b53 (patch)
treefa5f92848ed602216ed76ed84980921c9af95a07 /history.c
downloadvdr-plugin-spider-1b80a09e835a6cd68d4160f9799a7268e54a5b53.tar.gz
vdr-plugin-spider-1b80a09e835a6cd68d4160f9799a7268e54a5b53.tar.bz2
Initial versionv0.1.0
Diffstat (limited to 'history.c')
-rw-r--r--history.c149
1 files changed, 149 insertions, 0 deletions
diff --git a/history.c b/history.c
new file mode 100644
index 0000000..88de34e
--- /dev/null
+++ b/history.c
@@ -0,0 +1,149 @@
+/*
+ * Spider-Arachnid: A plugin for the Video Disk Recorder
+ *
+ * See the README file for copyright information and how to reach the author.
+ *
+ * $Id$
+ */
+
+#include "history.h"
+#include "deck.h"
+#include "heap.h"
+
+
+/** --- class History ------------------------------------------------------ **/
+
+/** Constructor */
+History::History()
+{
+ executed = 0;
+}
+
+/** Destructor */
+History::~History()
+{
+ for (unsigned int pos = history.size(); pos > 0; --pos)
+ {
+ // Remove object created outside of History
+ delete history.back();
+ history.pop_back();
+ }
+}
+
+/** Current move in the history */
+Move* History::current()
+{
+ return history[executed - 1];
+}
+
+/** Add a new move */
+void History::add(Move* move)
+{
+ for (unsigned int pos = history.size(); pos > executed; --pos)
+ {
+ // Remove object created outside of History
+ delete history.back();
+ history.pop_back();
+ }
+ history.push_back(move);
+ ++executed;
+}
+
+/** Set previous move as current */
+void History::backward()
+{
+ if (movesExecuted())
+ --executed;
+}
+
+/** Set next move as current */
+void History::forward()
+{
+ if (movesToExecute())
+ ++executed;
+}
+
+/** Are there executed moves in the history */
+bool History::movesExecuted()
+{
+ return executed > 0;
+}
+
+/** Are there moves to execute in the history */
+bool History::movesToExecute()
+{
+ return executed < history.size();
+}
+
+
+/** --- class DealMove ----------------------------------------------------- **/
+
+/** Constructor */
+DealMove::DealMove(Pack* s, Piles& d) :
+ source(s), destination(d)
+{
+}
+
+/** Do the move */
+void DealMove::execute()
+{
+ source->deal(destination);
+}
+
+/** Redo the move */
+void DealMove::takeBack()
+{
+ source->takeBackDeal(destination);
+}
+
+
+/** --- class NormalMove --------------------------------------------------- **/
+
+/** Constructor */
+NormalMove::NormalMove(Pile* s, Pile* d, int c, bool t) :
+ source(s), destination(d), count(c), turn(t)
+{
+}
+
+/** Do the move */
+void NormalMove::execute()
+{
+ source->moveTo(destination, count);
+ if (turn)
+ source->turn();
+}
+
+/** Redo the move */
+void NormalMove::takeBack()
+{
+ if (turn)
+ source->turn();
+ destination->moveTo(source, count);
+}
+
+
+/** --- class FinalMove ---------------------------------------------------- **/
+
+/** Constructor */
+FinalMove::FinalMove(Pile* s, FinalHeap* d, int c, bool t, bool b) :
+ source(s), destination(d), count(c), turn(t), bonus(b)
+{
+}
+
+/** Do the move */
+void FinalMove::execute()
+{
+ source->moveTo(destination, count);
+ if (turn)
+ source->turn();
+ destination->setBonus(bonus);
+}
+
+/** Redo the move */
+void FinalMove::takeBack()
+{
+ destination->setBonus(false);
+ if (turn)
+ source->turn();
+ destination->moveTo(source, count);
+}