/* * divination.cpp * Divination spells * ____ _ * | _ \ ___ __ _| |_ __ ___ ___ * | |_) / _ \/ _` | | '_ ` _ \/ __| * | _ < __/ (_| | | | | | | \__ \ * |_| \_\___|\__,_|_|_| |_| |_|___/ * * Permission to use, modify and distribute is granted via the * Creative Commons - Attribution - Non Commercial - Share Alike 3.0 License * http://creativecommons.org/licenses/by-nc-sa/3.0/ * * Copyright (C) 2007-2012 Jason Mitchell, Randi Mitchell * Contributions by Tim Callahan, Jonathan Hseu * Based on Mordor (C) Brooke Paul, Brett J. Vickers, John P. Freeman * */ #include "mud.h" #include "move.h" //********************************************************************* // splTrueSight //********************************************************************* // This function allows players to detect misted vampires. int splTrueSight(Creature* player, cmd* cmnd, SpellData* spellData) { return(splGeneric(player, cmnd, spellData, "a", "true-sight", "true-sight")); } //********************************************************************* // splFarsight //********************************************************************* // allows target to see further in the overland map int splFarsight(Creature* player, cmd* cmnd, SpellData* spellData) { return(splGeneric(player, cmnd, spellData, "a", "farsight", "farsight")); } //********************************************************************* // splDetectMagic //********************************************************************* // This function allows players to cast the detect-magic spell which // allows the spell-castee to see magic items. int splDetectMagic(Creature* player, cmd* cmnd, SpellData* spellData) { return(splGeneric(player, cmnd, spellData, "a", "detect-magic", "detect-magic")); } //********************************************************************* // splDetectInvisibility //********************************************************************* // This function allows players to cast the detect-invisibility spell which // allows the target to see invisible items, monsters, and exits. int splDetectInvisibility(Creature* player, cmd* cmnd, SpellData* spellData) { return(splGeneric(player, cmnd, spellData, "a", "detect-invisibility", "detect-invisible")); } //********************************************************************* // splKnowAura //********************************************************************* // This spell allows the caster to determine what alignment another // target or player is by looking at it. int splKnowAura(Creature* player, cmd* cmnd, SpellData* spellData) { return(splGeneric(player, cmnd, spellData, "a", "know-aura", "know-aura")); } //********************************************************************* // splFortune //********************************************************************* // This allows bards to tell the luck of a given player. int splFortune(Creature* player, cmd* cmnd, SpellData* spellData) { Creature* target=0; int luk; Player *pPlayer = player->getAsPlayer(); if(player->getClass() != BARD && !player->isCt()) { player->print("Only bards may cast that spell.\n"); return(0); } if(cmnd->num == 2) { if(spellData->how == CAST || spellData->how == SCROLL || spellData->how == WAND) { player->print("Fortune spell cast on yourself.\n"); luk = pPlayer->getLuck() / 10; luk = MAX(luk, 1); switch(luk) { case 1: player->print("Your death will be tragic.\n."); break; case 2: player->print("A black cat must have crossed your path.\n"); break; case 3: player->print("If it weren't for bad luck you'd have no luck at all.\n"); break; case 4: player->print("Your karma is imbalanced.\n"); break; case 5: player->print("Your future is uncertain.\n"); break; case 6: player->print("Without intervention you may find yourself in a dire situation.\n"); break; case 7: player->print("Long range prospects look good.\n"); break; case 8: player->print("Count your blessings, for others are less fortunate.\n"); break; case 9: player->print("The fates have smiled upon you.\n"); break; case 10: player->print("Your death would be tragic.\n"); break; default: player->print("You can't tell right now.\n"); } broadcast(player->getSock(), player->getParent(), "%M reads %s fortune.", player, player->hisHer()); } else if(spellData->how == POTION) player->print("Nothing happens.\n"); } else { if(player->noPotion( spellData)) return(0); cmnd->str[2][0] = up(cmnd->str[2][0]); target = player->getParent()->findCreature(player, cmnd->str[2], cmnd->val[2], false); if(!target) { player->print("That's not here.\n"); return(0); } if(target->isMonster()) luk = target->getAlignment() / 10; else luk = target->getAsPlayer()->getLuck() / 10; luk = MAX(luk, 1); player->print("Fortune spell cast on %N.\n", target); switch (luk) { case 1: player->print("%M's death will be swift and certain.\n", target); break; case 2: player->print("You sense %N's karma is imbalanced.\n", target); break; case 3: player->print("A black cat must have crossed %N's path.\n", target); break; case 4: player->print("%M's aura reeks of danger.\n", target); break; case 5: player->print("Without intervention %N may end up in a dire situation.\n", target); break; case 6: player->print("%M's future is uncertain.\n", target); break; case 7: player->print("Long range prospects look good for %N.\n", target); break; case 8: player->print("%M should count their blessings, as others are less fortunate.\n", target); break; case 9: player->print("The fates smile upon %N.\n", target); break; case 10: player->print("%M's death will be tragic and unexpected.\n", target); break; default: player->print("You can't tell right now.\n"); } broadcast(player->getSock(), player->getParent(), "%M checks %N's fortune.", player, target); } return(1); } //********************************************************************* // splClairvoyance //********************************************************************* int splClairvoyance(Creature* player, cmd* cmnd, SpellData* spellData) { Player *pPlayer = player->getAsPlayer(); if(!pPlayer) return(0); Player *target=0; int chance=0; if(pPlayer->getClass() == BUILDER) { pPlayer->print("You cannot cast this spell.\n"); return(0); } if(cmnd->num < 3) { pPlayer->print("Cast clairvoyance on whom?\n"); return(0); } lowercize(cmnd->str[2], 1); target = gServer->findPlayer(cmnd->str[2]); if(!target || pPlayer == target || !pPlayer->canSee(target)) { pPlayer->print("That player is not logged on.\n"); return(0); } if(Move::tooFarAway(pPlayer, target, "clair")) return(0); broadcast(pPlayer->getSock(), pPlayer->getRoomParent(), "%M casts clairvoyance.", pPlayer); if(spellData->how == CAST) pPlayer->print("You attempt to focus on %N.\n", target); chance = 50 + (spellData->level - target->getLevel()) * 5 + (bonus((int) pPlayer->intelligence.getCur()) - bonus((int) target->intelligence.getCur())) * 5; chance += (pPlayer->getClass() == MAGE) ? 5 : 0; chance = MIN(85, chance); if(target->isStaff()) chance = 0; if( target->getRoomParent()->flagIsSet(R_NO_CLAIR_ROOM) || target->getRoomParent()->flagIsSet(R_LIMBO) || target->getRoomParent()->flagIsSet(R_VAMPIRE_COVEN) || target->getRoomParent()->isConstruction() || target->getRoomParent()->flagIsSet(R_SHOP_STORAGE) ) chance = 0; if(pPlayer->isStaff() || mrand(1, 100) < chance) { chance += (target->getClass() == MAGE) ? 5 : 0; chance = MIN(85, chance); chance = 60 + ((int)target->getLevel() - (int)spellData->level) * 5 + (bonus((int) target->intelligence.getCur()) - bonus((int) pPlayer->intelligence.getCur())) * 5; chance += (target->getClass() == MAGE) ? 5 : 0; chance = MIN(85, chance); if(!pPlayer->isStaff()) { if(!target->chkSave(MEN, pPlayer, 0)) { display_rom(target, pPlayer); if(mrand(1, 100) < chance) { // display a different string if the target can't see if(target->flagIsSet(P_SLEEPING) || target->isBlind()) { target->print("%M temporarily sees your surroundings.\n", pPlayer); } else { target->print("%M temporarily sees through your eyes.\n", pPlayer); } } } else { pPlayer->print("You failed to locate %N.\n", target); if(mrand(1, 100) < chance) target->print("%M tried to connect to your mind.\n", pPlayer); } } else { display_rom(target, pPlayer); } } else { pPlayer->print("Your mind is unable to connect.\n"); chance = 65 + ((int)target->getLevel() - (int)spellData->level) * 5 + (bonus((int) target->intelligence.getCur()) - bonus((int) pPlayer->intelligence.getCur())) * 5; if(!pPlayer->isStaff() && mrand(1, 100) < chance) target->print("%M attempts to connect to your mind.\n", pPlayer); } return(1); } //********************************************************************* // splComprehendLanguages //********************************************************************* int splComprehendLanguages(Creature* player, cmd* cmnd, SpellData* spellData) { if(spellData->how == CAST && player->getClass() != MAGE && player->getClass() != BARD && !player->isStaff()) { player->print("Only mages and bards may cast that spell.\n"); return(0); } return(splGeneric(player, cmnd, spellData, "a", "comprehend-languages", "comprehend-languages")); } //********************************************************************* // splTongues //********************************************************************* int splTongues(Creature* player, cmd* cmnd, SpellData* spellData) { if(spellData->how == CAST && player->getClass() != MAGE && player->getClass() != BARD && !player->isStaff()) { player->print("Only mages and bards may cast that spell.\n"); return(0); } return(splGeneric(player, cmnd, spellData, "a", "tongues", "tongues")); } //********************************************************************* // splDetectHidden //********************************************************************* int splDetectHidden(Creature* player, cmd* cmnd, SpellData* spellData) { if(!player->isPlayer()) return(0); if(spellData->how == CAST) { if(!player->isMageLich()) return(0); player->print("You cast a detect-hidden spell.\n"); broadcast(player->getSock(), player->getParent(), "%M casts a detect-hidden spell.", player); } Player* viewer = player->getAsPlayer(); display_rom(viewer, viewer, spellData->level); return(1); }