#define HUNT_FILE "hunt.table" #include <stdio.h> #include <string.h> #include <ctype.h> #include <time.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 variables */ extern struct room_data *world; extern struct descriptor_data *descriptor_list; extern struct char_data *character_list; extern struct obj_data *object_list; extern char credits[MAX_STRING_LENGTH]; extern char news[MAX_STRING_LENGTH]; extern char info[MAX_STRING_LENGTH]; extern char wizlist[MAX_STRING_LENGTH]; extern char *dirs[]; extern char *where[]; extern char *color_liquid[]; extern char *fullness[]; extern char *room_bits[]; extern int top_of_world; typedef struct HUNTTYPE { int direct; int dist; } HUNTTYPE; int direct(int x,int y) { struct HUNTTYPE *direct; char buf[50]; register int i; FILE *ptr; direct=malloc(sizeof(HUNTTYPE)); if (!(ptr=fopen(HUNT_FILE,"r"))) { log("Error reading HUNT_FILE"); return; } fseek(ptr,sizeof(HUNTTYPE)*(x*(top_of_world+1))+y*sizeof(HUNTTYPE),0); fread(direct,sizeof(HUNTTYPE),1,ptr); fclose(ptr); i=direct->direct; free(direct); return(i); } int dist(int x,int y) { struct HUNTTYPE *dist; char buf[50]; register int i; FILE *ptr; dist=malloc(sizeof(HUNTTYPE)); if (!(ptr=fopen(HUNT_FILE,"r"))) { log("Error reading HUNT_FILE"); return; } fseek(ptr,sizeof(HUNTTYPE)*(x*(top_of_world+1))+y*sizeof(HUNTTYPE),0); fread(dist,sizeof(HUNTTYPE),1,ptr); fclose(ptr); i=dist->dist; free(dist); return(i); } void huntstep(struct char_data *ch, int wasroom) { char buf[MAX_STRING_LENGTH]; char *exits[] = { "North", "East", "South", "West", "Up", "Down" }; int temp; if (!ch->specials.hunting) { REMOVE_BIT(ch->specials.act,PLR_HUNT); return; } if (dist(ch->in_room,ch->specials.hunting->in_room)==-1) { if (IS_SET(ch->specials.act,PLR_GRAPHICS)) sprintf(buf,"%c%c%c%cYou seem to have lost the scent of your victim.%c%c%c\n\r",27,91,55,109,27,91,109); else sprintf(buf,"You seem to have lost the scent of your victim.\n\r"); send_to_char(buf,ch); REMOVE_BIT(ch->specials.act,PLR_HUNT); ch->specials.hunting=NULL; return; } if (dist(ch->in_room,ch->specials.hunting->in_room)==0) { if (IS_SET(ch->specials.act,PLR_GRAPHICS)) sprintf(buf,"%c%c%c%cYou have succeeded in hunting down your victim.%c%c%c\n\r",27,91,55,109,27,91,109); else sprintf(buf,"You have succeeded in hunting down your victim.\n\r"); send_to_char(buf,ch); REMOVE_BIT(ch->specials.act,PLR_HUNT); ch->specials.hunting=NULL; return; } for (temp=0;temp<=5;++temp) if (world[ch->in_room].dir_option[temp]) if (world[ch->in_room].dir_option[temp]->to_room == direct(ch->in_room,ch->specials.hunting->in_room)) { if (dist(ch->in_room,ch->specials.hunting->in_room)> dist(wasroom,ch->specials.hunting->in_room)) { if (IS_SET(ch->specials.act,PLR_GRAPHICS)) sprintf(buf,"%c%c%c%cYou have seem to have lost the scent.%c%c%c\n\r",27,91,55,109,27,91,109); else sprintf(buf,"You have seem to have lost the scent.\n\r"); REMOVE_BIT(ch->specials.act,PLR_HUNT); ch->specials.hunting=NULL; send_to_char(buf,ch); return; } if (IS_SET(ch->specials.act,PLR_GRAPHICS)) sprintf(buf,"%c%c%c%cThe scent seems to be coming from direction %s.%c%c%c\n\r",27,91,55,109,exits[temp],27,91,109); else sprintf(buf,"The scent seems to be coming from direction %s.\n\r",exits[temp]); send_to_char(buf,ch); break; } return; } void huntmove(struct char_data *hunter, struct char_data *victim) { int temp; char direction[50]; void do_move(struct char_data *ch, char *argument, int cmd); for (temp=0;temp<=5;++temp) if (world[hunter->in_room].dir_option[temp]) if (world[hunter->in_room].dir_option[temp]->to_room == direct(hunter->in_room,victim->in_room)) { switch(temp) { case 0: strcpy(direction,"north"); break; case 1: strcpy(direction,"east"); break; case 2: strcpy(direction,"south"); break; case 3: strcpy(direction,"west"); break; case 4: strcpy(direction,"up"); break; case 5: strcpy(direction,"down"); break; } do_move(hunter,direction,temp+1); } } /* nice and clean eh? PHL */ void do_hunt(struct char_data *ch, char *argument, int cmd) { char name[MAX_INPUT_LENGTH], buf[MAX_STRING_LENGTH]; struct char_data *i,*bestchar; struct obj_data *k,*bestobj; struct descriptor_data *d; int bestdist; int temp; bool found; int x; char *exits[] = { "North", "East", "South", "West", "Up", "Down" }; one_argument(argument, name); if (!*name) { send_to_char("What do you want to hunt for?\n\r", ch); return; } if (GET_LEVEL(ch)>20) if (is_number(name)) { x=atoi(name); if (x<0||x>top_of_world) { send_to_char("Real room number out of range.\n\r",ch); return; } sprintf(buf,"From(R%d)(V%d) To(%d)(V%d).. Go(R%d)(V%d) Dist(%d)\n\r", ch->in_room,world[ch->in_room].number, x,world[x].number, direct(ch->in_room,x),world[direct(ch->in_room,x)].number, dist(ch->in_room,x)); send_to_char(buf,ch); return; } *buf = '\0'; found = FALSE; bestdist = MAXROOM+1; for (i = character_list; i; i = i->next) if (isname(name, i->player.name) && CAN_SEE(ch, i) ) { if ((i->in_room != NOWHERE) && ((GET_LEVEL(ch)>20) || (dist(ch->in_room,i->in_room)<=(GET_LEVEL(ch)*4)))) { if ((IS_SET(i->specials.act,PLR_GODINVIS))&& (GET_LEVEL(ch)<GET_LEVEL(i))) continue; if (dist(ch->in_room,i->in_room) != -1) if (dist(ch->in_room,i->in_room) < bestdist) { found=TRUE; bestchar = i; bestdist = dist(ch->in_room,i->in_room); } } } if (found) { if (!bestdist) { send_to_char("Right here in this room!\n\r",ch); REMOVE_BIT(ch->specials.act,PLR_HUNT); ch->specials.hunting=NULL; return; } for (temp=0;temp<=5;++temp) if (world[ch->in_room].dir_option[temp]) if (world[ch->in_room].dir_option[temp]->to_room == direct(ch->in_room,bestchar->in_room)) { if (IS_SET(ch->specials.act,PLR_GRAPHICS)) sprintf(buf,"%c%c%c%cThe scent seems to be coming from direction %s.%c%c%c\n\r",27,91,55,109,exits[temp],27,91,109); else sprintf(buf,"The scent seems to be coming from direction %s.\n\r",exits[temp]); send_to_char(buf,ch); ch->specials.hunting=bestchar; SET_BIT(ch->specials.act,PLR_HUNT); break; } return; } if (!found) { for (k = object_list; k; k = k->next) if (isname(name, k->name) && CAN_SEE_OBJ(ch, k) && (k->in_room != NOWHERE)) if ((GET_LEVEL(ch) > 20) || (dist(ch->in_room,k->in_room)<=(GET_LEVEL(ch)*4))) if (dist(ch->in_room,k->in_room) != -1) if (dist(ch->in_room,k->in_room) < bestdist) { found=TRUE; bestobj = k; bestdist = dist(ch->in_room,k->in_room); } } if (found) { if (!bestdist) { send_to_char("Right here in this room!\n\r",ch); REMOVE_BIT(ch->specials.act,PLR_HUNT); ch->specials.hunting=NULL; return; } for (temp=0;temp<=5;++temp) if (world[ch->in_room].dir_option[temp]) if (world[ch->in_room].dir_option[temp]->to_room == direct(ch->in_room,bestobj->in_room)) { if (IS_SET(ch->specials.act,PLR_GRAPHICS)) sprintf(buf,"%c%c%c%cYour ESP (with help from gods) tells you the object is %s.%c%c%c\n\r",27,91,55,109,exits[temp],27,91,109); else sprintf(buf,"Your ESP (with help from gods) tells you the object is %s.\n\r",exits[temp]); send_to_char(buf,ch); REMOVE_BIT(ch->specials.act,PLR_HUNT); ch->specials.hunting=NULL; break; } return; } if (!found) { send_to_char("You couldn't find any scent.\n\r", ch); REMOVE_BIT(ch->specials.act,PLR_HUNT); ch->specials.hunting=NULL; } }