/*
* MAGIC4.C:
*
* Additional spell-casting routines.
*
* Copyright (C) 1991, 1992, 1993 Brett J. Vickers
*
*/
#include "mstruct.h"
#include "mextern.h"
/**********************************************************************/
/* detectinvis */
/**********************************************************************/
/* This function allows players to cast the detect-invisible spell which */
/* allows the spell-castee to see invisible items. */
int detectinvis(ply_ptr, cmnd, how)
creature *ply_ptr;
cmd *cmnd;
int how;
{
creature *crt_ptr;
room *rom_ptr;
long t;
int fd;
fd = ply_ptr->fd;
rom_ptr = ply_ptr->parent_rom;
t = time(0);
if(ply_ptr->mpcur < 10 && how == CAST) {
print(fd, "Not enough magic points.\n");
return(0);
}
if(!S_ISSET(ply_ptr, SDINVI) && how == CAST) {
print(fd, "You don't know that spell.\n");
return(0);
}
if(spell_fail(ply_ptr)) {
if(how==CAST)
ply_ptr->mpcur -= 10;
return(0);
}
/* Cast detect-invisibility on self */
if(cmnd->num == 2) {
ply_ptr->lasttime[LT_DINVI].ltime = t;
if(how == CAST) {
ply_ptr->lasttime[LT_DINVI].interval = MAX(300, 1200 +
bonus[ply_ptr->intelligence]*600);
if(ply_ptr->class == MAGE)
ply_ptr->lasttime[LT_DINVI].interval +=
60*ply_ptr->level;
ply_ptr->mpcur -= 10;
if (F_ISSET(ply_ptr->parent_rom,RPMEXT)){
print(fd,"The room's magical properties increase the power of your spell.\n");
ply_ptr->lasttime[LT_DINVI].interval += 600L;
}
}
else
ply_ptr->lasttime[LT_DINVI].interval = 1200;
if(how == CAST || how == SCROLL || how == WAND) {
print(fd,"Detect-invisibile spell cast.\n");
broadcast_rom(fd, ply_ptr->rom_num,
"%M casts detect-invisible on %sself.",
ply_ptr,
F_ISSET(ply_ptr, PMALES) ? "him":"her");
}
else if(how == POTION)
print(fd, "Your eyes tingle.\n");
F_SET(ply_ptr, PDINVI);
return(1);
}
/* Cast detect-invisibility on another player */
else {
if(how == POTION) {
print(fd, "You can only use a potion on yourself.\n");
return(0);
}
cmnd->str[2][0] = up(cmnd->str[2][0]);
crt_ptr = find_crt(ply_ptr, rom_ptr->first_ply,
cmnd->str[2], cmnd->val[2]);
if(!crt_ptr) {
print(fd, "That player is not here.\n");
return(0);
}
crt_ptr->lasttime[LT_DINVI].ltime = t;
if(how == CAST) {
crt_ptr->lasttime[LT_DINVI].interval = MAX(300, 1200 +
bonus[ply_ptr->intelligence]*600);
if(ply_ptr->class == MAGE)
crt_ptr->lasttime[LT_DINVI].interval +=
60*ply_ptr->level;
ply_ptr->mpcur -= 10;
if (F_ISSET(ply_ptr->parent_rom,RPMEXT)){
print(fd,"The room's magical properties increase the power of your spell.\n");
crt_ptr->lasttime[LT_DINVI].interval += 600L;
}
}
else
crt_ptr->lasttime[LT_DINVI].interval = 1200;
F_SET(crt_ptr, PDINVI);
if(how == CAST || how == SCROLL || how == WAND) {
print(fd, "Detect-invisible cast on %m.\n", crt_ptr);
print(crt_ptr->fd,
"%M casts a detect-invisible spell on you.\n",
ply_ptr);
broadcast_rom2(fd, crt_ptr->fd, ply_ptr->rom_num,
"%M casts detect-invisible on %m.",
ply_ptr, crt_ptr);
return(1);
}
}
return(1);
}
/**********************************************************************/
/* detectmagic */
/**********************************************************************/
/* This function allows players to cast the detect-magic spell which */
/* allows the spell-castee to see magic items. */
int detectmagic(ply_ptr, cmnd, how)
creature *ply_ptr;
cmd *cmnd;
int how;
{
creature *crt_ptr;
room *rom_ptr;
long t;
int fd;
fd = ply_ptr->fd;
rom_ptr = ply_ptr->parent_rom;
t = time(0);
if(ply_ptr->mpcur < 10 && how == CAST) {
print(fd, "Not enough magic points.\n");
return(0);
}
if(!S_ISSET(ply_ptr, SDMAGI) && how == CAST) {
print(fd, "You don't know that spell.\n");
return(0);
}
if(spell_fail(ply_ptr)) {
if(how==CAST)
ply_ptr->mpcur -= 10;
return(0);
}
/* Cast detect-magic on self */
if(cmnd->num == 2) {
ply_ptr->lasttime[LT_DMAGI].ltime = t;
if(how == CAST) {
ply_ptr->lasttime[LT_DMAGI].interval = MAX(300, 1200 +
bonus[ply_ptr->intelligence]*600);
if(ply_ptr->class == MAGE)
ply_ptr->lasttime[LT_DMAGI].interval +=
60*ply_ptr->level;
ply_ptr->mpcur -= 10;
if (F_ISSET(ply_ptr->parent_rom,RPMEXT)){
print(fd,"The room's magical properties increase the power of your spell.\n");
ply_ptr->lasttime[LT_DMAGI].interval += 600L;
}
}
else
ply_ptr->lasttime[LT_DMAGI].interval = 1200;
if(how == CAST || how == SCROLL || how == WAND) {
print(fd,"Detect-magic spell cast.\n");
broadcast_rom(fd, ply_ptr->rom_num,
"%M casts detect-magic on %sself.",
ply_ptr,
F_ISSET(ply_ptr, PMALES) ? "him":"her");
}
else if(how == POTION)
print(fd, "Your eyes feel funny.\n");
F_SET(ply_ptr, PDMAGI);
return(1);
}
/* Cast detect-magic on another player */
else {
if(how == POTION) {
print(fd, "You can only use a potion on yourself.\n");
return(0);
}
cmnd->str[2][0] = up(cmnd->str[2][0]);
crt_ptr = find_crt(ply_ptr, rom_ptr->first_ply,
cmnd->str[2], cmnd->val[2]);
if(!crt_ptr) {
print(fd, "That player is not here.\n");
return(0);
}
crt_ptr->lasttime[LT_DMAGI].ltime = t;
if(how == CAST) {
crt_ptr->lasttime[LT_DMAGI].interval = MAX(300, 1200 +
bonus[ply_ptr->intelligence]*600);
if(ply_ptr->class == MAGE)
crt_ptr->lasttime[LT_DMAGI].interval +=
60*ply_ptr->level;
ply_ptr->mpcur -= 10;
if (F_ISSET(ply_ptr->parent_rom,RPMEXT)){
print(fd,"The room's magical properties increase the power of your spell.\n");
crt_ptr->lasttime[LT_DMAGI].interval += 600L;
}
}
else
crt_ptr->lasttime[LT_DMAGI].interval = 1200;
F_SET(crt_ptr, PDMAGI);
if(how == CAST || how == SCROLL || how == WAND) {
print(fd, "Detect-magic cast on %m.\n", crt_ptr);
print(crt_ptr->fd,
"%M casts a detect-magic spell on you.\n",
ply_ptr);
broadcast_rom2(fd, crt_ptr->fd, ply_ptr->rom_num,
"%M casts detect-magic on %m.",
ply_ptr, crt_ptr);
return(1);
}
}
return(1);
}
/**********************************************************************/
/* teleport */
/**********************************************************************/
/* This function allows a player to teleport himself or another player */
/* to another room randomly. */
int teleport(ply_ptr, cmnd, how)
creature *ply_ptr;
cmd *cmnd;
int how;
{
creature *crt_ptr;
room *rom_ptr, *new_rom;
int fd, rtn, rom_num;
fd = ply_ptr->fd;
rom_ptr = ply_ptr->parent_rom;
if(ply_ptr->mpcur < 20 && how == CAST) {
print(fd, "Not enough magic points.\n");
return(0);
}
if(!S_ISSET(ply_ptr, STELEP) && how == CAST) {
print(fd, "You don't know that spell.\n");
return(0);
}
if(spell_fail(ply_ptr)) {
if(how == CAST)
ply_ptr->mpcur -= 20;
return(0);
}
/* Cast teleport on self */
if(cmnd->num == 2) {
if(how == CAST)
ply_ptr->mpcur -= 20;
broadcast_rom(fd, ply_ptr->rom_num,
"%M disappears.", ply_ptr);
if(how == CAST || how == SCROLL)
print(fd, "Teleport spell cast.\n");
else
print(fd, "You become disoriented and find yourself in another place.\n");
do {
rom_num = mrand(1, RMAX-1);
rtn = load_rom(rom_num, &new_rom);
if(rtn > -1 && F_ISSET(new_rom, RNOTEL))
rtn = -1;
else if(rtn > -1 && new_rom->lolevel > ply_ptr->level)
rtn = -1;
else if(rtn > -1 && ply_ptr->level > new_rom->hilevel &&
new_rom->hilevel)
rtn = -1;
} while(rtn < 0);
del_ply_rom(ply_ptr, rom_ptr);
add_ply_rom(ply_ptr, new_rom);
return(1);
}
/* Cast teleport on another player */
else {
if(how == POTION) {
print(fd, "You can only use a potion on yourself.\n");
return(0);
}
cmnd->str[2][0] = up(cmnd->str[2][0]);
crt_ptr = find_crt(ply_ptr, rom_ptr->first_ply,
cmnd->str[2], cmnd->val[2]);
if(!crt_ptr) {
print(fd, "That player is not here.\n");
return(0);
}
if(F_ISSET(crt_ptr, PRMAGI) && (mrand(1,60)+(ply_ptr->level-crt_ptr->level)*10) > 80) {
print(fd, "Your magic is too weak to teleport %m.\n", crt_ptr);
print(crt_ptr->fd, "%M tried to cast teleport on you.\n", ply_ptr);
if(how == CAST)
ply_ptr->mpcur -= 20;
return(0);
}
if(how == CAST)
ply_ptr->mpcur -=20;
if(how == CAST || how == SCROLL || how == WAND) {
print(fd, "Teleport cast on %m.\n", crt_ptr);
print(crt_ptr->fd,
"%M casts a teleport spell on you.\n",
ply_ptr);
broadcast_rom2(fd, crt_ptr->fd, ply_ptr->rom_num,
"%M casts teleport on %m.",
ply_ptr, crt_ptr);
do {
rom_num = mrand(1, RMAX-1);
rtn = load_rom(rom_num, &new_rom);
if(rtn > -1 && F_ISSET(new_rom, RNOTEL))
rtn = -1;
else if(rtn > -1 &&
new_rom->lolevel > ply_ptr->level)
rtn = -1;
else if(rtn > -1 &&
ply_ptr->level > new_rom->hilevel &&
new_rom->hilevel)
rtn = -1;
} while(rtn < 0);
del_ply_rom(crt_ptr, rom_ptr);
add_ply_rom(crt_ptr, new_rom);
return(1);
}
}
return(1);
}
/**********************************************************************/
/* enchant */
/**********************************************************************/
/* This function allows mages to enchant weapons at a cost of 25 magic */
/* points. They can only do it 3 times a day. */
int enchant(ply_ptr, cmnd, how)
creature *ply_ptr;
cmd *cmnd;
int how;
{
object *obj_ptr;
room *rom_ptr;
int fd, adj;
fd = ply_ptr->fd;
rom_ptr = ply_ptr->parent_rom;
if(how == CAST && ply_ptr->class != MAGE &&
ply_ptr->class < CARETAKER) {
print(fd, "Only mages may enchant.\n");
return(0);
}
if(ply_ptr->mpcur < 25 && how == CAST) {
print(fd, "Not enough magic points.\n");
return(0);
}
if(!S_ISSET(ply_ptr, SENCHA) && how == CAST) {
print(fd, "You don't know that spell.\n");
return(0);
}
if(cmnd->num < 3) {
print(fd, "Cast the spell on what?\n");
return(0);
}
obj_ptr = find_obj(ply_ptr, ply_ptr->first_obj,
cmnd->str[2], cmnd->val[2]);
if(!obj_ptr) {
print(fd, "You don't have that in your inventory.\n");
return(0);
}
if(F_ISSET(obj_ptr, OENCHA)) {
print(fd, "That object is already enchanted.\n");
return(1);
}
if(how == CAST) {
if(!dec_daily(&ply_ptr->daily[DL_ENCHA]) &&
ply_ptr->class < CARETAKER) {
print(fd, "You have enchanted enough today.\n");
return(0);
}
ply_ptr->mpcur -= 25;
}
if((ply_ptr->class == MAGE || ply_ptr->class >= CARETAKER) &&
how == CAST) {
adj = (ply_ptr->level-5)/5 + 1;
adj = MIN(3, adj);
}
else
adj = 1;
obj_ptr->adjustment = MAX(adj, obj_ptr->adjustment);
if(obj_ptr->type == ARMOR && obj_ptr->wearflag == BODY)
obj_ptr->armor += adj*2;
else if(obj_ptr->type == ARMOR)
obj_ptr->armor += adj;
else if(obj_ptr->type <= MISSILE) {
obj_ptr->shotsmax += adj*10;
obj_ptr->shotscur += adj*10;
obj_ptr->pdice += adj;
}
obj_ptr->value += 500*adj;
F_SET(obj_ptr, OENCHA);
print(fd, "%I begins to glow brightly.\n", obj_ptr);
broadcast_rom(fd, rom_ptr->rom_num, "%M enchants %1i.", ply_ptr,
obj_ptr);
return(1);
}