#include #include #include #include #include #define MAX_LOC 420 #define N 0 #define NE 1 #define E 2 #define SE 3 #define S 4 #define SW 5 #define W 6 #define NW 7 unsigned char fname[81], got_file, fnum[3], t1[80], t2[80]; int num_chars, num_events, num_loc, year,month,day,hour; unsigned char buf[412], cbuf[MAX_LOC][58]; int event[24]; unsigned char name[23]; int c3, c4; int dumpster; unsigned char *who[12] = {"Merchant","#1","#2","#3","Foreign Trader","Pharmacist", "Meddici","Hanseatic League","Fuggar","#9","Mayor","#11"}; int director; unsigned char *nsew[8] = {"N","NE","E","SE","S","SW","W","NW"}; FILE *game, *ifile; /****************************************************************************/ void find_recent_save() { unsigned dte, tme; struct find_t ff; strcpy(fnum,"0"); fnum[2] = 0; if (_dos_findfirst(".\\SAVES\\DKSAVE*.SAV",_A_NORMAL,&ff) == 0){ fnum[0] = ff.name[6]; fnum[1] = 0; if (ff.name[7] != '.') { fnum[1] = ff.name[7]; } dte = ff.wr_date; tme = ff.wr_time; } while (_dos_findnext(&ff) == 0) { if (ff.wr_date > dte) { dte = ff.wr_date; tme = ff.wr_time; fnum[0] = ff.name[6]; fnum[1] = 0; if (ff.name[7] != '.') { fnum[1] = ff.name[7]; } } if (ff.wr_date == dte) { if (ff.wr_time > tme) { dte = ff.wr_date; tme = ff.wr_time; fnum[0] = ff.name[6]; fnum[1] = 0; if (ff.name[7] != '.') { fnum[1] = ff.name[7]; } } } } } /****************************************************************************/ void get_loc(int ndx, unsigned char *loc) { fseek(game,393+(num_chars*554)+(num_events*48)+42+(ndx*58),SEEK_SET); fread(loc,58,1,game); } /****************************************************************************/ void get_item_desc(int ndx, unsigned char *desc) { fseek(ifile,3+(ndx*46),SEEK_SET); fread(desc,46,1,ifile); } /****************************************************************************/ void break_city(int num) { int z; for (z = 0; z < 10; z++) { name[z] = cbuf[num][z+38]; } name[z] = 0; c3 = cbuf[num][4] + (cbuf[num][5] * 256); c4 = cbuf[num][6] + (cbuf[num][7] * 256); } /****************************************************************************/ int get_dir(int sitex, int sitey, int cityx, int cityy) { int dx, dy, dd, dir; dx = abs(sitex - cityx); dy = abs(sitey - cityy); dd = abs(dx - dy); if ( dy > dx ) { if (sitey < cityy) { dir = N; if ( dd < 3 ) { if ( sitex < cityx ) { dir = NW; }else{ dir = NE; } } }else{ dir = S; if ( dd < 3 ) { if ( sitex < cityx ) { dir = SW; }else{ dir = SE; } } } }else{ if ( sitex < cityx) { dir = W; if ( dd < 3 ) { if ( sitey < cityy ) { dir = NW; }else{ dir = SW; } } }else{ dir = E; if ( dd < 3 ) { if ( sitey < cityy ) { dir = NE; }else{ dir = SE; } } } } return(dir); } /****************************************************************************/ int find_closest_city(int x, int y) { int z, who, savex, savey; double x2, y2, miny, dx; miny = 99999.0; who = -1; for (z = 0; z < 92; z++) { break_city(z); x2 = fabs((double)(c3) - (double)(x)); y2 = fabs((double)(c4) - (double)(y)); x2 = x2 * x2; y2 = y2 * y2; dx = sqrt(x2+y2); if (dx < miny) { savex = c3; savey = c4; miny = dx; who = z; } } director = get_dir(x,y,savex,savey); return(who); } /****************************************************************************/ void get_file() { int i; unsigned char nc; got_file = 1; if ((game = fopen(fname,"rb")) == NULL) { got_file = 0; printf(_strerror(fname)); return; } if ((ifile = fopen("darkland.lst","rb")) == NULL) { printf(_strerror("darkland.lst")); fclose(game); return; } fseek(game,104,SEEK_SET); fread(&year,2,1,game); fread(&month,2,1,game); fread(&day,2,1,game); fread(&hour,2,1,game); month = month+1; fseek(game,241,SEEK_SET); fread(&nc,1,1,game); num_chars = (int)(nc); fseek(game,393+(num_chars*554),SEEK_SET); fread(&num_events,2,1,game); fseek(game,393+(num_chars*554)+2+(num_events*48),SEEK_SET); fread(&num_loc,2,1,game); i = num_loc; if (i > MAX_LOC) { i = MAX_LOC; } fread(&cbuf[0],58,i,game); } /****************************************************************************/ void dumpit() { int i, j, xx, yyy, hh, dd, mm, yy, h, d, m, y; if (dumpster) { printf("\nevents que: %d\n\n",num_events); for (i = 0; i < num_events; i++) { fseek(game,393+(num_chars*554)+2+(i*48),SEEK_SET); fread(&event,48,1,game); xx = event[0]; hh = event[1]; dd = event[2]; mm = event[3]; yy = event[4]; printf("%2d %4d/%02d/%02d ",xx,yy,mm,dd); h = event[5]; d = event[6]; m = event[7]; y = event[8]; printf("%4d/%02d/%02d ",y,m,d); hh = event[9]; dd = event[10]; mm = event[11]; yy = event[12]; printf("%4d/%02d/%02d\n",yy,mm,dd); for (j = 13; j < 24; j++) { printf("%4d ",event[j]); } printf("\n"); for (j = 13; j < 24; j++) { printf(" %02X ",event[j]); } printf("\n"); if (event[13] >= 0) { /* pending event ? */ printf("%s: ",who[event[13]]); if (event[23] != 0) { get_item_desc(event[23],buf); if (yy == 1499) { printf("Get %s ",buf); }else{ printf("Return %s ",buf); } }else{ printf("Kill Raubritter "); } if (event[23] != 0) { /* item ? */ if (yy == 1499) { /* go to get */ get_loc(event[15],buf); }else{ get_loc(event[22],buf); } }else{ get_loc(event[22],buf); } printf("from: %s ",buf); get_loc(event[14],buf); printf("to: %s",buf); if (event[14] > 91) { break_city(event[14]); xx = c3; yy = c4; hh = find_closest_city(xx,yy); break_city(hh); printf(" (near %s) ",name); } printf("\n"); }else{ if (event[14] != 0) { get_loc(event[14],buf); printf("location: %s\n",buf); } } printf("\n\n"); } } rewind(game); fread(t1,21,1,game); fread(t2,80,1,game); printf("Quests for DKSAVE%s.SAV %s %s %d/%d/%d %d\n\n",fnum,t1,t2,year,month,day,hour); for (i = 0; i < num_events; i++) { fseek(game,393+(num_chars*554)+2+(i*48),SEEK_SET); fread(&event,48,1,game); h = event[5]; d = event[6]; m = event[7]; y = event[8]; hh = event[9]; dd = event[10]; mm = event[11]; yy = event[12]; if ((event[13] >= 0) /* pending event ? */ && (yy != y)) { if (event[23] != 0) { /* item ? */ get_item_desc(event[23],buf); if (yy == 1499) { printf("Get %s from ",buf); }else{ printf("Return %s to %s at ",buf,who[event[13]]); } }else{ printf("Raubritter Quest (%s) - go to - ",who[event[13]]); } get_loc(event[14],buf); /* destination */ printf("%s ",buf); if (event[14] > 91) { break_city(event[14]); xx = c3; yyy = c4; hh = find_closest_city(xx,yyy); break_city(hh); printf("(%s of %s) ",nsew[director],name); } if (event[12] > 1498) { printf("(no limit from %4d/%02d/%02d)",y,m+1,d); }else{ printf("by %4d/%02d/%02d ",yy,mm+1,dd); } if (event[23] != 0) { /* item ? */ if (yy == 1499) { /* go to get */ get_loc(event[15],buf); printf("\nDeliver to %s at %s",who[event[13]],buf); } } printf("\n\n"); } } fclose(game); fclose(ifile); } /****************************************************************************/ void do_help() { printf("\nUSAGE DKQUEST \n"); printf("\n Where is the saved game number.\n"); printf("For example, DKQUEST 2\n"); printf("will display the current quests in DKSAVE2.SAV\n"); printf("NOTE: If you do not specify , your most recent (by DOS date & time)\n"); printf("saved game will be reported.\n"); } /****************************************************************************/ void main(int argc, char *argv[]) { if (argc != 1) { if (argv[1][0] == '?') { do_help(); return; } if ((atoi(argv[1]) > 99) || (atoi(argv[1]) < 0)) { printf("\nSaved game number must be between 0 and 99\n"); do_help(); return; } if (argv[1][0] < '0' || argv[1][0] > '9') { do_help(); return; } } if (argc > 2) { dumpster = 1; }else{ dumpster = 0; } printf ("DKQUE version 1.1 Steven J. Cotellesse\n\n"); strcpy(fname,".\\SAVES\\DKSAVE"); if (argc < 2) { find_recent_save(); strcat(fname,fnum); }else{ strcat(fname,argv[1]); strcpy(fnum,argv[1]); } strcat(fname,".SAV"); get_file(); if (!got_file) { printf("No file selected - exiting\n"); }else{ dumpit(); } } /****************************************************************************/