/*
* COMMAND12.C:
*
* (C) Brooke Paul 1995-1997
*/
#include "mstruct.h"
#include "mextern.h"
#ifdef DMALLOC
#include "/usr/local/include/dmalloc.h"
#endif
/***********************************************************************/
/* bard_song */
/***********************************************************************/
int bard_song(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
int c = 0, fd, i, t, heal;
ctag *cp;
ctag *cp_tmp;
fd = ply_ptr->fd;
if(ply_ptr->class != BARD && ply_ptr->class < CARETAKER) {
print(fd, "Only bards have that skill.\n");
return(PROMPT);
}
if(ply_ptr->level < 4 && ply_ptr->class < CARETAKER) {
print(fd, "You have not practiced enough to do that yet.\n");
return(0);
}
if(F_ISSET(ply_ptr, PSILNC)) {
print( fd, "A spell has taken your voice, and you cannot sing.\n");
return(0);
}
i = ply_ptr->lasttime[LT_SINGS].ltime+ply_ptr->lasttime[LT_SINGS].interval;
t = time(0);
if(i>t) {
if(i-t > 60)
print(fd, "Please wait %d:%02d minutes.\n",(i-t)/60L, (i-t)%60L);
else
print(fd,"Please wait %d seconds.\n", i-t);
return(0);
}
ply_ptr->lasttime[LT_SINGS].ltime = t;
ply_ptr->lasttime[LT_SINGS].interval = 120L;
cp = ply_ptr->parent_rom->first_ply;
print(fd,"Your music rejuvenates everyone in the room.\n");
heal = mrand(1,4) + ply_ptr->level;
if (F_ISSET(ply_ptr->parent_rom,RPMEXT)){
heal += mrand(1,4);
print(fd,"The room's magical properties increase the power of your song.\n");
}
while(cp){
cp_tmp = cp->next_tag;
if(cp->crt->type != MONSTER) {
if(cp->crt != ply_ptr) {
print(cp->crt->fd,"%M's song rejuvinates your spirits.\n",ply_ptr);
}
cp->crt->hpcur += heal;
cp->crt->hpcur = MIN(cp->crt->hpmax, cp->crt->hpcur);
}
cp = cp_tmp;
}
return(0);
}
/**********************************************************************/
/* bard_song2 */
/**********************************************************************/
/* AKA Charm */
int bard_song2(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
room *rom_ptr;
creature *crt_ptr;
int fd, dur, chance;
fd = ply_ptr->fd;
if(ply_ptr->class != BARD && ply_ptr->class < CARETAKER) {
print(fd, "Only bards have that skill.\n");
return(0);
}
if(F_ISSET(ply_ptr, PSILNC)) {
print(fd, "A spell has taken your voice and you cannot sing.\n");
return(0);
}
if(cmnd->num < 2) {
print(fd, "Charm whom?\n");
return(0);
}
if(!dec_daily(&ply_ptr->daily[DL_CHARM]) && ply_ptr->class < CARETAKER) {
print (fd, "You have charmed enough today.\n");
return(0);
}
rom_ptr = ply_ptr->parent_rom;
dur = 300 + mrand(1,30)*10 + bonus[ply_ptr->constitution]*30 + ply_ptr->level*5;
cmnd->str[1][0] = up(cmnd->str[1][0]);
crt_ptr = find_crt(ply_ptr, rom_ptr->first_ply,
cmnd->str[1], cmnd->val[1]);
if(!crt_ptr) {
cmnd->str[1][0] = low(cmnd->str[1][0]);
crt_ptr = find_crt(ply_ptr, rom_ptr->first_mon,
cmnd->str[1], cmnd->val[1]);
if(!crt_ptr) {
print(fd, "That's not here.\n");
return(0);
}
}
if(F_ISSET(crt_ptr, MUNKIL)) {
print(fd, "You cannot harm %m.\n", crt_ptr);
return(0);
}
chance = MIN(90, ((ply_ptr->level)-(crt_ptr->level))*20+4*bonus[ply_ptr->piety]);
if(F_ISSET(crt_ptr, MUNDED) || F_ISSET(crt_ptr, MPERMT) || chance < mrand(1,100))
{
print(fd, "Your charm has no effect on %m.\n", crt_ptr);
broadcast_rom(fd, "%M sings way off key.\n", ply_ptr);
if(crt_ptr->type == MONSTER) {
add_enm_crt(ply_ptr->name, crt_ptr);
return(0);
}
ANSI(crt_ptr->fd, MAGENTA);
print(crt_ptr->fd, "%M tried to charm you.\n", ply_ptr);
ANSI(crt_ptr->fd, WHITE);
return(0);
}
if((crt_ptr->type == PLAYER && F_ISSET(crt_ptr, PRMAGI)) ||
(crt_ptr->type != PLAYER && F_ISSET(crt_ptr, MRMAGI)))
dur /= 2;
print(fd, "Your song charms %m.\n", crt_ptr);
broadcast_rom2(fd, crt_ptr->fd, ply_ptr->rom_num,
"%M sings to %m.",
ply_ptr, crt_ptr);
print(crt_ptr->fd, "%M's song charms you.\n", ply_ptr);
add_charm_crt(crt_ptr, ply_ptr);
crt_ptr->lasttime[LT_CHRMD].ltime = time(0);
crt_ptr->lasttime[LT_CHRMD].interval = dur;
if(crt_ptr->type == PLAYER)
F_SET(crt_ptr, PCHARM);
else
F_SET(crt_ptr, MCHARM);
return(0);
}
/********************************************************************/
/* meditate */
/********************************************************************/
/* This command is for monks. */
int meditate(ply_ptr)
creature *ply_ptr;
{
int fd, chance;
long i,t;
fd = ply_ptr->fd;
if(ply_ptr->class != MONK && ply_ptr->class < CARETAKER){
print(fd, "Only monks may meditate.\n");
return(0);
}
i = ply_ptr->lasttime[LT_MEDIT].ltime+ply_ptr->lasttime[LT_MEDIT].interval;
t = time(0);
if(i>t) {
if(i-t > 60)
print(fd, "Please wait %d:%02d minutes.\n",(i-t)/60L, (i-t)%60L);
else
print(fd,"Please wait %d seconds.\n", i-t);
return(0);
}
/*
i = LT(ply_ptr, LT_MEDIT);
t = time(0);
if(i > t) {
please_wait(fd, i-t);
return(0);
} */
chance = MIN(70, ply_ptr->level*10+bonus[ply_ptr->piety]);
if(mrand(1,100) <= chance) {
print(fd, "You feel at one with the universe.\n");
broadcast_rom(fd, ply_ptr->rom_num, "%M meditates.", ply_ptr);
ply_ptr->hpcur += mrand(4,15)+ply_ptr->level;
ply_ptr->hpcur = MIN(ply_ptr->hpmax, ply_ptr->hpcur);
ply_ptr->lasttime[LT_MEDIT].ltime = t;
ply_ptr->lasttime[LT_MEDIT].interval = 120L;
}
else {
print(fd, "Your spirit is not at peace.\n");
broadcast_rom(fd, ply_ptr->rom_num, "%M meditates.",
ply_ptr);
ply_ptr->lasttime[LT_MEDIT].ltime = t;
ply_ptr->lasttime[LT_MEDIT].interval = 5L;
}
return(0);
}
/**********************************************************************/
/* touch_of_death */
/**********************************************************************/
/* This function allows monks to kill nonundead creatures. */
/* If they succeed then the creature is either killed or harmed */
/* for approximately half of its hit points. */
int touch_of_death(ply_ptr, cmnd)
creature *ply_ptr;
cmd *cmnd;
{
creature *crt_ptr;
room *rom_ptr;
long i, t;
int chance, m, dmg, fd;
fd = ply_ptr->fd;
rom_ptr = ply_ptr->parent_rom;
if(cmnd->num < 2) {
print(fd, "Touch whom?\n");
return(0);
}
if(ply_ptr->class != MONK && ply_ptr->class < CARETAKER) {
print(fd, "Only monks may use that skill.\n");
return(0);
}
if(ply_ptr->level < 10) {
print(fd, "You are not experienced enough to do that.\n");
return(0);
}
if(ply_ptr->ready[WIELD-1]){
print(fd, "How can you do that with your hands full?\n");
return(0);
}
crt_ptr = find_crt(ply_ptr, rom_ptr->first_mon,
cmnd->str[1], cmnd->val[1]);
if(!crt_ptr) {
cmnd->str[1][0] = up(cmnd->str[1][0]);
crt_ptr = find_crt(ply_ptr, rom_ptr->first_ply, cmnd->str[1], cmnd->val[1]);
if(!crt_ptr) {
print(fd, "They aren't here.\n");
return(0);
}
}
if((!F_ISSET(ply_ptr,PPLDGK) || !F_ISSET(crt_ptr,PPLDGK)) || (BOOL(F_ISSET(ply_ptr,PKNGDM)) == BOOL (F_ISSET(crt_ptr,PKNGDM))) || (! AT_WAR)) {
if(!F_ISSET(ply_ptr, PCHAOS) && crt_ptr->type != MONSTER && ply_ptr->class < DM) {
print(fd, "Sorry, you're lawful.\n");
return (0);
}
if(!F_ISSET(crt_ptr, PCHAOS) && ply_ptr->class < DM && crt_ptr->type != MONSTER) {
print(fd, "Sorry, that player is lawful.\n");
return (0);
}
}
if(F_ISSET(ply_ptr, PBLIND)) {
print(fd, "How do you do that? You're blind.\n");
return(0);
}
if(F_ISSET(rom_ptr, RNOKIL) && ply_ptr->class < DM) {
print(fd, "Not here.\n");
return(0);
}
if(F_ISSET(crt_ptr, MUNDED) && crt_ptr->type == MONSTER) {
print(fd, "That wont work on the undead.\n");
add_enm_crt(ply_ptr->name, crt_ptr);
return(0);
}
if(F_ISSET(ply_ptr, PINVIS)) {
F_CLR(ply_ptr, PINVIS);
print(fd, "Your invisibility fades.\n");
broadcast_rom(fd, ply_ptr->rom_num, "%M fades into view.",
ply_ptr);
}
i = ply_ptr->lasttime[LT_TOUCH].ltime;
t = time(0);
if(t-i < 600L) {
print(fd, "Please wait %d:%02d more minutes.\n",
(600L-t+i)/60L, (600L-t+i)%60L);
return(0);
}
if(crt_ptr->type != PLAYER && F_ISSET(crt_ptr, MUNKIL)) {
print(fd, "You cannot harm %s.\n",
F_ISSET(crt_ptr, MMALES) ? "him":"her");
return(0);
}
if(crt_ptr->type == MONSTER)
add_enm_crt(ply_ptr->name, crt_ptr);
ply_ptr->lasttime[LT_TOUCH].ltime = t;
ply_ptr->lasttime[LT_ATTCK].ltime = t;
ply_ptr->lasttime[LT_TOUCH].interval = 600L;
chance = (ply_ptr->level - crt_ptr->level)*20+bonus[ply_ptr->constitution]*10;
chance = MIN(chance, 85);
if(mrand(1,100) > chance) {
print(fd, "You failed to harm %m.\n", crt_ptr);
broadcast_rom(fd, ply_ptr->rom_num, "%M failed the touch of death on %m.\n",
ply_ptr, crt_ptr);
return(0);
}
if((mrand(1,100) > 80 - bonus[ply_ptr->constitution]) && crt_ptr->type == MONSTER && !F_ISSET(crt_ptr, MPERMT)) {
print(fd, "You fatally wound %m.\n", crt_ptr);
broadcast_rom(fd, ply_ptr->rom_num, "%M fatally wounds %m.",
ply_ptr, crt_ptr);
add_enm_dmg(ply_ptr->name, crt_ptr, crt_ptr->hpcur);
die(crt_ptr, ply_ptr);
}
else {
dmg = MAX(1, crt_ptr->hpcur / 2);
m = MIN(crt_ptr->hpcur, dmg);
crt_ptr->hpcur -= dmg;
add_enm_dmg(ply_ptr->name, crt_ptr, m);
print(fd, "You touched %m for %d damage.\n",
crt_ptr, dmg);
broadcast_rom(fd, ply_ptr->rom_num, "%M uses the touch of death on %m.", ply_ptr, crt_ptr);
if(crt_ptr->hpcur < 1) {
print(fd, "You killed %m.\n", crt_ptr);
broadcast_rom(fd, ply_ptr->rom_num, "%M killed %m.",
ply_ptr, crt_ptr);
die(crt_ptr, ply_ptr);
}
}
return(0);
}