virtual bool onPhaseChange(ServerPlayer *wangyi) const{ if(!wangyi->isWounded()) return false; if(wangyi->getPhase() == Player::Start || wangyi->getPhase() == Player::Finish){ if(!wangyi->askForSkillInvoke(objectName())) return false; Room *room = wangyi->getRoom(); room->broadcastSkillInvoke(objectName(), 1); JudgeStruct judge; judge.pattern = QRegExp("(.*):(club|spade):(.*)"); judge.good = true; judge.reason = objectName(); judge.who = wangyi; room->judge(judge); if(judge.isGood()){ int x = wangyi->getLostHp(); wangyi->drawCards(x); //It should be preview, not draw ServerPlayer *target = room->askForPlayerChosen(wangyi, room->getAllPlayers(), objectName()); if (target == wangyi) room->broadcastSkillInvoke(objectName(), 2); else if (target->getGeneralName().contains("machao")) room->broadcastSkillInvoke(objectName(), 4); else room->broadcastSkillInvoke(objectName(), 3); QList<const Card *> miji_cards = wangyi->getHandcards().mid(wangyi->getHandcardNum() - x); foreach(const Card *card, miji_cards){ CardMoveReason reason(CardMoveReason::S_REASON_GIVE, wangyi->objectName()); reason.m_playerId == target->objectName(); room->obtainCard(target, card, reason, false); } }
void LeijiCard::onEffect(const CardEffectStruct &effect) const{ ServerPlayer *zhangjiao = effect.from; ServerPlayer *target = effect.to; Room *room = zhangjiao->getRoom(); room->setEmotion(target, "bad"); JudgeStruct judge; judge.pattern = QRegExp("(.*):(spade):(.*)"); judge.good = false; judge.reason = "leiji"; judge.who = target; room->judge(judge); if(judge.isBad()){ DamageStruct damage; damage.card = NULL; damage.damage = 2; damage.from = zhangjiao; damage.to = target; damage.nature = DamageStruct::Thunder; room->damage(damage); }else room->setEmotion(zhangjiao, "bad"); }
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; }
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; }
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 void onDamaged(ServerPlayer *xiahou, const DamageStruct &damage) const{ ServerPlayer *from = damage.from; Room *room = xiahou->getRoom(); QVariant source = QVariant::fromValue(from); if(from && from->isAlive() && room->askForSkillInvoke(xiahou, "ganglie", source)){ room->playSkillEffect(objectName()); JudgeStruct judge; judge.pattern = QRegExp("(.*):(club):(.*)"); judge.good = false; judge.reason = objectName(); judge.who = xiahou; room->judge(judge); if(judge.isGood()){ if(!room->askForDiscard(from, objectName(), 2, true)){ DamageStruct damage; damage.from = xiahou; damage.to = from; room->setEmotion(xiahou, "good"); room->damage(damage); } }else room->setEmotion(xiahou, "bad"); } }
virtual bool onPhaseChange(ServerPlayer *wangyi) const{ if(!wangyi->isWounded()) return false; if(wangyi->getPhase() == Player::Start || wangyi->getPhase() == Player::Finish){ if(!wangyi->askForSkillInvoke(objectName())) return false; Room *room = wangyi->getRoom(); JudgeStruct judge; judge.pattern = QRegExp("(.*):(club|spade):(.*)"); judge.good = true; judge.reason = objectName(); judge.who = wangyi; room->judge(judge); if(judge.isGood()){ room->playSkillEffect(objectName()); int x = wangyi->getLostHp(); wangyi->drawCards(x); ServerPlayer *target = room->askForPlayerChosen(wangyi, room->getAllPlayers(), objectName()); QList<const Card *> miji_cards = wangyi->getHandcards().mid(wangyi->getHandcardNum() - x); foreach(const Card *card, miji_cards) room->obtainCard(target, card, false); } }
virtual bool trigger(TriggerEvent, Room *room, ServerPlayer *shenguanyu, QVariant &data) const{ DeathStruct death = data.value<DeathStruct>(); if (death.who != shenguanyu) return false; QList<ServerPlayer *> players = room->getOtherPlayers(shenguanyu); int max = 0; foreach (ServerPlayer *player, players) max = qMax(max, player->getMark("@nightmare")); if (max == 0) return false; QList<ServerPlayer *> foes; foreach (ServerPlayer *player, players) { if (player->getMark("@nightmare") == max) foes << player; } if (foes.isEmpty()) return false; ServerPlayer *foe; if (foes.length() == 1) foe = foes.first(); else foe = room->askForPlayerChosen(shenguanyu, foes, "wuhun", "@wuhun-revenge"); room->notifySkillInvoked(shenguanyu, "wuhun"); JudgeStruct judge; judge.pattern = "Peach,GodSalvation"; judge.good = true; judge.negative = true; judge.reason = "wuhun"; judge.who = foe; room->judge(judge); if (judge.isBad()) { room->broadcastSkillInvoke("wuhun", 2); room->doLightbox("$WuhunAnimate", 3000); LogMessage log; log.type = "#WuhunRevenge"; log.from = shenguanyu; log.to << foe; log.arg = QString::number(max); log.arg2 = "wuhun"; room->sendLog(log); room->killPlayer(foe); } else room->broadcastSkillInvoke("wuhun", 3); QList<ServerPlayer *> killers = room->getAllPlayers(); foreach (ServerPlayer *player, killers) player->loseAllMarks("@nightmare"); 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)); } }
virtual bool onPhaseChange(ServerPlayer *wangyi) const{ if(!wangyi->isWounded()) return false; if(wangyi->getPhase() == Player::Start || wangyi->getPhase() == Player::Finish){ if(!wangyi->askForSkillInvoke(objectName())) return false; Room *room = wangyi->getRoom(); JudgeStruct judge; judge.pattern = QRegExp("(.*):(club|spade):(.*)"); judge.good = true; judge.reason = objectName(); judge.who = wangyi; room->judge(judge); if(judge.isGood()){ int x = wangyi->getLostHp(); LogMessage log; log.type = "#WatchNCards"; log.from = wangyi; log.arg = QString::number(x); room->sendLog(log); room->playSkillEffect(objectName()); QList<int> miji_cards = room->getNCards(x, false); room->fillAG(miji_cards, wangyi); room->askForAG(wangyi, miji_cards, true, objectName()); room->broadcastInvoke("clearAG"); room->addToDrawPile(miji_cards); ServerPlayer *target = room->askForPlayerChosen(wangyi, room->getAllPlayers(), objectName()); log.type = "#Miji"; log.arg = objectName(); log.to << target; room->sendLog(log); target->drawCards(x, false); } } return false; }
void DingpinCard::onEffect(const CardEffectStruct &effect) const { Room *room = effect.from->getRoom(); JudgeStruct judge; judge.who = effect.to; judge.good = true; judge.pattern = ".|black"; judge.reason = "dingpin"; room->judge(judge); if (judge.isGood()) { room->setPlayerFlag(effect.to, "dingpin"); effect.to->drawCards(effect.to->getLostHp(), "dingpin"); } else { effect.from->turnOver(); } }
virtual bool trigger(TriggerEvent , ServerPlayer *player, QVariant &data) const{ Room *room = player->getRoom(); SlashEffectStruct effect = data.value<SlashEffectStruct>(); if(!room->askForSkillInvoke(player, objectName(), data)) return false; JudgeStruct judge; judge.pattern = QRegExp("(.*):(heart):(.*)"); judge.good = false; judge.reason = objectName(); judge.who = player; room->judge(judge); if(judge.isGood()){ QStringList natures; natures << "normal_nature" << "fire_nature" << "thunder_nature" << "wind_nature"; QString choice = room->askForChoice(player, objectName(), natures.join("+")); if(choice == "normal_nature") effect.nature = DamageStruct::Normal; else if(choice == "fire_nature") effect.nature = DamageStruct::Fire; else if(choice == "thunder_nature") effect.nature = DamageStruct::Thunder; else if(choice == "wind_nature") effect.nature = DamageStruct::Wind; LogMessage log; log.type = "#BaguaSwordLog"; log.from = player; log.arg = choice; room->sendLog(log); data = QVariant::fromValue(effect); return false; }else{ Jink *jink = new Jink(Card::NoSuit, 0); room->slashResult(effect, jink); return true; } return false; }
virtual void onDamaged(ServerPlayer *xiahou, const DamageStruct &damage) const{ ServerPlayer *from = damage.from; Room *room = xiahou->getRoom(); QVariant source = QVariant::fromValue(from); if(from && from->isAlive() && room->askForSkillInvoke(xiahou, "neoganglie", source)){ room->broadcastSkillInvoke("ganglie"); JudgeStruct judge; judge.pattern = QRegExp("(.*):(heart):(.*)"); judge.good = false; judge.reason = objectName(); judge.who = xiahou; room->judge(judge); if(judge.isGood()){ QStringList choicelist; choicelist << "damage"; if (from->getHandcardNum() > 1) choicelist << "throw"; QString choice; if (choicelist.length() == 1) choice = choicelist.first(); else choice = room->askForChoice(xiahou, "neoganglie", choicelist.join("+")); if(choice == "damage"){ DamageStruct damage; damage.from = xiahou; damage.to = from; room->setEmotion(xiahou, "good"); room->damage(damage); } else room->askForDiscard(from, objectName(), 2, 2); }else room->setEmotion(xiahou, "bad"); } }
virtual bool effect(TriggerEvent, Room *, ServerPlayer *, QVariant &data, ServerPlayer *) const{ JudgeStruct *judge = data.value<JudgeStruct *>(); judge->updateResult(); return false; }