diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index 14b560b5..d2291e4e 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -1078,7 +1078,12 @@ void Player::actCreatePredefinedToken() void Player::actCreateRelatedCard() { - // get he target card name + // get the clicked card + CardItem * sourceCard = game->getActiveCard(); + if(!sourceCard) + return; + + // get the target card name QAction *action = static_cast(sender()); CardInfo *cardInfo = db->getCard(action->text()); @@ -1089,8 +1094,8 @@ void Player::actCreateRelatedCard() cmd.set_color(cardInfo->getColors().isEmpty() ? QString().toStdString() : cardInfo->getColors().first().toLower().toStdString()); cmd.set_pt(cardInfo->getPowTough().toStdString()); cmd.set_destroy_on_zone_change(true); - cmd.set_x(-1); - cmd.set_y(0); + cmd.set_target_zone(sourceCard->getZone()->getName().toStdString()); + cmd.set_target_card_id(sourceCard->getId()); sendGameCommand(cmd); } diff --git a/common/pb/command_create_token.proto b/common/pb/command_create_token.proto index 574fcb21..9c34a478 100644 --- a/common/pb/command_create_token.proto +++ b/common/pb/command_create_token.proto @@ -11,6 +11,8 @@ message Command_CreateToken { optional bool destroy_on_zone_change = 6; optional sint32 x = 7; optional sint32 y = 8; + optional string target_zone = 9; + optional sint32 target_card_id = 10 [default = -1]; } diff --git a/common/server_player.cpp b/common/server_player.cpp index 9f02acb0..d1413147 100644 --- a/common/server_player.cpp +++ b/common/server_player.cpp @@ -1065,7 +1065,7 @@ Response::ResponseCode Server_Player::cmdAttachCard(const Command_AttachCard &cm return Response::RespOk; } -Response::ResponseCode Server_Player::cmdCreateToken(const Command_CreateToken &cmd, ResponseContainer & /*rc*/, GameEventStorage &ges) +Response::ResponseCode Server_Player::cmdCreateToken(const Command_CreateToken &cmd, ResponseContainer & rc, GameEventStorage &ges) { if (spectator) return Response::RespFunctionNotAllowed; @@ -1109,8 +1109,20 @@ Response::ResponseCode Server_Player::cmdCreateToken(const Command_CreateToken & event.set_x(x); event.set_y(y); ges.enqueueGameEvent(event, playerId); - - return Response::RespOk; + + // chck if the token is a replacement for an existing card + if(cmd.target_card_id() < 0) + return Response::RespOk; + + Command_AttachCard cmd2; + cmd2.set_start_zone(cmd.target_zone()); + cmd2.set_card_id(cmd.target_card_id()); + + cmd2.set_target_player_id(zone->getPlayer()->getPlayerId()); + cmd2.set_target_zone(cmd.zone()); + cmd2.set_target_card_id(card->getId()); + + return cmdAttachCard(cmd2, rc, ges); } Response::ResponseCode Server_Player::cmdCreateArrow(const Command_CreateArrow &cmd, ResponseContainer & /*rc*/, GameEventStorage &ges)