const Card *WuxinCard::validate(CardUseStruct &cardUse) const{ QList<int> skysoldier = cardUse.from->getPile("skysoldier"); QList<int> black_skysoldier, disabled_skysoldier; foreach(int id, skysoldier){ if (Sanguosha->getCard(id)->isBlack()){ Slash *theslash = new Slash(Card::SuitToBeDecided, -1); theslash->setSkillName("wuxin"); theslash->addSubcard(id); theslash->deleteLater(); bool can_slash = theslash->isAvailable(cardUse.from) && theslash->targetsFeasible(ServerPlayerList2PlayerList(cardUse.to), cardUse.from); if (can_slash) black_skysoldier << id; else disabled_skysoldier << id; } else disabled_skysoldier << id; } if (black_skysoldier.isEmpty()) return NULL; Room *room = cardUse.from->getRoom(); room->fillAG(skysoldier, cardUse.from, disabled_skysoldier); int slash_id = room->askForAG(cardUse.from, black_skysoldier, false, "wuxin"); room->clearAG(cardUse.from); Slash *slash = new Slash(Card::SuitToBeDecided, -1); slash->addSubcard(slash_id); slash->setSkillName("wuxin"); return slash; }
virtual const Card *viewAs(const Card *originalCard) const{ Slash *slash = new Slash(originalCard->getSuit(), originalCard->getNumber()); slash->setSkillName(objectName()); WrappedCard *card = Sanguosha->getWrappedCard(originalCard->getId()); card->takeOver(slash); return card; }
void PengriCard::use(Room *room, ServerPlayer *player, const QList<ServerPlayer *> &tar) const{ int card_id = room->askForCardChosen(player, tar.first(), "he", "pengri"); room->obtainCard(player, card_id, room->getCardPlace(card_id) != Player::Hand); Slash *slash = new Slash(Card::NoSuit, 0); slash->setSkillName("pengri"); CardUseStruct use; use.card = slash; use.from = tar.first(); use.to << player; room->useCard(use); }
bool WuxinCard::targetsFeasible(const QList<const Player *> &targets, const Player *Self) const{ foreach(int id, Self->getPile("skysoldier")){ if (Sanguosha->getCard(id)->isBlack()){ Slash *theslash = new Slash(Card::SuitToBeDecided, -1); theslash->setSkillName("wuxin"); theslash->addSubcard(id); theslash->deleteLater(); bool can_slash = theslash->isAvailable(Self) && theslash->targetsFeasible(targets, Self); if (can_slash) return true; } } return false; }
virtual void onDamaged(ServerPlayer *player, const DamageStruct &damage) const{ Room *room = player->getRoom(); if(damage.damage != 1 || !damage.from || damage.from == player) return; if(room->askForSkillInvoke(player, objectName(), QVariant::fromValue(damage))){ ServerPlayer *target = room->askForPlayerChosen(player, room->getOtherPlayers(damage.from), objectName()); Slash *slash = new Slash(Card::NoSuit, 0); slash->setSkillName(objectName()); CardUseStruct use; use.card = slash; use.from = damage.from; use.to << target; room->useCard(use, false); } }
virtual const Card *viewAs(CardItem *card_item) const{ const Card *card = card_item->getFilteredCard(); bool clone_jink = false; if(ClientInstance->getStatus() == Client::Responsing) clone_jink = ClientInstance->getPattern() == "jink"; if(clone_jink){ Jink *jink = new Jink(card->getSuit(), card->getNumber()); jink->addSubcard(card); jink->setSkillName(objectName()); return jink; } else{ Slash *slash = new Slash(card->getSuit(), card->getNumber()); slash->addSubcard(card); slash->setSkillName(objectName()); return slash; } }
virtual const Card *viewAs(const QList<CardItem *> &cards) const{ if(cards.length() != 2) return NULL; const Card *first = cards.at(0)->getFilteredCard(); const Card *second = cards.at(1)->getFilteredCard(); Card::Suit suit = Card::NoSuit; if(first->isBlack() && second->isBlack()) suit = Card::Spade; else if(first->isRed() && second->isRed()) suit = Card::Heart; Slash *slash = new Slash(suit, 0); slash->setSkillName(objectName()); slash->addSubcard(first); slash->addSubcard(second); return slash; }