/* * COMMAND9.C: * * Additional user routines. * * Copyright (C) 1991, 1992, 1993 Brett J. Vickers * */ #include "mstruct.h" #include "mextern.h" /**********************************************************************/ /* bribe */ /**********************************************************************/ /* This function allows players to bribe monsters. If they give the */ /* monster enough money, it will leave the room. If not, the monster */ /* keeps the money and stays. */ int bribe(ply_ptr, cmnd) creature *ply_ptr; cmd *cmnd; { creature *crt_ptr; room *rom_ptr; long amount; int fd; fd = ply_ptr->fd; rom_ptr = ply_ptr->parent_rom; if(cmnd->num < 2) { print(fd, "Bribe whom?\n"); return(0); } if(cmnd->num < 3 || cmnd->str[2][0] != '$') { print(fd, "Syntax: bribe <monster> $<amount>\n"); return(0); } crt_ptr = find_crt(ply_ptr, rom_ptr->first_mon, cmnd->str[1], cmnd->val[1]); if(!crt_ptr) { print(fd, "That is not here.\n"); return(0); } amount = atol(&cmnd->str[2][1]); if(amount < 1 || amount > ply_ptr->gold) { print(fd, "Get real.\n"); return(0); } if(amount < crt_ptr->level*895L || F_ISSET(crt_ptr, MPERMT)) { print(fd, "%M takes your money, but stays.\n", crt_ptr); broadcast_rom(fd, ply_ptr->rom_num, "%M tried to bribe %m.", ply_ptr, crt_ptr); ply_ptr->gold -= amount; crt_ptr->gold += amount; } else { print(fd, "%M takes your money and leaves.\n", crt_ptr); broadcast_rom(fd, ply_ptr->rom_num, "%M bribed %m.", ply_ptr, crt_ptr); ply_ptr->gold -= amount; del_crt_rom(crt_ptr, rom_ptr); del_active(crt_ptr); free_crt(crt_ptr); } return(0); } /**********************************************************************/ /* haste */ /**********************************************************************/ /* This function allows rangers to hasten themselves every 10 minutes */ /* or so, giving themselves 5 extra dexterity points. The haste will */ /* last for 2 minutes. */ int haste(ply_ptr, cmnd) creature *ply_ptr; cmd *cmnd; { long i, t; int chance, fd; fd = ply_ptr->fd; if(ply_ptr->class != RANGER && ply_ptr->class < CARETAKER) { print(fd, "Only rangers may use haste.\n"); return(0); } if(F_ISSET(ply_ptr, PHASTE)) { print(fd, "You're already hastened.\n"); return(0); } i = ply_ptr->lasttime[LT_HASTE].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); } chance = MIN(85, ply_ptr->level*20+bonus[ply_ptr->dexterity]); if(mrand(1,100) <= chance) { print(fd, "You feel yourself moving faster.\n"); broadcast_rom(fd, ply_ptr->rom_num, "%M hastens.", ply_ptr); F_SET(ply_ptr, PHASTE); ply_ptr->dexterity += 5; ply_ptr->lasttime[LT_HASTE].ltime = t; ply_ptr->lasttime[LT_HASTE].interval = 120L + 60L * (ply_ptr->level/5); } else { print(fd, "Your attempt to hasten failed.\n"); broadcast_rom(fd, ply_ptr->rom_num, "%M tried to hasten.", ply_ptr); ply_ptr->lasttime[LT_HASTE].ltime = t - 590L; } return(0); } /**********************************************************************/ /* pray */ /**********************************************************************/ /* This function allows clerics and paladins to pray every 10 minutes */ /* to increase their piety for a duration of 5 minutes. */ int pray(ply_ptr, cmnd) creature *ply_ptr; cmd *cmnd; { long i, t; int chance, fd; fd = ply_ptr->fd; if(ply_ptr->class != CLERIC && ply_ptr->class != PALADIN && ply_ptr->class < CARETAKER) { print(fd, "Only clerics and paladins may pray.\n"); return(0); } if(F_ISSET(ply_ptr, PPRAYD)) { print(fd, "You've already prayed.\n"); return(0); } i = ply_ptr->lasttime[LT_PRAYD].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); } chance = MIN(85, ply_ptr->level*20+bonus[ply_ptr->piety]); if(mrand(1,100) <= chance) { print(fd, "You feel extremely pious.\n"); broadcast_rom(fd, ply_ptr->rom_num, "%M prays.", ply_ptr); F_SET(ply_ptr, PPRAYD); ply_ptr->piety += 5; ply_ptr->lasttime[LT_PRAYD].ltime = t; ply_ptr->lasttime[LT_PRAYD].interval = 300L; } else { print(fd, "Your prayers were not answered.\n"); broadcast_rom(fd, ply_ptr->rom_num, "%M prays.", ply_ptr); ply_ptr->lasttime[LT_PRAYD].ltime = t - 590L; } return(0); } /**********************************************************************/ /* prepare */ /**********************************************************************/ /* This function allows players to prepare themselves for traps that */ /* might be in the next room they enter. This way, they can hope to */ /* avoid a trap that they already know is there. */ int prepare(ply_ptr, cmnd) creature *ply_ptr; cmd *cmnd; { long i, t; int fd; fd = ply_ptr->fd; if(F_ISSET(ply_ptr, PPREPA)) { print(fd, "You've already prepared.\n"); return(0); } t = time(0); i = LT(ply_ptr, LT_PREPA); if(t < i) { please_wait(fd, i-t); return(0); } ply_ptr->lasttime[LT_PREPA].ltime = t; ply_ptr->lasttime[LT_PREPA].interval = ply_ptr->class == DM ? 0:15; print(fd, "You prepare yourself for traps.\n"); broadcast_rom(fd, ply_ptr->rom_num, "%M prepares for traps.", ply_ptr); F_SET(ply_ptr, PPREPA); if(F_ISSET(ply_ptr, PBLIND)) F_CLR(ply_ptr, PPREPA); return(0); } /************************************************************************/ /* use */ /************************************************************************/ /* This function allows a player to use an item without specifying the */ /* special command for its type. Use determines which type of item */ /* it is, and calls the appropriate functions. */ int use(ply_ptr, cmnd) creature *ply_ptr; cmd *cmnd; { object *obj_ptr; room *rom_ptr; int fd, n, rtn, onfloor=0; fd = ply_ptr->fd; rom_ptr = ply_ptr->parent_rom; if(cmnd->num < 2) { print(fd, "Use what?\n"); return(0); } if(!strcmp(cmnd->str[1], "all")) return(wear(ply_ptr, cmnd)); obj_ptr = find_obj(ply_ptr, ply_ptr->first_obj, cmnd->str[1], cmnd->val[1]); if(!obj_ptr) { obj_ptr = find_obj(ply_ptr, rom_ptr->first_obj, cmnd->str[1], cmnd->val[1]); if(!obj_ptr || !F_ISSET(obj_ptr, OUSEFL)) { print(fd, "Use what?\n"); return(0); } else if(F_ISSET(obj_ptr, OUSEFL)) { onfloor = 1; cmnd->num = 2; } } F_CLR(ply_ptr, PHIDDN); switch(obj_ptr->type) { case SHARP: case THRUST: case BLUNT: case POLE: case MISSILE: rtn = ready(ply_ptr, cmnd); break; case ARMOR: rtn = wear(ply_ptr, cmnd); break; case POTION: rtn = drink(ply_ptr, cmnd); break; case SCROLL: rtn = readscroll(ply_ptr, cmnd); break; case WAND: if(onfloor) { cmnd->num = 2; obj_ptr->shotscur -= 1; rtn = zap_obj(ply_ptr, obj_ptr, cmnd); } else rtn = zap(ply_ptr, cmnd); break; case KEY: rtn = unlock(ply_ptr, cmnd); break; case LIGHTSOURCE: rtn = hold(ply_ptr, cmnd); break; default: print(fd, "How does one use that?\n"); rtn = 0; } return(rtn); } /************************************************************************/ /* ignore */ /************************************************************************/ /* This function allows players to ignore the flashes of other players. */ /* If used without an argument, it lists the names of players currently */ /* being ignored. If included with a name, the player will be added */ /* to the ignore list if he is not already on it. Otherwise the player */ /* will be taken off the list. The ignore list lasts only for the */ /* duration of the player's connection. */ int ignore(ply_ptr, cmnd) creature *ply_ptr; cmd *cmnd; { int n, fd; etag *ign, *prev; char outstr[1024], *name; creature *crt_ptr; fd = ply_ptr->fd; if(cmnd->num == 1) { strcpy(outstr, "You are ignoring: "); ign = Ply[fd].extr->first_ignore; n = 0; while(ign) { strcat(outstr, ign->enemy); strcat(outstr, ", "); n = 1; ign = ign->next_tag; } if(!n) strcat(outstr, "No one."); else { outstr[strlen(outstr)-2] = '.'; outstr[strlen(outstr)-1] = 0; } print(fd, "%s\n", outstr); return(0); } cmnd->str[1][0] = up(cmnd->str[1][0]); name = cmnd->str[1]; n = 0; ign = Ply[fd].extr->first_ignore; if(!ign) {} else if(!strcmp(ign->enemy, name)) { Ply[fd].extr->first_ignore = ign->next_tag; free(ign); n = 1; } else { prev = ign; ign = ign->next_tag; while(ign) { if(!strcmp(ign->enemy, name)) { prev->next_tag = ign->next_tag; free(ign); n = 1; break; } prev = ign; ign = ign->next_tag; } } if(n) { print(fd, "%s removed from your ignore list.\n", name); return(0); } crt_ptr = find_who(name); if(crt_ptr && !F_ISSET(crt_ptr, PDMINV)) { ign = (etag *)malloc(sizeof(etag)); strcpy(ign->enemy, name); ign->next_tag = Ply[fd].extr->first_ignore; Ply[fd].extr->first_ignore = ign; print(fd, "%s added to your ignore list.\n", name); } else print(fd, "That player is not on.\n"); return(0); }