/* ************************************************************************
* file: spec_other.c , Special module. Part of DIKUMUD *
* Usage: Procedures handling special procedures for object/room/mobile *
* Copyright (C) 1990, 1991 - see 'license.doc' for complete information. *
************************************************************************* */
#include <stdio.h>
#include <strings.h>
#include <ctype.h>
#include "structs.h"
#include "utils.h"
#include "comm.h"
#include "interpreter.h"
#include "handler.h"
#include "db.h"
#include "spells.h"
#include "limits.h"
/* external vars */
extern struct room_data *world;
extern struct zone_data *zone_table;
extern struct char_data *character_list;
extern struct descriptor_data *descriptor_list;
extern struct index_data *obj_index;
extern struct time_info_data time_info;
extern struct title_type titles[4][28];
extern char *command[];
/* extern procedures */
void hit(struct char_data *ch, struct char_data *victim, int type);
void gain_exp(struct char_data *ch, int gain);
char *strdup(char *source);
/* Room_Proc */
int arena_guard(int room, struct char_data *ch, int cmd, char *arg)
{
char buf[256], buf2[256];
if ((cmd!=3 || !ch || ch->in_room!=real_room(3703)) &&
(cmd!=1 || ch->in_room!=real_room(3702)))
return FALSE;
if (IS_NPC(ch)) {
return FALSE;
}
strcpy(buf, "The Arena Gods prevent you from entering since you're an outlaw.\n\r");
strcpy(buf2, "The Arena Gods prevent the outlaw, $n, from entering.");
if ((ch->in_room == real_room(3702)) && (cmd == 1)) {/*BLUE room*/
if (IS_SET(ch->specials.act,PLR_OUTLAW)||
IS_SET(ch->specials.act,PLR_ISTHIEF)||
IS_SET(ch->specials.act,PLR_ISKILLER)) {
act(buf2, FALSE, ch, 0, 0, TO_ROOM);
send_to_char(buf, ch);
return TRUE;
}
if (ch->specials.arena!=ARENA_BLUE_PLR) {
act("The Arena Gods bar $n's way since this is the BLUE team's exit\n\r",FALSE,ch,0,0,TO_ROOM);
send_to_char("You can't enter the ARENA here without the BLUE team color!\n\r",ch);
return TRUE;
}
} else if ((ch->in_room == real_room(3703)) && (cmd == 3)) { /*RED*/
if (IS_SET(ch->specials.act,PLR_OUTLAW)||
IS_SET(ch->specials.act,PLR_ISTHIEF)||
IS_SET(ch->specials.act,PLR_ISKILLER)) {
act(buf2, FALSE, ch, 0, 0, TO_ROOM);
send_to_char(buf, ch);
return TRUE;
}
if (ch->specials.arena!=ARENA_RED_PLR) {
act("The Arena Gods bar $n's way since this is the RED team's entrance.\n\r",FALSE,ch,0,0,TO_ROOM);
send_to_char("You can't enter the ARENA here without the RED team color!\n\r",ch);
return TRUE;
}
}
/* Save stats so we can restore them when you leave the Arena */
ch->specials.arena_move=GET_MOVE(ch);
ch->specials.arena_mana=GET_MANA(ch);
ch->specials.arena_hits=GET_HIT(ch);
ch->tmp_affected=ch->affected;
ch->affected=NULL;
ch->specials.arena_affvector=ch->specials.affected_by;
ch->specials.affected_by=NULL;
return FALSE;
}
/* Mob proc */
int brass_dragon(struct char_data *ch, struct char_data *pl, int cmd, char *arg)
{
char buf[256], buf2[256];
if (cmd>6 || cmd<1)
return FALSE;
strcpy(buf, "The brass dragon humiliates you, and blocks your way.\n\r");
strcpy(buf2, "The brass dragon humiliates $n, and blocks $s way.");
if ((ch->in_room == real_room(5065)) && (cmd == 4)) {
act(buf2, FALSE, pl, 0, 0, TO_ROOM);
send_to_char(buf, pl);
return TRUE;
}
return FALSE;
}
int puff(struct char_data *ch, struct char_data *pl, int cmd, char *arg)
{
void do_say(struct char_data *ch, char *argument, int cmd);
if (cmd)
return(0);
switch (number(0, 60))
{
case 0:
do_say(ch, "My god! It's full of stars!", 0);
return(1);
case 1:
do_say(ch, "How'd all those fish get up here?", 0);
return(1);
case 2:
do_say(ch, "I'm a very female dragon.", 0);
return(1);
case 3:
do_say(ch, "I've got a peaceful, easy feeling.", 0);
return(1);
default:
return(0);
}
}
int janitor(struct char_data *ch, struct char_data *pl, int cmd, char *arg)
{
struct obj_data *i, *temp, *next_obj;
if (cmd || !AWAKE(ch))
return(FALSE);
for (i = world[ch->in_room].contents; i; i = i->next_content) {
if (IS_SET(i->obj_flags.wear_flags, ITEM_TAKE) &&
((i->obj_flags.type_flag == ITEM_DRINKCON) ||
(i->obj_flags.cost <= 20))) {
act("$n picks up some trash.", FALSE, ch, 0, 0, TO_ROOM);
obj_from_room(i);
obj_to_char(i, ch);
return(TRUE);
}
}
return(FALSE);
}
int cityguard(struct char_data *ch, struct char_data *pl, int cmd, char *arg)
{
struct char_data *tch, *evil;
int max_evil;
if (cmd || !AWAKE(ch) || (GET_POS(ch) == POSITION_FIGHTING))
return (FALSE);
max_evil = 1000;
evil = 0;
for (tch=world[ch->in_room].people; tch; tch = tch->next_in_room) {
if (tch->specials.fighting && CAN_SEE(ch,tch)) {
if ((GET_ALIGNMENT(tch) < max_evil) &&
(IS_NPC(tch) || IS_NPC(tch->specials.fighting))) {
max_evil = GET_ALIGNMENT(tch);
evil = tch;
}
}
}
if (evil && (GET_ALIGNMENT(evil->specials.fighting) >= 0)) {
act("$n screams 'PROTECT THE INNOCENT! BANZAI!!! CHARGE!!! ARARARAGGGHH!'", FALSE, ch, 0, 0, TO_ROOM);
hit(ch, evil, TYPE_UNDEFINED);
return(TRUE);
}
for(tch=world[ch->in_room].people; tch; tch=tch->next_in_room) {
if (!IS_NPC(tch) && CAN_SEE(ch, tch) &&
(IS_SET(tch->specials.act,PLR_ISKILLER)||
IS_SET(tch->specials.act,PLR_ISTHIEF))){
act("$n screams 'Outlaw! Fresh blood! Kill!'", FALSE, ch, 0, 0, TO_ROOM);
hit(ch, tch, TYPE_UNDEFINED);
return(TRUE);
}
}
return(FALSE);
}
#define PER_LEVEL 10 /* coins per level needed to play in arena */
int arena_shop(int room, struct char_data *ch, int cmd, char *arg)
{
char buf[MAX_STRING_LENGTH];
int gold_needed;
gold_needed=GET_LEVEL(ch)*PER_LEVEL;
if (cmd==59) { /* List */
send_to_char("Your choice of team colors are:\n\r", ch);
send_to_char("\n\rRED\n\rBLUE\n\r\n\r",ch);
send_to_char("You may JOIN RED, or JOIN BLUE\n\r\n\r",ch);
send_to_char("No outlaws are allowed in the Holy Arena\n\r",ch);
sprintf(buf,"It will cost you %d coins to join a team.\n\r",
gold_needed);
send_to_char(buf,ch);
return(TRUE);
} else if (cmd==228) { /* JOIN */
if(IS_SET(ch->specials.act,PLR_ISTHIEF)||
IS_SET(ch->specials.act,PLR_ISKILLER)){
send_to_char("The Arena Gods forbid outlaws from joining!\n\r",ch);
return(FALSE);
}
arg = one_argument(arg, buf);
if(!strcmp(buf,"red")&&!strcmp(buf,"blue")) {
send_to_char("You can only join a RED or BLUE team.\n\r",ch);
return(TRUE);
}
if(GET_GOLD(ch)<gold_needed){
sprintf(buf,"You need %d coins to join!! Go away\n\r",
gold_needed);
send_to_char(buf,ch);
return(TRUE);
}
if (!strcmp(buf,"red")) {
ch->specials.arena=ARENA_RED_PLR;
send_to_char("You are now a member of the RED team!\n\r",ch);
return(TRUE);
}
if (!strcmp(buf,"blue")) {
ch->specials.arena=ARENA_BLUE_PLR;
send_to_char("You are now a member of the BLUE team!\n\r",ch);
return(TRUE);
}
send_to_char("The Gods decree that you may only join red or blue teams!\n\r",ch);
return(TRUE);
}
/* All commands except list and buy */
return(FALSE);
}
/* Idea of the LockSmith is functionally similar to the Pet Shop */
/* The problem here is that each key must somehow be associated */
/* with a certain player. My idea is that the players name will */
/* appear as the another Extra description keyword, prefixed */
/* by the words 'item_for_' and followed by the player name. */
/* The (keys) must all be stored in a room which is (virtually) */
/* adjacent to the room of the lock smith. */
int pray_for_items(int room, struct char_data *ch, int cmd, char *arg)
{
char buf[256];
int key_room, gold;
bool found;
struct obj_data *obj;
struct extra_descr_data *ext;
if (cmd != 176) /* You must pray to get the stuff */
return FALSE;
key_room = 1+ch->in_room;
strcpy(buf, "item_for_");
strcat(buf, GET_NAME(ch));
gold = 0;
found = FALSE;
for (obj=world[key_room].contents; obj && !found; obj = obj->next_content)
for(ext = obj->ex_description; ext && !found; ext = ext->next)
if (str_cmp(buf, ext->keyword) == 0) {
if (gold == 0) {
gold = 1;
act("$n kneels and at the altar and chants a prayer to Odin.",
FALSE, ch, 0, 0, TO_ROOM);
act("You notice a faint light in Odin's eye.",
FALSE, ch, 0, 0, TO_CHAR);
}
obj_from_room(obj);
act("$p slowly fades into existence.",FALSE,ch,obj,0,TO_ROOM);
act("$p slowly fades into existence.",FALSE,ch,obj,0,TO_CHAR);
gold += obj->obj_flags.cost;
obj_to_room(obj, ch->in_room);
found = TRUE;
}
if (found) {
GET_GOLD(ch) -= gold;
GET_GOLD(ch) = MAX(0, GET_GOLD(ch));
return TRUE;
}
return FALSE;
}
/* ********************************************************************
* Special procedures for objects *
******************************************************************** */
#define CHAL_ACT \
"You are torn out of reality!\n\r\
You roll and tumble through endless voids for what seems like eternity...\n\r\
\n\r\
After a time, a new reality comes into focus... you are elsewhere.\n\r"
int chalice(struct obj_data *obj, struct char_data *ch, int cmd, char *arg)
{
/* 222 is the normal chalice, 223 is chalice-on-altar */
struct obj_data *chalice;
char buf1[MAX_INPUT_LENGTH], buf2[MAX_INPUT_LENGTH];
static int chl = -1, achl = -1;
if (chl < 1)
{
chl = real_object(222);
achl = real_object(223);
}
switch(cmd)
{
case 10: /* get */
if (!(chalice = get_obj_in_list_num(chl,
world[ch->in_room].contents))
&& CAN_SEE_OBJ(ch, chalice))
if (!(chalice = get_obj_in_list_num(achl,
world[ch->in_room].contents)) && CAN_SEE_OBJ(ch, chalice))
return(0);
/* we found a chalice.. now try to get us */
do_get(ch, arg, cmd);
/* if got the altar one, switch her */
if (chalice == get_obj_in_list_num(achl, ch->carrying))
{
extract_obj(chalice);
chalice = read_object(chl, VIRTUAL);
obj_to_char(chalice, ch);
}
return(1);
break;
case 67: /* put */
if (!(chalice = get_obj_in_list_num(chl, ch->carrying)))
return(0);
argument_interpreter(arg, buf1, buf2);
if (!str_cmp(buf1, "chalice") && !str_cmp(buf2, "altar"))
{
extract_obj(chalice);
chalice = read_object(achl, VIRTUAL);
obj_to_room(chalice, ch->in_room);
send_to_char("Ok.\n\r", ch);
}
return(1);
break;
case 176: /* pray */
if (!(chalice = get_obj_in_list_num(achl,
world[ch->in_room].contents)))
return(0);
do_action(ch, arg, cmd); /* pray */
send_to_char(CHAL_ACT, ch);
extract_obj(chalice);
act("$n is torn out of existence!", TRUE, ch, 0, 0, TO_ROOM);
char_from_room(ch);
char_to_room(ch, real_room(2500),0); /* before the fiery gates */
do_look(ch, "", 15);
return(1);
break;
default:
return(0);
break;
}
}
int kings_hall(int room, struct char_data *ch, int cmd, char *arg)
{
if (cmd != 176)
return(0);
do_action(ch, arg, 176);
send_to_char("You feel as if some mighty force has been offended.\n\r", ch);
send_to_char(CHAL_ACT, ch);
act("$n is struck by an intense beam of light and vanishes.",
TRUE, ch, 0, 0, TO_ROOM);
char_from_room(ch);
char_to_room(ch, real_room(1420),0); /* behind the altar */
do_look(ch, "", 15);
return(1);
}
/* The salesman, always after a tidy profit and the satisfaction of a sale, is
a social individual...Maybe overly so... <grin> */
int sales_spec(struct char_data *ch, struct char_data *pl, int cmd, char *arg)
{
char buf[MAX_STRING_LENGTH],
arg1[MAX_STRING_LENGTH],arg2[MAX_STRING_LENGTH];
int i_val = 0;
struct obj_data *selling=0, *s_item = 0, *obj=0;
struct char_data *c_obj=0,*k, *dummy_char, *old_follow=NULL;
extern void do_insult(struct char_data *ch,char *argument,int cmd);
extern void do_say(struct char_data *ch,char *argument,int cmd);
/* Find out if we have anything to sell, either in first equipment slot */
/* or something being carried */
#if CONFIG_JAIL
if(witness(ch,pl,cmd,arg))
return(TRUE);
#endif
if (selling = ch->equipment[WIELD])
i_val = ch->equipment[WIELD]->obj_flags.cost * 2 + 3;
else if (selling = ch->carrying)
i_val = ch->carrying->obj_flags.cost * 2 + 3;
/* Handle cases where we might care what a player does: buy, steal, etc. */
if (cmd != 0) {
argument_interpreter(arg,arg1,arg2);
if (*arg1) c_obj=get_char_room(arg1,ch->in_room);
switch(cmd) {
case 9:
case 113:
case 118:
case 120:
case 121:
case 123:
case 138:
case 160:
/* Actions of questionable intent */
if(c_obj!=ch || GET_POS(ch)<=POSITION_SLEEPING)
return FALSE;
if(pl->player.sex != 2) {
act("$N slaps you before you can even begin.",
FALSE,pl,0,ch,TO_CHAR);
act("$N slaps $n for his naughty intentions.",
FALSE,pl,0,ch,TO_ROOM);
}
return TRUE;
break;
case 19:
if(c_obj!=ch || GET_POS(ch)<=POSITION_SLEEPING)
return FALSE;
do_say(ch,"I can talk all day, but only you can buy...",0);
return TRUE;
break;
case 23:
/* The salesman suffers from acceptance anxiety :-) */
if(GET_POS(ch)<=POSITION_SLEEPING)
return FALSE;
do_action(pl, arg1, cmd);
act("$n smiles too, trying to join in on the fun.",
TRUE,ch,0,0,TO_ROOM);
return TRUE;
break;
case 33:
if(c_obj!=ch || GET_POS(ch)<=POSITION_SLEEPING)
return FALSE;
do_insult(pl,arg,0);
act("$N humbles you with a greater insult.",FALSE,pl,
0,ch,TO_CHAR);
act("$N snaps back with a greater insult.",FALSE,pl,
0,ch,TO_ROOM);
return TRUE;
break;
case 46:
if(c_obj!=ch)
return FALSE;
if(GET_POS(ch) != POSITION_SLEEPING)
act("$N is not sleeping.",FALSE,pl,0,ch,TO_CHAR);
else {
act("Your gentle nudging awakens $N, who yawns and clears his throat.",FALSE,pl,0,ch,TO_CHAR);
act("$n nudges $N awake.",FALSE,pl,0,ch,TO_ROOM);
GET_POS(ch) = POSITION_STANDING;
}
return TRUE;
break;
case 94:
/* An exchange of poking */
if(c_obj!=ch || GET_POS(ch)<=POSITION_SLEEPING)
return FALSE;
do_action(pl, arg, 94);
act("$N pokes you back.",FALSE,pl,0,ch,TO_CHAR);
act("$N pokes $n back.",TRUE,pl,0,ch,TO_ROOM);
return TRUE;
break;
case 154:
if(c_obj!=ch || GET_POS(ch)<=POSITION_SLEEPING)
return FALSE;
act("Oof! $N knocks you down.",FALSE,pl,0,ch,TO_CHAR);
act("$n tries to backstab $N who, more alert than \
he appears, slams\n\r$m down on the ground instead.",FALSE,pl,0,ch,TO_ROOM);
do_say(ch,"I've dealt with your kind before!",0);
GET_POS(pl) = POSITION_SITTING;
return TRUE;
break;
case 56:
/* "To buy is to be" is the salesman's motto... */
if (strlen(arg1)==0 || GET_POS(ch)<=POSITION_SLEEPING || !selling)
return FALSE;
if (c_obj==ch) {
do_say(ch,"I'm not for sale, idiot!",0);
return TRUE;
}
if (!generic_find(arg1,FIND_OBJ_EQUIP,ch,&dummy_char,&s_item))
s_item=get_obj_in_list(arg1,selling);
if (strlen(arg2)==0) {
if(!get_char_room_vis(pl, "2.salesman")) {
if(s_item==selling) {
if(transact(ch,s_item,pl,i_val)) {
if(ch->master)
stop_follower(ch);
REMOVE_BIT(ch->specials.act,ACT_SENTINEL);
}
} else if (s_item) {
sprintf(buf,"$n grins and says, 'Buy the %s \
first, and then I'll\n\rconsider selling you the %s.",selling->short_description,
s_item->short_description);
act(buf,FALSE,ch,0,0,TO_ROOM);
} else do_say(ch,"Sell you what?",0);
return(TRUE);
} else if(ch==get_char_room_vis(ch,"salesman")){
sprintf(buf,"$n arches an eyebrow and says, 'Who \
\n\r'ya talkin' to, %s?'\n\rUse: BUY <OBJ> [FROM] <SELLER>.",pl->player.name);
act(buf,FALSE,ch,0,0,TO_ROOM);
} else
do_say(ch,"Yeah, we can't ALL oblige you, ya know?",0);
} else {
if (ch == get_char_room_vis(pl,arg2)) {
if (s_item==selling) {
if(transact(ch,s_item,pl,i_val)) {
if(ch->master)
stop_follower(ch);
REMOVE_BIT(ch->specials.act,ACT_SENTINEL);
}
} else
do_say(ch,"I don't have that.",0);
return(TRUE);
}
}
break;
default:
return FALSE;
break;
}
} else if (IS_LIGHT(ch->in_room)) {
if (GET_POS(ch) == POSITION_SLEEPING) {
ch->specials.position = POSITION_STANDING;
act("$n becomes alert, ready to assault any \
unsuspecting\n\rpersons with $s salesmanship.",TRUE,ch,0,0,TO_ROOM);
}
if (ch->master) {
if (!selling) {
/* No items to sell, must have had item stolen */
act("$n looks puzzled.",TRUE,ch,0,0,TO_ROOM);
stop_follower(ch);
REMOVE_BIT(ch->specials.act,ACT_SENTINEL);
return(FALSE);
}
i_val = selling->obj_flags.cost * 2 + 4;
if (ch->master->in_room == ch->in_room) {
if (ch->specials.spec[0] > 108) { /* Number is not fixed in stone */
act("$n throws $s hands up in disgust.",TRUE,
ch,0,0,TO_ROOM);
old_follow=ch->master;
stop_follower(ch);
REMOVE_BIT(ch->specials.act,ACT_SENTINEL);
} else {
if(GET_POS(ch->master)<=POSITION_SLEEPING)
return(0);
buf[0]=0;
switch (number(0,14)) {
case 0:
act("$n says 'I tell you this $o is of the finest quality.'",FALSE,ch,selling,0,TO_ROOM);
break;
case 1:
sprintf(buf,"Only %d pieces of gold - a bargain!",i_val);
do_say(ch,buf,0);
break;
case 2:
buf[0]='a';
act("$N splutters 'You know, I have six\
hungry wives\n\rand a child to feed...'",FALSE,pl,0,ch,TO_CHAR);
break;
case 3:
act("$N waves the $p in your face.",
FALSE,ch->master,selling,ch,TO_CHAR);
act("$N waves the $p in $n's face.",
FALSE,ch->master,selling,ch,TO_ROOM);
break;
case 4:
act("The salesman demonstrates the unique usefulness of the $o.",TRUE,ch,selling,0,TO_ROOM);
break;
case 5:
do_action(ch,"",107);
break;
default:
break;
}
if(buf[0]) {
act("$n tries to sell the $o to $N.",FALSE,ch,selling,ch->master,TO_NOTVICT);
ch->specials.spec[0] +=1;
}
}
} else {
stop_follower(ch);
REMOVE_BIT(ch->specials.act,ACT_SENTINEL);
}
}
if (!ch->master && !selling ) {
SET_BIT(ch->specials.act,ACT_SCAVENGER);
if(number(0,5)==0) act("$n scans the floor.",TRUE,ch,0,0,TO_ROOM);
} else if(!ch->master) {
REMOVE_BIT(ch->specials.act,ACT_SCAVENGER);
for(k=world[ch->in_room].people;pl=k;k=k->next_in_room) {
if (/*!IS_NPC(pl) &&*/ number(0,4)<3 && CAN_SEE(ch,pl) &&
!circle_follow(ch,pl)&&old_follow!=pl) {
add_follower(ch,pl);
SET_BIT(ch->specials.act,ACT_SENTINEL);
sprintf(buf,"The salesman saunters up to you and says, 'Hey %s! \
Have I got a\n\rdeal for you! Take a look at this magnificent $o.\n\rIsn't it \
just a dream? And it can be yours for just %d coins!'",pl->player.name, i_val);
act(buf,FALSE,pl,selling,0,TO_CHAR);
act("$N makes a sales pitch to $n.",FALSE,pl,
0,ch,TO_ROOM);
ch->specials.spec[0] = 100;
break;
}
}
}
} else if(GET_POS(ch) > POSITION_SLEEPING) {
if(!ch->equipment[WEAR_LIGHT]) { /* See if we have a light source */
for(obj=ch->carrying;obj;obj=obj->next_content) {
if(obj->obj_flags.type_flag==ITEM_LIGHT) {
do_grab(ch,obj->name,0);
return(FALSE);
}
}
} else {
do_remove(ch,obj->name,0);
do_drop(ch,obj->name,0);
return(FALSE);
}
if(number(0,5) == 0) {
GET_POS(ch) = POSITION_SLEEPING;
do_say(ch,"Ah, must be time to go to bed!",0);
act("The sounds of violent snoring filter through the area.",FALSE,
ch,0,0,TO_ROOM);
if (ch->master) {
stop_follower(ch);
REMOVE_BIT(ch->specials.act,ACT_SENTINEL);
}
}
}
return(FALSE);
}
int jester(struct char_data *ch, struct char_data *pl, int cmd, char *arg)
{
void do_say(struct char_data *ch, char *argument, int cmd);
#if CONFIG_JAIL
if(witness(ch,pl,cmd,arg))
return(TRUE);
#endif
if (cmd)
return(0);
switch (number(0, 60))
{
case 0:
do_say(ch, "You are a real stinker!", 0);
return(1);
case 1:
do_say(ch, "Have you considered getting a lobotomy?", 0);
return(1);
case 2:
do_say(ch, "You're as stupid as you look!", 0);
return(1);
case 3:
do_say(ch, "Get a real hair-cut!", 0);
return(1);
case 4:
act("$n does a backflip.",TRUE,ch,0,0,TO_ROOM);
do_say(ch, "Ha!",0);
return(1);
default:
return(0);
}
}
int spiny(struct char_data *ch, struct char_data *pl, int cmd, char *arg)
{
void do_say(struct char_data *ch, char *argument, int cmd);
if(pl) {
return(NULL);
} else {
if(GET_POS(ch)!=POSITION_FIGHTING) {
switch(dice(3,2)) {
case 3:
act("$n flips onto its back...or is that its front?",TRUE,ch,0,0,TO_ROOM);
break;
case 4:
act("$n makes some clicking noises.",FALSE,ch,0,0,TO_ROOM);
break;
default:
break;
}
}
}
}
int snowvulture(struct char_data *ch, struct char_data *pl, int cmd, char *arg)
{
void do_say(struct char_data *ch, char *argument, int cmd);
if(pl) {
return(NULL);
} else {
if(GET_POS(ch)!=POSITION_FIGHTING) {
switch(dice(3,3)) {
case 3:
do_say(ch,"Skaaa? reet.",0);
break;
case 4:
act("$n flaps about.",FALSE,ch,0,0,TO_ROOM);
break;
case 5:
devour(ch,pl,cmd,arg);
break;
default:
break;
}
}
}
return(FALSE);
}
int snowbeast(struct char_data *ch, struct char_data *pl, int cmd, char *arg)
{
void do_say(struct char_data *ch, char *argument, int cmd);
if(pl) {
return(NULL);
} else {
if(GET_POS(ch)!=POSITION_FIGHTING) {
switch(dice(3,6)) {
case 3:
do_say(ch,"Yaargh, arrogha!!?!",0);
break;
case 4:
do_say(ch,"Hmmph.",0);
break;
case 5:
act("The snowbeast scratches itself.",TRUE,ch,0,0,TO_ROOM);
break;
case 6:
act("The snowbeast stares inquisitively at a point in space.",TRUE,ch,0,0,TO_ROOM);
break;
default:
break;
}
}
}
return(FALSE);
}
/* A special for each tower roof in Anapest (room-based)
int tower(int room, struct char_data *ch, int cmd, char *arg)
{
if(!cmd) {
if....
act("There is activity along the valley rim.\n\r",....);
} else if(cmd==...look...) {
if(*arg) {
number = search_block(arg,t_skills,FALSE);
if(number == -1) {
.....nasty...may need to change call with self reference like w/mobs */
/* A special for the Knife Shop Proprieter (mob-based) */
int clyde(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
char buf[MAX_STRING_LENGTH];
if(!pl) {
if(GET_POS(ch)!=POSITION_STANDING)
return(FALSE);
switch(dice(2,5)) {
case 1:
act("An evil grin crosses $n's face.",FALSE,ch,
0,0,TO_ROOM);
break;
case 2:
act("$n whistles a tune.",FALSE,ch,0,0,TO_ROOM);
break;
default:
break;
};
} else if(ch->in_room==real_room(12595) && cmd==3 &&
GET_CLASS(pl)!=CLASS_THIEF && GET_POS(ch) ==
POSITION_STANDING) {
act("With a gentle, but firm hand, Clyde guides you away from the curtain.",FALSE,pl,0,0,TO_CHAR);
act("Clyde skillfully redirects $n from going behind the curtain.",FALSE,pl,0,0,TO_ROOM);
return(TRUE);
} else if(cmd==56 || cmd==57 || cmd==58 || cmd==59) {
do_say(ch,"I'm not open for business right now.",0);
/* in fact, he's never open... */
}
return(FALSE);
}
/* Another mob-based special... */
int waiter(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
int check1,check2,check3,check4,check5;
char buf[MAX_STRING_LENGTH];
struct obj_data *i;
#if CONFIG_JAIL
if(witness(ch,pl,cmd,arg))
return(TRUE);
#endif
if(cmd==2 && ch->in_room==real_room(12576)) {
check1=real_object(12530);
check2=real_object(12531);
check3=real_object(12532);
check4=-1;
check5=-1; /* For when I add other menu items */
for(i=pl->carrying;i;i=i->next_content) {
if(i->item_number==check1 || i->item_number==check2
|| i->item_number==check3 || i->item_number==check4
|| i->item_number==check5){
act("The waiter prevents you from leaving.",
FALSE,pl,0,0,TO_CHAR);
act("The waiter prevents $n from leaving.",
FALSE,pl,0,0,TO_ROOM);
do_say(ch,"You must finish your meal here!",0);
return(TRUE);
}
}
}
return(shop_keeper(ch,pl,cmd,arg));
}
int barmaid(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
/* Do special stuff, then call regular shop routine */
#if CONFIG_JAIL
if(witness(ch,pl,cmd,arg))
return(TRUE);
#endif
return(shop_keeper(ch,pl,cmd,arg));
}
int cookie(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
/* Have him kick people he can see out through side door... */
#if CONFIG_JAIL
if(witness(ch,pl,cmd,arg))
return(TRUE);
#endif
if(pl) {
} else {
switch(number(1,15)) {
case 1:
do_action(ch,"cookie",244);
break;
case 2:
do_action(ch,"",106);
switch(number(1,3)) {
case 1:
do_say(ch,"Mmm! Mammoth!",0);
break;
case 2:
do_say(ch,"Mmm! Yak liver!",0);
break;
case 3:
do_say(ch,"Hmm. Can't quite place that one.",0);
break;
default:
break;
}
default:
break;
}
}
return(FALSE);
}
int neophyte(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
#if CONFIG_JAIL
if(witness(ch,pl,cmd,arg))
return(TRUE);
#endif
if(pl) {
if(ch->in_room==real_room(12587)) {
if(cmd==4 && GET_CLASS(pl)!=CLASS_CLERIC &&
!(pl->specials.act & PLR_ISMULTICL)) {
do_say(ch,"Only the chosen get to see the master!",0);
return(TRUE);
}
}
} else {
switch(number(1,15)) {
case 1:
do_action(ch,"",244);
break;
default:
break;
}
}
return(FALSE);
}
int guru_anapest(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{ /* If in floating position, rotate, slow flips, etc... */
struct char_data *who;
char arg1[MAX_STRING_LENGTH],arg2[MAX_STRING_LENGTH];
if(pl) {
if(GET_POS(ch)<=POSITION_SLEEPING)
return(FALSE);
argument_interpreter(arg,arg1,arg2);
who=get_char_room(arg1,ch->in_room);
switch(cmd) {
case 197:
if(who==ch) {
do_action(pl,arg,197);
do_say(ch,"Don't worship me, for none are worthy of such respect.",0);
return(TRUE);
}
break;
case 185:
if(who==ch) {
do_action(pl,arg,185);
do_action(ch,GET_NAME(pl),146);
return(TRUE);
};
break;
case 146:
if(who==ch) {
do_action(pl,arg,146);
do_action(ch,GET_NAME(pl),185);
return(TRUE);
};
break;
}
} else if(GET_POS(ch)==POSITION_FIGHTING) {
if(GET_HIT(ch) < (GET_MAX_HIT(ch)/4)) {
spell_teleport(GET_LEVEL(ch),ch,ch,NULL);
}
} else {
switch(number(0,25)) {
case 1:
do_say(ch,"Existence is suffering.",0);
break;
case 2:
do_say(ch,"Suffering is the end result of greed.",0);
break;
case 3:
do_say(ch,"Information complicates our lives.",0);
break;
case 4:
do_say(ch,"The pinnacle of existence is nothingness.",0);
break;
default:
break;
}
}
return(guild(ch,pl,cmd,arg));
}
int confess_figure(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
#if CONFIG_JAIL
if(witness(ch,pl,cmd,arg))
return(TRUE);
#endif
if(pl) {
if(cmd==19) { /* Tell */
return(TRUE);
}
} else if(GET_POS(ch)==POSITION_FIGHTING) {
switch(number(1,11)) {
case 1:
do_say(ch,"I hope your conscience bothers you!",
0);
break;
default:
break;
}
return(FALSE);
} else {
if(ch->specials.spec[0]) {
} else switch(number(1,10)) {
case 1:
do_action(ch,"",109);
break;
default:
break;
}
}
return(FALSE);
}
int taxman(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
struct char_data *who;
char arg1[MAX_STRING_LENGTH],arg2[MAX_STRING_LENGTH];
if(GET_POS(ch) <= POSITION_SLEEPING)
return(FALSE);
if(pl) {
argument_interpreter(arg,arg1,arg2);
who=get_char_room(arg1,ch->in_room);
switch(cmd) {
case 154:
if(who==ch) {
do_say(ch,"Oh no you don't!",0);
do_action(ch,GET_NAME(pl),191);
}
break;
default:
break;
}
} else {
switch(number(1,15)) {
case 1:
do_action(ch,"",26);
break;
default:
break;
}
}
return(FALSE);
}
int albert(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
char buf[MAX_INPUT_LENGTH];
#if CONFIG_JAIL
if(witness(ch,pl,cmd,arg))
return(TRUE);
#endif
if(!pl) {
if(IS_SET(ch->specials.act,ACT_SENTINEL) &&
GET_HIT(ch)==GET_MAX_HIT(ch)) {
if(GET_POS(ch)==POSITION_SLEEPING)
do_wake(ch,"",0);
else if(GET_POS(ch)<POSITION_STANDING)
do_stand(ch,"",0);
REMOVE_BIT(ch->specials.act,ACT_SENTINEL);
} else if(world[ch->in_room].number==12613 ||
world[ch->in_room].number==12614) {
if(IS_FIGHTING(ch)) {
do_action(ch,"",32);
do_flee(ch,"",0);
}
} else if(GET_HIT(ch)!=GET_MAX_HIT(ch)) {
strcpy(buf,"rub ring");
command_interpreter(ch,buf);
if(world[ch->in_room].number!=12613) {
do_say(ch,"What happened to my ring?",0);
} else {
SET_BIT(ch->specials.act,ACT_SENTINEL);
}
}
}
return(FALSE);
}
int mage_anapest(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
char buf[MAX_STRING_LENGTH];
struct char_data *who,*i,*temp;
char arg1[MAX_STRING_LENGTH],arg2[MAX_STRING_LENGTH];
if(GET_POS(ch) <= POSITION_SLEEPING)
return(FALSE);
if(pl) {
switch(cmd) {
case 154:
do_action(ch,"",31);
spell_teleport(GET_LEVEL(ch),ch,pl,NULL);
act("She apparently doesn't like that.\n\r",
FALSE,pl,0,0,TO_CHAR);
return(TRUE);
break;
default:
break;
}
} else {
if(ch->in_room==real_room(12581)) {
for(i=world[ch->in_room].people;i;i=temp) {
temp=i->next_in_room;
if(i!=ch && GET_CLASS(i) != CLASS_MAGIC_USER){
do_say(ch,"Be gone!",0);
/* Get rid of them */
spell_teleport(GET_LEVEL(ch),ch,i,NULL);
} else if(i!=ch && GET_ALIGNMENT(i) > 350) {
sprintf(buf,"%s I don't think I like you!",i->player.name);
do_tell(ch,buf,0);
}
}
}
}
return(guild(ch,pl,cmd,arg));
}
int farmer(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
struct char_data *who;
char arg1[MAX_STRING_LENGTH],arg2[MAX_STRING_LENGTH],*str=NULL;
#if CONFIG_JAIL
if(witness(ch,pl,cmd,arg))
return(TRUE);
#endif
if(pl) {
if(GET_POS(ch) <= POSITION_SLEEPING)
return(FALSE);
argument_interpreter(arg,arg1,arg2);
who=get_char_room(arg1,ch->in_room);
switch(cmd) {
case 19: /* Tell */
if(who==ch) {
do_tell(pl,arg,cmd);
do_action(ch,"",35);
switch(number(1,20)) {
case 1:
str=" I ain't got no problem with that - it's your opinion.";
break;
case 2:
str=" Hehehe.";
break;
case 3:
str=" You're just SO much smarter than simple little farmers like us...NOT!";
break;
default:
break;
}
if(str) {
arg2[0]=0;
strcat(arg2,GET_NAME(pl));
strcat(arg2,str);
do_tell(ch,arg2,0);
}
}
}
} else {
switch(number(1,13)) {
case 1:
do_action(ch,"",198);
break;
case 2:
if(world[ch->in_room].room_flags & INDOORS)
do_say(ch,"Ya know, I really like being outside.",0);
else {
act("$n examines the ground for its agricultural potential.",TRUE,ch,0,0,TO_ROOM);
if(world[ch->in_room].sector_type<=SECT_CITY)
do_say(ch,"Pbbbbbt!",0);
}
break;
default:
break;
}
}
return(FALSE);
}
int phalanx(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
struct obj_data *obj;
sh_int temp=0,temp2=0;
if(cmd < 0) {
obj=read_object(12000,VIRTUAL);
act("BOOM! $n explodes, leaving a $o, which\n\rfalls toward the ground, sparkling along the way.\n\r",FALSE,ch,obj,0,TO_ROOM);
obj_to_room(obj,ch->in_room);
return(FALSE);
}
if(pl) {
if(cmd==5 && pl!=ch) {
act("$n whirrs around the ceiling.",TRUE,ch,0,0,TO_ROOM);
act("$N is preventing you.",FALSE,pl,0,ch,TO_CHAR);
return(TRUE);
}
} else {
if(GET_POS(ch)==POSITION_FIGHTING) {
if((GET_HIT(ch) < (GET_MAX_HIT(ch)/4)) &&
(ch->in_room!=real_room(12144))) {
temp=ch->in_room;
do_move(ch,"",5);
if(ch->in_room!=temp) {
temp2=ch->in_room;
char_from_room(ch);
char_to_room(ch,temp,0);
act("$n retreats upward.",TRUE,ch,0,0,TO_ROOM);
ch->points.hit += ch->points.hit;
char_from_room(ch);
char_to_room(ch,temp2,0);
act("$n has arrived.",TRUE,ch,0,0,TO_ROOM);
}
}
} else if(ch->points.armor==0) {
act("$n forms a new configuration.",TRUE,ch,0,0,TO_ROOM);
ch->points.armor=-50;
} else {
switch(dice(3,7)) {
case 20:
act("$n splits apart to reorganize.",TRUE,ch,
0,0,TO_ROOM);
ch->points.armor=0;
break;
case 19:
act("$n makes some crackling noises.",
FALSE,ch,0,0,TO_ROOM);
break;
case 7:
act("A spark emanates from the interior of $n.",
FALSE,ch,0,0,TO_ROOM);
break;
default:
break;
}
}
}
return(FALSE);
}
int skeleton(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
struct char_data *temp;
if(cmd<0) {
if(!ch->specials.spec[0])
ch->specials.spec[0]=3;
else if(!--ch->specials.spec[0])
return(FALSE);
temp=read_mobile(ch->nr,REAL);
if(temp) {
char_to_room(temp,ch->in_room,0);
temp->specials.spec[0]=ch->specials.spec[0];
}
temp=read_mobile(ch->nr,REAL);
if(temp) {
char_to_room(temp,ch->in_room,0);
temp->specials.spec[0]=ch->specials.spec[0];
}
act("The bones of the skeleton split apart and reform into two new skeletons.",TRUE,ch,0,0,TO_ROOM);
}
return(FALSE);
}
/* item proc */
int crystal_spike(struct obj_data *obj,struct char_data *ch,int cmd,char *arg)
{
int pos=-1,i;
if(!ch)
return(FALSE);
if(!obj->equipped_by)
return(FALSE);
for(i=0;i<MAX_WEAR;i++)
if(obj->equipped_by->equipment[i]==obj)
pos=i;
if(pos==-1)
return(FALSE);
if(cmd && obj->equipped_by==ch) {
if(cmd==84) { /* Cast */
obj->obj_flags.value[0]--;
if(obj->obj_flags.value[0] < 1) {
act("Your $p fades slowly, and disappears into nothing.",FALSE,obj->equipped_by,obj,0,TO_CHAR);
act("$n's $p fades slowly, and disappears into nothing.",FALSE,obj->equipped_by,obj,0,TO_ROOM);
unequip_char(obj->equipped_by,pos);
extract_obj(obj);
}
}
}
return(FALSE);
}
int spore_ball(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
struct char_data *k;
if(cmd==-1) {
act("$n crumples, a noxious gas escaping its interior.",FALSE,ch,0,0,TO_ROOM);
if(is_in_safe(ch))
act("The gas dissipates harmlessly.",FALSE,ch,0,0,TO_ROOM);
else
for(k=world[ch->in_room].people;k;k=k->next_in_room)
if(k!=ch)
spell_poison(24,ch,k,0);
}
return(FALSE);
}
int bridge_troll(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
int gold;
struct char_data *k,*save;
if(pl) {
if(cmd==72) { /* give */
gold=GET_GOLD(ch);
do_give(pl,arg,cmd);
if(gold=GET_GOLD(ch)-gold) {
if(gold<500)
do_say(ch,"You STILL need to pay me 500 gold, pal.",0);
else {
do_action(ch,GET_NAME(pl),23);/*smile*/
k=world[ch->in_room].people;
while(k!=ch && k!=pl && k)
k=k->next_in_room;
if(!k) { /* Should not happen! */
log("Troll error 1!");
return(TRUE);
}
act("$N picks you and tosses you to the other side of the bridge!",FALSE,pl,0,ch,TO_CHAR);
act("$N throws $n to the other side of the bridge!",TRUE,pl,0,ch,TO_NOTVICT);
char_from_room(pl);
if(k==ch)
char_to_room(pl,real_room(14236),0);
else
char_to_room(pl,real_room(14238),2);
act("$n lands in a pile here from the direction of the bridge!",TRUE,pl,0,0,TO_ROOM);
GET_POS(pl)==POSITION_SITTING;
do_look(pl,"",0);
}
}
return(TRUE);
}
} else {
ch->specials.spec[0]++;
if(ch->specials.spec[0]==6) {
ch->specials.spec[0]=0;
GET_HIT(ch)=MIN(GET_HIT(ch)+6,hit_limit(ch));
}
}
return(FALSE);
}
/* Pi's room proc */
struct obj_data *find_key(struct char_data *ch, int key)
{
struct obj_data *o, *tar_obj;
tar_obj=0;
if(!has_key(ch,key)) return(0);
for(o=ch->carrying; o; o=o->next_content)
if(obj_index[o->item_number].virtual==key)
tar_obj=o;
if(ch->equipment[HOLD])
if(obj_index[ch->equipment[HOLD]->item_number].virtual == key)
tar_obj=ch->equipment[HOLD];
return(tar_obj);
}
int feed_lock(int room,struct char_data *ch, int cmd, char *arg)
{
void do_unlock(struct char_data *ch, char *argument, int cmd);
struct obj_data *obj;
int door;
char type[100], dir[100];
if (cmd!=102) return FALSE;
if (cmd==102) { /*Unlock*/
argument_interpreter(arg, type, dir);
if (!(door = find_door(ch, type, dir))) return FALSE;
if (!(obj=find_key(ch, EXIT(ch,door)->key))) return FALSE;
if (IS_SET(EXIT(ch, door)->exit_info, EX_LOCKED)) {
do_unlock(ch,arg,cmd);
act("The Lock says 'yummie... I like to eat keys.'\n\rthe Lock looks at the key.\n\rthe Lock grins evily.\n\r\n\r",TRUE,ch,obj,0,TO_ROOM);
act("The Lock says 'yummie... I like to eat keys.'\n\rthe Lock looks at the key.\n\rthe Lock grins evily.\n\r\n\r",TRUE,ch,obj,0,TO_CHAR);
act("Hey!. The Lock has eaten $p.\n\r",TRUE,ch,obj,0,TO_ROOM);
act("Hey!. The Lock has eaten your key!.\n\r",TRUE,ch,obj,0,TO_CHAR);
act("The Lock says 'mo food ..mo food.. I'm still hungry'\n\r",TRUE,ch,obj,0,TO_ROOM);
act("The Lock says 'mo food ..mo food.. I'm still hungry'\n\r",TRUE,ch,obj,0,TO_CHAR);
if ((ch->equipment[HOLD]) && (ch->equipment[HOLD]==obj))
unequip_char(ch, HOLD);
extract_obj(obj);
return TRUE;
}
return FALSE;
}
return FALSE;
}