RetroShare/plugins/patience_plugin/Patience/Punktezaehler.cpp
defnax 0b78ed6ff8 added patience plugin
git-svn-id: http://svn.code.sf.net/p/retroshare/code/trunk@2245 b45a01b8-16f6-495d-af2f-9b41ad6348cc
2010-02-08 22:33:14 +00:00

285 lines
7.0 KiB
C++

#include "Punktezaehler.h"
#include "Scene.h"
#include "Basisstapel.h"
#include "Proportionen.h"
#include <QTimer>
#include <QDebug>
using namespace std;
Punktezaehler::Punktezaehler(Scene *parent) : QObject(parent), punkte(0), scene(parent), nur_eine_ziehen(true)
{
// straftimer erstellen und seinen intervall auf 10 sekunden einstellen
straftimer = new QTimer(this);
straftimer->setInterval(10000);
// signal - slot verbindungen
// reaktionen auf straftimer ermoeglichen
connect(straftimer, SIGNAL(timeout()), this, SLOT(reaktion_auf_timeout()));
}
Punktezaehler::~Punktezaehler()
{
}
void Punktezaehler::neuer_zug(const Zug& zug)
{
// auf ungueltigen zug pruefen
if (zug.ist_gueltig() == false)
{
qDebug() << tr("Invalid move in Punktzaehler::neuer_zug()");
exit(1);
}
// nur, wenn ein spiel laeuft
if (scene->laufendes_spiel() == true)
{
// wenn straftimer noch nicht laueft
if (straftimer->isActive() == false && scene->laufendes_spiel() == true)
{
straftimer->start();
emit erster_zug();
}
punkte += kalkuliere_punkte(zug);
if (straftimer->isActive() == true && bringt_zeitaufschub(zug) == true)
{
straftimer->stop();
straftimer->start();
}
emit neue_punktzahl(punkte);
}
}
void Punktezaehler::neues_spiel()
{
straftimer->stop();
punkte = 0;
emit neue_punktzahl(punkte);
nach_oben_liste.clear();
}
void Punktezaehler::spiel_zuende()
{
straftimer->stop();
}
void Punktezaehler::reaktion_auf_timeout()
{
if (punkte > 0)
{
if (nur_eine_ziehen == true) punkte -= PUNKTEZAEHLER_EINE_ZIEHEN_PUNKTEABZUG_ZEIT;
else punkte -= PUNKTEZAEHLER_DREI_ZIEHEN_PUNKTEABZUG_ZEIT;
if (punkte < 0) punkte = 0;
emit neue_punktzahl(punkte);
}
}
void Punktezaehler::stapel_durch()
{
if (punkte > 0)
{
if (nur_eine_ziehen == true) punkte -= PUNKTEZAEHLER_EINE_ZIEHEN_AUSTEILSTAPEL_DURCH;
else punkte -= PUNKTEZAEHLER_DREI_ZIEHEN_AUSTEILSTAPEL_DURCH;
if (punkte < 0) punkte = 0;
emit neue_punktzahl(punkte);
}
}
int Punktezaehler::punktstand() const
{
return punkte;
}
void Punktezaehler::eine_ziehen()
{
nur_eine_ziehen = true;
}
void Punktezaehler::drei_ziehen()
{
nur_eine_ziehen = false;
}
void Punktezaehler::undo_meldung(const Zug& zug)
{
// die punke des rueckgaengi gemachten zuges wieder abziehen
nach_oben_liste.removeAll(zug.karte_name());
punkte -= kalkuliere_punkte(zug);
emit neue_punktzahl(punkte);
}
int Punktezaehler::kalkuliere_punkte(const Zug& zug) const
{
int erg = 0;
// wenn es sich um eine bewegung handelt
if (zug.ist_bewegung() == true)
{
// vom austeilstapel zu einem ablagestapel bringt 5 punkte
if (zug.herkunft_name() == BASISSTAPEL_AUSTEILCOSTAPEL && zug.ziel_name().contains(BASISSTAPEL_ABLAGESTAPEL) == true)
{
if (nur_eine_ziehen == true) erg += PUNKTEZAEHLER_EINE_ZIEHEN_AUSTEILSTAPEL_ZU_ABLAGESTAPEL;
else erg += PUNKTEZAEHLER_DREI_ZIEHEN_AUSTEILSTAPEL_ZU_ABLAGESTAPEL;
}
// vom austeilcostapel zum zielstapel bringt 15 punkte
else if (zug.herkunft_name() == BASISSTAPEL_AUSTEILCOSTAPEL && zug.ziel_name().contains(BASISSTAPEL_ZIELSTAPEL) == true && nach_oben_liste.contains(zug.karte_name()) == false)
{
// man soll fuer das hochlegen einer karte nicht mehrfach punkte kassieren koennen
if (nur_eine_ziehen == true) erg += PUNKTEZAEHLER_EINE_ZIEHEN_AUSTEILSTAPEL_ZU_ZIELSTAPEL;
else erg += PUNKTEZAEHLER_DREI_ZIEHEN_AUSTEILSTAPEL_ZU_ZIELSTAPEL;
}
// von unten zum zielstapel bringt 10 punkte
else if (zug.herkunft_name().contains(BASISSTAPEL_ABLAGESTAPEL) == true && zug.ziel_name().contains(BASISSTAPEL_ZIELSTAPEL) == true && nach_oben_liste.contains(zug.karte_name()) == false)
{
if (nur_eine_ziehen == true) erg += PUNKTEZAEHLER_EINE_ZIEHEN_ABLAGESTAPEL_ZU_ZIELSTAPEL;
else erg += PUNKTEZAEHLER_DREI_ZIEHEN_ABLAGESTAPEL_ZU_ZIELSTAPEL;
}
}
// wenn es sich bei zug um eine aufdeckung handelt
else if (zug.ist_aufdeckgung() == true)
{
// wenn eine karte vom ablagestapel aufgedeckt wurde gibt's dafuer 5 punkte
if (zug.herkunft_name().contains(BASISSTAPEL_ABLAGESTAPEL) == true)
{
if (nur_eine_ziehen == true) erg += PUNKTEZAEHLER_EINE_ZIEHEN_KARTE_AUF_ABLAGESTAPEL_AUFGEDECKT;
else erg += PUNKTEZAEHLER_DREI_ZIEHEN_KARTE_AUF_ABLAGESTAPEL_AUFGEDECKT;
}
}
// wenn es sich weder um eine bewegung noch um eine aufdeckung handelt ist zug ungueltig
else
{
qDebug() << tr("Invalid move in Punktzaehler::kalkuliere_punkte(const Zug& zug)");
exit(1);
}
return erg;
}
bool Punktezaehler::bringt_zeitaufschub(const Zug& zug) const
{
bool erg = false;
// wenn es sich um eine bewegung handelt
if (zug.ist_bewegung() == true)
{
// vom austeilstapel zu einem ablagestapel bringt zeitaufschub
if (zug.herkunft_name() == BASISSTAPEL_AUSTEILCOSTAPEL && zug.ziel_name().contains(BASISSTAPEL_ABLAGESTAPEL) == true) erg = true;
// vom austeilcostapel zum zielstapel bringt zeitaufschub
else if (zug.herkunft_name() == BASISSTAPEL_AUSTEILCOSTAPEL && zug.ziel_name().contains(BASISSTAPEL_ZIELSTAPEL) == true && nach_oben_liste.contains(zug.karte_name()) == false) erg = true;
// karte unten umstapeln bringt zeitaufschub
else if (zug.herkunft_name().contains(BASISSTAPEL_ABLAGESTAPEL) == true && zug.ziel_name().contains(BASISSTAPEL_ABLAGESTAPEL) == true) erg = true;
// von unten zum zielstapel bringt zeitaufschub
else if (zug.herkunft_name().contains(BASISSTAPEL_ABLAGESTAPEL) == true && zug.ziel_name().contains(BASISSTAPEL_ZIELSTAPEL) == true && nach_oben_liste.contains(zug.karte_name()) == false) erg = true;
// karten vom zielstapel nach unten bringt nur zeitaufschub
else if (zug.herkunft_name().contains(BASISSTAPEL_ZIELSTAPEL) == true && zug.ziel_name().contains(BASISSTAPEL_ABLAGESTAPEL) == true) erg = true;
}
// wenn es sich bei zug um eine aufdeckung handelt
else if (zug.ist_aufdeckgung() == true)
{
// wenn eine karte vom ablagestapel aufgedeckt wurde gibt's dafuer 5 punkte
if (zug.herkunft_name().contains(BASISSTAPEL_ABLAGESTAPEL) == true) erg = true;
}
else
{
qDebug() << tr("Invalid move in Punktzaehler::bringt_zeitaufschub(const Zug& zug)");
exit(1);
}
return erg;
}
const QStringList Punktezaehler::speichere() const
{
QStringList erg;
// die id speichern
erg.append(objectName());
// straftimer zustand speichern
erg.append(QString::number(straftimer->isActive()));
// die nach_oben_liste speichern
QString nach_oben_string;
for (register int idx = 0; idx < nach_oben_liste.size(); idx++)
{
if (idx > 0) nach_oben_string.append(PUNKTEZAEHLER_STRING_SPLITTER);
nach_oben_string.append(nach_oben_liste.at(idx));
}
erg.append(nach_oben_string);
// die punkte speichern
erg.append(QString::number(punkte));
return erg;
}
bool Punktezaehler::lade(const QStringList& daten)
{
bool erg = false;
if (daten.size() == PUNKTEZAEHLER_ANZAHL_SPEICHERELEMENTE && daten.first() == objectName())
{
erg = true;
// noetigenfalls den straftimer starten
if (daten.at(PUNKTEZAEHLER_STRAFTIMER_ON_IDX).toInt() == 1) straftimer->start();
// die nach_oben_liste laden
nach_oben_liste = daten.at(PUNKTEZAEHLER_NACH_OBEN_LISTE_IDX).split(PUNKTEZAEHLER_STRING_SPLITTER, QString::SkipEmptyParts);
// die punkte laden
punkte = daten.at(PUNKTEZAEHLER_PUNKTE_IDX).toInt();
emit neue_punktzahl(punkte);
}
return erg;
}
bool Punktezaehler::begonnenes_spiel() const
{
return straftimer->isActive();
}