tgm@ukc.UUCP (T.Murphy) (03/30/85)
Well here are the programs to translate the database. I really didn't think the database was all that unreadable. The only tricky bit was figuring that spell components made a three digit bianary number that fit nicely into one byte. I am afraid the code is mostly uncommented but it should be fairly straight- forward. Two output routines are here: inout.c and inout.c.old . I am sure that better ones can be devised since they were only secondary to the rest of the program which reads in and translates the spells. It would be nice if somebody wrote a routine to search for a spell by whatever and print out the entire spell (other than putting in a readable file and using grep -r). I have actually lost the PRFILE that is used in inout.c.old but you should be able to recreate it easially. It just conatains the prompts to print before the data, i.e. Name:, Class:, Duration:, ... . If you could post all errors in both the database and program to me and not to the newsnet I will compile them all and post the corrections in about a months time. Good Hacking {decvax,seismo,philabs}!mcvax!ukc!tcdmath!jaymin Joe Jaquinta; c/o D.U. Mats Society, 39.16 Trinity College Dublin, Ireland ---------------------------- Cut Here ------------------------------------- /*###### File : makefile ######*/ all: sp.o vsm.o init.o time.o type.o class.o inout.o special.o ld -X /lib/crt0.o sp.o vsm.o init.o time.o type.o class.o inout.o special.o -lc -o sp /*###### File : sp.h ######*/ #include <stdio.h> #include <ctype.h> #define MAXSTR 50 #define ARGS 10 #define PRFILE "/usr/user/system/jaymin/d+d/s.prmt" #define SEPCHAR '@' #define CLASS 0 #define NAME 1 #define TYPE 2 #define LEVEL 3 #define RANGE 4 #define DURAT 5 #define AOE 6 #define COM 7 #define TIME 8 #define SAVE 9 char tome[ARGS][MAXSTR]; char promt[ARGS][MAXSTR]; char buff[MAXSTR]; /*###### File : class.c ######*/ #include "sp.h" class(clss) char clss[]; { switch(clss[0]) { case 'c': strcpy(clss ,"Cleric"); break; case 'd': strcpy(clss ,"Druid"); break; case 'm': strcpy(clss ,"Magic user"); break; case 'i': strcpy(clss ,"Illusionist"); break; } } name(namestr) char namestr[]; { if ((namestr[strlen(namestr)-1] == 'r') && (namestr[strlen(namestr)-2] == ' ')) { namestr[strlen(namestr)-1] = '\0'; strcat(namestr,"(Reversible)"); } } /*###### File : init.c ######*/ #include "sp.h" blnkstr(string) char string[]; { register int i; for (i = 0; i<MAXSTR; i++) string[i] = '\0'; } init() { FILE *prmt; register int i,j; if ((prmt = fopen(PRFILE, "r")) == NULL) { fprintf(stderr,"Cannot open prompt file.\n"); exit(1); } fgets(promt[0],MAXSTR,prmt); /* Eliminates first number */ for (i = 0; i<=10; i++) { fgets(promt[i],MAXSTR,prmt); for (j = 0; promt[i][j] != '\n'; ++j); promt[i][j] = '\t'; } } /*###### File : inout.c ######*/ #include "sp.h" readspell(stream) FILE *stream; { register int i; for (i = 0; i<ARGS; i++) getnext(tome[i],stream); fgetc(stream); } getnext(string,stream) char string[]; FILE *stream; { register int i; for (i=0; ((string[i] = fgetc(stream)) != SEPCHAR) && (i<=MAXSTR); i++); string[i] = '\0'; } writespell() { char outbuf[171]; int ptr; for (ptr = 0; ptr < 171; ptr++) outbuf[ptr] = ' '; copy(0, tome[NAME], outbuf); copy(30, tome[LEVEL], outbuf); copy(34, tome[RANGE], outbuf); copy(55, tome[DURAT], outbuf); copy(88, tome[AOE], outbuf); copy(138, tome[COM], outbuf); copy(144, tome[TIME], outbuf); copy(164, tome[SAVE], outbuf); /* printf("%s\n", outbuf); */ write(1, outbuf, 171); write(1, "\n", 1); } copy(start, insert, string) int start; char *insert,*string; { char *c; for(c = string + start; *insert; insert++, c++) if ((*insert != '\n') || (*insert != '\0')) *c = *insert; } /*###### File : sp.c ######*/ #include "sp.h" main(argc,argv) int argc; char **argv; { FILE *stream; if ((stream = fopen(*++argv, "r")) == NULL) { fprintf(stderr,"Can't open %s\n",*argv); exit(1); } else { init(); ungetc(getc(stream), stream); /* to flag eof */ while (!feof(stream)) { readspell(stream); class(tome[CLASS]); /* name(tome[NAME]); */ type(tome[TYPE]); level(tome[RANGE]); level(tome[DURAT]); level(tome[AOE]); time(tome[DURAT]); time(tome[TIME]); vsm(tome[COM]); aoe(tome[AOE]); special(tome[AOE]); special(tome[TIME]); special(tome[DURAT]); special(tome[RANGE]); special(tome[SAVE]); save(tome[SAVE]); writespell(); ungetc(getc(stream), stream);/* do dah, do dah */ } } } /*###### File : special.c ######*/ #include "sp.h" special(str) char str[]; { register char *ptr; blnkstr(buff); for (ptr = str; *ptr; ptr++) if (*ptr == 'X') strcat(buff, "special"); else strncat(buff, ptr, 1); strcpy(str, buff); } save(str) char str[]; { switch(str[0]) { case 'H': strcpy(str, "half"); break; case 'N': strcpy(str, "negates"); break; case 'M': strcpy(str, "none"); break; } } level(str) char str[]; { register char *ptr; blnkstr(buff); for (ptr = str; *ptr != '\0'; ptr++) if (*ptr == 'L') strcat(buff, "Level"); else if (*ptr == '+') strcat(buff, " + "); else strncat(buff, ptr, 1); strcpy(str, buff); } /*###### File : time.c ######*/ #include "sp.h" time(str) char str[]; { register char *ptr; blnkstr(buff); buff[0] = str[0]; ptr = str; for (ptr++; *ptr != '\0'; ptr++) { if (!isalpha(*(ptr-1)) && !isalpha(*(ptr+1))) switch(*ptr) { case 'r': strcat(buff," round"); if (*(ptr-1) != '1') strncat(buff,"s",1); break; case 's': strcat(buff," segment"); if (*(ptr-1) != '1') strncat(buff,"s",1); break; case 't': strcat(buff," turn"); if (*(ptr-1) != '1') strncat(buff,"s",1); break; default: strncat(buff,ptr,1); } else switch(*ptr) { case '+': strcat(buff," + "); break; default: strncat(buff,ptr,1); } } strcpy(str,buff); } /*###### File : type.c ######*/ #include "sp.h" type(typestr) char typestr[]; { register char *ptr; blnkstr(buff); for (ptr = typestr; *ptr != '\0'; ptr++) switch(*ptr) { case 'e': if (*(ptr + 1) == 'n') { strcat(buff,"Enchantment"); ptr++; } else if (*(ptr + 1) == 'v') { strcat(buff,"Evocation"); ptr++; } break; case 'a': if (*(ptr + 1) == 'l') { strcat(buff,"Alteration"); ptr++; } else if (*(ptr + 1) == 'b') { strcat(buff,"Abjuration"); ptr++; } break; case 'i': if (*(ptr + 1) == 'l') { strcat(buff,"Illusion"); ptr++; } else if (*(ptr + 1) == 'n') { strcat(buff,"Invocation"); ptr++; } break; case 'p': if (*(ptr + 1) == 'h') { strcat(buff,"Phantasm"); ptr++; } else if (*(ptr + 1) == 'o') { strcat(buff,"Posession"); ptr++; } break; case 's': if (*(ptr + 1) == 'u') { strcat(buff,"Summoning"); ptr++; } break; case 'n': if (*(ptr + 1) == 'e') { strcat(buff,"Necromantic"); ptr++; } break; case 'd': if (*(ptr + 1) == 'i') { strcat(buff,"Divination"); ptr++; } break; case 'c': if (*(ptr + 1) == 'o') { strcat(buff,"Conjuration"); ptr++; } else if (*(ptr + 1) == 'h') { strcat(buff,"Charm"); ptr++; } break; case '/': strcat(buff,"/"); break; case '-': case ',': strcat(buff,","); break; } strcpy(typestr, buff); } /*###### File : vsm.c ######*/ #include "sp.h" vsm(type) char type[]; { register int x; x = type[0] - '0'; type[0] = '\0'; if (x & 4) { strcat(type, "V"); if (x > 4) strcat(type, ","); } if (x & 2) { strcat(type, "S"); if (x & 1) strcat(type, ","); } if (x & 1) strcat(type, "M"); } aoe(str) char str[]; { char *ptr; blnkstr(buff); for (ptr = str; *ptr; ptr++) switch(*ptr) { case 'R': strcat(buff, "radius"); break; case 'S': strcat(buff, "sphere"); break; case 'D': strcat(buff, "diameter"); break; case 'Q': strcat(buff, "square"); break; default: strncat(buff, ptr, 1); } strcpy(str, buff); } /*###### File : inout.c.old ######*/ #include "sp.h" readspell(stream) FILE *stream; { register int i; for (i = 0; i<ARGS; i++) getnext(tome[i],stream); fgetc(stream); } getnext(string,stream) char string[]; FILE *stream; { register int i; for (i=0; ((string[i] = fgetc(stream)) != SEPCHAR) && (i<=MAXSTR); i++); string[i] = '\0'; } writespell() { printf("%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n%s%s\n\n", promt[0],tome[0], promt[1],tome[1], promt[2],tome[2], promt[3],tome[3], promt[4],tome[4], promt[5],tome[5], promt[6],tome[6], promt[7],tome[7], promt[8],tome[8], promt[9],tome[9]); }