diff options
author | John Fultz <jfultz@wolfram.com> | 2016-08-02 04:08:43 -0500 |
---|---|---|
committer | John Fultz <jfultz@wolfram.com> | 2016-08-02 06:37:15 -0500 |
commit | dbcb13d3c87133117bc54023c162ad0a202efa1d (patch) | |
tree | 955715420b4584b73baa676c1b4b5fe4febb3c48 /quackleio | |
parent | a3aa3602d173939a2b616bb78a5a739eb9761d9b (diff) |
Fixes to allow bad endgames to be loaded from GCGs.
Not perfect, but it now does a decent job of not corrupting GCGs when
it loads one where players have messed up tile counts/drawing in the
end-game. It also tries to annotate these for the player and in any
GCG file that's round-tripped.
Also, a lot of C++11-izing of ranged iterators.
Diffstat (limited to 'quackleio')
-rw-r--r-- | quackleio/gcgio.cpp | 11 | ||||
-rw-r--r-- | quackleio/util.cpp | 7 |
2 files changed, 15 insertions, 3 deletions
diff --git a/quackleio/gcgio.cpp b/quackleio/gcgio.cpp index 483678b..b60d57c 100644 --- a/quackleio/gcgio.cpp +++ b/quackleio/gcgio.cpp @@ -143,6 +143,7 @@ Quackle::Game *GCGIO::read(QTextStream &stream, int flags) gameStarted = true; } + UVString currentPlayer = Util::qstringToString(strings.front().mid(1, strings.front().size() - 2)); strings.pop_front(); if (strings.isEmpty()) @@ -158,10 +159,11 @@ Quackle::Game *GCGIO::read(QTextStream &stream, int flags) if (rackString.startsWith("(") && rackString.endsWith(")")) { // end the game - if (ret->hasPositions()) + if (ret->hasPositions() && !ret->currentPosition().gameOver()) ret->commitCandidate(canMaintainCrosses); else ret->addPosition(); + ret->currentPosition().setTileBonus(currentPlayer, Util::encode(rackString.mid(1, rackString.size() - 2)), strings.front().toInt()); continue; } @@ -359,11 +361,14 @@ void GCGIO::write(const Quackle::Game &game, QTextStream &stream) outputScoreAddition = 0; } - stream << ">" << Util::uvStringToQString((*it).currentPlayer().abbreviatedName()) << ": " << Util::letterStringToQString((*it).currentPlayer().rack().alphaTiles()) << " " << Util::uvStringToQString(move.toString()) << " +" << outputScore << " " << outputScore + (*it).currentPlayer().score() << endl; + QString rackString = Util::letterStringToQString((*it).currentPlayer().rack().alphaTiles()); + if (move.action == Quackle::Move::UnusedTilesBonusError) + rackString = QString(); + stream << ">" << Util::uvStringToQString((*it).currentPlayer().abbreviatedName()) << ": " << rackString << " " << Util::uvStringToQString(move.toString()) << " +" << outputScore << " " << outputScore + (*it).currentPlayer().score() << endl; if (move.isChallengedPhoney()) { - stream << ">" << Util::uvStringToQString((*it).currentPlayer().abbreviatedName()) << ": " << Util::letterStringToQString((*it).currentPlayer().rack().alphaTiles()) << " -- -" << outputScore << " " << move.effectiveScore() + (*it).currentPlayer().score() << endl; + stream << ">" << Util::uvStringToQString((*it).currentPlayer().abbreviatedName()) << ": " << rackString << " -- -" << outputScore << " " << move.effectiveScore() + (*it).currentPlayer().score() << endl; } if (outputScoreAddition != 0) diff --git a/quackleio/util.cpp b/quackleio/util.cpp index 901c65e..774dcad 100644 --- a/quackleio/util.cpp +++ b/quackleio/util.cpp @@ -59,8 +59,11 @@ QString Util::moveToDetailedString(const Quackle::Move &move) ret = QObject::tr("Exch. %1").arg(move.tiles().length()); break; + case Quackle::Move::UnusedTilesBonusError: case Quackle::Move::UnusedTilesBonus: ret = QObject::tr("2*(%1)").arg(letterStringToQString(Util::alphagram(move.usedTiles()))); + if (move.action == Quackle::Move::UnusedTilesBonusError) + ret += " [Endgame Error]"; break; case Quackle::Move::TimePenalty: @@ -72,6 +75,7 @@ QString Util::moveToDetailedString(const Quackle::Move &move) break; case Quackle::Move::Place: + case Quackle::Move::PlaceError: ret = uvStringToQString(move.positionString()) + " "; ret += prettyTiles; @@ -81,6 +85,9 @@ QString Util::moveToDetailedString(const Quackle::Move &move) if (move.isChallengedPhoney()) ret = QObject::tr("%1 [Challenged Off]").arg(ret); + if (move.action == Quackle::Move::PlaceError) + ret += " [Endgame Misdraw]"; + break; } |