Look for the following in merc.h: extern sh_int gsn_recall; Then add: extern sh_int gsn_hunt;
[EMAIL PROTECTED] wrote: > This is my hunt.c and for some reason it wont compile right because it > says that gsn_hunt isn't declared. But I do have it declared and > everything... Hrm... Anybody see anything wrong with it. Btw I think it > might be where it says gsn_hunt might be: > ch->pcdata->learned[gsn_hunt] > Instead of (I THINK) something like: > ch, gsn_hunt, FALSE, 2 > or something of the sort. Thats what I seen in the code. What do the TRUE > FALSE and numerical args stand for though? > Here's hunt.c: > > /* > * > * Modified by Baxter for Deadland MUD (Rom2.4b4) (01-Feb-97). > * Hidayet Dogan ([EMAIL PROTECTED]) > * ftp://deadland.ada.com.tr/pub/mud/Rom/code/track.skill (195.142.130.3) > * Deadland MUD - deadland.ada.com.tr 4000 (195.142.130.3) > * > */ > > /* > * SillyMUD Distribution V1.1b (c) 1993 SillyMUD Developement > * See license.doc for distribution terms. SillyMUD is based on DIKUMUD > * > * Modifications by Rip in attempt to port to merc 2.1 > */ > > /* > * Modified by Turtle for Merc22 (07-Nov-94) > * > * I got this one from > ftp.atinc.com:/pub/mud/outgoing/track.merc21.tar.gz. > * It cointained 5 files: README, hash.c, hash.h, skills.c, and skills.h. > * I combined the *.c and *.h files in this hunt.c, which should compile > * without any warnings or errors. > */ > > /* > * Some systems don't have bcopy and bzero functions in their linked > libraries. > * If compilation fails due to missing of either of these functions, > * define NO_BCOPY or NO_BZERO accordingly. -- Turtle > 31-Jan-95 > */ > > #if defined(macintosh) > #include <types.h> > #include <time.h> > #else > #include <sys/types.h> > #include <sys/time.h> > #endif > #include <stdio.h> > #include <stdlib.h> > #include <unistd.h> > #include "merc.h" > #include "interp.h" > #include "recycle.h" > #include "tables.h" > #include "lookup.h" > #include "olc.h" > > DECLARE_DO_FUN(do_say ); > DECLARE_DO_FUN(do_open ); > > void bcopy(register char *s1,register char *s2,int len); > void bzero(register char *sp,int len); > > struct hash_link > { > int key; > struct hash_link *next; > void *data; > }; > > struct hash_header > { > int rec_size; > int table_size; > int *keylist, klistsize, klistlen; /* this is really lame, > AMAZINGLY lame */ > struct hash_link **buckets; > }; > > #define WORLD_SIZE 30000 > #define HASH_KEY(ht,key)((((unsigned int)(key))*17)%(ht)->table_size) > > struct hunting_data > { > char *name; > struct char_data **victim; > }; > > struct room_q > { > int room_nr; > struct room_q *next_q; > }; > > struct nodes > { > int visited; > int ancestor; > }; > > #define IS_DIR (get_room_index(q_head->room_nr)->exit[i]) > #define GO_OK (!IS_SET( IS_DIR->exit_info, EX_CLOSED )) > #define GO_OK_SMARTER 1 > > #if defined( NO_BCOPY ) > void bcopy(register char *s1,register char *s2,int len) > { > while( len-- ) *(s2++) = *(s1++); > } > #endif > > #if defined( NO_BZERO ) > void bzero(register char *sp,int len) > { > while( len-- ) *(sp++) = '\0'; > } > #endif > > void init_hash_table(struct hash_header *ht,int rec_size,int table_size) > { > ht->rec_size = rec_size; > ht->table_size= table_size; > ht->buckets = (void*)calloc(sizeof(struct hash_link**),table_size); > ht->keylist = (void*)malloc(sizeof(ht->keylist)*(ht->klistsize=128)); > ht->klistlen = 0; > } > > void init_world(ROOM_INDEX_DATA *room_db[]) > { > /* zero out the world */ > bzero((char *)room_db,sizeof(ROOM_INDEX_DATA *)*WORLD_SIZE); > } > > void destroy_hash_table(struct hash_header *ht,void (*gman)()) > { > int i; > struct hash_link *scan,*temp; > > for(i=0;i<ht->table_size;i++) > for(scan=ht->buckets[i];scan;) > { > temp = scan->next; > (*gman)(scan->data); > free(scan); > scan = temp; > } > free(ht->buckets); > free(ht->keylist); > } > > void _hash_enter(struct hash_header *ht,int key,void *data) > { > /* precondition: there is no entry for <key> yet */ > struct hash_link *temp; > int i; > > temp = (struct hash_link *)malloc(sizeof(struct hash_link)); > temp->key = key; > temp->next = ht->buckets[HASH_KEY(ht,key)]; > temp->data = data; > ht->buckets[HASH_KEY(ht,key)] = temp; > if(ht->klistlen>=ht->klistsize) > { > ht->keylist = (void*)realloc(ht->keylist,sizeof(*ht->keylist)* > (ht->klistsize*=2)); > } > for(i=ht->klistlen;i>=0;i--) > { > if(ht->keylist[i-1]<key) > { > ht->keylist[i] = key; > break; > } > ht->keylist[i] = ht->keylist[i-1]; > } > ht->klistlen++; > } > > ROOM_INDEX_DATA *room_find(ROOM_INDEX_DATA *room_db[],int key) > { > return((key<WORLD_SIZE&&key>-1)?room_db[key]:0); > } > > void *hash_find(struct hash_header *ht,int key) > { > struct hash_link *scan; > > scan = ht->buckets[HASH_KEY(ht,key)]; > > while(scan && scan->key!=key) > scan = scan->next; > > return scan ? scan->data : NULL; > } > > int room_enter(ROOM_INDEX_DATA *rb[],int key,ROOM_INDEX_DATA *rm) > { > ROOM_INDEX_DATA *temp; > > temp = room_find(rb,key); > if(temp) return(0); > > rb[key] = rm; > return(1); > } > > int hash_enter(struct hash_header *ht,int key,void *data) > { > void *temp; > > temp = hash_find(ht,key); > if(temp) return 0; > > _hash_enter(ht,key,data); > return 1; > } > > ROOM_INDEX_DATA *room_find_or_create(ROOM_INDEX_DATA *rb[],int key) > { > ROOM_INDEX_DATA *rv; > > rv = room_find(rb,key); > if(rv) return rv; > > rv = (ROOM_INDEX_DATA *)malloc(sizeof(ROOM_INDEX_DATA)); > rb[key] = rv; > > return rv; > } > > void *hash_find_or_create(struct hash_header *ht,int key) > { > void *rval; > > rval = hash_find(ht, key); > if(rval) return rval; > > rval = (void*)malloc(ht->rec_size); > _hash_enter(ht,key,rval); > > return rval; > } > > int room_remove(ROOM_INDEX_DATA *rb[],int key) > { > ROOM_INDEX_DATA *tmp; > > tmp = room_find(rb,key); > if(tmp) > { > rb[key] = 0; > free(tmp); > } > return(0); > } > > void *hash_remove(struct hash_header *ht,int key) > { > struct hash_link **scan; > > scan = ht->buckets+HASH_KEY(ht,key); > > while(*scan && (*scan)->key!=key) > scan = &(*scan)->next; > > if(*scan) > { > int i; > struct hash_link *temp, *aux; > > temp = (*scan)->data; > aux = *scan; > *scan = aux->next; > free(aux); > > for(i=0;i<ht->klistlen;i++) > if(ht->keylist[i]==key) > break; > > if(i<ht->klistlen) > { > bcopy((char *)ht->keylist+i+1,(char *)ht->keylist+i,(ht->klistlen-i) > *sizeof(*ht->keylist)); > ht->klistlen--; > } > > return temp; > } > > return NULL; > } > > void room_iterate(ROOM_INDEX_DATA *rb[],void (*func)(),void *cdata) > { > register int i; > > for(i=0;i<WORLD_SIZE;i++) > { > ROOM_INDEX_DATA *temp; > > temp = room_find(rb,i); > if(temp) (*func)(i,temp,cdata); > } > } > > void hash_iterate(struct hash_header *ht,void (*func)(),void *cdata) > { > int i; > > for(i=0;i<ht->klistlen;i++) > { > void *temp; > register int key; > > key = ht->keylist[i]; > temp = hash_find(ht,key); > (*func)(key,temp,cdata); > if(ht->keylist[i]!=key) /* They must have deleted this room */ > i--; /* Hit this slot again. */ > } > } > > int exit_ok( EXIT_DATA *pexit ) > { > ROOM_INDEX_DATA *to_room; > > if ( ( pexit == NULL ) > || ( to_room = pexit->u1.to_room ) == NULL ) > return 0; > > return 1; > } > > void donothing() > { > return; > } > > int find_path( int in_room_vnum, int out_room_vnum, CHAR_DATA *ch, > int depth, int in_zone ) > { > struct room_q *tmp_q, *q_head, *q_tail; > struct hash_header x_room; > int i, tmp_room, count=0, thru_doors; > ROOM_INDEX_DATA *herep; > ROOM_INDEX_DATA *startp; > EXIT_DATA *exitp; > > if ( depth <0 ) > { > thru_doors = TRUE; > depth = -depth; > } > else > { > thru_doors = FALSE; > } > > startp = get_room_index( in_room_vnum ); > > init_hash_table( &x_room, sizeof(int), 2048 ); > hash_enter( &x_room, in_room_vnum, (void *) - 1 ); > > /* initialize queue */ > q_head = (struct room_q *) malloc(sizeof(struct room_q)); > q_tail = q_head; > q_tail->room_nr = in_room_vnum; > q_tail->next_q = 0; > > while(q_head) > { > herep = get_room_index( q_head->room_nr ); > /* for each room test all directions */ > if( herep->area == startp->area || !in_zone ) > { > /* only look in this zone... > saves cpu time and makes world safer for players */ > for( i = 0; i <= 5; i++ ) > { > exitp = herep->exit[i]; > if( exit_ok(exitp) && ( thru_doors ? GO_OK_SMARTER : GO_OK ) ) > { > /* next room */ > tmp_room = herep->exit[i]->u1.to_room->vnum; > if( tmp_room != out_room_vnum ) > { > /* shall we add room to queue ? > count determines total breadth and depth */ > if( !hash_find( &x_room, tmp_room ) > && ( count < depth ) ) > /* && !IS_SET( RM_FLAGS(tmp_room), DEATH ) ) */ > { > count++; > /* mark room as visted and put on queue */ > > tmp_q = (struct room_q *) > malloc(sizeof(struct room_q)); > tmp_q->room_nr = tmp_room; > tmp_q->next_q = 0; > q_tail->next_q = tmp_q; > q_tail = tmp_q; > > /* ancestor for first layer is the direction */ > hash_enter( &x_room, tmp_room, > ((int)hash_find(&x_room,q_head->room_nr) > == -1) ? (void*)(i+1) > : hash_find(&x_room,q_head->room_nr)); > } > } > else > { > /* have reached our goal so free queue */ > tmp_room = q_head->room_nr; > for(;q_head;q_head = tmp_q) > { > tmp_q = q_head->next_q; > free(q_head); > } > /* return direction if first layer */ > if ((int)hash_find(&x_room,tmp_room)==-1) > { > if (x_room.buckets) > { > /* junk left over from a previous track */ > destroy_hash_table(&x_room, donothing); > } > return(i); > } > else > { > /* else return the ancestor */ > int i; > > i = (int)hash_find(&x_room,tmp_room); > if (x_room.buckets) > { > /* junk left over from a previous track */ > destroy_hash_table(&x_room, donothing); > } > return( -1+i); > } > } > } > } > } > > /* free queue head and point to next entry */ > tmp_q = q_head->next_q; > free(q_head); > q_head = tmp_q; > } > > /* couldn't find path */ > if( x_room.buckets ) > { > /* junk left over from a previous track */ > destroy_hash_table( &x_room, donothing ); > } > return -1; > } > > /* void do_track( CHAR_DATA *ch, char *argument ) */ > void do_hunt( CHAR_DATA *ch, char *argument ) > { > char buf[MAX_STRING_LENGTH]; > char arg[MAX_STRING_LENGTH]; > CHAR_DATA *victim; > int direction; > bool fArea; > > one_argument( argument, arg ); > > if (!IS_NPC(ch) > && ch->level < skill_table[gsn_hunt].skill_level[ch->class]) > { > send_to_char("Huh?\n\r",ch); > return; > } > > if( arg[0] == '\0' ) > { > send_to_char( "Whom are you trying to hunt?\n\r", ch ); > return; > } > > /* only imps can hunt to different areas */ > fArea = ( get_trust(ch) < MAX_LEVEL ); > > if (IS_NPC(ch)) > victim = get_char_world( ch, arg ); > else if (fArea) > victim = get_char_area( ch, arg ); > else > victim = get_char_world( ch, arg ); > > if( victim == NULL ) > { > send_to_char("No-one around by that name.\n\r", ch ); > return; > } > > if( ch->in_room == victim->in_room ) > { > act( "$N is here!", ch, NULL, victim, TO_CHAR ); > return; > } > > /* > * Deduct some movement. > */ > if( ch->move > 2 ) > ch->move -= 3; > else > { > send_to_char( "You're too exhausted to hunt anyone!\n\r", ch ); > return; > } > > act( "$n carefully sniffs the air.", ch, NULL, NULL, TO_ROOM ); > WAIT_STATE( ch, skill_table[gsn_hunt].beats ); > direction = find_path( ch->in_room->vnum, victim->in_room->vnum, > ch, -40000, fArea ); > > if( direction == -1 ) > { > act( "You couldn't find a path to $N from here.", > ch, NULL, victim, TO_CHAR ); > return; > } > > if( direction < 0 || direction > 5 ) > { > send_to_char( "Hmm... Something seems to be wrong.\n\r", ch ); > return; > } > > /* > * Give a random direction if the player misses the die roll. > */ > #if 0 > if( ( IS_NPC (ch) && number_percent () > 75) /* NPC @ 25% */ > || (!IS_NPC (ch) && number_percent () > /* PC @ norm */ > ch->pcdata->learned[gsn_hunt] ) ) > #endif > > if (!IS_NPC(ch) && number_percent() > ch->pcdata->learned[gsn_hunt]) > { > do > { > direction = number_door(); > } > while( ( ch->in_room->exit[direction] == NULL ) > || ( ch->in_room->exit[direction]->u1.to_room == NULL) ); > } > > /* > * Display the results of the search. > */ > sprintf( buf, "$N is %s from here.", dir_name[direction] ); > act( buf, ch, NULL, victim, TO_CHAR ); > check_improve(ch,gsn_hunt,TRUE,1); > return; > } > > _______________________________________________ > ROM mailing list > [email protected] > http://www.rom.org/cgi-bin/mailman/listinfo/rom

