mirror of
https://github.com/Cockatrice/Cockatrice.git
synced 2026-07-01 11:03:54 -07:00
arrows can target players now
This commit is contained in:
parent
cbf201ed9b
commit
61b82bd6f9
25 changed files with 802 additions and 489 deletions
|
|
@ -4,18 +4,20 @@
|
|||
#include <QColor>
|
||||
|
||||
class Server_Card;
|
||||
class Server_ArrowTarget;
|
||||
|
||||
class Server_Arrow {
|
||||
private:
|
||||
int id;
|
||||
Server_Card *startCard, *targetCard;
|
||||
Server_Card *startCard;
|
||||
Server_ArrowTarget *targetItem;
|
||||
QColor color;
|
||||
public:
|
||||
Server_Arrow(int _id, Server_Card *_startCard, Server_Card *_targetCard, const QColor &_color)
|
||||
: id(_id), startCard(_startCard), targetCard(_targetCard), color(_color) { }
|
||||
Server_Arrow(int _id, Server_Card *_startCard, Server_ArrowTarget *_targetItem, const QColor &_color)
|
||||
: id(_id), startCard(_startCard), targetItem(_targetItem), color(_color) { }
|
||||
int getId() const { return id; }
|
||||
Server_Card *getStartCard() const { return startCard; }
|
||||
Server_Card *getTargetCard() const { return targetCard; }
|
||||
Server_ArrowTarget *getTargetItem() const { return targetItem; }
|
||||
QColor getColor() const { return color; }
|
||||
};
|
||||
|
||||
|
|
|
|||
10
common/server_arrowtarget.h
Normal file
10
common/server_arrowtarget.h
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
#ifndef SERVER_ARROWTARGET_H
|
||||
#define SERVER_ARROWTARGET_H
|
||||
|
||||
#include <QObject>
|
||||
|
||||
class Server_ArrowTarget : public QObject {
|
||||
Q_OBJECT
|
||||
};
|
||||
|
||||
#endif
|
||||
|
|
@ -20,12 +20,14 @@
|
|||
#ifndef SERVER_CARD_H
|
||||
#define SERVER_CARD_H
|
||||
|
||||
#include "server_arrowtarget.h"
|
||||
#include <QString>
|
||||
#include <QMap>
|
||||
|
||||
class Server_CardZone;
|
||||
|
||||
class Server_Card {
|
||||
class Server_Card : public Server_ArrowTarget {
|
||||
Q_OBJECT
|
||||
private:
|
||||
Server_CardZone *zone;
|
||||
int id;
|
||||
|
|
|
|||
|
|
@ -197,6 +197,28 @@ Server_Player *Server_Game::addPlayer(Server_ProtocolHandler *handler, bool spec
|
|||
void Server_Game::removePlayer(Server_Player *player)
|
||||
{
|
||||
players.remove(player->getPlayerId());
|
||||
|
||||
// Remove all arrows of other players pointing to the player being removed or to one of his cards.
|
||||
QMapIterator<int, Server_Player *> playerIterator(players);
|
||||
while (playerIterator.hasNext()) {
|
||||
Server_Player *p = playerIterator.next().value();
|
||||
QList<Server_Arrow *> arrows = p->getArrows().values();
|
||||
QList<Server_Arrow *> toDelete;
|
||||
for (int i = 0; i < arrows.size(); ++i) {
|
||||
Server_Arrow *a = arrows[i];
|
||||
Server_Card *targetCard = qobject_cast<Server_Card *>(a->getTargetItem());
|
||||
if (targetCard) {
|
||||
if (targetCard->getZone()->getPlayer() == player)
|
||||
toDelete.append(a);
|
||||
} else if ((static_cast<Server_Player *>(a->getTargetItem()) == player) || (a->getStartCard()->getZone()->getPlayer() == player))
|
||||
toDelete.append(a);
|
||||
}
|
||||
for (int i = 0; i < toDelete.size(); ++i) {
|
||||
sendGameEvent(new Event_DeleteArrow(p->getPlayerId(), toDelete[i]->getId()));
|
||||
p->deleteArrow(toDelete[i]->getId());
|
||||
}
|
||||
}
|
||||
|
||||
sendGameEvent(new Event_Leave(player->getPlayerId()));
|
||||
bool spectator = player->getSpectator();
|
||||
delete player;
|
||||
|
|
@ -243,16 +265,29 @@ QList<ServerInfo_Player *> Server_Game::getGameState(Server_Player *playerWhosAs
|
|||
QMapIterator<int, Server_Arrow *> arrowIterator(player->getArrows());
|
||||
while (arrowIterator.hasNext()) {
|
||||
Server_Arrow *arrow = arrowIterator.next().value();
|
||||
arrowList.append(new ServerInfo_Arrow(
|
||||
arrow->getId(),
|
||||
arrow->getStartCard()->getZone()->getPlayer()->getPlayerId(),
|
||||
arrow->getStartCard()->getZone()->getName(),
|
||||
arrow->getStartCard()->getId(),
|
||||
arrow->getTargetCard()->getZone()->getPlayer()->getPlayerId(),
|
||||
arrow->getTargetCard()->getZone()->getName(),
|
||||
arrow->getTargetCard()->getId(),
|
||||
arrow->getColor()
|
||||
));
|
||||
Server_Card *targetCard = qobject_cast<Server_Card *>(arrow->getTargetItem());
|
||||
if (targetCard)
|
||||
arrowList.append(new ServerInfo_Arrow(
|
||||
arrow->getId(),
|
||||
arrow->getStartCard()->getZone()->getPlayer()->getPlayerId(),
|
||||
arrow->getStartCard()->getZone()->getName(),
|
||||
arrow->getStartCard()->getId(),
|
||||
targetCard->getZone()->getPlayer()->getPlayerId(),
|
||||
targetCard->getZone()->getName(),
|
||||
targetCard->getId(),
|
||||
arrow->getColor()
|
||||
));
|
||||
else
|
||||
arrowList.append(new ServerInfo_Arrow(
|
||||
arrow->getId(),
|
||||
arrow->getStartCard()->getZone()->getPlayer()->getPlayerId(),
|
||||
arrow->getStartCard()->getZone()->getName(),
|
||||
arrow->getStartCard()->getId(),
|
||||
qobject_cast<Server_Player *>(arrow->getTargetItem())->getPlayerId(),
|
||||
QString(),
|
||||
-1,
|
||||
arrow->getColor()
|
||||
));
|
||||
}
|
||||
|
||||
QList<ServerInfo_Counter *> counterList;
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef PLAYER_H
|
||||
#define PLAYER_H
|
||||
|
||||
#include <QObject>
|
||||
#include "server_arrowtarget.h"
|
||||
#include <QString>
|
||||
#include <QList>
|
||||
#include <QMap>
|
||||
|
|
@ -15,7 +15,7 @@ class Server_ProtocolHandler;
|
|||
class ProtocolItem;
|
||||
class ServerInfo_PlayerProperties;
|
||||
|
||||
class Server_Player : public QObject {
|
||||
class Server_Player : public Server_ArrowTarget {
|
||||
Q_OBJECT
|
||||
private:
|
||||
Server_Game *game;
|
||||
|
|
|
|||
|
|
@ -593,7 +593,7 @@ ResponseCode Server_ProtocolHandler::moveCard(Server_Game *game, Server_Player *
|
|||
QMapIterator<int, Server_Arrow *> arrowIterator(players[i]->getArrows());
|
||||
while (arrowIterator.hasNext()) {
|
||||
Server_Arrow *arrow = arrowIterator.next().value();
|
||||
if ((arrow->getStartCard() == card) || (arrow->getTargetCard() == card))
|
||||
if ((arrow->getStartCard() == card) || (arrow->getTargetItem() == card))
|
||||
arrowsToDelete.append(arrow->getId());
|
||||
}
|
||||
for (int j = 0; j < arrowsToDelete.size(); ++j)
|
||||
|
|
@ -689,21 +689,33 @@ ResponseCode Server_ProtocolHandler::cmdCreateArrow(Command_CreateArrow *cmd, Co
|
|||
if (!startPlayer || !targetPlayer)
|
||||
return RespNameNotFound;
|
||||
Server_CardZone *startZone = startPlayer->getZones().value(cmd->getStartZone());
|
||||
Server_CardZone *targetZone = targetPlayer->getZones().value(cmd->getTargetZone());
|
||||
if (!startZone || !targetZone)
|
||||
bool playerTarget = cmd->getTargetZone().isEmpty();
|
||||
Server_CardZone *targetZone = 0;
|
||||
if (!playerTarget)
|
||||
targetZone = targetPlayer->getZones().value(cmd->getTargetZone());
|
||||
if (!startZone || (!targetZone && !playerTarget))
|
||||
return RespNameNotFound;
|
||||
Server_Card *startCard = startZone->getCard(cmd->getStartCardId(), false);
|
||||
Server_Card *targetCard = targetZone->getCard(cmd->getTargetCardId(), false);
|
||||
if (!startCard || !targetCard || (startCard == targetCard))
|
||||
Server_Card *targetCard = 0;
|
||||
if (!playerTarget)
|
||||
targetCard = targetZone->getCard(cmd->getTargetCardId(), false);
|
||||
if (!startCard || (!targetCard && !playerTarget) || (startCard == targetCard))
|
||||
return RespContextError;
|
||||
|
||||
Server_ArrowTarget *targetItem;
|
||||
if (playerTarget)
|
||||
targetItem = targetPlayer;
|
||||
else
|
||||
targetItem = targetCard;
|
||||
|
||||
QMapIterator<int, Server_Arrow *> arrowIterator(player->getArrows());
|
||||
while (arrowIterator.hasNext()) {
|
||||
Server_Arrow *temp = arrowIterator.next().value();
|
||||
if ((temp->getStartCard() == startCard) && (temp->getTargetCard() == targetCard))
|
||||
if ((temp->getStartCard() == startCard) && (temp->getTargetItem() == targetItem))
|
||||
return RespContextError;
|
||||
}
|
||||
|
||||
Server_Arrow *arrow = new Server_Arrow(player->newArrowId(), startCard, targetCard, cmd->getColor());
|
||||
|
||||
Server_Arrow *arrow = new Server_Arrow(player->newArrowId(), startCard, targetItem, cmd->getColor());
|
||||
player->addArrow(arrow);
|
||||
game->sendGameEvent(new Event_CreateArrows(player->getPlayerId(), QList<ServerInfo_Arrow *>() << new ServerInfo_Arrow(
|
||||
arrow->getId(),
|
||||
|
|
@ -711,8 +723,8 @@ ResponseCode Server_ProtocolHandler::cmdCreateArrow(Command_CreateArrow *cmd, Co
|
|||
startZone->getName(),
|
||||
startCard->getId(),
|
||||
targetPlayer->getPlayerId(),
|
||||
targetZone->getName(),
|
||||
targetCard->getId(),
|
||||
cmd->getTargetZone(),
|
||||
cmd->getTargetCardId(),
|
||||
cmd->getColor()
|
||||
)));
|
||||
return RespOk;
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue