virtual bool onPhaseChange(ServerPlayer *menghuo) const{ if(menghuo->getPhase() == Player::Draw && menghuo->isWounded()){ Room *room = menghuo->getRoom(); if(room->askForSkillInvoke(menghuo, objectName())){ int x = menghuo->getLostHp(), i; room->playSkillEffect(objectName(), 1); bool has_heart = false; for(i=0; i<x; i++){ int card_id = room->drawCard(); room->moveCardTo(Sanguosha->getCard(card_id), NULL, Player::Special, true); room->getThread()->delay(); const Card *card = Sanguosha->getCard(card_id); if(card->getSuit() == Card::Heart){ RecoverStruct recover; recover.card = card; recover.who = menghuo; room->recover(menghuo, recover); room->throwCard(card_id); has_heart = true; }else room->obtainCard(menghuo, card_id); } if(has_heart) room->playSkillEffect(objectName(), 2); else room->playSkillEffect(objectName(), 3); return true; } } return false; }
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; }