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); } } }
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)); }
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"); } }
void FloodCard::onEffect(const CardEffectStruct &effect) const{ effect.to->throwAllEquips(); Room *room = effect.to->getRoom(); if(!room->askForDiscard(effect.to, "flood", 2, true)){ DamageStruct damage; damage.from = effect.from; damage.to = effect.to; room->damage(damage); } }
void GameRule::onPhaseChange(ServerPlayer *player) const{ Room *room = player->getRoom(); switch(player->getPhase()){ case Player::Start: { if(player->hasFlag("drank")) room->setPlayerFlag(player, "-drank"); break; } case Player::Judge: { QStack<const DelayedTrick *> tricks = player->delayedTricks(); while(!tricks.isEmpty() && player->isAlive()){ const DelayedTrick *trick = tricks.pop(); bool on_effect = room->cardEffect(trick, NULL, player); if(!on_effect) trick->onNullified(player); } break; } case Player::Draw: { player->drawCards(2, false); break; } case Player::Play: { while(player->isAlive()){ CardUseStruct card_use; room->activate(player, card_use); if(card_use.isValid()) room->useCard(card_use); else break; } break; } case Player::Discard:{ int discard_num = player->getHandcardNum() - player->getMaxCards(); if(discard_num > 0) room->askForDiscard(player, discard_num); break; } case Player::Finish: break; case Player::NotActive: return; } }
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 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 void onDamaged(ServerPlayer *target, const DamageStruct &damage) const{ if(target->askForSkillInvoke(objectName(), QVariant::fromValue(damage))){ target->getRoom()->playSkillEffect(objectName()); target->drawCards(1); if(target->isKongcheng()) return; Room *room = target->getRoom(); room->showAllCards(target); QList<const Card *> cards = target->getHandcards(); Card::Color color = cards.first()->getColor(); bool same_color = true; foreach(const Card *card, cards){ if(card->getColor() != color){ same_color = false; break; } } if(same_color && damage.from && !damage.from->isKongcheng()) room->askForDiscard(damage.from, objectName(), 1, 1); }
void GameRule::onPhaseChange(ServerPlayer *player) const{ Room *room = player->getRoom(); switch(player->getPhase()){ case Player::RoundStart:{ break; } case Player::Start: { player->setMark("SlashCount", 0); break; } case Player::Judge: { QList<const DelayedTrick *> tricks = player->delayedTricks(); while(!tricks.isEmpty() && player->isAlive()){ const DelayedTrick *trick = tricks.takeLast(); bool on_effect = room->cardEffect(trick, NULL, player); if(!on_effect) trick->onNullified(player); } break; } case Player::Draw: { QVariant num = 2; if(room->getTag("FirstRound").toBool()){ room->setTag("FirstRound", false); if(room->getMode() == "02_1v1") num = 1; } room->getThread()->trigger(DrawNCards, room, player, num); int n = num.toInt(); if(n > 0) player->drawCards(n, false); break; } case Player::Play: { player->clearHistory(); while(player->isAlive()){ CardUseStruct card_use; room->activate(player, card_use); if(card_use.isValid()){ room->useCard(card_use); }else break; } break; } case Player::Discard:{ while (player->getHandcardNum() > player->getMaxCards()) { int discard_num = player->getHandcardNum() - player->getMaxCards(); if(player->hasFlag("jilei")){ QSet<const Card *> jilei_cards; QList<const Card *> handcards = player->getHandcards(); foreach(const Card *card, handcards){ if(player->isJilei(card)) jilei_cards << card; } if(jilei_cards.size() > player->getMaxCards()){ // show all his cards room->showAllCards(player); DummyCard *dummy_card = new DummyCard; foreach(const Card *card, handcards.toSet() - jilei_cards){ dummy_card->addSubcard(card); } room->throwCard(dummy_card, player); return; } } if(discard_num > 0) { room->askForDiscard(player, "gamerule", discard_num, 1); } } break; }
void GameRule::onPhaseChange(ServerPlayer *player) const{ Room *room = player->getRoom(); switch(player->getPhase()){ case Player::RoundStart:{ break; } case Player::Start: { player->setMark("SlashCount", 0); if(room->getMode() == "05_2v3") if(player->isLord() || player->getRole() == "loyalist"){ int card_id = room->drawCard(); room->showCard(player, card_id); room->getThread()->delay(); player->addToPile("Angers", card_id); LogMessage log; log.type = "$Juqi"; log.from = player; log.card_str = QString::number(card_id); room->sendLog(log); if(player->getPile("Angers").length() > 4){ const QList<int> angs = player->getPile("Angers"); room->fillAG(angs, player); int card_id = room->askForAG(player, angs, false, "cbangercollect"); if(card_id < 0) card_id = player->getPile("Angers").first(); room->throwCard(card_id); player->invoke("clearAG"); } } break; } case Player::Judge: { QList<const DelayedTrick *> tricks = player->delayedTricks(); while(!tricks.isEmpty() && player->isAlive()){ const DelayedTrick *trick = tricks.takeLast(); bool on_effect = room->cardEffect(trick, NULL, player); if(!on_effect) trick->onNullified(player); } break; } case Player::Draw: { QVariant num = 2; if(room->getTag("FirstRound").toBool()){ room->setTag("FirstRound", false); if(room->getMode() == "02_1v1") num = 1; } room->getThread()->trigger(DrawNCards, player, num); int n = num.toInt(); if(n > 0) player->drawCards(n, false); room->getThread()->trigger(DrawNCardsDone, player, num); break; } case Player::Play: { player->clearHistory(); while(player->isAlive()){ CardUseStruct card_use; room->activate(player, card_use); if(card_use.isValid()){ room->useCard(card_use); }else break; } break; } case Player::Discard:{ int discard_num = player->getHandcardNum() - player->getMaxCards(); if(player->hasFlag("jilei")){ QSet<const Card *> jilei_cards; QList<const Card *> handcards = player->getHandcards(); foreach(const Card *card, handcards){ if(player->isJilei(card)) jilei_cards << card; } if(jilei_cards.size() > player->getMaxCards()){ // show all his cards room->showAllCards(player); DummyCard *dummy_card = new DummyCard; foreach(const Card *card, handcards.toSet() - jilei_cards){ dummy_card->addSubcard(card); } room->throwCard(dummy_card, player); return; } } if(discard_num > 0) room->askForDiscard(player, "gamerule", discard_num); break; }