virtual bool onPhaseChange(ServerPlayer *wangyi) const{
        if(!wangyi->isWounded())
            return false;
        if(wangyi->getPhase() == Player::Start || wangyi->getPhase() == Player::Finish){
            if(!wangyi->askForSkillInvoke(objectName()))
                return false;
            Room *room = wangyi->getRoom();
            room->broadcastSkillInvoke(objectName(), 1);
            JudgeStruct judge;
            judge.pattern = QRegExp("(.*):(club|spade):(.*)");
            judge.good = true;
            judge.reason = objectName();
            judge.who = wangyi;

            room->judge(judge);

            if(judge.isGood()){
                int x = wangyi->getLostHp();
                wangyi->drawCards(x); //It should be preview, not draw
                ServerPlayer *target = room->askForPlayerChosen(wangyi, room->getAllPlayers(), objectName());

                if (target == wangyi)
                    room->broadcastSkillInvoke(objectName(), 2);
                else if (target->getGeneralName().contains("machao"))
                    room->broadcastSkillInvoke(objectName(), 4);
                else
                    room->broadcastSkillInvoke(objectName(), 3);

                QList<const Card *> miji_cards = wangyi->getHandcards().mid(wangyi->getHandcardNum() - x);
                foreach(const Card *card, miji_cards){
                    CardMoveReason reason(CardMoveReason::S_REASON_GIVE, wangyi->objectName());
                    reason.m_playerId == target->objectName();
                    room->obtainCard(target, card, reason, false);
                }
            }
QString GeneralSelector::selectFirst(ServerPlayer *player, const QStringList &candidates)
{
    QMap<QString, qreal> values;
    QString role = player->getRole();
    ServerPlayer *lord = player->getRoom()->getLord();
    foreach (QString candidate, candidates) {
        qreal value = 5.0;
        const General *general = Sanguosha->getGeneral(candidate);
        if (role == "loyalist" && lord && (general->getKingdom() == lord->getKingdom() || general->getKingdom() == "god"))
            value *= 1.04;
        if (role == "rebel" && lord && lord->getGeneral() && lord->getGeneral()->hasSkill("xueyi")
            && general->getKingdom() == "qun")
            value *= 0.8;
        if (role != "loyalist" && lord && lord->getGeneral() && lord->getGeneral()->hasSkill("shichou")
            && general->getKingdom() == "shu")
            value *= 0.1;
        if (role == "rebel" && lord && lord->getGeneral() && lord->getGeneral()->hasSkill("guiming")
            && general->getKingdom() == "wu")
            value *= 0.5;
        QString key = QString("_:%1:%2").arg(candidate).arg(role);
        value *= qPow(1.1, first_general_table.value(key, 0.0));
        if (lord) {
            QString key2 = QString("%1:%2:%3").arg(lord->getGeneralName()).arg(candidate).arg(role);
            value *= qPow(1.1, first_general_table.value(key2, 0.0));
        }
        values.insert(candidate, value);
    }
 virtual bool trigger(TriggerEvent , Room *room, ServerPlayer *player, QVariant &data) const{
     RecoverStruct recover_struct = data.value<RecoverStruct>();
     int recover = recover_struct.recover;
     for (int i = 0; i < recover; i++) {
         ServerPlayer *target = room->askForPlayerChosen(player, room->getOtherPlayers(player), objectName(), "shushen-invoke", true, true);
         if (target) {
             room->broadcastSkillInvoke(objectName(), target->getGeneralName().contains("liubei") ? 2 : 1);
             target->drawCards(1);
         } else {
             break;
         }
     }
     return false;
 }
 bool trigger(TriggerEvent, Room *room, ServerPlayer *player, QVariant &data) const
 {
     RecoverStruct recover_struct = data.value<RecoverStruct>();
     int recover = recover_struct.recover;
     for (int i = 0; i < recover; i++) {
         ServerPlayer *target = room->askForPlayerChosen(player, room->getOtherPlayers(player), objectName(), "shushen-invoke", true, true);
         if (target) {
             room->broadcastSkillInvoke(objectName(), target->getGeneralName().contains("liubei") ? 2 : 1);
             if (target->isWounded() && room->askForChoice(player, objectName(), "recover+draw", QVariant::fromValue(target)) == "recover")
                 room->recover(target, RecoverStruct(player));
             else
                 target->drawCards(2, objectName());
         } else {
             break;
         }
     }
     return false;
 }
QString GeneralSelector::selectFirst(ServerPlayer *player, const QStringList &candidates){
    QString role = player->getRole();
    int seat = player->getSeat();
    int player_count = Sanguosha->getPlayerCount(player->getRoom()->getMode());
    int index = seat;
    if(player_count < 8 && seat == player_count)
        index = 8;
    else if(player_count > 8 && seat > 8)
        index = 8;

    int max = -1;
    QString max_general;

    qreal default_value;
    if(role == "loyalist")
        default_value = 6.5;
    else if(role == "rebel")
        default_value = 7.3;
    else
        default_value = 6.3;

    ServerPlayer *lord = player->getRoom()->getLord();
    QString lord_kingdom, suffix = QString();
    if(lord->getGeneral() && lord->getGeneral()->isLord()){
        lord_kingdom = lord->getKingdom();
        suffix = lord->getGeneralName();
    }

    foreach(QString candidate, candidates){
        QString key = QString("%1:%2:%3:%4").arg(candidate).arg(role).arg(index).arg(suffix);
        qreal value = first_general_table.value(key, default_value);

        if(!lord_kingdom.isNull() && (role == "loyalist" || role == "renegade")){
            const General *general = Sanguosha->getGeneral(candidate);
            if(general->getKingdom() == lord_kingdom)
                value += 0.5;
        }

        if(value > max){
            max = value;
            max_general = candidate;
        }
    }
QString GeneralSelector::selectFirst(ServerPlayer *player, const QStringList &candidates) {
    QString role = player->getRole();
    int seat = player->getSeat();
    Q_ASSERT(player->getRoom() != NULL);
    int player_count = Sanguosha->getPlayerCount(player->getRoom()->getMode());
    int index = seat;
    if (player_count < 8 && seat == player_count)
        index = 8;
    else if (player_count > 8 && seat > 8)
        index = 8;

    QString max_general;

    ServerPlayer *lord = player->getRoom()->getLord();
    QString suffix = QString();
    if (lord->getGeneral() && lord->getGeneral()->isLord())
        suffix = lord->getGeneralName();

    QStringList key_list;
    foreach (QString candidate, candidates) {
        QString key = QString("%1:%2:%3:%4").arg(candidate).arg(role).arg(index).arg(suffix);
        key_list << key;
    }
Exemple #7
0
    virtual bool trigger(TriggerEvent, Room *room, ServerPlayer *caopi, QVariant &data) const{
        DeathStruct death = data.value<DeathStruct>();
        ServerPlayer *player = death.who;
        if (player->isNude() || caopi == player)
            return false;
        if (caopi->isAlive() && room->askForSkillInvoke(caopi, objectName(), data)) {
            bool isCaoCao = player->getGeneralName().contains("caocao");
            room->broadcastSkillInvoke(objectName(), (isCaoCao ? 3 : (player->isMale() ? 1 : 2)));

            DummyCard *dummy = new DummyCard;
            QList <const Card *> handcards = player->getHandcards();
            foreach (const Card *card, handcards)
                dummy->addSubcard(card);

            QList <const Card *> equips = player->getEquips();
            foreach (const Card *card, equips)
                dummy->addSubcard(card);

            if (dummy->subcardsLength() > 0) {
                CardMoveReason reason(CardMoveReason::S_REASON_RECYCLE, caopi->objectName());
                room->obtainCard(caopi, dummy, reason, false);
            }
            delete dummy;
        }