colonel@ellie.UUCP (04/16/86)
This is a VMS "C" program that prints a nice-looking MORIA character sheet. -----MORIACHR.CLD----------------------------------------------------- DEFINE VERB MORIACHR IMAGE "DUA1:[CSD0.CSDSICHE]MORIACHR.EXE" ... or wherever you put it. PARAMETER P1, PROMPT="File", VALUE(REQUIRED,TYPE=$FILE) -----MORIACHR.C------------------------------------------------------- /* * moriachr - reformat moria character dump for TeX. * the Colonel. 1986. * A real hack ... should have been written in FORTRAN. * send flames to csdsicher@sunyabva.bitnet. */ /* * $ MORIACHR file.ext * * Default extension is .CHR * Writes to file.TEX */ #include <ctype.h> #include <errno.h> #include <stat.h> #include <stdio.h> #include <time.h> #define GETLINE {for (bp=buf; '\n'!=(*bp=getc(In)); bp++);} #define SKIPLINE {while('\n'!=getc(In));} char buf[80]; FILE *In, *Out; char *miscabil[9] = { "Fighting","Throw/Bows","Saving Throw", "Stealth","Disarming","Magic Device", "Perception","Searching","Infra-Vision"}; char *misc[9] = { "fighting","throwbows","savingthrow", "stealth","disarming","magicdevice", "perception","searching","infravision"}; char *xstat[6] = { "Strength","Intelligence","Wisdom", "Dexterity","Constitution","Charisma"}; char *cstat[3] = { "Level","Experience","Gold"}; char *font[] = { "smalltype=amr9","smaller=amr8","bo=amb10", "bigbold=ambx10 scaled \\magstep1", "bigmit=ammi10 scaled \\magstep2", "csc=amcsc10",""} , **fpp; plussify() { int i; for (i=20; i>=15; i--) if (buf[i]==' ') { buf[i]='+'; return; } else if (buf[i]=='-') return; } char * minussify(s) char *s; { int eqmode, ismath, paren; paren = 1; eqmode = 0; for ( ; *s!='\n'; s++) { ismath = (int)strchr("0123456789,+-",*s); if (*s=='(' || *s=='[') paren+=1; else if (*s==')' || *s==']') paren-=1; if (eqmode && !ismath) { eqmode=0; fprintf(Out,"}$%c",*s); } else if (!eqmode && paren && ismath) { eqmode = 1; fprintf(Out,"$"); fprintf(Out,"{\\mit"); putc(*s,Out); } else putc(*s,Out); } } pritems(n) int n; { int i; fprintf(Out,"\\setbox40=\\vtop{\\baselineskip=10pt\n"); for (i=0; i<(n>5? (n+1)/2: n); i++) fprintf(Out," \\hbox{\\smaller\\item%c}\n",'a'+i); fprintf(Out,"}\n"); if (n>5) { fprintf(Out,"\\setbox41=\\vtop{\\baselineskip=10pt\n"); for (i=(n+1)/2; i<n; i++) fprintf(Out," \\hbox{\\smaller\\item%c}\n",'a'+i); fprintf(Out,"}\n"); } fprintf(Out," \\vskip 1.5em\n"); fprintf(Out," \\centerline{\\csc Inventory}\n"); fprintf(Out," \\vskip 10pt\n"); fprintf(Out,"\\centerline{%s}\n", n>5?"\\box40\\quad\\box41": "\\box40"); } prstat(s) char *s; { int slashf, i; slashf=0; fprintf(Out,"\\def\\%s{\\mit",s); for (i=72; i<78; i++) { if (isdigit(buf[i])) putc(buf[i],Out); else if ('/'==buf[i]) { fprintf(Out,"\\rlap{{\\rm /}"); slashf++; } } if (slashf) fprintf(Out,"}"); fprintf(Out,"}\n"); } char * trunc(s) char *s; { int i; static char v[100]; strcpy(v,s); for (i=strlen(v)-1; i>0; i--) if (v[i]!=' ') { v[i+1]='\0'; return v; } v[1]='\0'; return v; } sub(s,m1,m2,all) char *s, *m1, *m2; int all; { for ( ; '\n'!= *s; s++) if (!strncmp(s,m1,strlen(m1))) { strncpy(s,m2,strlen(m2)); if (!all) return; } } char *monthname[]={ "January","February","March","April", "May","June","July","August","September","October", "November","December"}; char * cdate(t) unsigned t; /* UNIX-style timestamp */ { static char chold[20]; struct tm *thold; thold = localtime(&t); sprintf(chold,"%s %d, %d",monthname[thold->tm_mon], thold->tm_mday, thold->tm_year+1900); return chold; } main(argc,argv) int argc; char **argv; { int i, female, madesub, nitems; char outname[80]; char *bp, hold[21]; struct stat statbuf; madesub = 0; if (strchr(argv[1],'.')) { if (stat(argv[1],&statbuf) || NULL == (In = fopen(argv[1],"r"))) { fprintf(stderr,"MORIACHR-E-CANTREAD, Cannot read %s\n",argv[1]); exit(0); } } else { strcpy(buf,argv[1]); strcat(buf,".chr"); if (stat(buf,&statbuf) || NULL == (In = fopen(buf,"r"))) { if (stat(argv[1],&statbuf) || NULL==(In = fopen(argv[1],"r"))) { fprintf(stderr,"MORIACHR-E-CANTREAD, Cannot read %s\n",buf); exit(0); } } } strcpy(outname,argv[1]); if (bp=strchr(outname,'.')) *bp = '\0'; strcat(outname,".tex"); Out = fopen(outname,"w","rfm=var","mrs=80","rat=cr"); for (fpp=font; **fpp; fpp++) fprintf(Out,"\\font\\%s\n",*fpp); fprintf(Out,"\\nopagenumbers\n"); fprintf(Out,"\\def\\rogue{$\\}\\!\\!\\bullet\\!\\!\\{$}\n"); fprintf(Out,"\\def\\star{{\\bigmit?}}\n"); fprintf(Out,"\\def\\statwidth{1.3in}\n"); fprintf(Out,"\\def\\abilwidth{1.7in}\n"); fprintf(Out,"\\hsize=6in\n"); fprintf(Out,"\\def\\cdate{%s}\n",cdate(statbuf.st_ctime)); for (i=0; i<4; i++) SKIPLINE; GETLINE; buf[29]='\0'; fprintf(Out,"\\def\\nw{{%s}} %% without space\n",trunc(buf+9)); fprintf(Out,"\\def\\nm{%s } %% with space\n",trunc(buf+9)); /* * This little kludge is for when the background starts with "Your". */ fprintf(Out,"\\def\\nmr{%s's }\n",trunc(buf+9)); buf[53]='\0'; fprintf(Out,"\\def\\age{%s}\n",trunc(buf+49)); prstat("Str"); GETLINE; fprintf(Out,"\\def\\race{%-20.20s}\n",buf+9); fprintf(Out,"\\def\\height{%-4.4s}\n",buf+49); prstat("Int"); GETLINE; fprintf(Out,"\\def\\sex{%-20.20s}\n",buf+9); female = 'F' == buf[9]; fprintf(Out,"\\def\\weight{%-4.4s}\n",buf+49); prstat("Wis"); GETLINE; fprintf(Out,"\\def\\class{%-20.20s}\n",buf+9); switch(buf[10]-buf[9]) { case 'a'-'W': bp = "$\\spadesuit$"; break; case 'a'-'R': bp = "\\star"; break; case 'a'-'P': bp = "$\\oplus$"; break; case 'a'-'M': bp = "$\\infty$"; break; case 'r'-'P': bp = "$\\Delta$"; break; case 'o'-'R': bp = "\\rogue"; break; default: bp = "\\bullet"; } fprintf(Out,"\\def\\clsym{%s}\n",bp); fprintf(Out,"\\def\\socialclass{%-4.4s}\n",buf+49); prstat("Dex"); GETLINE; fprintf(Out,"\\def\\title{%-20.20s}\n",buf+9); prstat("Con"); GETLINE; prstat("Cha"); for (i=0; i<4; i++) SKIPLINE; GETLINE; plussify(); fprintf(Out,"\\def\\tohit{%-6.6s}\n",buf+15); fprintf(Out,"\\def\\Lev{%-6.6s}\n",buf+38); fprintf(Out,"\\def\\maxhitpts{%-6.6s}\n",buf+65); GETLINE; plussify(); fprintf(Out,"\\def\\todam{%-6.6s}\n",buf+15); fprintf(Out,"\\def\\Exp{%-6.6s}\n",buf+38); fprintf(Out,"\\def\\curhitpts{%-6.6s}\n",buf+65); GETLINE; plussify(); fprintf(Out,"\\def\\toarmor{%-6.6s}\n",buf+15); fprintf(Out,"\\def\\Gol{%-6.6s}\n",buf+38); fprintf(Out,"\\def\\maxmana{%-6.6s}\n",buf+65); GETLINE; fprintf(Out,"\\def\\armorclass{%-6.6s}\n",buf+15); fprintf(Out,"\\def\\curmana{%-6.6s}\n",buf+65); for (i=0; i<4; i++) SKIPLINE; for (i=0; i<3; i+=1) { GETLINE; fprintf(Out,"\\def\\%s{%-10.10s}\n",misc[i],buf+16); fprintf(Out,"\\def\\%s{%-10.10s}\n",misc[i+3],buf+42); fprintf(Out,"\\def\\%s{%-10.10s}\n",misc[i+6],buf+68); } for (i=0; i<3; i++) SKIPLINE; fprintf(Out,"\\def\\background{\n"); for (i=0; i<6; i++) { GETLINE; for (bp=buf; *bp; bp++) if (' '!=*bp) break; if ('\n'==*bp) continue; sub(buf,"have","has ",1); sub(buf,"are","is ",1); if (!madesub++) sub(buf,"You","\\nm",0); sub(buf,"You",female?"She":"He ",1); for (bp=buf+5; '\n'!=*bp; bp++) putc(*bp,Out); putc('\n',Out); } fprintf(Out,"}\n"); /* * Equipment list. */ for (i=0; i<3; i++) SKIPLINE; fprintf(Out,"\\setbox30=\\vbox{\\baselineskip=11pt\n"); for (;;) { GETLINE; for (bp=buf; *bp; bp++) if (' '!=*bp) break; if ('\f'==*bp) break; fprintf(Out,"\\hbox{\\smalltype\n"); minussify(buf+2); fprintf(Out,"}\n"); } fprintf(Out,"}\n"); /* * Inventory. */ nitems = 0; for (i=0; i<5; i++) SKIPLINE; for (;;) { GETLINE; for (bp=buf; *bp; bp++) if (' '!=*bp) break; if ('\f'==*bp) break; fprintf(Out,"\\def\\item%c{",'a'+nitems); for (bp=buf; '\n'!=*bp; bp++) putc(*bp,Out); fprintf(Out,"}\n"); nitems += 1; } /* * Print the data. */ fprintf(Out,"\\centerline{"); fprintf(Out,"\\clsym\\qquad{\\bigbold\\nw}\\qquad\\clsym}\n"); fprintf(Out,"\\vskip 5pt\n"); fprintf(Out,"\\centerline{\\cdate}\n"); fprintf(Out,"\\vskip 2em\n"); fprintf(Out,"\\setbox0=\\vtop{\\halign{\\bf#\\hfil&\\quad#\\hfil\\cr\n"); fprintf(Out," Name&\\nw\\cr\n"); fprintf(Out," Race&\\race\\cr\n"); fprintf(Out," Sex&\\sex\\cr\n"); fprintf(Out," Class&\\class\\cr\n"); fprintf(Out," Title&\\title\\cr\n"); fprintf(Out,"}}\n"); fprintf(Out,"\\def\\dotbox #1/#2.{\\hbox to \\statwidth"); fprintf(Out,"{{\\bf #1}\\dotfill{\\oldstyle #2}}}\n"); fprintf(Out,"\\setbox1=\\vtop{\n"); fprintf(Out,"\\dotbox Age/\\age.\n"); fprintf(Out,"\\dotbox Height/\\height.\n"); fprintf(Out,"\\dotbox Weight/\\weight.\n"); fprintf(Out,"\\dotbox Social Class/\\socialclass.\n"); fprintf(Out,"}\n"); fprintf(Out,"\\setbox2=\\vtop{"); for (i=0; i<6; i++) fprintf(Out," \\dotbox %s/\\%3.3s.\n",xstat[i],xstat[i]); fprintf(Out,"}\n"); fprintf(Out,"\\setbox3="); fprintf(Out,"\\vtop{\\halign{\\hfil$\\oldstyle#$&\\enspace\\bf#\\hfil\\cr\n"); fprintf(Out," \\tohit&to Hit\\cr\n"); fprintf(Out," \\todam&to Damage\\cr\n"); fprintf(Out," \\toarmor&to Armor\\cr\n"); fprintf(Out," \\armorclass&Total Armor\\cr\n"); fprintf(Out,"}}\n"); fprintf(Out,"\\setbox4=\\vtop{\n"); for (i=0; i<3; i++) fprintf(Out,"\\dotbox %s/\\%3.3s.\n",cstat[i],cstat[i]); fprintf(Out,"}\n"); fprintf(Out,"\\setbox5=\\vtop{\\halign{\\hfil$\\mit#$&\\enspace\\bf#\\hfil\\cr\n "); fprintf(Out," \\maxhitpts&Maximum H.P.\\cr\n"); fprintf(Out," \\curhitpts&Current H.P.\\cr\n"); fprintf(Out," \\maxmana&Maximum Mana\\cr\n"); fprintf(Out," \\curmana&Current Mana\\cr\n"); fprintf(Out,"}}\n"); for (i=0; i<3; i++) abilbox(6+i,miscabil[3*i],misc[3*i], miscabil[3*i+1],misc[3*i+1], miscabil[3*i+2],misc[3*i+2]); fprintf(Out,"\\centerline{\\hbox{\\box0\\hskip 0.5in\\box1\\hskip 0.5in\\box2}}\n"); fprintf(Out,"\\vskip 1.5em\n"); fprintf(Out,"\\centerline{\\hbox{\\box3\\hskip 0.5in\\box4\\hskip 0.5in\\box5}}\n"); fprintf(Out,"\\vskip 2em\n"); fprintf(Out,"\\centerline{\\csc Miscellaneous Abilities}\n"); fprintf(Out,"\\vskip 1em\n"); fprintf(Out,"\\centerline{\\hbox{\\box6\\qquad\\box7\\qquad\\box8}}\n"); fprintf(Out,"\\vskip 2em\n"); fprintf(Out,"\\centerline{\\csc Character Background}\n"); fprintf(Out,"\\vskip 5pt\n"); fprintf(Out,"{\\narrower\\narrower\\smallskip\\background\\smallskip}\n"); fprintf(Out,"\\vskip 1em\n"); fprintf(Out,"\\setbox20=\\vbox{\n"); fprintf(Out," \\halign{\\hfil\\smalltype#\\hfil\\cr\n"); fprintf(Out," {\\csc Equipment}\\cr\n"); fprintf(Out," \\noalign{\\vskip 1em}\n"); fprintf(Out," \\hbox{\\box30}\\cr}\n}\n"); fprintf(Out,"\\centerline{\\box20}\n"); if (nitems) pritems(nitems); fprintf(Out,"\\bye\n"); exit(1); } abilbox(n,a1,b1,a2,b2,a3,b3) int n; char *a1, *b1, *a2, *b2, *a3, *b3; { char *format; fprintf(Out,"\\setbox%d=\\vtop{\n",n); format="\\hbox to\\abilwidth{\\bo %s\\dotfill\\%s}\n"; fprintf(Out,format,a1,b1); fprintf(Out,format,a2,b2); fprintf(Out,format,a3,b3); fprintf(Out,"}\n"); } -- Col. G. L. Sicherman UU: ...{rocksvax|decvax}!sunybcs!colonel CS: colonel@buffalo-cs BI: csdsicher@sunyabva