virtual void onDamaged(ServerPlayer *guojia, const DamageStruct &damage) const{ Room *room = guojia->getRoom(); room->playSkillEffect(objectName()); int n = damage.damage * 3; guojia->drawCards(n); QList<int> yiji_cards = guojia->handCards().mid(guojia->getHandcardNum() - n); while(room->askForYiji(guojia, yiji_cards)) ; // empty loop }
virtual bool onPhaseChange(ServerPlayer *target) const{ Room *room = target->getRoom(); if (target->getPhase() == Player::Finish && target->isWounded() && target->askForSkillInvoke(objectName())) { room->broadcastSkillInvoke(objectName(), 1); QStringList draw_num; for (int i = 1; i <= target->getLostHp(); draw_num << QString::number(i++)) {} int num = room->askForChoice(target, "miji_draw", draw_num.join("+")).toInt(); target->drawCards(num, objectName()); if (!target->isKongcheng()) { int n = 0; forever { int original_handcardnum = target->getHandcardNum(); if (n < num && !target->isKongcheng()) { QList<int> handcards = target->handCards(); if (!room->askForYiji(target, handcards, objectName(), false, false, false, num - n)) break; n += original_handcardnum - target->getHandcardNum(); } else { break; } } // give the rest cards randomly if (n < num && !target->isKongcheng()) { int rest_num = num - n; forever { QList<int> handcard_list = target->handCards(); qShuffle(handcard_list); int give = qrand() % rest_num + 1; rest_num -= give; QList<int> to_give = handcard_list.length() < give ? handcard_list : handcard_list.mid(0, give); ServerPlayer *receiver = room->getOtherPlayers(target).at(qrand() % (target->aliveCount() - 1)); DummyCard *dummy = new DummyCard; foreach (int id, to_give) dummy->addSubcard(id); room->obtainCard(receiver, dummy, false); delete dummy; if (rest_num == 0 || target->isKongcheng()) break; } }