void NeoFanjianCard::onEffect(const CardEffectStruct &effect) const{ ServerPlayer *zhouyu = effect.from; ServerPlayer *target = effect.to; Room *room = zhouyu->getRoom(); room->broadcastSkillInvoke("fanjian"); const Card *card = Sanguosha->getCard(getSubcards().first()); int card_id = card->getEffectiveId(); Card::Suit suit = room->askForSuit(target, "neofanjian"); LogMessage log; log.type = "#ChooseSuit"; log.from = target; log.arg = Card::Suit2String(suit); room->sendLog(log); room->getThread()->delay(); target->obtainCard(this); room->showCard(target, card_id); if(card->getSuit() != suit){ DamageStruct damage; damage.card = NULL; damage.from = zhouyu; damage.to = target; room->damage(damage); } }
void EquipCard::use(Room *room, ServerPlayer *source, const QList<ServerPlayer *> &targets) const{ const EquipCard *equipped = NULL; ServerPlayer *target = targets.value(0, source); switch(location()){ case WeaponLocation: equipped = target->getWeapon(); break; case ArmorLocation: equipped = target->getArmor(); break; case DefensiveHorseLocation: equipped = target->getDefensiveHorse(); break; case OffensiveHorseLocation: equipped = target->getOffensiveHorse(); break; } if(equipped) room->throwCard(equipped, source); int tmpId = -1; if(getId() > -1) tmpId = getId(); else if(!getSubcards().empty()) tmpId = this->getSubcards().first(); if(this->objectName() == "gale-shell" || room->getCardOwner(tmpId)->objectName() == target->objectName()){ LogMessage log; log.from = target; log.type = "$Install"; log.card_str = QString::number(tmpId); room->sendLog(log); room->moveCardTo(this, target, Player::Equip, true); } }
void DaojuCard::onUse(Room *room, const CardUseStruct &card_use) const{ CardStar ju = Sanguosha->getCard(card_use.from->getPile("gui").first()); const Card *first = Sanguosha->getCard(getSubcards().first()); const Card *second = Sanguosha->getCard(getSubcards().last()); Card::Suit suit = Card::NoSuit; if(first->isBlack() && second->isBlack()) suit = Card::Spade; else if(first->isRed() && second->isRed()) suit = Card::Heart; Card *new_card = Sanguosha->cloneCard(ju->objectName(), suit, (first->getNumber() + second->getNumber()) / 2); new_card->setSkillName("daoju"); new_card->addSubcard(first); new_card->addSubcard(second); CardUseStruct use; use.card = new_card; use.from = card_use.from; use.to = card_use.to; room->useCard(use); }
void XunguiCard::use(Room *room, ServerPlayer *player, const QList<ServerPlayer *> &) const{ if(!player->getPile("gui").isEmpty()){ room->playSkillEffect(skill_name, 2); room->throwCard(player->getPile("gui").first()); if(player->isWounded()){ RecoverStruct rev; room->recover(player, rev); } } else room->playSkillEffect(skill_name, 1); player->addToPile("gui", getSubcards().first()); }
bool Slash::targetFilter(const QList<const Player *> &targets, const Player *to_select, const Player *Self) const{ int slash_targets = 1; if(Self->hasWeapon("halberd") && Self->isLastHandCard(this)){ slash_targets = 3; } bool distance_limit = true; int rangefix = 0; if(isVirtualCard() && getSubcards().length() > 0){ foreach(int card_id, getSubcards()){ if(Self->getWeapon()) if(card_id == Self->getWeapon()->getId()) if(Self->getWeapon()->getRange() > 1) rangefix = qMax((Self->getWeapon()->getRange()), rangefix); if(Self->getOffensiveHorse()) if(card_id == Self->getOffensiveHorse()->getId()) rangefix = qMax(rangefix, 1); } }
void QiaobianCard::use(Room *room, ServerPlayer *zhanghe, const QList<ServerPlayer *> &targets) const{ if(zhanghe->getPhase() == Player::Discard){ room->setTag("QiaobianCost", QVariant::fromValue(getSubcards().first())); room->playSkillEffect("qiaobian", 4); } if(zhanghe->getPhase() == Player::Judge) room->playSkillEffect("qiaobian", 1); if(targets.isEmpty()) return; if(zhanghe->getPhase() == Player::Draw){ room->playSkillEffect("qiaobian", 2); QList<ServerPlayer *> players = targets; qSort(players.begin(), players.end(), Card::CompareByActionOrder); foreach(ServerPlayer *target, players){ room->cardEffect(this, zhanghe, target); }
bool Slash::targetFilter(const QList<const Player *> &targets, const Player *to_select, const Player *Self) const{ int slash_targets = 1; if(Self->hasWeapon("halberd") && Self->isLastHandCard(this)){ slash_targets = 3; } bool distance_limit = true; if(Self->hasFlag("tianyi_success")){ distance_limit = false; slash_targets ++; } if(Self->hasSkill("lihuo") && inherits("FireSlash")) slash_targets ++; if(Self->hasSkill("tieji_p") && Self->getWeapon() && Self->getWeapon()->getRange() >= 3){ slash_targets ++ ; } if(Self->hasSkill("shenji") && Self->getWeapon() == NULL) slash_targets = 3; if(targets.length() >= slash_targets) return false; if(inherits("WushenSlash")){ distance_limit = false; } if(getSkillName() == "wusheng" && Self->isSkillEnhance("wusheng", 1)){ int card_id = getSubcards().first() ; if(Sanguosha->getCard(card_id)->getSuit() == Card::Heart) distance_limit = false ; } return Self->canSlash(to_select, distance_limit); }
void DujiCard::use(Room *, ServerPlayer *player, const QList<ServerPlayer *> &) const{ player->playSkillEffect(skill_name, 1); player->addToPile("du", getSubcards().first()); }