コード例 #1
0
ファイル: healmagic.cpp プロジェクト: RealmsMud/RealmsCode
int doRes(Creature* caster, cmd* cmnd, bool res) {
    // if ress=false, it's a bloodfusion
    Player  *player = caster->getAsPlayer();
    int     prevLevel=0;
    bool    full=false;
    long    t=0;
    Player *target=0;
    BaseRoom *newRoom=0;

    if(player && !player->isDm()) {
        if(player->getNegativeLevels()) {
            player->print("You cannot do that without your full life essence.\n");
            return(0);
        }
        if(player->mp.getCur() < player->mp.getMax()) {
            player->print("You must have full MP to cast that spell.\n");
            return(0);
        }
    } else {
        // a DM can set to a 100% restore instead of 80%
        if(cmnd->num == 4 && !strcasecmp(cmnd->str[3], "-full"))
            full = true;
    }


    if(cmnd->num < 2) {
        caster->print("%s?\n", res ? "Resurrect whom" : "Fuse whom with new blood");
        return(0);
    }

    cmnd->str[2][0] = up(cmnd->str[2][0]);
    target = gServer->findPlayer(cmnd->str[2]);
    if(!target) {
        caster->print("That player is not online.\n");
        return(0);
    }

    if(target->isDm() && target->flagIsSet(P_DM_INVIS) && !caster->isDm()) {
        caster->print("That player is not online.\n");
        return(0);
    }

    if(target->isStaff()) {
        caster->print("Staff characters do not need to be %s.\n",
            res ? "resurrected" : "fused with blood");
        return(0);
    }

    if(checkRefusingMagic(caster, target))
        return(0);

    if(Move::tooFarAway(caster, target, res ? "resurrect" : "fuse with new blood"))
        return(0);

    if(res) {
        if(target->isUndead()) {
            caster->print("Undead players cannot be resurrected.\n");
            return(0);
        }
    } else {
        if(!target->isUndead()) {
            caster->print("Only undead players can be fused with new blood.\n");
            return(0);
        }
    }


    if(!caster->isDm()) {
        if(target->getLocation() != target->getLimboRoom()) {
            caster->print("%s is not in limbo! How can you %s %s?\n",
                target->getCName(), res ? "resurrect" : "bloodfuse", target->himHer());
            return(0);
        }
        if(target->getLevel() < 7) {
            caster->print("%s is not yet powerful enough to be %s.\n",
                target->getCName(), res ? "resurrected" : "fused with blood");
            return(0);
        }
        if(!target->flagIsSet(P_KILLED_BY_MOB)) {
            caster->print("%s does not need to be %s.\n", target->getCName(), res ? "resurrected" : "fused with new blood");
            return(0);
        }
    }

    if(target == caster) {
        caster->print("You cannot %s.\n", res ? "resurrect yourself" : "fuse yourself with new blood");
        return(0);
    }

    if(player && !player->isDm() && player->daily[DL_RESURRECT].cur == 0) {
        player->print("You have done that enough times for today.\n");
        return(0);
    }

    if(!caster->isDm() && target->daily[DL_RESURRECT].cur == 0) {
        caster->print("Players can only be %s once per 24 hours real time.\n", res ? "resurrected" : "fused with new blood");
        return(0);
    }


    caster->print("You cast a %s spell on %N.\n", res ? "resurrection" : "bloodfusion", target);

    prevLevel = target->getLevel();
    long expGain = full ? (target->statistics.getLastExperienceLoss()*4/5) : (target->statistics.getLastExperienceLoss());

    EffectInfo *effect = target->getEffect("death-sickness");
    if(effect) {
        if(full)
            target->removeEffect("death-sickness");
        else
            effect->setDuration(effect->getDuration() / 3);
    }

    target->cureDisease();
    target->curePoison();
    target->removeEffect("hold-person");
    target->removeEffect("petrification");
    target->removeEffect("confusion");
    target->removeEffect("drunkenness");

    target->clearFlag(P_KILLED_BY_MOB);
    target->setTickDamage(0);

    if(player)
        dec_daily(&player->daily[DL_RESURRECT]);
    dec_daily(&target->daily[DL_RESURRECT]);


    broadcast(caster->getSock(), caster->getRoomParent(), "%M casts a %s spell on %N.", caster, res ? "resurrection" : "bloodfusion", target);

    logn("log.resurrect", "%s(L:%d) %s %s(L%d:%d) %s.\n", caster->getCName(), caster->getLevel(),
        res ? "resurrected" : "fused", target->getCName(), prevLevel, target->getLevel(),
        res ? "from the dead" : "with new blood");

    if(res)
        broadcast("^R### %M just resurrected %s from the dead!", caster, target->getCName());
    else
        broadcast("^R### %M just fused %s with new blood!", caster, target->getCName());


    if(player && !player->isDm()) {
        t = time(0);
        caster->setFlag(P_NO_TICK_MP);
        // caster cannot tick MP for 20 mins online time
        caster->lasttime[LT_NOMPTICK].ltime = t;
        caster->lasttime[LT_NOMPTICK].interval = 120L;

        broadcast(caster->getSock(), caster->getRoomParent(), "%M collapses from exhaustion.", caster);
        caster->print("You collapse from exhaustion.\n");
        caster->knockUnconscious(120);

        caster->mp.setCur(0);
    }

    newRoom = target->getRecallRoom().loadRoom(target);
    if(newRoom) {
        target->deleteFromRoom();
        target->addToRoom(newRoom);
        target->doPetFollow();
    }

    target->print("You have been %s!\n", res ? "resurrected from the dead" : "fused with new blood");


    // Gain back 80% of lost experience

    target->addExperience(expGain);
    // See if we need to relevel
    target->checkLevel();

    target->hp.restore();
    target->mp.restore();
    target->pp.restore();

    target->computeAttackPower();
    target->computeAC();

    target->clearAsEnemy();
    target->save(true);
    updateRecentActivity();
    return(1);
}