#define HUNT_FILE "hunt.table" #include <stdio.h> #include <string.h> #include <ctype.h> #include <time.h> #include "structs.h" #include "utils.h" #include "db.h" #include "comm.h" #include "handler.h" #include "limits.h" typedef struct HUNTTYPE { int direct; int dist; } HUNTTYPE; extern struct room_data *world; extern int top_of_world; void do_hunt(struct char_data *a,char *b,int c) { } void huntstep(struct char_data *a,int c) { } void huntmove(struct char_data *a,struct char_data *b) { } int main(int argc,char **argv) { if (chdir(DFLT_DIR)<0) { perror("Cant open the directory"); return(0); } log("booting zones"); boot_zones(); log("booting world"); boot_world(); log("renumbering world"); renum_world(); log("doing setup"); huntsetup(); log("writing to file"); writehuntfile(); } int direct[MAXROOM+1][MAXROOM+1]; int dist[MAXROOM+1][MAXROOM+1]; void writehuntfile() { struct HUNTTYPE *cell; char buf[50]; register int x,y; FILE *ptr; cell = malloc(sizeof(HUNTTYPE)); if(!( ptr=fopen(HUNT_FILE,"w"))) { log("Error writing to HUNT_FILE"); return; } for(x=0;x<=top_of_world;++x) for(y=0;y<=top_of_world;++y) { cell->direct=direct[x][y]; cell->dist=dist[x][y]; fwrite(cell,sizeof(HUNTTYPE),1,ptr); } fclose(ptr); } void inithunt(void) { register int x,y; char buf[100]; sprintf(buf,"init:tow(%d)",top_of_world); log(buf); for (x=0;x<=top_of_world;++x) for (y=0;y<=top_of_world;++y) { direct[x][y]=-1; dist[x][y]=-1; if (x==y) { direct[x][y]=-2; dist[x][y]=0; } } sprintf(buf,"init:beginassign",top_of_world); log(buf); for(x=0;x<=top_of_world;++x) for(y=0;y<=5;++y) if(world[x].dir_option[y]) if (world[x].dir_option[y]->to_room != NOWHERE) if (world[x].dir_option[y]->to_room != x) { direct[x][world[x].dir_option[y]->to_room]= world[x].dir_option[y]->to_room; dist[x][world[x].dir_option[y]->to_room]=1; } } /* This is a weird, but working world table needed by do_hunt to find the path to any object or monster. Note that it is my pseudo algorithm for finding the shortest path between two rooms. (If a better one exists please insert here :) PHL */ void huntsetup(void) { register int counter=0,tempx,minpath; register int top_of_worl = top_of_world; char buf[100]; register int from,to,x; inithunt(); sprintf(buf,"setup:begin",top_of_world); log(buf); do { for (from=0;from<=top_of_worl;++from) for (to=0;to<=top_of_worl;++to) if (direct[from][to]==-1) { tempx=-1; minpath=top_of_worl+2; for (x=0;x<=top_of_worl;++x) if ((direct[x][to]>=0)&&(direct[from][x]>=0)) if (dist[x][to]+dist[from][x]<minpath) { minpath=dist[x][to]+dist[from][x]; tempx=direct[from][x]; } if (tempx!=-1) { direct[from][to]=tempx; dist[from][to]=minpath; } } sprintf(buf,"setup:(%d)",counter); log(buf); } while (counter++ <=10); }