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); }