complete server-side AlwaysRevealTopCard support, related to issue #31

This commit is contained in:
Max-Wilhelm Bruker 2012-03-31 22:47:42 +02:00
parent 005a4363d3
commit 840b577f42
2 changed files with 40 additions and 3 deletions

View file

@ -13,7 +13,6 @@
ZoneViewZone::ZoneViewZone(Player *_p, CardZone *_origZone, int _numberCards, bool _revealZone, bool _writeableRevealZone, QGraphicsItem *parent)
: SelectZone(_p, _origZone->getName(), false, false, true, parent, true), bRect(QRectF()), minRows(0), numberCards(_numberCards), origZone(_origZone), revealZone(_revealZone), writeableRevealZone(_writeableRevealZone), sortByName(false), sortByType(false)
{
qDebug() << "revealZone=" << revealZone << "writeable=" << writeableRevealZone;
if (!(revealZone && !writeableRevealZone))
origZone->setView(this);
}

View file

@ -306,6 +306,15 @@ Response::ResponseCode Server_Player::drawCards(GameEventStorage &ges, int numbe
ges.enqueueGameEvent(eventPrivate, playerId, GameEventStorageItem::SendToPrivate, playerId);
ges.enqueueGameEvent(eventOthers, playerId, GameEventStorageItem::SendToOthers);
if (deckZone->getAlwaysRevealTopCard() && !deckZone->cards.isEmpty()) {
Event_RevealCards revealEvent;
revealEvent.set_zone_name(deckZone->getName().toStdString());
revealEvent.set_card_id(0);
deckZone->cards.first()->getInfo(revealEvent.add_cards());
ges.enqueueGameEvent(revealEvent, playerId);
}
return Response::RespOk;
}
@ -411,6 +420,7 @@ Response::ResponseCode Server_Player::moveCard(GameEventStorage &ges, Server_Car
}
}
int publicNewX;
if (card->getDestroyOnZoneChange() && (startzone->getName() != targetzone->getName())) {
Event_DestroyCard event;
event.set_zone_name(startzone->getName().toStdString());
@ -459,13 +469,14 @@ Response::ResponseCode Server_Player::moveCard(GameEventStorage &ges, Server_Car
if (startzone->getType() == ServerInfo_Zone::HiddenZone)
privatePosition = position;
publicNewX = newX;
Event_MoveCard eventOthers;
eventOthers.set_start_player_id(startzone->getPlayer()->getPlayerId());
eventOthers.set_start_zone(startzone->getName().toStdString());
eventOthers.set_target_player_id(targetzone->getPlayer()->getPlayerId());
if (startzone != targetzone)
eventOthers.set_target_zone(targetzone->getName().toStdString());
eventOthers.set_x(newX);
eventOthers.set_y(y);
eventOthers.set_face_down(faceDown);
@ -475,6 +486,7 @@ Response::ResponseCode Server_Player::moveCard(GameEventStorage &ges, Server_Car
eventPrivate.set_card_name(privateCardName.toStdString());
eventPrivate.set_position(privatePosition);
eventPrivate.set_new_card_id(privateNewCardId);
eventPrivate.set_x(newX);
// Other players do not get to see the start and/or target position of the card if the respective
// part of the zone is being looked at. The information is not needed anyway because in hidden zones,
@ -485,8 +497,9 @@ Response::ResponseCode Server_Player::moveCard(GameEventStorage &ges, Server_Car
)
position = -1;
if ((targetzone->getType() == ServerInfo_Zone::HiddenZone) && ((targetzone->getCardsBeingLookedAt() > newX) || (targetzone->getCardsBeingLookedAt() == -1)))
newX = -1;
publicNewX = -1;
eventOthers.set_x(publicNewX);
eventOthers.set_position(position);
if ((startzone->getType() == ServerInfo_Zone::PublicZone) || (targetzone->getType() == ServerInfo_Zone::PublicZone)) {
eventOthers.set_card_id(oldCardId);
@ -504,6 +517,22 @@ Response::ResponseCode Server_Player::moveCard(GameEventStorage &ges, Server_Car
if (!ptString.isEmpty() && !faceDown)
setCardAttrHelper(ges, targetzone->getName(), card->getId(), AttrPT, ptString);
}
if (startzone->getAlwaysRevealTopCard() && !startzone->cards.isEmpty() && (originalPosition == 0)) {
Event_RevealCards revealEvent;
revealEvent.set_zone_name(startzone->getName().toStdString());
revealEvent.set_card_id(0);
startzone->cards.first()->getInfo(revealEvent.add_cards());
ges.enqueueGameEvent(revealEvent, playerId);
}
if (targetzone->getAlwaysRevealTopCard() && !targetzone->cards.isEmpty() && (newX == 0)) {
Event_RevealCards revealEvent;
revealEvent.set_zone_name(targetzone->getName().toStdString());
revealEvent.set_card_id(0);
targetzone->cards.first()->getInfo(revealEvent.add_cards());
ges.enqueueGameEvent(revealEvent, playerId);
}
}
if (undoingDraw)
ges.setGameEventContext(Context_UndoDraw());
@ -1552,6 +1581,15 @@ Response::ResponseCode Server_Player::cmdChangeZoneProperties(const Command_Chan
event.set_always_reveal_top_card(cmd.always_reveal_top_card());
ges.enqueueGameEvent(event, playerId);
if (!zone->cards.isEmpty()) {
Event_RevealCards revealEvent;
revealEvent.set_zone_name(zone->getName().toStdString());
revealEvent.set_card_id(0);
zone->cards.first()->getInfo(revealEvent.add_cards());
ges.enqueueGameEvent(revealEvent, playerId);
}
} else
return Response::RespContextError;
}