void RendeCard::use(Room *room, ServerPlayer *source, QList<ServerPlayer *> &targets) const{ ServerPlayer *target = targets.first(); int old_value = source->getMark("rende"); QList<int> rende_list; if (old_value > 0) rende_list = StringList2IntList(source->property("rende").toString().split("+")); else rende_list = source->handCards(); foreach (int id, this->subcards) rende_list.removeOne(id); room->setPlayerProperty(source, "rende", IntList2StringList(rende_list).join("+")); CardMoveReason reason(CardMoveReason::S_REASON_GIVE, source->objectName(), target->objectName(), "rende", QString()); room->obtainCard(target, this, reason, false); int new_value = old_value + subcards.length(); room->setPlayerMark(source, "rende", new_value); if (old_value < 2 && new_value >= 2) { RecoverStruct recover; recover.card = this; recover.who = source; room->recover(source, recover); } if (room->getMode() == "04_1v3" && source->getMark("rende") >= 2) return; if (source->isKongcheng() || source->isDead() || rende_list.isEmpty()) return; room->addPlayerHistory(source, "RendeCard", -1); if (!room->askForUseCard(source, "@@rende", "@rende-give", -1, Card::MethodNone)) room->addPlayerHistory(source, "RendeCard"); }
LuaSkillCard *LuaSkillCard::Parse(const QString &str) { QRegExp rx("#(\\w+):(.*):(.*)"); QRegExp e_rx("#(\\w*)\\[(\\w+):(.+)\\]:(.*):(.*)"); static QMap<QString, Card::Suit> suit_map; if (suit_map.isEmpty()) { suit_map.insert("spade", Card::Spade); suit_map.insert("club", Card::Club); suit_map.insert("heart", Card::Heart); suit_map.insert("diamond", Card::Diamond); suit_map.insert("no_suit_red", Card::NoSuitRed); suit_map.insert("no_suit_black", Card::NoSuitBlack); suit_map.insert("no_suit", Card::NoSuit); } QStringList texts; QString name, suit, number; QString subcard_str; QString user_string; if (rx.exactMatch(str)) { texts = rx.capturedTexts(); name = texts.at(1); subcard_str = texts.at(2); user_string = texts.at(3); } else if (e_rx.exactMatch(str)) { texts = e_rx.capturedTexts(); name = texts.at(1); suit = texts.at(2); number = texts.at(3); subcard_str = texts.at(4); user_string = texts.at(5); } else return NULL; const LuaSkillCard *c = LuaSkillCards.value(name, NULL); if (c == NULL) return NULL; LuaSkillCard *new_card = c->clone(); if (subcard_str != ".") new_card->addSubcards(StringList2IntList(subcard_str.split("+"))); if (!suit.isEmpty()) new_card->setSuit(suit_map.value(suit, Card::NoSuit)); if (!number.isEmpty()) { int num = 0; if (number == "A") num = 1; else if (number == "J") num = 11; else if (number == "Q") num = 12; else if (number == "K") num = 13; else num = number.toInt(); new_card->setNumber(num); } new_card->setUserString(user_string); QString skillName = LuaSkillCardsSkillName.value(name, QString()); if (skillName.isEmpty()) skillName = name.toLower().remove("card"); new_card->setSkillName(skillName); return new_card; }
void NosYijiViewAsSkill::setCards(const QString &card_str) { QStringList cards = card_str.split("+"); ids = StringList2IntList(cards); }