Here's the first of the two attachments to the mail... *shrug* -- Erm... Yeah. Whatever. /*************************************************************************** * Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, * * Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. * * * * Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael * * Chastain, Michael Quan, and Mitchell Tse. * * * * In order to use any part of this Merc Diku Mud, you must comply with * * both the original Diku license in 'license.doc' as well the Merc * * license in 'license.txt'. In particular, you may not remove either of * * these copyright notices. * * * * Much time and thought has gone into this software and you are * * benefitting. We hope that you share your changes too. What goes * * around, comes around. * ***************************************************************************/ #include <ctype.h> #include <stdio.h> #include <stdlib.h> #ifdef unix #include <string.h> #else #include <strings.h> #endif typedef struct obj_index_data OBJ_INDEX_DATA; typedef struct bitvector_type BITVECTOR_DATA; typedef struct affect_data AFFECT_DATA; #define MAX_VNUMS 500 int logs[8]; /* Log base 2 list */ int room_vnum[MAX_VNUMS]; int exit_data[MAX_VNUMS]; int total_room; int obj_vnum[MAX_VNUMS]; int total_obj; int mob_vnum[MAX_VNUMS]; int total_mob; /* * An affect. */ struct affect_data { AFFECT_DATA *next; int type; int duration; int location; int modifier; int bitvector; }; /* * Prototype for an object. */ struct obj_index_data { AFFECT_DATA * affected; int vnum; int item_type; int extra_flags; int wear_flags; int weight; int cost; int value [4]; int level_rent; int level; }; struct bitvector_type /* text of particular body parts */ { char *name; /* name of bit */ int value; BITVECTOR_DATA *next; }; BITVECTOR_DATA *bitvector_list; /* * Globals. */ #if !defined(FALSE) #define FALSE 0 #endif #if !defined(TRUE) #define TRUE 1 #endif #define MAX_INPUT_LENGTH 2000 #define MAX_STRING_LENGTH 8000 #define APPLY_NONE 0 #define APPLY_STR 1 #define APPLY_DEX 2 #define APPLY_INT 3 #define APPLY_WIS 4 #define APPLY_CON 5 #define APPLY_SEX 6 #define APPLY_MANA 12 #define APPLY_HIT 13 #define APPLY_MOVE 14 #define APPLY_AC 17 #define APPLY_HITROLL 18 #define APPLY_DAMROLL 19 #define APPLY_SAVING_BREATH 23 #define APPLY_SAVING_SPELL 24 #define ITEM_LIGHT 1 #define ITEM_SCROLL 2 #define ITEM_WAND 3 #define ITEM_STAFF 4 #define ITEM_WEAPON 5 #define ITEM_TREASURE 8 #define ITEM_ARMOR 9 #define ITEM_POTION 10 #define ITEM_FURNITURE 12 #define ITEM_TRASH 13 #define ITEM_CONTAINER 15 #define ITEM_DRINK_CON 17 #define ITEM_KEY 18 #define ITEM_FOOD 19 #define ITEM_MONEY 20 #define ITEM_BOAT 22 #define ITEM_FOUNTAIN 25 #define ITEM_PILL 26 #define ITEM_AMMO 30 #define ITEM_GLOW 1 #define ITEM_HUM 2 #define ITEM_DARK 4 #define ITEM_LOCK 8 #define ITEM_EVIL 16 #define ITEM_INVIS 32 #define ITEM_MAGIC 64 #define ITEM_NODROP 128 #define ITEM_ANTI_GOOD 512 #define ITEM_ANTI_EVIL 1024 #define ITEM_ANTI_NEUTRAL 2048 #define ITEM_NOREMOVE 4096 #define ITEM_INVENTORY 8192 #define ITEM_LEVEL 16384 #define ITEM_AUTO_ENGRAVE 65536 char fread_string_buf[MAX_STRING_LENGTH]; char *bufx; char word[MAX_INPUT_LENGTH]; int obj_level_estimate(OBJ_INDEX_DATA *); void bug( FILE *); /* * Semi-locals. */ FILE * fpArea; char strArea[MAX_INPUT_LENGTH]; void fread_to_eol( FILE *); char fread_letter( FILE *); int fread_number( FILE *); char *fread_word( FILE *); char *fread_string( FILE *); void load_object_program( FILE *); /* * Local booting procedures. */ void load_area ( FILE *fp ) ; void load_helps ( FILE *fp ) ; void load_mobiles ( FILE *fp ) ; void load_objects ( FILE *fp ) ; void load_resets ( FILE *fp ) ; void load_rooms ( FILE *fp ) ; void load_shops ( FILE *fp ) ; void load_specials ( FILE *fp ) ; void load_sites( void ); /* * MOBprogram locals */ void mprog_read_programs ( FILE* fp ) ; char areafile[200]; /* Put together by David Bills (Chaos of Mortal Realms) */ main(argc,argv) int argc; char *argv[]; { total_obj = 0; total_room = 0; total_mob = 0; logs[0] = 1; logs[1] = 2; logs[2] = 4; logs[3] = 8; logs[4] = 16; logs[5] = 32; logs[6] = 64; logs[7] = 128; if(argc!=2) { printf("\nArea Syntax Checker v1.1 MrMud v1.2 format"); printf("\nFormat:\n areacheck <area file>\n"); exit(0); } sscanf(argv[1],"%s",areafile); load_sites(); { FILE *fpArea; if ( ( fpArea = fopen( areafile, "r" ) ) == NULL ) { perror( areafile ); exit( 1 ); } for ( ; ; ) { char word[200]; if ( fread_letter( fpArea ) != '#' ) { printf( "Boot_db: # not found.\n\r"); bug( fpArea ); exit( 1 ); } strcpy(word , fread_word( fpArea )); if ( word[0] == '$' ) break; else if ( !strcmp( word, "AREA" ) ) load_area (fpArea); else if ( !strcmp( word, "HELPS" ) ) load_helps (fpArea); else if ( !strcmp( word, "MOBILES" ) ) load_mobiles (fpArea); else if ( !strcmp( word, "OBJECTS" ) ) load_objects (fpArea); else if ( !strcmp( word, "RESETS" ) ) load_resets (fpArea); else if ( !strcmp( word, "ROOMS" ) ) load_rooms (fpArea); else if ( !strcmp( word, "SHOPS" ) ) load_shops (fpArea); else if ( !strcmp( word, "SPECIALS" ) ) load_specials(fpArea); else if ( !strcmp( word, "NODEBUG" ) ) ; else if ( !strcmp( word, "NOTELEPORT" ) ); else if ( !strcmp( word, "RESTRICT" ) ) { fread_number( fpArea ); fread_number( fpArea );} else if ( !strcmp( word, "TEMPERATURE" ) ) { fread_number( fpArea ); fread_number( fpArea ); fread_number( fpArea );} else if ( !strcmp( word, "FREEQUIT" ) ); else { printf( "Boot_db: bad section name.\n\r"); bug( fpArea ); exit( 1 ); } } fclose( fpArea ); } printf( "Finished.\n\r" ); return; } /* * Snarf an 'area' header line. */ void load_area ( FILE *fp ) { fread_string( fp ); printf( "Loaded Area.\n\r"); return; } /* * Snarf a help section. */ void load_helps( FILE *fp ) { char *buf; for ( ; ; ) { fread_number( fp ); buf = fread_string( fp ); if( *buf == '$' ) { printf( "Loaded Helps.\n\r"); break; } fread_string( fp ); } return; } /* * Snarf a mob section. */ void load_mobiles( FILE *fp ) { int vnum; int cnt; for ( ; ; ) { char letter; letter = fread_letter( fp ); if ( letter != '#' ) { printf( "Load_mobiles: # not found.\n\r"); bug( fp ); exit( 1 ); } if ( (vnum = fread_number( fp ) ) == 0) { printf( "Loaded %d Mobiles.\n\r", total_mob); return; } mob_vnum[total_mob]=vnum; for( cnt=0;cnt<total_mob;cnt++) if( mob_vnum[cnt]==vnum) { printf( "Load_mobiles: vnum %d repeated.\n\r", vnum); bug( fp ); exit( 1 ); } total_mob++; fread_string( fp ); fread_string( fp ); fread_string( fp ); fread_string( fp ); fread_number( fp ) ; fread_number( fp ); fread_number( fp ); letter = fread_letter( fp ); fread_number( fp ); /* * The unused stuff is for imps who want to use the old-style * stats-in-files method. */ fread_number( fp ); fread_number( fp ); fread_number( fp ); /* 'd' */ fread_letter( fp ); fread_number( fp ); /* '+' */ fread_letter( fp ); fread_number( fp ); fread_number( fp ); /* 'd' */ fread_letter( fp ); fread_number( fp ); /* '+' */ fread_letter( fp ); fread_number( fp ); fread_number( fp ); /* xp can't be used! */ fread_number( fp ); /* Unused */ fread_number( fp ); /* start pos */ fread_number( fp ); /* Unused */ /* * Back to meaningful values. */ fread_number( fp ); if ( letter != 'S' ) { printf( "Load_mobiles: #%d non-S.\n\r" , vnum); bug( fp ); exit( 1 ); } letter = fread_letter( fp ); if( letter == 'D' ) { int x; for( x=0; x<3121; x++) letter = fread_letter( fp ); } ungetc(letter,fp); if(letter=='>') mprog_read_programs(fp); } } /* * Snarf an obj section. */ void load_objects( FILE *fp ) { OBJ_INDEX_DATA *obj; int cnt, est_level; for ( ; ; ) { int vnum; char letter; letter = fread_letter( fp ); if ( letter != '#' ) { printf( "Load_objects: # not found.\n\r"); bug( fp ); exit( 1 ); } vnum = fread_number( fp ); if ( vnum == 0 ) { printf( "Loaded %d Objects.\n\r", total_obj ); return; } obj_vnum[total_obj]=vnum; for( cnt=0;cnt<total_obj;cnt++) if( obj_vnum[cnt]==vnum) { printf( "Load_objects: vnum %d repeated.\n\r", vnum); bug( fp ); exit( 1 ); } total_obj++; obj = (OBJ_INDEX_DATA *) malloc( sizeof( *obj ) ); obj->vnum = vnum; fread_string( fp ); fread_string( fp ); fread_string( fp ); fread_string( fp ); obj->item_type = fread_number( fp ); if( obj->item_type < 1 ) obj->item_type = 13 ; obj->extra_flags = fread_number( fp ); obj->wear_flags = fread_number( fp ); obj->value[0] = fread_number( fp ); obj->value[1] = fread_number( fp ); obj->value[2] = fread_number( fp ); obj->value[3] = fread_number( fp ); obj->weight = fread_number( fp ); obj->cost = fread_number( fp ); obj->level = 0; obj->level_rent = fread_number( fp ); if( ( obj->extra_flags & ITEM_LEVEL ) != 0 ) obj->level = obj->level_rent; for ( ; ; ) { char letter; letter = fread_letter( fp ); if ( letter == 'A' ) { AFFECT_DATA *paf; paf = (AFFECT_DATA *) malloc( sizeof( *paf ) ); paf->type = -1; paf->duration = -1; paf->location = fread_number( fp ); paf->modifier = fread_number( fp ); paf->bitvector = 0; paf->next = obj->affected; obj->affected = paf; } else if ( letter == 'C' ) { fread_string( fp ); fread_number( fp ); } else if ( letter == 'D' ) { int x; for( x=0; x<3120; x++) fread_letter( fp ); } else if ( letter == 'E' ) { fread_string( fp ); fread_string( fp ); } else if ( letter == 'P' ) load_object_program( fp ); else { ungetc( letter, fp ); /* Let's look over the levels: */ est_level = obj_level_estimate( obj ); if( obj->level < est_level/2 -5 ) printf( "Obj #%5d Lvl/Est: %3d/%3d *ERROR* Object will be corrected to %d.\n\r", obj->vnum, obj->level, est_level, (obj->level+est_level)/2); else if( obj->level < est_level - ( est_level/20 + 5 ) ) printf( "Obj #%5d Lvl/Est: %3d/%3d *Warning* Object level is too low.\n\r", obj->vnum, obj->level, est_level); else printf( "Obj #%5d Lvl/Est: %3d/%3d\n\r", obj->vnum, obj->level, est_level); while( obj->affected!=NULL ) { AFFECT_DATA *next_aff; next_aff = obj->affected->next ; free( obj->affected ); obj->affected = next_aff; } free( obj ); break; } } } } /* * Snarf a reset section. */ void load_resets( FILE *fp ) { int arg1, arg2, arg3; int found, cnt; for ( ; ; ) { char letter; if ( ( letter = fread_letter( fp ) ) == 'S' ) break; if ( letter == '*' ) { fread_to_eol( fp ); continue; } fread_number( fp ); arg1 = fread_number( fp ); arg2 = fread_number( fp ); if(letter != 'G' && letter != 'R') arg3 = fread_number( fp ); else arg3 = 0; fread_to_eol( fp ); /* * Validate parameters. * We're calling the index functions for the side effect. * And counting occurances of things. */ found = FALSE; switch ( letter ) { default: printf( "Load_resets: bad command '%c'.\n\r", letter ); bug( fp ); exit( 1 ); break; case 'M': found = FALSE; for( cnt = 0; cnt< total_mob; cnt++) if( mob_vnum[cnt]==arg1) { found = TRUE; break; } /* if( !found ) { printf( "Load_resets: bad mobile #%d\n\r", arg1); bug( fp ); } */ found = FALSE; for( cnt = 0; cnt< total_room; cnt++) if( room_vnum[cnt]==arg3) { found = TRUE; break; } /* if( !found ) { printf( "Load_resets: bad room #%d\n\r", arg3); bug( fp ); } */ break; case 'P': case 'O': found = FALSE; for( cnt = 0; cnt< total_obj; cnt++) if( obj_vnum[cnt]==arg1) found = TRUE; /* if( !found ) { printf( "Load_resets: bad object #%d\n\r", arg1); bug( fp ); } */ found = FALSE; for( cnt = 0; cnt< total_room; cnt++) if( room_vnum[cnt]==arg3) { found = TRUE; break; } /* if( !found ) { printf( "Load_resets: bad room #%d\n\r", arg3); bug( fp ); } */ break; case 'G': case 'E': found = FALSE; for( cnt = 0; cnt< total_obj; cnt++) if( obj_vnum[cnt]==arg1) { found = TRUE; break; } /* if( !found ) { printf( "Load_resets: bad object #%d\n\r", arg1); bug( fp ); } */ break; case 'D': found = FALSE; for( cnt = 0; cnt< total_room; cnt++) if( room_vnum[cnt]==arg1) { found = TRUE; break; } /* if( !found ) { printf( "Load_resets: bad room #%d\n\r", arg1); bug( fp ); } if ( ( exit_data[cnt] & logs[arg2] ) == 0 ) { printf( "Load_resets: bad exit #%d (%d)\n\r", arg2, exit_data[cnt]); bug( fp ); exit( 0 ); } */ break; case 'R': found = FALSE; for( cnt = 0; cnt< total_room; cnt++) if( room_vnum[cnt]==arg1) { found = TRUE; break; } /* if( !found ) { printf( "Load_resets: bad room #%d\n\r", arg1); bug( fp ); } if ( arg2 < 0 || arg2 > 6 ) { printf( "Load_resets: bad exit #%d\n\r", arg2); bug( fp ); exit( 0 ); } */ break; } } return; } /* * Snarf a room section. * And counting occurances of things. */ void load_rooms( FILE *fp ) { int door; int cnt; for ( ; ; ) { int vnum; char letter; letter = fread_letter( fp ); if ( letter != '#' ) { printf( "Load_rooms: # not found.\n\r" ); bug( fp ); exit( 1 ); } vnum = fread_number( fp ); if ( vnum == 0 ) { printf( "Loaded %d Rooms.\n\r", total_room); return; } room_vnum[total_room]=vnum; for( cnt=0;cnt<total_room;cnt++) if( room_vnum[cnt]==vnum) { printf( "Load_rooms: vnum %d repeated.\n\r", vnum); bug( fp ); exit( 1 ); } fread_string( fp ); fread_string( fp ); fread_number( fp ); fread_number( fp ); fread_number( fp ); for ( ; ; ) { letter = fread_letter( fp ); if ( letter == 'S' ) break; if ( letter == 'D' ) { door = fread_number( fp ); if ( door < 0 || door > 5 ) { printf( "Fread_rooms: vnum %d has bad door number.\n\r", vnum ); bug( fp ); exit( 1 ); } fread_string( fp ); fread_string( fp ); fread_number( fp ); fread_number( fp ); fread_number( fp ); if ( ( exit_data[total_room] & logs[door] ) != 0 ) { printf( "Fread_rooms: vnum %d has same dir number.\n\r", vnum ); bug( fp ); exit( 1 ); } exit_data[total_room] |= logs[door]; } else if ( letter == 'F' ) { fread_number( fp ); fread_number( fp ); } else if ( letter == 'E' ) { fread_string( fp ); fread_string( fp ); } else { printf( "Load_rooms: vnum %d has flag not 'DES'.\n\r", vnum ); bug( fp ); exit( 1 ); } } total_room++; } } /* * Snarf a shop section. */ void load_shops( FILE *fp ) { int iTrade; for ( ; ; ) { iTrade = fread_number( fp ); if( iTrade == 0) { printf( "Loaded Shops.\n\r"); return; } for ( iTrade = 0; iTrade < 5; iTrade++ ) fread_number( fp ); fread_number( fp ); fread_number( fp ); fread_number( fp ); fread_number( fp ); fread_to_eol( fp ); } } /* * Snarf spec proc declarations. */ void load_specials( FILE *fp ) { for ( ; ; ) { char letter; switch ( letter = fread_letter( fp ) ) { default: printf( "Load_specials: letter '%c' not *MS.\n\r", letter ); bug( fp ); exit( 1 ); case 'S': printf( "Loaded Specials.\n\r"); return; case '*': break; case 'M': fread_number ( fp ); fread_word ( fp ); break; case 'O': fread_number ( fp ) ; fread_word ( fp ) ; break; } fread_to_eol( fp ); } } /* * Read a letter from a file. */ char fread_letter( FILE *fp ) { char c; do { c = getc( fp ); } while ( c==' ' || c=='\r' || c=='\n' ); return c; } /* * Read a number from a file. */ int fread_number( FILE *fp ) { int number; int sign; int bit, qfound; char c; char buf[2], buf2[100]; buf[1]='\0'; buf2[0]='\0'; bit = FALSE; do { c = getc( fp ); } while ( isspace( c ) ); number = 0; qfound = FALSE; sign = FALSE; if ( c == '+' ) { c = getc( fp ); } else if ( c == '-' ) { sign = TRUE; c = getc( fp ); } if( c=='Q' ) { c = getc( fp ); /* Get the following letter, and then grab a real number */ number = (int)c - (int)'Q' + 1; c = getc( fp ); qfound = TRUE; } while( c>='A' && c<='Z' || c=='_') { bit = TRUE; buf[0]=c; strcat( buf2, buf); c = getc( fp ); } if( bit ) { BITVECTOR_DATA *bt; int foundb; foundb=FALSE; for( bt=bitvector_list; bt!= NULL && !foundb; bt=bt->next) if( !strcmp( bt->name, buf2)) { foundb=TRUE; number=bt->value; } if( !foundb) { printf( "Fread_number: bad format '%s'.\n\r", buf2); bug( fp ); exit(0 ); } } else { if ( !isdigit(c) && (!qfound || c!=' ')) { char *tmp; tmp=fread_word( fp ); printf( "Fread_number: bad format '%c%s'.\n\r", c, tmp); bug( fp ); exit( 1 ); } while ( isdigit(c) ) { number = number * 10 + c - '0'; c = getc( fp ); } } if ( sign ) number = 0 - number; if ( c == '|' ) number += fread_number( fp ); else if ( c != ' ' ) ungetc( c, fp ); return (number); } /* * Read and allocate space for a string from a file. * Strings are created and placed in Dynamic Memory. */ char *fread_string( FILE *fp ) { char *plast; char c; plast=fread_string_buf; /* * Skip blanks. * Read first char. */ do { c = getc( fp ); } while ( isspace( c ) ); if ( ( *plast++ = c ) == '~' ) return NULL; for ( ;; ) { /* * Back off the char type lookup, * it was too dirty for portability. * -- Furey */ switch ( *plast = getc( fp ) ) { default: plast++; break; case EOF: printf( "Fread_string: EOF\n\r"); bug( fp ); exit( 1 ); break; case '\n': plast++; *plast++ = '\r'; break; case '\r': break; case '~': *plast='\0'; return( fread_string_buf ); /* String space repointer was removed - Chaos 5/19/94 */ } } } /* * Read to end of line (for comments). */ void fread_to_eol( FILE *fp ) { char c; do { c = getc( fp ); } while ( c != '\n' && c != '\r' ); do { c = getc( fp ); } while ( c == '\n' || c == '\r' ); ungetc( c, fp ); return; } /* * Read one word (into static buffer). */ char *fread_word( FILE *fp ) { char *pword; char cEnd; do { cEnd = getc( fp ); } while ( isspace( cEnd ) ); if ( cEnd == '\'' || cEnd == '"' ) { pword = word; } else { word[0] = cEnd; pword = word+1; cEnd = ' '; } for ( ; pword < word + MAX_INPUT_LENGTH; pword++ ) { *pword = getc( fp ); #ifdef unix if( *pword == EOF ) { *pword = '\0'; return word; } #endif if ( cEnd == ' ' ? isspace(*pword) : *pword == cEnd ) { if ( cEnd == ' ' ) ungetc( *pword, fp ); *pword = '\0'; return word; } } word[10]='\0'; printf("Fread_word: word '%s' too long.\n\r", word ); bug( fp ); exit( 1 ); return NULL; } /* * Removes the tildes from a string. * Used for player-entered strings that go into disk files. */ void smash_tilde( char *str ) { for ( ; *str != '\0'; str++ ) { if ( *str == '~' ) *str = '-'; } return; } void tail_chain( void ) { return; } void mprog_read_programs( FILE *fp) { char letter; int done = FALSE; letter = ' '; while ( !done ) { letter = fread_letter( fp ); switch ( letter ) { case '>': fread_word( fp ); fread_string( fp ); fread_string( fp ); break; case '|': fread_to_eol( fp ); done = TRUE; break; default: printf( "Load_mobiles: bad MOBPROG.\n\r" ); bug( fp ); exit( 1 ); break; } } return; } void load_sites( void) { FILE *fp; char buf[MAX_STRING_LENGTH]; BITVECTOR_DATA *bit; int done; done=0; bitvector_list = NULL; fp=fopen( "bitvector.lst", "r"); if(fp!=NULL) { done=0; while(done==0) { strcpy(buf, fread_word(fp)); if(!strcmp(buf,"NULL")) done=1; else { bit = (BITVECTOR_DATA *) malloc( sizeof( *bit) ); bit->next=bitvector_list; bitvector_list=bit; bit->name=strdup( buf); bit->value=fread_number( fp); } } } fclose(fp); return; } void bug( FILE *fpArea ) { if ( fpArea != NULL ) { int iLine; long iChar; if ( fpArea == stdin ) { iLine = 0; } else { iChar = ftell( fpArea ); fseek( fpArea, 0, 0 ); for ( iLine = 0; ftell( fpArea ) < iChar; iLine++ ) while ( getc( fpArea ) != '\n' ); fseek( fpArea, iChar, 0 ); } printf( "LINE: %d\n\r", iLine ); } return; } void load_object_program( FILE *fp) { char keyword; fread_number( fp ); /* get index number */ keyword = (char)fread_number( fp ); /* get trigger command type */ switch( keyword ) { case 'C': /* game command */ fread_number( fp ); /* get chance number */ fread_word( fp ) ; break; case 'U': /* unknown command or social */ fread_number( fp ); /* get chance number */ fread_word( fp ) ; break; case 'T': /* Tick check */ fread_number( fp ); /* get chance number */ break; case 'X': /* void trigger */ break; case 'H': /* Got hit check */ fread_number( fp ); /* get chance number */ break; case 'D': /* Damaged another check */ fread_number( fp ); /* get chance number */ break; default: printf( "Bad obj_command type\n\r"); } keyword = (char)fread_number( fp ); /* get reaction command */ switch( keyword ) { case 'E': /* screen echo */ fread_string( fp ) ; break; case 'C': /* user command at level 99 without arg, but with multi-line*/ fread_string( fp ) ; break; case 'G': /* user command at level 99 with argument */ fread_string( fp ) ; break; case 'S': /* Set quest bit to value */ fread_number( fp ); fread_number( fp ); fread_number( fp ); break; case 'D': /* Add to quest bit */ fread_number( fp ); fread_number( fp ); fread_number( fp ); break; case 'P': /* Player quest bit if check */ fread_number( fp ); fread_number( fp ); fread_letter( fp ); fread_number( fp ); fread_number( fp ); fread_number( fp ); break; case 'Q': /* Quest bit if check */ fread_number( fp ); fread_number( fp ); fread_letter( fp ); fread_number( fp ); fread_number( fp ); fread_number( fp ); break; case 'H': /* If has object check */ fread_number( fp ); fread_number( fp ); fread_number( fp ); break; case 'I': /* If check */ fread_number( fp ); fread_letter( fp ); fread_number( fp ); fread_number( fp ); fread_number( fp ); break; case 'A': /* Apply to temp stats */ fread_number( fp ); fread_number( fp ); break; case 'J': /* Junk the item */ break; default: printf( "Bad obj_command reaction type\n\r"); } return; } int obj_level_estimate(OBJ_INDEX_DATA *objIndex) { AFFECT_DATA *aff; int level; int value[4]; level=1; for(aff=objIndex->affected;aff!=NULL;aff=aff->next) { switch(aff->location) { case APPLY_STR: if(aff->modifier > 0) level+=(aff->modifier*(3*aff->modifier))/2; else level-=(aff->modifier*(aff->modifier)); break; case APPLY_DEX: if(aff->modifier > 0) level+=(aff->modifier*(2*aff->modifier))/3; else level-=(aff->modifier*(aff->modifier))/3; break; case APPLY_INT: if(aff->modifier > 0) level+=(aff->modifier*(2*aff->modifier))/3; else level-=(aff->modifier*(aff->modifier))/4; break; case APPLY_WIS: if(aff->modifier > 0) level+=(aff->modifier*(4*aff->modifier))/3; else level-=(aff->modifier*(2*aff->modifier))/3; break; case APPLY_CON: if(aff->modifier > 0) level+=(aff->modifier*(4*aff->modifier))/3; else level-=(aff->modifier*(2*aff->modifier))/3; break; case APPLY_MANA: if(aff->modifier > 0) level+=aff->modifier/3; else level+=aff->modifier/5; break; case APPLY_HIT: if(aff->modifier > 0) level+=aff->modifier/2; else level+=aff->modifier/4; break; case APPLY_MOVE: if(aff->modifier > 0) level+=aff->modifier/3; else level+=aff->modifier/5; break; case APPLY_AC: if(aff->modifier < 0) level+=(aff->modifier*(aff->modifier))/3; else level-=(aff->modifier*(aff->modifier))/6; break; case APPLY_HITROLL: if(aff->modifier > 0) level+=(aff->modifier*(aff->modifier))*2/3; else level-=(aff->modifier*(aff->modifier))/6; break; case APPLY_DAMROLL: if(aff->modifier > 0) level+=(aff->modifier*(aff->modifier)); else level-=(aff->modifier*(aff->modifier))/3; break; case APPLY_SAVING_BREATH: if(aff->modifier < 0) level+=(aff->modifier*(aff->modifier))/7; else level-=(aff->modifier*(aff->modifier))/9; break; case APPLY_SAVING_SPELL: if(aff->modifier < 0) level+=(aff->modifier*(aff->modifier))/6; else level-=(aff->modifier*(aff->modifier))/8; break; case APPLY_NONE: case APPLY_SEX: default: break; } } value[0]=objIndex->value[0]; value[1]=objIndex->value[1]; value[2]=objIndex->value[2]; value[3]=objIndex->value[3]; switch(objIndex->item_type) { case ITEM_LIGHT: if(value[2] < 0) { if(level < 25) level = 25; } else if( level+value[2]/2400 > 3*level/2) level = level+value[2]/2400; else level=3*level/2; break; case ITEM_SCROLL: if(value[1]>0) level+=3*value[0]/5; if(value[2]>0) level+=3*value[0]/5; if(value[3]>0) level+=3*value[0]/5; break; case ITEM_POTION: if(value[1]>0) level+=3*value[0]/5; if(value[2]>0) level+=3*value[0]/5; if(value[3]>0) level+=3*value[0]/5; break; case ITEM_PILL: if(value[1]>0) level+=2*value[0]/3; if(value[2]>0) level+=2*value[0]/3; if(value[3]>0) level+=2*value[0]/3; break; case ITEM_WAND: level+=2*value[0]/3 + 2*value[0]*(value[1])/24; break; case ITEM_STAFF: level+=3*value[0]/5 + 3*value[0]*(value[1])/30; break; case ITEM_WEAPON: level+=((5*(value[1]*(1+(value[2]-1)/2.0))/2)-10); break; case ITEM_ARMOR: level+=value[0]*abs(value[0])/4+1; break; case ITEM_AMMO: level+=value[1]*value[3]*value[2]/20; break; case ITEM_TREASURE: case ITEM_FURNITURE: case ITEM_TRASH: case ITEM_CONTAINER: level+=value[0]/15; break; case ITEM_DRINK_CON: case ITEM_KEY: case ITEM_FOOD: case ITEM_MONEY: case ITEM_BOAT: case ITEM_FOUNTAIN: default: break; } if((objIndex->extra_flags & ITEM_INVIS) != 0) level+=(level/20); if((objIndex->extra_flags & ITEM_NODROP) != 0) level-=(level/15); if((objIndex->extra_flags & ITEM_ANTI_GOOD) != 0) level-=(level/20); if((objIndex->extra_flags & ITEM_ANTI_EVIL) != 0) level-=(level/20); if((objIndex->extra_flags & ITEM_ANTI_NEUTRAL) != 0) level-=(level/20); if((objIndex->extra_flags & ITEM_NOREMOVE) != 0) level-=(level/15); if((objIndex->extra_flags & ITEM_INVENTORY) != 0) level+=(level/10); if((objIndex->extra_flags & ITEM_AUTO_ENGRAVE) != 0) level-=(level/15); if(level>0) return level; else return 1; } +-----------------------------------------------------------+ | Ensure that you have read the CircleMUD Mailing List FAQ: | | http://cspo.queensu.ca/~fletcher/Circle/list_faq.html | +-----------------------------------------------------------+
This archive was generated by hypermail 2b30 : 12/07/00 PST