void FloodCard::onEffect(const CardEffectStruct &effect) const{ effect.to->throwAllEquips(); Room *room = effect.to->getRoom(); if (!room->askForDiscard(effect.to, "flood", 2, 2, true)) room->damage(DamageStruct("flood", effect.from, effect.to)); }
void QuhuCard::use(Room *room, ServerPlayer *xunyu, QList<ServerPlayer *> &targets) const{ ServerPlayer *tiger = targets.first(); room->broadcastSkillInvoke("quhu", 1); bool success = xunyu->pindian(tiger, "quhu", NULL); if (success) { room->broadcastSkillInvoke("quhu", 2); QList<ServerPlayer *> players = room->getOtherPlayers(tiger), wolves; foreach (ServerPlayer *player, players) { if (tiger->inMyAttackRange(player)) wolves << player; } if (wolves.isEmpty()) { LogMessage log; log.type = "#QuhuNoWolf"; log.from = xunyu; log.to << tiger; room->sendLog(log); return; } ServerPlayer *wolf = room->askForPlayerChosen(xunyu, wolves, "quhu", QString("@quhu-damage:%1").arg(tiger->objectName())); room->damage(DamageStruct("quhu", tiger, wolf)); } else {
bool trigger(TriggerEvent triggerEvent, Room *room, ServerPlayer *zhangjiao, QVariant &data) const { if (triggerEvent == CardResponded && TriggerSkill::triggerable(zhangjiao)) { const Card *card_star = data.value<CardResponseStruct>().m_card; if (card_star->isKindOf("Jink")) { ServerPlayer *target = room->askForPlayerChosen(zhangjiao, room->getAlivePlayers(), objectName(), "leiji-invoke", true, true); if (target) { room->broadcastSkillInvoke(objectName()); JudgeStruct judge; judge.pattern = ".|black"; judge.good = false; judge.negative = true; judge.reason = objectName(); judge.who = target; room->judge(judge); if (judge.isBad()) room->damage(DamageStruct(objectName(), zhangjiao, target, 1, DamageStruct::Thunder)); } } } else if (triggerEvent == DamageCaused && zhangjiao->isAlive() && zhangjiao->isWounded()) { DamageStruct damage = data.value<DamageStruct>(); if (damage.reason == objectName() && !damage.chain) room->recover(zhangjiao, RecoverStruct(zhangjiao)); } return false; }
void FurongCard::onEffect(const CardEffectStruct &effect) const { Room *room = effect.from->getRoom(); // copy Room::askForCard twice!! // anti-programming skill!! // wait for the final version. const Card *card1 = NULL; const Card *card2 = NULL; if (card1 == NULL || card2 == NULL) return; //for future use if (card1->isKindOf("Slash") && !card2->isKindOf("Jink")) room->damage(DamageStruct(objectName(), effect.from, effect.to)); else if (!card1->isKindOf("Slash") && card2->isKindOf("Jink")) { if (!effect.to->isNude()) { int id = room->askForCardChosen(effect.from, effect.to, "he", objectName()); room->obtainCard(effect.from, id, false); } } }
void onDamaged(ServerPlayer *xiahou, const DamageStruct &damage) const { ServerPlayer *from = damage.from; Room *room = xiahou->getRoom(); QVariant data = QVariant::fromValue(damage); if (room->askForSkillInvoke(xiahou, "neoganglie", data)) { room->broadcastSkillInvoke("ganglie"); JudgeStruct judge; judge.pattern = ".|heart"; judge.good = false; judge.reason = objectName(); judge.who = xiahou; room->judge(judge); if (!from || from->isDead()) return; if (judge.isGood()) { QStringList choicelist; choicelist << "damage"; if (from->getHandcardNum() > 1) choicelist << "throw"; QString choice = room->askForChoice(xiahou, objectName(), choicelist.join("+")); if (choice == "damage") room->damage(DamageStruct(objectName(), xiahou, from)); else room->askForDiscard(from, objectName(), 2, 2); } } }
virtual bool trigger(TriggerEvent, Room *room, ServerPlayer *zhangjiao, QVariant &data) const{ CardStar card_star = data.value<CardResponseStruct>().m_card; if (card_star->isKindOf("Jink")) { ServerPlayer *target = room->askForPlayerChosen(zhangjiao, room->getAlivePlayers(), objectName(), "leiji-invoke", true, true); if (target) { room->broadcastSkillInvoke(objectName()); JudgeStruct judge; judge.pattern = ".|black"; judge.good = false; judge.negative = true; judge.reason = objectName(); judge.who = target; room->judge(judge); if (judge.isBad()) { room->damage(DamageStruct(objectName(), zhangjiao, target, 1, DamageStruct::Thunder)); if (zhangjiao->isAlive()) { RecoverStruct recover; recover.who = zhangjiao; room->recover(zhangjiao, recover); } } } } return false; }
virtual bool trigger(TriggerEvent , Room *room, ServerPlayer *player, QVariant &) const{ if (player->getPhase() != Player::Finish) return false; ServerPlayer *yuejin = room->findPlayerBySkillName(objectName()); if (!yuejin || yuejin == player) return false; if (yuejin->canDiscard(yuejin, "h") && room->askForCard(yuejin, ".Basic", "@xiaoguo", QVariant(), objectName())) { room->broadcastSkillInvoke(objectName(), 1); if (!room->askForCard(player, ".Equip", "@xiaoguo-discard", QVariant())) { room->broadcastSkillInvoke(objectName(), 2); room->damage(DamageStruct("xiaoguo", yuejin, player)); } else room->broadcastSkillInvoke(objectName(), 3); } return false; }
virtual void onDamaged(ServerPlayer *xiahou, const DamageStruct &damage) const{ ServerPlayer *from = damage.from; Room *room = xiahou->getRoom(); JudgeStruct judge; judge.pattern = ".|heart"; judge.good = false; judge.reason = objectName(); judge.who = xiahou; room->judge(judge); if (!from || from->isDead()) return; if (judge.isGood()) { if (from->getHandcardNum() < 2 || !room->askForDiscard(from, objectName(), 2, 2, true)) room->damage(DamageStruct(objectName(), xiahou, from)); } }
void FireAttack::onEffect(const CardEffectStruct &effect) const{ Room *room = effect.from->getRoom(); if (effect.to->isKongcheng()) return; const Card *card = room->askForCardShow(effect.to, effect.from, objectName()); room->showCard(effect.to, card->getEffectiveId()); QString suit_str = card->getSuitString(); QString pattern = QString(".%1").arg(suit_str.at(0).toUpper()); QString prompt = QString("@fire-attack:%1::%2").arg(effect.to->objectName()).arg(suit_str); if (effect.from->isAlive()) { const Card *card_to_throw = room->askForCard(effect.from, pattern, prompt); if (card_to_throw) room->damage(DamageStruct(this, effect.from, effect.to, 1, DamageStruct::Fire)); else effect.from->setFlags("FireAttackFailed_" + effect.to->objectName()); // For AI } if (card->isVirtualCard()) delete card; }
void NeoFanjianCard::onEffect(const CardEffectStruct &effect) const{ ServerPlayer *zhouyu = effect.from; ServerPlayer *target = effect.to; Room *room = zhouyu->getRoom(); 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) room->damage(DamageStruct("neofanjian", zhouyu, target)); }
} if (wolves.isEmpty()) { LogMessage log; log.type = "#QuhuNoWolf"; log.from = xunyu; log.to << tiger; room->sendLog(log); return; } ServerPlayer *wolf = room->askForPlayerChosen(xunyu, wolves, "quhu", QString("@quhu-damage:%1").arg(tiger->objectName())); room->damage(DamageStruct("quhu", tiger, wolf)); } else { room->damage(DamageStruct("quhu", tiger, xunyu)); } } class Jieming: public MasochismSkill { public: Jieming(): MasochismSkill("jieming") { } virtual void onDamaged(ServerPlayer *xunyu, const DamageStruct &damage) const{ Room *room = xunyu->getRoom(); for (int i = 0; i < damage.damage; i++) { ServerPlayer *to = room->askForPlayerChosen(xunyu, room->getAlivePlayers(), objectName(), "jieming-invoke", true, true); if (!to) break; int upper = qMin(5, to->getMaxHp());