/* 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(witness(ch,pl,cmd,arg))
return(TRUE);
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,pl,selling,ch,TO_CHAR);
act("$N waves the $p in $n's face.",
FALSE,pl,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(witness(ch,pl,cmd,arg))
return(TRUE);
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);
}
}
/* 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(witness(ch,pl,cmd,arg))
return(TRUE);
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 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(witness(ch,pl,cmd,arg))
return(TRUE);
if(pl) {
/* perhaps put in something later */
} else {
switch(number(1,15)) {
case 1:
do_action(ch,"cookie",244);
break;
case 2:
do_action(ch,"",106); /* He burps */
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 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,temp=i->next_in_room;
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 landshark(struct char_data *ch,struct char_data *pl,int cmd,char *arg)
{
if(!pl) {
if(ch->specials.spec[0] && GET_POS(ch)>POSITION_FIGHTING) {
switch(ch->specials.spec[0]) {
case 1:
do_say(ch,"Flowers.",0);
break;
case 2:
do_say(ch,"Candygram.",0);
break;
case 3:
do_say(ch,"Plumber.",0);
break;
case 4:
do_say(ch,"I'm only a dolphin.",0);
ch->specials.spec[0]=-1;
SET_BIT(ch->specials.act,ACT_AGGRESSIVE);
break;
default:
break;
}
ch->specials.spec[0]++;
} else if(!number(0,9) &&!ch->specials.spec[0]) {
ch->specials.spec[0]=1;
REMOVE_BIT(ch->specials.act,ACT_AGGRESSIVE);
}
}
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);
}