merged from master

This commit is contained in:
Max-Wilhelm Bruker 2012-03-31 18:41:01 +02:00
commit 767d53b5a8
5 changed files with 2182 additions and 2373 deletions

View file

@ -65,8 +65,8 @@
<!-- <file>translations/cockatrice_cs.qm</file> <!-- <file>translations/cockatrice_cs.qm</file>
<file>translations/cockatrice_pl.qm</file> <file>translations/cockatrice_pl.qm</file>
<file>translations/cockatrice_sk.qm</file> <file>translations/cockatrice_sk.qm</file>
--> --> <file>translations/cockatrice_sv.qm</file>
<file>translations/cockatrice_sv.qm</file>
<file>resources/countries/ar.svg</file> <file>resources/countries/ar.svg</file>
<file>resources/countries/at.svg</file> <file>resources/countries/at.svg</file>
<file>resources/countries/au.svg</file> <file>resources/countries/au.svg</file>

File diff suppressed because it is too large Load diff

View file

@ -413,7 +413,7 @@ void Server_Game::removePlayer(Server_Player *player)
players.remove(player->getPlayerId()); players.remove(player->getPlayerId());
GameEventStorage ges; GameEventStorage ges;
removeArrowsToPlayer(ges, player); removeArrowsRelatedToPlayer(ges, player);
unattachCards(ges, player); unattachCards(ges, player);
ges.enqueueGameEvent(Event_Leave(), player->getPlayerId()); ges.enqueueGameEvent(Event_Leave(), player->getPlayerId());
ges.sendToGame(this); ges.sendToGame(this);
@ -451,11 +451,13 @@ void Server_Game::removePlayer(Server_Player *player)
emit gameInfoChanged(gameInfo); emit gameInfoChanged(gameInfo);
} }
void Server_Game::removeArrowsToPlayer(GameEventStorage &ges, Server_Player *player) void Server_Game::removeArrowsRelatedToPlayer(GameEventStorage &ges, Server_Player *player)
{ {
QMutexLocker locker(&gameMutex); QMutexLocker locker(&gameMutex);
// Remove all arrows of other players pointing to the player being removed or to one of his cards. // Remove all arrows of other players pointing to the player being removed or to one of his cards.
// Also remove all arrows starting at one of his cards. This is necessary since players can create
// arrows that start at another person's cards.
QMapIterator<int, Server_Player *> playerIterator(players); QMapIterator<int, Server_Player *> playerIterator(players);
while (playerIterator.hasNext()) { while (playerIterator.hasNext()) {
Server_Player *p = playerIterator.next().value(); Server_Player *p = playerIterator.next().value();
@ -467,7 +469,11 @@ void Server_Game::removeArrowsToPlayer(GameEventStorage &ges, Server_Player *pla
if (targetCard) { if (targetCard) {
if (targetCard->getZone()->getPlayer() == player) if (targetCard->getZone()->getPlayer() == player)
toDelete.append(a); toDelete.append(a);
} else if ((static_cast<Server_Player *>(a->getTargetItem()) == player) || (a->getStartCard()->getZone()->getPlayer() == player)) } else if (static_cast<Server_Player *>(a->getTargetItem()) == player)
toDelete.append(a);
// Don't use else here! It has to happen regardless of whether targetCard == 0.
if (a->getStartCard()->getZone()->getPlayer() == player)
toDelete.append(a); toDelete.append(a);
} }
for (int i = 0; i < toDelete.size(); ++i) { for (int i = 0; i < toDelete.size(); ++i) {

View file

@ -97,7 +97,7 @@ public:
bool containsUser(const QString &userName) const; bool containsUser(const QString &userName) const;
void addPlayer(Server_AbstractUserInterface *userInterface, ResponseContainer &rc, bool spectator, bool broadcastUpdate = true); void addPlayer(Server_AbstractUserInterface *userInterface, ResponseContainer &rc, bool spectator, bool broadcastUpdate = true);
void removePlayer(Server_Player *player); void removePlayer(Server_Player *player);
void removeArrowsToPlayer(GameEventStorage &ges, Server_Player *player); void removeArrowsRelatedToPlayer(GameEventStorage &ges, Server_Player *player);
void unattachCards(GameEventStorage &ges, Server_Player *player); void unattachCards(GameEventStorage &ges, Server_Player *player);
bool kickPlayer(int playerId); bool kickPlayer(int playerId);
void startGameIfReady(); void startGameIfReady();

View file

@ -718,7 +718,7 @@ Response::ResponseCode Server_Player::cmdConcede(const Command_Concede & /*cmd*/
return Response::RespContextError; return Response::RespContextError;
setConceded(true); setConceded(true);
game->removeArrowsToPlayer(ges, this); game->removeArrowsRelatedToPlayer(ges, this);
game->unattachCards(ges, this); game->unattachCards(ges, this);
clearZones(); clearZones();