void DelayedTrick::onEffect(const CardEffectStruct &effect) const{ Room *room = effect.to->getRoom(); LogMessage log; log.from = effect.to; log.type = "#DelayedTrick"; log.arg = effect.card->objectName(); room->sendLog(log); JudgeStruct judge_struct = judge; judge_struct.who = effect.to; room->judge(judge_struct); bool willthrow = true; bool takeffect = false; if(judge_struct.isBad()) takeffect = true; else if(movable){ willthrow = false; onNullified(effect.to); } if(willthrow) room->moveCardTo(this, NULL, Player::DiscardedPile); //room->throwCard(this); if(takeffect) takeEffect(effect.to); }
void DelayedTrick::onEffect(const CardEffectStruct &effect) const { Room *room = effect.to->getRoom(); CardMoveReason reason(CardMoveReason::S_REASON_USE, effect.to->objectName(), getSkillName(), QString()); room->moveCardTo(this, NULL, Player::PlaceTable, reason, true); LogMessage log; log.from = effect.to; log.type = "#DelayedTrick"; log.arg = effect.card->objectName(); room->sendLog(log); JudgeStruct judge_struct = judge; judge_struct.who = effect.to; room->judge(judge_struct); if (judge_struct.isBad()) { takeEffect(effect.to); if (room->getCardOwner(getEffectiveId()) == NULL) { CardMoveReason reason(CardMoveReason::S_REASON_NATURAL_ENTER, QString()); room->throwCard(this, reason, NULL); } } else if (movable) { onNullified(effect.to); } else { if (room->getCardOwner(getEffectiveId()) == NULL) { CardMoveReason reason(CardMoveReason::S_REASON_NATURAL_ENTER, QString()); room->throwCard(this, reason, NULL); } } }
void DelayedTrick::onNullified(ServerPlayer *target) const { Room *room = target->getRoom(); RoomThread *thread = room->getThread(); if (movable) { QList<ServerPlayer *> players = room->getOtherPlayers(target); players << target; ServerPlayer *next = NULL; //next meaning this next one bool next2next = false; //it's meaning another next(a second next) is necessary foreach (ServerPlayer *player, players) { if (player->containsTrick(objectName())) continue; const ProhibitSkill *skill = room->isProhibited(target, player, this); if (skill) { LogMessage log; log.type = "#SkillAvoid"; log.from = player; log.arg = skill->objectName(); log.arg2 = objectName(); room->sendLog(log); room->broadcastSkillInvoke(skill->objectName()); continue; } next = player; CardMoveReason reason(CardMoveReason::S_REASON_TRANSFER, target->objectName(), QString(), getSkillName(), QString()); room->moveCardTo(this, target, player, Player::PlaceDelayedTrick, reason, true); if (target == player) break; CardUseStruct use; use.from = NULL; use.to << player; use.card = this; QVariant data = QVariant::fromValue(use); thread->trigger(TargetConfirming, room, data); CardUseStruct new_use = data.value<CardUseStruct>(); if (new_use.to.isEmpty()) { next2next = true; break; } thread->trigger(TargetConfirmed, room, data); break; } //case:stop. if (!next) { CardMoveReason reason(CardMoveReason::S_REASON_TRANSFER, target->objectName(), QString(), getSkillName(), QString()); room->moveCardTo(this, target, target, Player::PlaceDelayedTrick, reason, true); } //case: next2next if (next && next2next) onNullified(next); } else {
void DelayedTrick::use(Room *room, ServerPlayer *source, QList<ServerPlayer *> &targets) const{ if (targets.isEmpty()) { if (movable) { onNullified(source); if (room->getCardOwner(getEffectiveId()) != source) return; } CardMoveReason reason(CardMoveReason::S_REASON_USE, source->objectName(), QString(), this->getSkillName(), QString()); room->moveCardTo(this, source, NULL, Player::DiscardPile, reason, true); } }
void DelayedTrick::onNullified(ServerPlayer *target) const { Room *room = target->getRoom(); RoomThread *thread = room->getThread(); if (movable) { QList<ServerPlayer *> players = room->getOtherPlayers(target); players << target; ServerPlayer *p = NULL; foreach (ServerPlayer *player, players) { if (player->containsTrick(objectName())) continue; const ProhibitSkill *skill = room->isProhibited(target, player, this); if (skill) { if (skill->isVisible()) { LogMessage log; log.type = "#SkillAvoid"; log.from = player; log.arg = skill->objectName(); log.arg2 = objectName(); room->sendLog(log); room->broadcastSkillInvoke(skill->objectName()); } continue; } CardMoveReason reason(CardMoveReason::S_REASON_TRANSFER, target->objectName(), QString(), this->getSkillName(), QString()); room->moveCardTo(this, target, player, Player::PlaceDelayedTrick, reason, true); if (target == player) break; CardUseStruct use; use.from = NULL; use.to << player; use.card = this; QVariant data = QVariant::fromValue(use); thread->trigger(TargetConfirming, room, player, data); CardUseStruct new_use = data.value<CardUseStruct>(); if (new_use.to.isEmpty()) { p = player; break; } foreach(ServerPlayer *p, room->getAllPlayers()) thread->trigger(TargetConfirmed, room, p, data); break; } if (p) onNullified(p); } else {
void DelayedTrick::use(Room *room, ServerPlayer *source, QList<ServerPlayer *> &targets) const { QStringList nullified_list = room->getTag("CardUseNullifiedList").toStringList(); bool all_nullified = nullified_list.contains("_ALL_TARGETS"); if (all_nullified || targets.isEmpty()) { if (movable) { onNullified(source); if (room->getCardOwner(getEffectiveId()) != source) return; } CardMoveReason reason(CardMoveReason::S_REASON_USE, source->objectName(), QString(), this->getSkillName(), QString()); room->moveCardTo(this, room->getCardOwner(getEffectiveId()), NULL, Player::DiscardPile, reason, true); } }
void DelayedTrick::onEffect(const CardEffectStruct &effect) const { Room *room = effect.to->getRoom(); CardMoveReason reason(CardMoveReason::S_REASON_USE, effect.to->objectName(), getSkillName(), QString()); room->moveCardTo(this, NULL, Player::PlaceTable, reason, true); LogMessage log; log.from = effect.to; log.type = "#DelayedTrick"; log.arg = effect.card->objectName(); room->sendLog(log); JudgeStruct judge_struct = judge; judge_struct.who = effect.to; room->judge(judge_struct); if (judge_struct.negative == judge_struct.isBad()) { if (effect.to->isAlive()) takeEffect(effect.to); if (room->getCardOwner(getEffectiveId()) == NULL) { CardMoveReason reason(CardMoveReason::S_REASON_NATURAL_ENTER, QString()); room->throwCard(this, reason, NULL); } } else if (movable) { onNullified(effect.to); } else if (returnable && effect.to->isAlive()) { if (room->getCardOwner(getEffectiveId()) == NULL) { if (isVirtualCard()) { Card *delayTrick = Sanguosha->cloneCard(objectName()); WrappedCard *vs_card = Sanguosha->getWrappedCard(getEffectiveId()); vs_card->setSkillName(getSkillName()); vs_card->takeOver(delayTrick); room->broadcastUpdateCard(room->getAlivePlayers(), vs_card->getId(), vs_card); } CardsMoveStruct move; move.card_ids << getEffectiveId(); move.to = effect.to; move.to_place = Player::PlaceDelayedTrick; room->moveCardsAtomic(move, true); } } else { if (room->getCardOwner(getEffectiveId()) == NULL) { CardMoveReason reason(CardMoveReason::S_REASON_NATURAL_ENTER, QString()); room->throwCard(this, reason, NULL); } } }
void DelayedTrick::onEffect(const CardEffectStruct &effect) const{ Room *room = effect.to->getRoom(); if(!movable) room->throwCard(this); LogMessage log; log.from = effect.to; log.type = "#DelayedTrick"; log.arg = effect.card->objectName(); room->sendLog(log); Q_ASSERT(callback != NULL); if(room->judge(effect.to, callback) == "bad"){ room->throwCard(this); takeEffect(effect.to); }else if(movable){ onNullified(effect.to); } }
void DelayedTrick::onEffect(const CardEffectStruct &effect) const{ Room *room = effect.to->getRoom(); if(!movable) room->throwCard(this); LogMessage log; log.from = effect.to; log.type = "#DelayedTrick"; log.arg = effect.card->objectName(); room->sendLog(log); JudgeStruct judge_struct = judge; judge_struct.who = effect.to; room->judge(judge_struct); if(judge_struct.isBad()){ room->throwCard(this); takeEffect(effect.to); }else if(movable){ onNullified(effect.to); } }