/* bot functions */
#include <stdio.h>
#include <string.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"
/* extern vars */
extern struct time_info_data time_info;
extern char *dirletters;
extern struct command_info cmd_info[];
extern struct room_data *world;
extern struct char_data *character_list;
extern struct descriptor_data *descriptor_list;
extern struct index_data *obj_index;
extern struct index_data *mob_index;
extern struct player_index_element *player_table;
extern int top_of_p_table;
extern int top_of_mobt;
extern int top_of_objt;
/* extern functions */
void do_action(struct char_data *ch, char *argument, int cmd);
#ifdef NEEDS_STRDUP
char *strdup(char *source);
#endif
char *rand_player_room(struct char_data *ch);
char *rand_player_world(struct char_data *ch);
char *rand_playername_file();
char *rand_char_room(struct char_data *ch);
char *rand_mob_room(struct char_data *ch);
char *rand_player_room(struct char_data *ch) {
struct char_data *tmp;
int pcount;
pcount = 0;
for(tmp=world[ch->in_room].people;tmp;tmp=tmp->next_in_room)
if(!IS_NPC(tmp)) pcount++;
if(!pcount) return(NULL);
pcount = number(0,pcount-1);
for(tmp=world[ch->in_room].people;pcount||IS_NPC(tmp);tmp=tmp->next_in_room)
if(!IS_NPC(tmp)) pcount--;
return tmp ? GET_NAME(tmp) : GET_NAME(ch);
} /* end rand_player_room */
char *rand_player_world(struct char_data *ch) {
struct char_data *c;
struct descriptor_data *d;
int pcount =0;
for(d=descriptor_list;d;d=d->next) {
if(!d->connected) {
c = d->original ? d->original : d->character;
if(CAN_SEE(ch,c)) pcount++;
}
}
if(!pcount) return(NULL);
pcount=number(0,pcount-1);
for(d=descriptor_list;pcount || d->connected;d=d->next)
if(!d->connected) pcount--;
c = d->original ? d->original : d->character;
return c ? GET_NAME(c) : GET_NAME(ch);
} /* end rand_player_world*/
char *rand_playername_file() {
int pcount;
pcount = number(0,top_of_p_table);
return((player_table + pcount)->name);
} /* end rand_player_file */
char *rand_mob_room(struct char_data *ch) {
struct char_data *tmp;
int pcount=0;
for(tmp=world[ch->in_room].people;tmp;tmp=tmp->next_in_room)
if(IS_NPC(tmp)) pcount++;
if(!pcount) return(NULL);
pcount = number(0,pcount-1);
for(tmp=world[ch->in_room].people;pcount|| !IS_NPC(tmp);tmp=tmp->next_in_room)
if(IS_NPC(tmp)) pcount--;
return tmp ? tmp->player.short_descr : 0;
} /* end rand_mob_room */
char *rand_char_room(struct char_data *ch) {
struct char_data *tmp;
int pcount;
pcount = 0;
for(tmp=world[ch->in_room].people;tmp;tmp=tmp->next_in_room)
pcount++;
if(!pcount) return(NULL);
pcount = number(0,pcount-1);
for(tmp=world[ch->in_room].people;pcount;tmp=tmp->next_in_room)
pcount--;
if(!tmp)
return 0;
return IS_NPC(tmp) ? tmp->player.short_descr : GET_NAME(tmp);
} /* end rand_char_room */
struct obj_data *rand_object() {
extern int top_of_objt;
struct obj_data *otmp = NULL;
while(!otmp)
otmp = read_object(number(0,top_of_objt-1),REAL);
return(otmp);
} /* end rand_object */
#define NOBS 12
char *oblist[]={
"jackass", "scumbag",
"shithead", "goofball",
"jerk", "lowlife",
"moron", "toad",
"idiot", "slimeball",
"mole", "dickweed"
};
char *rand_obscenity()
{
return oblist[number(0,NOBS-1)];
}
#define NGRS 8
char *grlist[]={
"Hello", "Greetings", "Good Morning",
"Good Evening", "Salutations", "Bonjour",
"Yo", "Hi"
};
char *rand_greeting()
{
return grlist[number(0,NGRS-1)];
}
int bot(struct char_data *ch, int cmd, char *arg)
{
int i,k,n;
ubyte flag;
sbyte c;
char *p,*s,*st,buf[256];
struct char_data *tmp;
struct obj_data *otmp, *o;
if(cmd)
return(FALSE);
if(!ch->player.description)
return(FALSE);
n=ch->specials.xxx;
c=ch->player.description[n];
if(!n && !c)
return(FALSE);
++n;
switch(c){
case 0 : n=0;
case '\n': break;
case '0' :
case '1' :
case '2' :
case '3' :
case '4' :
case '5' :
do_move(ch,"",c-'0'+1);
break;
case 'A' :
for(i=0;;i++){
c=ch->player.description[n++];
if(!c || (c=='.'))
break;
if(c=='#'){
c=ch->player.description[n++];
if(c=='d'){ /* char variables */
c=dirletters[number(0,5)];
buf[i]=c;
} else { /* string variables */
flag=0;
switch(c){
case 'f': flag=1; st=rand_playername_file(); break;
case 'x': st=rand_obscenity(); break;
case 'y': st=rand_greeting(); break;
case 'r': st=rand_player_room(ch); break;
case 'w': st=rand_player_world(ch); break;
default: st=GET_NAME(ch); break;
}
if(st){
strcpy(buf+i,st);
if(flag && islower(buf[i]))
buf[i]=toupper(buf[i]);
i+=(strlen(st)- 1);
}
}
} else {
buf[i]=c;
}
}
buf[i]=0;
command_interpreter(ch,buf);
break;
case 'B' :
otmp = read_object(1599,VIRTUAL);
if(otmp){
otmp->obj_flags.timer=0;
SET_BIT(otmp->obj_flags.extra_flags,ITEM_POOFSOON);
obj_to_room(otmp,ch->in_room);
}
break;
case 'C' :
for(tmp=world[ch->in_room].people;tmp&&(tmp==ch);tmp=tmp->next_in_room);
if(tmp){
sprintf(buf,"2 coins %s",GET_NAME(tmp));
do_give(ch,buf,0);
}
break;
case 'D' :
do_drop(ch,"all",0);
break;
case 'E':
if(s=ch->player.title){
if(p=(char *)index(s,'#')){
strcpy(buf,s);
s=buf;
p=(char *)index(s,'#');
*p = '0'+number(0,5);
}
command_interpreter(ch,s);
}
break;
case 'F' :
for(tmp=world[ch->in_room].people;tmp&&(tmp==ch);tmp=tmp->next_in_room);
if(tmp){
sprintf(buf,"%s",GET_NAME(tmp));
do_follow(ch,buf,0);
}
break;
case 'G' :
do_get(ch,"all",0);
break;
case 'H':
if(ch->master){
tmp=ch->master;
act("$n utters the words 'judicandus dies'.",TRUE,ch,0,tmp,TO_ROOM);
cast_cure_light(GET_LEVEL(ch),ch,"",SPELL_TYPE_SPELL,tmp,0);
}
break;
case 'I' :
for(tmp=world[ch->in_room].people;tmp&&(tmp==ch);tmp=tmp->next_in_room);
if(tmp){
k=number(6,264);
if(cmd_info[k].command_pointer==do_action){
sprintf(buf,"%s",GET_NAME(tmp));
do_action(ch,buf,k);
}
}
break;
case 'J' :
k=number(6,264);
if(cmd_info[k].command_pointer==do_action)
do_action(ch,"",k);
break;
case 'L' :
sprintf(buf,"I'm having a swell time at %s!",
world[ch->in_room].name);
do_shout(ch,buf,0);
break;
/*
case 'M':
break;
i = number(0,top_of_mobt-1);
tmp = read_mobile(i,REAL);
if(tmp)
char_to_room(tmp,ch->in_room);
break;
case 'O':
break;
i = number(0,top_of_objt-1);
otmp = read_object(i,REAL);
if(otmp)
obj_to_room(otmp,ch->in_room);
break;
*/
case 'P' :
sprintf(buf,"bob %s %s","bot",random_bot_program());
command_interpreter(ch,buf);
break;
case 'R' :
do_move(ch,"",number(1,6));
break;
case 'S' :
for(o=ch->carrying;o;o=otmp) {
otmp = o->next_content;
sprintf(buf, "sell %s",fname(o->name));
if(!command_interpreter(ch,buf))
break;
}
break;
case 'T' :
teleport(ch,0);
break;
case 'W':
spell_word_of_recall(IMO,ch,ch,0);
break;
}
ch->specials.xxx=n;
return(FALSE);
}
#define NMHLINES 8
static char *mh_lines[]={
"Hey Mel, this Mud sucks!",
"Wipe the player file, Mel, ya creep!",
"Guess what sux, Mel!",
"Where's my ole pal, ThisMudSux?",
"About time for a player file wipe, isn't it?",
"Let's wipe this game out!",
"Time for a new player file!",
"This MUD sux!"
};
int mudhead(struct char_data *ch, int cmd, char *arg)
{
static char mudhead_path[] = "s3g2222dx0000p1r.";
static bool moving = FALSE;
static int index=0, lt = 0;
int n, t;
char buf[256];
if((cmd==94) && (GET_LEVEL(ch) > (IMO+1))){
if(!moving){
moving=TRUE; index=0; return(FALSE);
}
}
if(cmd)
return(FALSE);
if (!moving) {
if (time_info.hours == 12) {
do_shout(ch,"Hey, it's noon, time for me to get up!",0);
moving = TRUE;
index = 0;
}
}
if(!moving || (GET_POS(ch) < POSITION_SLEEPING))
return FALSE;
t = time(0);
if((t - lt) < 5)
return;
switch (n=mudhead_path[index]) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
if(CAN_GO(ch,n-'0'))
do_move(ch,"",n-'0'+1);
break;
case 'd':
do_drop(ch,"all",0);
break;
case 'g':
do_get(ch,"all",0);
break;
case 'r':
GET_POS(ch) = POSITION_RESTING;
act("$n falls down.",FALSE,ch,0,0,TO_ROOM);
break;
case 's':
GET_POS(ch) = POSITION_STANDING;
act("$n just manages to stand up.",FALSE,ch,0,0,TO_ROOM);
break;
case 'p':
do_piss(ch,"",0);
break;
case 'x':
do_shout(ch,mh_lines[number(0,NMHLINES-1)],0);
break;
case '.':
moving = FALSE;
index=0;
break;
}
index++;
lt = t;
return TRUE;
}