Commit 61b82bd6 authored by Max-Wilhelm Bruker's avatar Max-Wilhelm Bruker
Browse files

arrows can target players now

parent cbf201ed
...@@ -20,12 +20,14 @@ ...@@ -20,12 +20,14 @@
#ifndef SERVER_CARD_H #ifndef SERVER_CARD_H
#define SERVER_CARD_H #define SERVER_CARD_H
#include "server_arrowtarget.h"
#include <QString> #include <QString>
#include <QMap> #include <QMap>
class Server_CardZone; class Server_CardZone;
class Server_Card { class Server_Card : public Server_ArrowTarget {
Q_OBJECT
private: private:
Server_CardZone *zone; Server_CardZone *zone;
int id; int id;
......
...@@ -197,6 +197,28 @@ Server_Player *Server_Game::addPlayer(Server_ProtocolHandler *handler, bool spec ...@@ -197,6 +197,28 @@ Server_Player *Server_Game::addPlayer(Server_ProtocolHandler *handler, bool spec
void Server_Game::removePlayer(Server_Player *player) void Server_Game::removePlayer(Server_Player *player)
{ {
players.remove(player->getPlayerId()); 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())); sendGameEvent(new Event_Leave(player->getPlayerId()));
bool spectator = player->getSpectator(); bool spectator = player->getSpectator();
delete player; delete player;
...@@ -243,14 +265,27 @@ QList<ServerInfo_Player *> Server_Game::getGameState(Server_Player *playerWhosAs ...@@ -243,14 +265,27 @@ QList<ServerInfo_Player *> Server_Game::getGameState(Server_Player *playerWhosAs
QMapIterator<int, Server_Arrow *> arrowIterator(player->getArrows()); QMapIterator<int, Server_Arrow *> arrowIterator(player->getArrows());
while (arrowIterator.hasNext()) { while (arrowIterator.hasNext()) {
Server_Arrow *arrow = arrowIterator.next().value(); Server_Arrow *arrow = arrowIterator.next().value();
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( arrowList.append(new ServerInfo_Arrow(
arrow->getId(), arrow->getId(),
arrow->getStartCard()->getZone()->getPlayer()->getPlayerId(), arrow->getStartCard()->getZone()->getPlayer()->getPlayerId(),
arrow->getStartCard()->getZone()->getName(), arrow->getStartCard()->getZone()->getName(),
arrow->getStartCard()->getId(), arrow->getStartCard()->getId(),
arrow->getTargetCard()->getZone()->getPlayer()->getPlayerId(), qobject_cast<Server_Player *>(arrow->getTargetItem())->getPlayerId(),
arrow->getTargetCard()->getZone()->getName(), QString(),
arrow->getTargetCard()->getId(), -1,
arrow->getColor() arrow->getColor()
)); ));
} }
......
#ifndef PLAYER_H #ifndef PLAYER_H
#define PLAYER_H #define PLAYER_H
#include <QObject> #include "server_arrowtarget.h"
#include <QString> #include <QString>
#include <QList> #include <QList>
#include <QMap> #include <QMap>
...@@ -15,7 +15,7 @@ class Server_ProtocolHandler; ...@@ -15,7 +15,7 @@ class Server_ProtocolHandler;
class ProtocolItem; class ProtocolItem;
class ServerInfo_PlayerProperties; class ServerInfo_PlayerProperties;
class Server_Player : public QObject { class Server_Player : public Server_ArrowTarget {
Q_OBJECT Q_OBJECT
private: private:
Server_Game *game; Server_Game *game;
......
...@@ -593,7 +593,7 @@ ResponseCode Server_ProtocolHandler::moveCard(Server_Game *game, Server_Player * ...@@ -593,7 +593,7 @@ ResponseCode Server_ProtocolHandler::moveCard(Server_Game *game, Server_Player *
QMapIterator<int, Server_Arrow *> arrowIterator(players[i]->getArrows()); QMapIterator<int, Server_Arrow *> arrowIterator(players[i]->getArrows());
while (arrowIterator.hasNext()) { while (arrowIterator.hasNext()) {
Server_Arrow *arrow = arrowIterator.next().value(); Server_Arrow *arrow = arrowIterator.next().value();
if ((arrow->getStartCard() == card) || (arrow->getTargetCard() == card)) if ((arrow->getStartCard() == card) || (arrow->getTargetItem() == card))
arrowsToDelete.append(arrow->getId()); arrowsToDelete.append(arrow->getId());
} }
for (int j = 0; j < arrowsToDelete.size(); ++j) for (int j = 0; j < arrowsToDelete.size(); ++j)
...@@ -689,21 +689,33 @@ ResponseCode Server_ProtocolHandler::cmdCreateArrow(Command_CreateArrow *cmd, Co ...@@ -689,21 +689,33 @@ ResponseCode Server_ProtocolHandler::cmdCreateArrow(Command_CreateArrow *cmd, Co
if (!startPlayer || !targetPlayer) if (!startPlayer || !targetPlayer)
return RespNameNotFound; return RespNameNotFound;
Server_CardZone *startZone = startPlayer->getZones().value(cmd->getStartZone()); Server_CardZone *startZone = startPlayer->getZones().value(cmd->getStartZone());
Server_CardZone *targetZone = targetPlayer->getZones().value(cmd->getTargetZone()); bool playerTarget = cmd->getTargetZone().isEmpty();
if (!startZone || !targetZone) Server_CardZone *targetZone = 0;
if (!playerTarget)
targetZone = targetPlayer->getZones().value(cmd->getTargetZone());
if (!startZone || (!targetZone && !playerTarget))
return RespNameNotFound; return RespNameNotFound;
Server_Card *startCard = startZone->getCard(cmd->getStartCardId(), false); Server_Card *startCard = startZone->getCard(cmd->getStartCardId(), false);
Server_Card *targetCard = targetZone->getCard(cmd->getTargetCardId(), false); Server_Card *targetCard = 0;
if (!startCard || !targetCard || (startCard == targetCard)) if (!playerTarget)
targetCard = targetZone->getCard(cmd->getTargetCardId(), false);
if (!startCard || (!targetCard && !playerTarget) || (startCard == targetCard))
return RespContextError; return RespContextError;
Server_ArrowTarget *targetItem;
if (playerTarget)
targetItem = targetPlayer;
else
targetItem = targetCard;
QMapIterator<int, Server_Arrow *> arrowIterator(player->getArrows()); QMapIterator<int, Server_Arrow *> arrowIterator(player->getArrows());
while (arrowIterator.hasNext()) { while (arrowIterator.hasNext()) {
Server_Arrow *temp = arrowIterator.next().value(); Server_Arrow *temp = arrowIterator.next().value();
if ((temp->getStartCard() == startCard) && (temp->getTargetCard() == targetCard)) if ((temp->getStartCard() == startCard) && (temp->getTargetItem() == targetItem))
return RespContextError; 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); player->addArrow(arrow);
game->sendGameEvent(new Event_CreateArrows(player->getPlayerId(), QList<ServerInfo_Arrow *>() << new ServerInfo_Arrow( game->sendGameEvent(new Event_CreateArrows(player->getPlayerId(), QList<ServerInfo_Arrow *>() << new ServerInfo_Arrow(
arrow->getId(), arrow->getId(),
...@@ -711,8 +723,8 @@ ResponseCode Server_ProtocolHandler::cmdCreateArrow(Command_CreateArrow *cmd, Co ...@@ -711,8 +723,8 @@ ResponseCode Server_ProtocolHandler::cmdCreateArrow(Command_CreateArrow *cmd, Co
startZone->getName(), startZone->getName(),
startCard->getId(), startCard->getId(),
targetPlayer->getPlayerId(), targetPlayer->getPlayerId(),
targetZone->getName(), cmd->getTargetZone(),
targetCard->getId(), cmd->getTargetCardId(),
cmd->getColor() cmd->getColor()
))); )));
return RespOk; return RespOk;
......
...@@ -29,7 +29,8 @@ HEADERS += src/servatrice.h \ ...@@ -29,7 +29,8 @@ HEADERS += src/servatrice.h \
../common/server_counter.h \ ../common/server_counter.h \
../common/server_game.h \ ../common/server_game.h \
../common/server_player.h \ ../common/server_player.h \
../common/server_protocolhandler.h ../common/server_protocolhandler.h \
../common/server_arrowtarget.h
SOURCES += src/main.cpp \ SOURCES += src/main.cpp \
src/servatrice.cpp \ src/servatrice.cpp \
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment