#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define MAX_EQUIP 250 #define MAX_SAINT 136 #define MAX_FORMULA 66 #define TO_FILE 'F' #define TO_PRINTER 'P' MFORMPTR mmp, mp, submmp; /* Main Menu & menu Pointers */ DFORMPTR fmp, vfmp; SRPTR srp; DFIELDPTR fld0, fld1, fld2, fld[33], fld3, fld4, fld5, vfld[300]; WINDOWPTR f10wnp; /* form instructions */ WINDOWPTR msgwnp; /* for up_msg dn_msg */ MFILEPTR chl_fnames; /* File Name Choice List */ MFILEPTR chl_items; WINDOWPTR current_wnp; unsigned char fname[12+1]; unsigned char game_dir[_MAX_DIR], save_dir[_MAX_DIR], save_dir_tmplt[_MAX_DIR]; unsigned char aname[33][7+1], message[20][81], edt_fname[_MAX_DIR]; unsigned char current_desc[80]; int num_chars, num_in_party, num_files, current_char, nip[5]; unsigned char got_file; int num_items, num_saints, num_formula, num_equip, total_items, total_saints, total_formula; unsigned char a_buf[369-253]; unsigned char adv_buf[554]; unsigned char nick_name[9+1], name[24+1], eqp, snt, frm; int attribute[33], age; unsigned char saint_name[MAX_SAINT][23+1], formula_name[MAX_FORMULA][31+1]; unsigned char pray[MAX_SAINT], formula[MAX_FORMULA], save_pray[MAX_SAINT], save_formula[MAX_FORMULA]; unsigned char equip_desc[64][19+1]; int equip_num[64], equip_byte[64], equip_qual[64],equip_qty[64],equip_wt[64]; int item_byte[MAX_EQUIP], item_qual[MAX_EQUIP], item_wt[MAX_EQUIP]; int party_fl, party_gr, party_pf, party_fame, party_ps, party_notes; unsigned char print_to; FILE *game, *xfer_file, *item_file, *device; typedef struct { unsigned char desc[19+1]; int qual; int qty; int wt; int num; int byte; } equip_data; equip_data equip[64], save_equip[64]; /****************************************************************************/ void wait_for_escape() { int k; k = 0; while (k != KEY_ESC) { k = ki(); } } /****************************************************************************/ unsigned char wait_for_keys(unsigned char *keys) { int i, k; unsigned char ch; ch = KEY_ESC; i = 0; while (i == 0) { k = ki(); ch = ch_toupper((UCHAR)k); if (strlen(keys) == 0) { break; } if ((strchr(keys,ch) != NULL) || k == KEY_ESC) { i = 1; } } return(ch); } /****************************************************************************/ void beep(int dur, int tone) { beep_vv(dur,tone); } /****************************************************************************/ void display_error_msg(unsigned char *err_msg) { int x, width; unsigned char emsg[80+1]; WINDOWPTR wnp; beep(BPMEDIUM,BPLOW); if (strlen(err_msg) > 76) { for (x = 0; x < 76; x++) { emsg[x] = err_msg[x]; } emsg[76] = 0; }else{ strcpy(emsg,err_msg); } width = strlen(err_msg) + 4; if (width < (28+4)) { width = 28 + 4; /* for "Press Esc" string */ } if (width > 80) { width = 80; } x = (79 - width) / 2; if (x < 0) { x = 0; } wnp = wn_def(8,x,4,width,(UCHAR)LERROR,BDR_DLNP); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, wnp); wn_set(wnp); sw_clreor(OFF,wnp); sw_csadv(OFF,wnp); sw_csrpl(OFF,wnp); v_stattpl(0,CENTER_TEXT,err_msg,(UCHAR)LERROR,STATT,wnp); v_stattpl(1,CENTER_TEXT,"Press ESCape to Continue....",(UCHAR)LERROR,STATT,wnp); wait_for_escape(); wn_unset(wnp); wn_free(wnp); } /****************************************************************************/ unsigned char display_msg(int wx, int wy, int lines, unsigned char *keys) { int i, y, x; unsigned int width; unsigned char ans; WINDOWPTR wnp; width = 0; for (i = 0; i < lines; i++) { if (strlen(message[i]) > width) { width = strlen(message[i]); } } width = width + 2; /* add in border */ if (wx == 0) { x = (79 - width) / 2; }else{ x = wx; } if (wy == 0) { y = (24 - lines) / 2; }else{ y = wy; } wnp = wn_def(y,x,lines+2,width,LREVERSE,BDR_DLNP); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, wnp); wn_set(wnp); sw_clreor(OFF,wnp); sw_csadv(OFF,wnp); sw_csrpl(OFF,wnp); for (i = 0; i < lines; i++) { v_stpl(i,LEFT_TEXT,message[i],wnp); } ans = wait_for_keys(keys); wn_unset(wnp); wn_free(wnp); return(ans); } /****************************************************************************/ void up_msg(int wx, int wy, int lines) { int i, y, x; unsigned int width; width = 0; for (i = 0; i < lines; i++) { if (strlen(message[i]) > width) { width = strlen(message[i]); } } width = width + 2; /* add in border */ if (wx == 0) { x = (79 - width) / 2; }else{ x = wx; } if (wy == 0) { y = (24 - lines) / 2; }else{ y = wy; } msgwnp = wn_def(y,x,lines+2,width,LREVERSE,BDR_DLNP); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, msgwnp); wn_set(msgwnp); sw_clreor(OFF,msgwnp); sw_csadv(OFF,msgwnp); sw_csrpl(OFF,msgwnp); for (i = 0; i < lines; i++) { v_stpl(i,CENTER_TEXT,message[i],msgwnp); } } /****************************************************************************/ void dn_msg() { wn_unset(msgwnp); wn_free(msgwnp); } /****************************************************************************/ void printer_not_ready() { display_error_msg("Printer Not Available"); return; } /****************************************************************************/ int printer_ready() { union REGS reg; int ready; reg.x.dx = 0; reg.h.ah = 0x02; int86(0x17,®,®); if (reg.h.ah == 144) { ready = TRUE; } else { ready = FALSE; } if (!ready) { time_delay(25); reg.x.dx = 0; reg.h.ah = 0x02; int86(0x17,®,®); if (reg.h.ah == 144) { ready = TRUE; } else { ready = FALSE; } } return (ready); } /****************************************************************************/ void set_horz_menu_colors() { latt_rpl(LMNINACT,NORMAL,BLUE,WHITE,LATT_SYS); latt_rpl(LMNACT,REVERSE,BLACK,CYAN,LATT_SYS); latt_rpl(LMNSELCH,NORMAL|HIGH_INT,CYAN|HIGH_INT,WHITE,LATT_SYS); } /****************************************************************************/ void set_main_menu_colors() { latt_rpl(LMNACT,NORMAL,BLACK,WHITE,LATT_SYS); latt_rpl(LMNINACT,REVERSE,BLACK,CYAN,LATT_SYS); latt_rpl(LMNSELCH,REVERSE,BLUE|HIGH_INT,CYAN,LATT_SYS); } /****************************************************************************/ void display_current_adv() { if (current_wnp != NULLP) { wn_unset(current_wnp); wn_free(current_wnp); } current_wnp = wn_def(18,2,3,76,LMESSAGE,BDR_SLNP); sw_title("Current Adventure",LMESSAGE,TOPCENTER,current_wnp); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, current_wnp); wn_set(current_wnp); sw_clreor(OFF,current_wnp); sw_csadv(OFF,current_wnp); sw_csrpl(OFF,current_wnp); v_stattpl(0,CENTER_TEXT,current_desc,LMESSAGE,STATT,current_wnp); } /****************************************************************************/ void trunc_trailing(unsigned char *txt) { int i; i = strlen(txt) - 1; while (txt[i] == ' ' && i >= 0) { txt[i] = 0; --i; } } /****************************************************************************/ int load_file_name_list(unsigned char *templt) { int i, y,m,d,h; unsigned char txt[_MAX_DIR], t1[81], t2[81], t3[80]; struct find_t ff; FILE *file; chl_fnames = mf_def(100,12+1+25+1+23+1+13+1); i = 0; if (_dos_findfirst(templt,_A_NORMAL,&ff) == 0){ strcpy(txt,save_dir); strcat(txt,ff.name); if ((file = fopen(txt,"rb")) == NULL) { display_error_msg(_strerror(ff.name)); } fread(t1,21,1,file); fread(t2,80,1,file); fseek(file,104,SEEK_SET); fread(&y,2,1,file); fread(&m,2,1,file); fread(&d,2,1,file); fread(&h,2,1,file); ++m; fclose(file); t1[25] = 0; t2[23] = 0; sprintf(t3,"%d/%d/%d %d",y,m,d,h); strcpy(txt,ff.name); st_padblank(txt,13); strcat(txt,t1); strcat(txt," "); strcat(txt,t2); strcat(txt," "); strcat(txt,t3); st_padblank(txt,68); txt[68] = 0; mf_rowins(txt,APPEND_ROW,chl_fnames); ++i; } while (_dos_findnext(&ff) == 0 && i < 100 ) { strcpy(txt,save_dir); strcat(txt,ff.name); file = fopen(txt,"rb"); fread(t1,21,1,file); fread(t2,80,1,file); fseek(file,104,SEEK_SET); fread(&y,2,1,file); fread(&m,2,1,file); fread(&d,2,1,file); fread(&h,2,1,file); ++m; fclose(file); t1[25] = 0; t2[23] = 0; sprintf(t3,"%d/%d/%d %d",y,m,d,h); strcpy(txt,ff.name); st_padblank(txt,13); strcat(txt,t1); strcat(txt," "); strcat(txt,t2); strcat(txt," "); strcat(txt,t3); st_padblank(txt,68); txt[68] = 0; mf_rowins(txt,APPEND_ROW,chl_fnames); ++i; } if (_dos_findnext(&ff) == 0) { printf("More than 100 files found - only first 100 will listed\n"); } return (i); } /****************************************************************************/ void get_file() { int i; unsigned char nc; unsigned char old_fname[13], txt[_MAX_DIR]; fmp = fm_def(9, 7, 5, 64, LNORMAL, BDR_DLNP); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, fmp->wnp); sfm_opt(AUTOEXIT, ON, fmp); sfm_opt(VERIFYEXIT, OFF, fmp); sfm_opt(VERIFYQUIT, OFF, fmp); fld0 = fld_def(1,1,"Game: ", FADJACENT,pic_def('!',12),F_STRING,fname,fmp); sf_msg("Name of saved game file to use, press Enter to accept or Escape to cancel.",fld0); sf_clist(NULLP,CLWRAP|CLPOP,chl_fnames,fld0); strcpy(old_fname,fname); if (fm_proc(0,fmp) == AC_EXIT) { trunc_trailing(fname); strcpy(txt,save_dir); strcat(txt,fname); trunc_trailing(txt); if ((game = fopen(txt,"rb")) == NULL) { display_error_msg(_strerror(txt)); strcpy(fname,old_fname); return; } strcpy(edt_fname,txt); fseek(game,239,SEEK_SET); fread(&nc,1,1,game); num_in_party = (int)(nc); fread(&nc,1,1,game); fread(&nc,1,1,game); num_chars = (int)(nc); if (num_chars < 1) { display_error_msg("No characters found for this game"); strcpy(fname,old_fname); fclose(game); return; } for (i= 0; i < num_in_party; i++) { fread(&nc,1,1,game); fread(&nc,1,1,game); nip[i] = (int)(nc); } got_file = TRUE; }else{ strcpy(fname,old_fname); } fclose(game); fm_free(fmp); } /****************************************************************************/ int FASTCALL begf10fm(MFORMPTR mfmp) { f10wnp = wn_def(22,0,2,80,LTHUMB,NULLP); wn_set(f10wnp); sw_clreor(OFF,f10wnp); sw_csadv(OFF,f10wnp); sw_csrpl(OFF,f10wnp); v_stpl(0,CENTER_TEXT,"Press the F10 key to save",f10wnp); v_stpl(1,CENTER_TEXT,"Press the ESC key to ignore changes",f10wnp); return(TRUE); } /****************************************************************************/ int FASTCALL endf10fm(MFORMPTR mfmp) { wn_unset(f10wnp); wn_free(f10wnp); return(TRUE); } /****************************************************************************/ int do_end_menu(MFORMPTR mptr) { return(EXITMENU); } /****************************************************************************/ int do_end(MFORMPTR mptr) { return(1); } /****************************************************************************/ int load_adv(MFORMPTR mfmp) { int i; unsigned char bufstp[80]; get_file(); if (!got_file) { return(SAMELEVEL); } for (i = 0; i < num_files; i++) { mf_rowget(bufstp, i, chl_fnames); bufstp[strlen(fname)] = 0; trunc_trailing(bufstp); if (STR_EQ(fname,bufstp)) { mf_rowget(current_desc, i, chl_fnames); trunc_trailing(current_desc); } } display_current_adv(); } /****************************************************************************/ void get_char() { int i, j, byt; fseek(game,393+(current_char*554),SEEK_SET); fread(adv_buf,554,1,game); for (i = 37; i <= 61; i++) { name[i-37] = adv_buf[i]; } st_padblank(name,24); for (i = 62; i <= 71; i++) { nick_name[i-62] = adv_buf[i]; } st_padblank(nick_name,9); for (i = 93; i <= 125; i++) { attribute[i-93] = (int)(adv_buf[i]); } age = (int)(adv_buf[18]); eqp = FALSE; snt = FALSE; frm = FALSE; for (i = 0; i < num_saints; i++) { pray[i] = FALSE; } for (i = 0; i < num_formula; i++) { formula[i] = FALSE; } j = 0; for (i = 0; i < 17; i++) { byt = (int)(adv_buf[128+i]); if (byt >= 128) { pray[j] = TRUE; byt -= 128; } ++j; if (byt >= 64) { pray[j] = TRUE; byt -= 64; } ++j; if (byt >= 32) { pray[j] = TRUE; byt -= 32; } ++j; if (byt >= 16) { pray[j] = TRUE; byt -= 16; } ++j; if (byt >= 8) { pray[j] = TRUE; byt -= 8; } ++j; if (byt >= 4) { pray[j] = TRUE; byt -= 4; } ++j; if (byt >= 2) { pray[j] = TRUE; byt -= 2; } ++j; if (byt >= 1) { pray[j] = TRUE; byt -= 1; } ++j; } for (i = 0; i < 22; i++) { byt = (int)(adv_buf[148+i]); if (byt >= 4) { formula[(i*3)+2] = TRUE; byt -= 4; } if (byt >= 2) { formula[(i*3)+1] = TRUE; byt -= 2; } if (byt >= 1) { formula[(i*3)] = TRUE; byt -= 1; } } num_equip = (int)(adv_buf[126]); for (i = 0; i < 64; i++) { j = i * 6; if (i < num_equip) { equip_num[i] = (int)(adv_buf[170+j]) + ((int)(adv_buf[171+j]) * 256); mf_rowget(equip_desc[i],equip_num[i],chl_items); st_padblank(equip_desc[i],19); equip_byte[i] = (int)(adv_buf[172+j]); equip_qual[i] = (int)(adv_buf[173+j]); equip_qty[i] = (int)(adv_buf[174+j]); equip_wt[i] = (int)(adv_buf[175+j]); }else{ equip_num[i] = 0; strcpy(equip_desc[i]," "); st_padblank(equip_desc[i],19); equip_byte[i] = 0; equip_qual[i] = 0; equip_qty[i] = 0; equip_wt[i] = 0; } equip[i].num = equip_num[i]; strcpy(equip[i].desc,equip_desc[i]); equip[i].qual = equip_qual[i]; equip[i].qty = equip_qty[i]; equip[i].wt = equip_wt[i]; equip[i].byte = equip_byte[i]; } } /****************************************************************************/ int process_equip() { int i, j; j = 0; for (i = 0; i < 64; i++) { equip_qual[i] = 0; equip_qty[i] = 0; equip_wt[i] = 0; equip_num[i] = 0; equip_byte[i] = 0; st_padblank(equip[i].desc,19); if (!st_isblank(equip[i].desc)) { equip_qual[j] = equip[i].qual; equip_qty[j] = equip[i].qty; equip_wt[j] = equip[i].wt; equip_num[j] = equip[i].num; equip_byte[j] = equip[i].byte; ++j; } } return(j); } /****************************************************************************/ void put_char() { int i, j, byt; trunc_trailing(name); for (i = 37; i <= 61; i++) { adv_buf[i] = name[i-37]; } trunc_trailing(nick_name); for (i = 62; i <= 71; i++) { adv_buf[i] = nick_name[i-62]; } for (i = 93; i <= 125; i++) { adv_buf[i] = (unsigned char)(attribute[i-93]); } adv_buf[18] = (unsigned char)(age); j = 0; for (i = 0; i < 17; i++) { byt = 0; if (pray[j]) { byt += 128; } ++j; if (pray[j]) { byt += 64; } ++j; if (pray[j]) { byt += 32; } ++j; if (pray[j]) { byt += 16; } ++j; if (pray[j]) { byt += 8; } ++j; if (pray[j]) { byt += 4; } ++j; if (pray[j]) { byt += 2; } ++j; if (pray[j]) { byt += 1; } ++j; adv_buf[128+i] = (unsigned char)(byt); } for (i = 0; i < 22; i++) { byt = 0; if (formula[(i*3)+2]) { byt += 4; } if (formula[(i*3)+1]) { byt += 2; } if (formula[(i*3)]) { byt += 1; } adv_buf[148+i] = (unsigned char)(byt); } num_equip = process_equip(); for (i = 0; i < 64; i++) { j = i * 6; adv_buf[171+j] = (unsigned char)(equip_num[i] / 256); adv_buf[170+j] = (unsigned char)(equip_num[i] % 256); adv_buf[172+j] = (unsigned char)(equip_byte[i]); adv_buf[173+j] = (unsigned char)(equip_qual[i]); adv_buf[174+j] = (unsigned char)(equip_qty[i]); adv_buf[175+j] = (unsigned char)(equip_wt[i]); } adv_buf[126] = (unsigned char)(num_equip); fseek(game,393+(current_char*554),SEEK_SET); fwrite(adv_buf,554,1,game); } /****************************************************************************/ int do_edit_char(MFORMPTR mptr) { if (fm_rd(0,fmp) == AC_EXIT) { put_char(); }else{ get_char(); } fm_updflds(fmp); return(SAMELEVEL); } /****************************************************************************/ int do_next_char(MFORMPTR mptr) { ++current_char; if (current_char >= num_chars) { current_char = 0; } get_char(); fm_updflds(fmp); return(SAMELEVEL); } /****************************************************************************/ void do_formula_list() { int i; latt_rpl(LFLDINACT,NORMAL,CYAN|LIGHT,BLUE,LATT_SYS); for (i = 0; i < num_formula; i++) { save_formula[i] = formula[i]; } vfmp = fm_vdef(5, 18, 13, 36, LMESSAGE, BDR_DLNP, num_formula+2, 36); sw_title("[ Formulas ]",LMESSAGE,TOPCENTER,vfmp->wnp); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, vfmp->wnp); for (i = 0; i < num_formula; i++) { vfld[i] = fld_def(i,1,formula_name[i], FADJACENT,"!",F_BOOL,&formula[i],vfmp); sf_msg("Know this Formula?",vfld[i]); } if (fm_proc(0,vfmp) == AC_QUIT) { for (i = 0; i < num_formula; i++) { formula[i] = save_formula[i]; } } fm_free(vfmp); latt_rpl(LFLDINACT,NORMAL,BLACK,WHITE,LATT_SYS); } /****************************************************************************/ int end_formula(DFORMPTR dfmp) { unsigned char typ; fld_get(&typ,38,dfmp); if (typ == TRUE) { do_formula_list(); } return(TRUE); } /****************************************************************************/ void do_saint_list() { int i; latt_rpl(LFLDINACT,NORMAL,CYAN|LIGHT,BLUE,LATT_SYS); for (i = 0; i < num_saints; i++) { save_pray[i] = pray[i]; } vfmp = fm_vdef(5, 24, 13, 29, LMESSAGE, BDR_DLNP, num_saints+2, 29); sw_title("[ Saints ]",LMESSAGE,TOPCENTER,vfmp->wnp); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, vfmp->wnp); for (i = 0; i < num_saints; i++) { vfld[i] = fld_def(i,1,saint_name[i], FADJACENT,"!",F_BOOL,&pray[i],vfmp); sf_msg("Know this Saint?",vfld[i]); } if (fm_proc(0,vfmp) == AC_QUIT) { for (i = 0; i < num_saints; i++) { pray[i] = save_pray[i]; } } fm_free(vfmp); latt_rpl(LFLDINACT,NORMAL,BLACK,WHITE,LATT_SYS); } /****************************************************************************/ int end_saints(DFORMPTR dfmp) { unsigned char typ; fld_get(&typ,37,dfmp); if (typ == TRUE) { do_saint_list(); } return(TRUE); } /****************************************************************************/ int validate_equip(unsigned char *editbufp,unsigned char *picp,struct form_struct *dfmp) { int i, result, row; unsigned char tx[19+1]; if (!fld_isaltered(curdfldp(dfmp))) { return(TRUE); } row = sr_currow(srp); if (st_isblank(editbufp)) { equip[row].qual = 0; equip[row].qty = 0; equip[row].wt = 0; equip[row].num = 0; equip[row].byte = 0; strcpy(equip[row].desc," "); st_padblank(equip[row].desc,19); srf_upd(equip[row].desc, row, 0, srp); srf_upd(&equip[row].qty, row, 1, srp); srf_upd(&equip[row].qual, row, 2, srp); srf_upd(&equip[row].wt, row, 3, srp); return(TRUE); } result = -1; strcpy(tx,editbufp); st_padblank(tx,19); for (i = 0; i < num_items; i++) { if (STR_EQ(tx,mf_rowp(i,chl_items))) { result = i; break; } } if (result != -1) { i = result; equip[row].qual = item_qual[i]; if (equip[row].qty < 1) { equip[row].qty = 1; } equip[row].wt = item_wt[i]; equip[row].num = i; equip[row].byte = item_byte[i]; mf_rowget(equip[row].desc,i,chl_items); st_padblank(equip[row].desc,19); srf_upd(equip[row].desc, row, 0, srp); srf_upd(&equip[row].qty, row, 1, srp); srf_upd(&equip[row].qual, row, 2, srp); srf_upd(&equip[row].wt, row, 3, srp); result = TRUE; }else{ display_error_msg("Unknown Item - please use F2 key for choices."); result = FALSE; VAL_ERR = 0; } return(result); } /****************************************************************************/ int validate_qty(unsigned char *editbufp,unsigned char *picp,struct form_struct *dfmp) { int i, result; if (!fld_isaltered(curdfldp(dfmp))) { return(TRUE); } if (st_isblank(equip[sr_currow(srp)].desc)) { return(TRUE); } i = atoi(editbufp); if (i < 1 || i > 255) { result = -1; }else{ result = 0; } if (result == 0) { result = TRUE; }else{ display_error_msg("Quantity must be between 1 and 255."); result = FALSE; VAL_ERR = 0; } return(result); } /****************************************************************************/ int validate_qual(unsigned char *editbufp,unsigned char *picp,struct form_struct *dfmp) { int i, result; if (!fld_isaltered(curdfldp(dfmp))) { return(TRUE); } if (st_isblank(equip[sr_currow(srp)].desc)) { return(TRUE); } i = atoi(editbufp); if (i < 1 || i > 99) { result = -1; }else{ result = 0; } if (result == 0) { result = TRUE; }else{ display_error_msg("Quality must be between 1 and 99."); result = FALSE; VAL_ERR = 0; } return(result); } /****************************************************************************/ void do_equip_list() { int i; latt_rpl(LFLDINACT,NORMAL,CYAN|LIGHT,BLUE,LATT_SYS); for (i = 0; i < 64; i++) { strcpy(save_equip[i].desc,equip[i].desc); save_equip[i].qty = equip[i].qty; save_equip[i].qual = equip[i].qual; save_equip[i].wt = equip[i].wt; save_equip[i].num = equip[i].num; save_equip[i].byte = equip[i].byte; } vfmp = fm_def(5, 18, 13, 37, LMESSAGE, BDR_DLNP); sw_title("[ Items ]",LMESSAGE,TOPCENTER,vfmp->wnp); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, vfmp->wnp); srp = sr_def(1, 1, 10, 33, LMESSAGE, BDR_NULLP, 64, vfmp); ssr_struct(equip,sizeof(equip_data),srp); bg_txtdef(0,1,"Description Qty Qual Wt",LMESSAGE,vfmp); vfld[0] = srf_def(0,"", FADJACENT,pic_def('X',19),F_STRING,equip[0].desc,srp); sf_msg("Item (press F2 for list).",vfld[0]); sf_clist(NULLP,CLWRAP,chl_items,vfld[0]); sf_valfp(validate_equip,vfld[0]); vfld[1] = srf_def(21,"", FADJACENT,"UUU",F_INT,&equip[0].qty,srp); sf_msg("Item Quantity. Must be between 1 and 255.",vfld[1]); sf_valfp(validate_qty,vfld[1]); vfld[2] = srf_def(26,"", FADJACENT,"UU",F_INT,&equip[0].qual,srp); sf_msg("Item Quality. Must be between 1 and 99.",vfld[2]); sf_valfp(validate_qual,vfld[2]); vfld[3] = srf_def(31,"", FADJACENT,"UU",F_INT,&equip[0].wt,srp); sf_opt(SKIP,ON,vfld[3]); if (fm_proc(0,vfmp) == AC_QUIT) { for (i = 0; i < 64; i++) { strcpy(equip[i].desc,save_equip[i].desc); equip[i].qty = save_equip[i].qty; equip[i].qual = save_equip[i].qual; equip[i].wt = save_equip[i].wt; equip[i].num = save_equip[i].num; equip[i].byte = save_equip[i].byte; } } fm_free(vfmp); latt_rpl(LFLDINACT,NORMAL,BLACK,WHITE,LATT_SYS); } /****************************************************************************/ int end_equip(DFORMPTR dfmp) { unsigned char typ; fld_get(&typ,36,dfmp); if (typ == TRUE) { do_equip_list(); } return(TRUE); } /****************************************************************************/ void print_a_character() { int i, eqp, snt, frm, printed; unsigned char cname[10], tx[40], part[128], line[128]; strcpy(cname,nick_name); trunc_trailing(cname); sprintf(message[0]," Printing %s ",cname); up_msg(0,0,1); fprintf(device,"%s %s Age: %d\n\n",name,nick_name,age); for (i = 0; i < 7; i++) { fprintf(device,"%s %2d / %2d",aname[i],attribute[i],attribute[i+7]); fprintf(device," %s%2d",aname[i+14],attribute[i+14]); if (i != 6) { fprintf(device," %s%2d",aname[i+21],attribute[i+21]); fprintf(device," %s%2d",aname[i+27],attribute[i+27]); } fprintf(device,"\n"); } fprintf(device,"\n"); fprintf(device,"Equipment Qual Qty Saints Formulas\n"); eqp = 0; snt = 0; frm = 0; for (i = 0; i < MAX_SAINT; i++) { printed = 0; if (eqp < num_equip) { strcpy(tx,equip[eqp].desc); tx[16] = 0; sprintf(part,"%s %2d %3d",tx,equip[eqp].qual,equip[eqp].qty); ++eqp; ++printed; }else{ strcpy(part," "); } strcpy(line,part); while (!pray[snt] && snt < MAX_SAINT) { ++snt; } if (snt < MAX_SAINT) { strcpy(tx,saint_name[snt]); tx[19] = 0; sprintf(part," %s",tx); ++snt; ++printed; }else{ strcpy(part," "); } strcat(line,part); while (!formula[frm] && frm < MAX_FORMULA) { ++frm; } if (frm < MAX_FORMULA) { strcpy(tx,formula_name[frm]); tx[31] = 0; sprintf(part," %s",tx); ++frm; ++printed; }else{ strcpy(part,""); } strcat(line,part); if (printed > 0) { fprintf(device,"%s\n",line); } } fprintf(device,"\n\n"); dn_msg(); } /****************************************************************************/ int get_pfile_name(unsigned char *pfn) { int rslt; latt_rpl(LFLDINACT,NORMAL,CYAN|LIGHT,BLUE,LATT_SYS); se_fmopt(AUTOMOVE|FMWRAP|CURSORFREE|CURSORCROSS|AUTOEXIT); vfmp = fm_def(10, 25, 5, 29, LMESSAGE, BDR_DLNP); sw_title("[ Print To ]",LMESSAGE,TOPCENTER,vfmp->wnp); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, vfmp->wnp); vfld[0] = fld_def(1,1,"File Name: ", FADJACENT,pic_def('X',13),F_STRING,pfn,vfmp); sf_msg("Enter name of file to print to.",vfld[0]); rslt = fm_proc(0,vfmp); fm_free(vfmp); latt_rpl(LFLDINACT,NORMAL,BLACK,WHITE,LATT_SYS); se_fmopt(AUTOMOVE|FMWRAP|CURSORFREE|CURSORCROSS|VERIFYQUIT|VERIFYEXIT); return(rslt); } /****************************************************************************/ int do_print_char(MFORMPTR mptr) { unsigned char pfname[13]; strcpy(pfname," "); strcpy(message[0]," Print to File or Printer (F/P)? "); print_to = display_msg(0,0,1,"FP"); if (print_to != TO_FILE && print_to != TO_PRINTER) { return(SAMELEVEL); } if (print_to == TO_FILE) { if (get_pfile_name(pfname) == AC_EXIT) { trunc_trailing(pfname); if ((device = fopen(pfname,"wt")) == NULL) { display_error_msg(_strerror(pfname)); return(SAMELEVEL); } }else{ return(SAMELEVEL); } }else{ device = stdprn; if (!printer_ready()) { printer_not_ready(); return(SAMELEVEL); } } print_a_character(); if (print_to == TO_FILE) { fclose(device); }else{ fflush(device); } return(SAMELEVEL); } /****************************************************************************/ int edit_char(MFORMPTR mptr) { int i; unsigned char nc; if (!got_file) { display_error_msg("No saved game loaded - please load a game first."); return(SAMELEVEL); } if ((game = fopen(edt_fname,"r+b")) == NULL) { display_error_msg(_strerror(edt_fname)); return(SAMELEVEL); } fseek(game,239,SEEK_SET); fread(&nc,1,1,game); num_in_party = (int)(nc); fread(&nc,1,1,game); fread(&nc,1,1,game); num_chars = (int)(nc); for (i= 0; i < num_in_party; i++) { fread(&nc,1,1,game); fread(&nc,1,1,game); nip[i] = (int)(nc); } get_char(); fmp = fm_def(2, 10, 15, 59, LNORMAL, BDR_SLNP); sw_title("Character Editor",LNORMAL,TOPCENTER,fmp->wnp); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, fmp->wnp); sfm_begfp(begf10fm, fmp); sfm_endfp(endf10fm, fmp); fld0 = fld_def(1,1,"",FADJACENT,pic_def('X',24),F_STRING,name,fmp); sf_msg("Character's Name.",fld0); fld1 = fld_def(1,26,"",FADJACENT,pic_def('X',9),F_STRING,nick_name,fmp); sf_msg("Character's Nick Name.",fld1); fld2 = fld_def(1,37,"Age: ",FADJACENT,"UU",F_INT,&age,fmp); sf_msg("Character's Age.",fld2); for (i = 0; i < 7; i++) { fld[i] = fld_def(i+3,1,aname[i], FADJACENT,"UU",F_INT,&attribute[i],fmp); sf_msg("Current Attribute.",fld[i]); fld[i+7] = fld_def(i+3,9,"/ ", FADJACENT,"UU",F_INT,&attribute[i+7],fmp); sf_msg("Maximum Attribute.",fld[i+7]); } for (i = 14; i < 21; i++) { fld[i] = fld_def(i+3-14,18,aname[i], FADJACENT,"UU",F_INT,&attribute[i],fmp); } for (i = 21; i < 27; i++) { fld[i] = fld_def(i+3-21,32,aname[i], FADJACENT,"UU",F_INT,&attribute[i],fmp); } for (i = 27; i < 33; i++) { fld[i] = fld_def(i+3-27,46,aname[i], FADJACENT,"UU",F_INT,&attribute[i],fmp); } fld3 = fld_def(11,1,"Equipment: ",FADJACENT,"!",F_BOOL,&eqp,fmp); sf_msg("Character's Equipment. Enter 'Y' to edit.",fld3); sf_endfp(end_equip,fld3); fld4 = fld_def(11,17,"Saints: ",FADJACENT,"!",F_BOOL,&snt,fmp); sf_msg("Character's Saints. Enter 'Y' to edit.",fld4); sf_endfp(end_saints,fld4); fld5 = fld_def(11,29,"Formula: ",FADJACENT,"!",F_BOOL,&frm,fmp); sf_msg("Character's Formulae. Enter 'Y' to edit.",fld5); sf_endfp(end_formula,fld5); fm_up(fmp); set_horz_menu_colors(); mp = mn_def(MNSTANDARD,23,0,1,80,(UCHAR)LNORMAL,BDR_NULLP); smn_opt(MNMSGAUTOPLACE,OFF,mp); mnf_def(0, 1,"Edit","Edit this character.",NULLP,do_edit_char,mp); mnf_def(0, 7,"Next","Next Character.",NULLP,do_next_char,mp); mnf_def(0,13,"Print","Print this Character.",NULLP,do_print_char,mp); mnf_def(0,20,"Main Menu","Return to the Main Menu.",NULLP,do_end_menu,mp); mn_proc(0,mp); set_main_menu_colors(); fm_dn(fmp); fm_free(fmp); fclose(game); return(SAMELEVEL); } /****************************************************************************/ int validate_gr(unsigned char *editbufp,unsigned char *picp,struct form_struct *dfmp) { int i, result; if (!fld_isaltered(curdfldp(dfmp))) { return(TRUE); } i = atoi(editbufp); if (i < 0 || i > 19) { result = -1; }else{ result = 0; } if (result == 0) { result = TRUE; }else{ display_error_msg("Quantity must be between 0 and 19."); result = FALSE; VAL_ERR = 0; } return(result); } /****************************************************************************/ int validate_pf(unsigned char *editbufp,unsigned char *picp,struct form_struct *dfmp) { int i, result; if (!fld_isaltered(curdfldp(dfmp))) { return(TRUE); } i = atoi(editbufp); if (i < 0 || i > 11) { result = -1; }else{ result = 0; } if (result == 0) { result = TRUE; }else{ display_error_msg("Quantity must be between 0 and 11."); result = FALSE; VAL_ERR = 0; } return(result); } /****************************************************************************/ int edit_party(MFORMPTR mptr) { if (!got_file) { display_error_msg("No saved game loaded - please load a game first."); return(SAMELEVEL); } if ((game = fopen(edt_fname,"r+b")) == NULL) { display_error_msg(_strerror(edt_fname)); return(SAMELEVEL); } fseek(game,112,SEEK_SET); fread(&party_fl,2,1,game); fread(&party_gr,2,1,game); fread(&party_pf,2,1,game); fseek(game,122,SEEK_SET); fread(&party_fame,2,1,game); fseek(game,140,SEEK_SET); fread(&party_notes,2,1,game); fseek(game,146,SEEK_SET); fread(&party_ps,2,1,game); fmp = fm_def(5, 31, 12, 20, LNORMAL, BDR_SLNP); sw_title("Party Editor",LNORMAL,TOPCENTER,fmp->wnp); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, fmp->wnp); sfm_begfp(begf10fm, fmp); sfm_endfp(endf10fm, fmp); fld0 = fld_def(1,1," Florins: ",FADJACENT,"UUU",F_INT,&party_fl,fmp); sf_msg("Party's Florins.",fld0); fld1 = fld_def(2,1,"Groschens: ",FADJACENT,"UU",F_INT,&party_gr,fmp); sf_msg("Party's Groschens.",fld1); sf_valfp(validate_gr,fld1); fld2 = fld_def(3,1,"Pfenniges: ",FADJACENT,"UU",F_INT,&party_pf,fmp); sf_msg("Party's Pfenniges.",fld2); sf_valfp(validate_pf,fld2); fld3 = fld_def(4,1,"Bank Note: ",FADJACENT,"UUU",F_INT,&party_notes,fmp); sf_msg("Party's Bank Notes.",fld3); fld4 = fld_def(6,1," Fame: ",FADJACENT,"UUUU",F_INT,&party_fame,fmp); sf_msg("Party's Fame.",fld4); fld5 = fld_def(8,1," PStone: ",FADJACENT,"UU",F_INT,&party_ps,fmp); sf_msg("Party's PStone quality.",fld5); if (fm_proc(0,fmp) == AC_EXIT) { fseek(game,112,SEEK_SET); fwrite(&party_fl,2,1,game); fwrite(&party_gr,2,1,game); fwrite(&party_pf,2,1,game); fseek(game,122,SEEK_SET); fwrite(&party_fame,2,1,game); fseek(game,140,SEEK_SET); fwrite(&party_notes,2,1,game); fseek(game,146,SEEK_SET); fwrite(&party_ps,2,1,game); } fclose(game); return(SAMELEVEL); } /****************************************************************************/ int xfer_char(MFORMPTR mptr) { int i, n, nipper, nchr, cn[5]; unsigned char nc, txt[_MAX_DIR], gotcha, f_f; if (!got_file) { display_error_msg("No saved game loaded - please load a game first."); return(SAMELEVEL); } if ((game = fopen(edt_fname,"r+b")) == NULL) { display_error_msg(_strerror(edt_fname)); return(SAMELEVEL); } fmp = fm_def(9, 7, 5, 64, LNORMAL, BDR_DLNP); sfm_opt(AUTOEXIT, ON, fmp); sfm_opt(VERIFYEXIT, OFF, fmp); sfm_opt(VERIFYQUIT, OFF, fmp); fld0 = fld_def(1,1,"Transfer party to: ", FADJACENT,pic_def('!',12),F_STRING,fname,fmp); sf_msg("Name of saved game file to transfer to - Enter to accept, Escape to cancel.",fld0); sf_clist(NULLP,CLWRAP|CLPOP,chl_fnames,fld0); gotcha = FALSE; if (fm_proc(0,fmp) == AC_EXIT) { gotcha = TRUE; trunc_trailing(fname); } fm_free(fmp); if (gotcha) { strcpy(txt,save_dir); strcat(txt,fname); trunc_trailing(txt); if (STR_EQ(edt_fname,txt)) { display_error_msg("Can not transfer to same file!"); fclose(game); return(SAMELEVEL); } if ((xfer_file = fopen(txt,"r+b")) == NULL) { got_file = FALSE; display_error_msg(_strerror(txt)); fclose(game); return(SAMELEVEL); } fseek(xfer_file,239,SEEK_SET); fread(&nc,1,1,xfer_file); nipper = (int)(nc); fread(&nc,1,1,xfer_file); fread(&nc,1,1,xfer_file); nchr = (int)(nc); for (i = 0; i < nipper; i++) { fread(&nc,1,1,xfer_file); fread(&nc,1,1,xfer_file); cn[i] = (int)(nc); } if (nipper < num_in_party) { sprintf(txt,"Insufficent character slots to transfer party - need %d in party to xfer to.",num_in_party); display_error_msg(txt); gotcha = FALSE; fclose(xfer_file); fclose(game); return(SAMELEVEL); } strcpy(message[0]," Transfer Fame and Fortune (Y/N)? "); f_f = display_msg(0,0,1,"YN"); if (f_f == 'Y' || f_f == 'y') { fseek(game,112,SEEK_SET); fread(&party_fl,2,1,game); fread(&party_gr,2,1,game); fread(&party_pf,2,1,game); fseek(game,122,SEEK_SET); fread(&party_fame,2,1,game); fseek(game,140,SEEK_SET); fread(&party_notes,2,1,game); fseek(game,146,SEEK_SET); fread(&party_ps,2,1,game); fseek(xfer_file,112,SEEK_SET); fwrite(&party_fl,2,1,xfer_file); fwrite(&party_gr,2,1,xfer_file); fwrite(&party_pf,2,1,xfer_file); fseek(xfer_file,122,SEEK_SET); fwrite(&party_fame,2,1,xfer_file); fseek(xfer_file,140,SEEK_SET); fwrite(&party_notes,2,1,xfer_file); fseek(xfer_file,146,SEEK_SET); fwrite(&party_ps,2,1,xfer_file); } fseek(game,253,SEEK_SET); fread(a_buf,369-253,1,game); fseek(xfer_file,253,SEEK_SET); fwrite(a_buf,369-253,1,xfer_file); for (n = 0; n < num_in_party; n++) { fseek(game,393+(nip[n]*554),SEEK_SET); fread(adv_buf,554,1,game); fseek(xfer_file,393+(cn[n]*554),SEEK_SET); fwrite(adv_buf,554,1,xfer_file); } fclose(game); fclose(xfer_file); strcpy(message[0]," Party transfered "); strcpy(message[1]," Press any key to continue "); display_msg(0,16,2,""); } return(SAMELEVEL); } /****************************************************************************/ int rpt_char(MFORMPTR mfmp) { int i, save_current; unsigned char pfname[13]; if (!got_file) { display_error_msg("No saved game loaded - please load a game first."); return(SAMELEVEL); } if (num_in_party < 1) { display_error_msg("No characters found in party"); return(SAMELEVEL); } strcpy(pfname," "); strcpy(message[0]," Print to File or Printer (F/P)? "); print_to = display_msg(0,0,1,"FP"); if (print_to != TO_FILE && print_to != TO_PRINTER) { return(SAMELEVEL); } if (print_to == TO_FILE) { if (get_pfile_name(pfname) == AC_EXIT) { trunc_trailing(pfname); if ((device = fopen(pfname,"wt")) == NULL) { display_error_msg(_strerror(pfname)); return(SAMELEVEL); } }else{ return(SAMELEVEL); } }else{ device = stdprn; if (!printer_ready()) { printer_not_ready(); return(SAMELEVEL); } } if ((game = fopen(edt_fname,"r+b")) == NULL) { display_error_msg(_strerror(edt_fname)); if (print_to == TO_FILE) { fclose(device); } return(SAMELEVEL); } fprintf(device,"%s\n",current_desc); fseek(game,112,SEEK_SET); fread(&party_fl,2,1,game); fread(&party_gr,2,1,game); fread(&party_pf,2,1,game); fseek(game,122,SEEK_SET); fread(&party_fame,2,1,game); fseek(game,146,SEEK_SET); fread(&party_ps,2,1,game); fprintf(device," Fame: %d\n",party_fame); fprintf(device,"Florins: %d Groschens: %d Pfennigs: %d (total: %d)\n", party_fl,party_gr,party_pf,((party_fl*240)+(party_gr*12)+party_pf)); fprintf(device," Pstone: %d\n\n",party_ps); save_current = current_char; for (i = 0; i < num_in_party; i++) { current_char = nip[i]; get_char(); print_a_character(); } if (print_to == TO_FILE) { fclose(device); }else{ fflush(device); } current_char = save_current; get_char(); fclose(game); return(SAMELEVEL); } /****************************************************************************/ void do_main_menu() { mn_proc(0,mmp); mn_free(mmp); } /****************************************************************************/ void init_submenu() { submmp = mn_def(MNSTANDARD,AUTOPLACE,0,AUTOSIZE,0,LREVERSE,BDR_DLNP); smn_opt(MNMSGAUTOPLACE,OFF,submmp); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, submmp->wnp); mnf_def(0, 0, "Characters", "Edit Characters.", NULLP, edit_char, submmp); mnf_def(1, 0, "Party ", "Edit Party information.", NULLP, edit_party, submmp); mnf_def(2, 0, "Main Menu ", "Return to Main Menu", NULLP, do_end, submmp); } /****************************************************************************/ void init_main_menu() { int x, y; init_submenu(); wn_mod(24,0,1,80,MSG_WNP); /* change menu descriptor to bottom screen*/ x = (80 - (4 + 6)) / 2; /* center menu, 6 = len of menu item */ y = (23 - 5) / 2; /* center menu, 5 = # of menu items */ mmp = mn_def(MNSTANDARD,y,x,AUTOSIZE,AUTOSIZE,(UCHAR)LREVERSE,BDR_DLNP); smn_opt(MNMSGAUTOPLACE|MNTOPESCAPE,OFF,mmp); sw_shad(TRANSPARENT, LAVR8, BOTTOMRIGHT, mmp->wnp); mnf_def(0, 0, "Load ", "Load a saved game file.",NULLP, load_adv, mmp); mnf_def(1, 0, "Edit ", "Edit Characters or Party in currently loaded saved game file.",submmp, MENUCALL, mmp); mnf_def(2, 0, "Report", "Print information for the current party.",NULLP, rpt_char, mmp); mnf_def(3, 0, "Xfer ", "Transfer current party to another saved game.",NULLP, xfer_char, mmp); mnf_def(4, 0, "Quit ", "Quit program & return to DOS", NULLP, do_end_menu, mmp); } /****************************************************************************/ void init_data() { int i, j, c; unsigned char nc, buf[128]; init_main_menu(); kt_rplkey(KEY_F10, k_exit, SRKTP); kt_rplkey(KEY_F10, k_exit, FMKTP); kt_rplkey(KEY_F10, k_exit, MEMOKTP); kt_rplkey(KEY_END, ks_end, SRKTP); kt_rplkey(KEY_END, kd_endfld, FMKTP); kt_rplkey(KEY_F2, kd_clist, SRKTP); kt_rplkey(KEY_F2, kd_clist, FMKTP); se_fmopt(AUTOMOVE|FMWRAP|CURSORFREE|CURSORCROSS|VERIFYQUIT|VERIFYEXIT); se_fldopt(F_STRING,TRAILBLANKS); se_fldopt(F_DECIMAL,CLEARONKEY | RTADJUST | THSEPARATOR); se_fldopt(F_FLOAT,CLEARONKEY | RTADJUST | THSEPARATOR); se_fldopt(F_LONG,CLEARONKEY | RTADJUST | THSEPARATOR); se_fldopt(F_INT,CLEARONKEY | RTADJUST | THSEPARATOR); se_fldopt(F_SHORT,CLEARONKEY | RTADJUST | THSEPARATOR); latt_rpl(LFLDSKIP,NORMAL,CYAN,BLACK,LATT_SYS); latt_rpl(LFLDSKIP,NORMAL,BLACK|LIGHT,WHITE,LATT_SYS); latt_rpl(LAVR2,NORMAL|HIGH_INT,BLUE,WHITE,LATT_SYS); latt_rpl(LAVR3,NORMAL|HIGH_INT,GREEN,WHITE,LATT_SYS); latt_rpl(LAVR8,NORMAL,BLACK|LIGHT,BLACK,LATT_SYS); latt_rpl(LURGENT,NORMAL|HIGH_INT|BLINK,WHITE|LIGHT|BLINK,RED,LATT_SYS); latt_rpl(LNORMAL,NORMAL,BLACK|LIGHT,WHITE,LATT_SYS); latt_rpl(LFLDINACT,NORMAL,BLACK,WHITE,LATT_SYS); latt_rpl(LFLDACT,NORMAL,WHITE,BLACK,LATT_SYS); latt_rpl(LERROR,REVERSE, WHITE | HIGH_INT, RED,LATT_SYS); se_boolch('Y','N'); strcpy(message[0],"Reading DARKLAND.LST"); up_msg(0,0,1); got_file = FALSE; strcpy(current_desc,"None Selected"); strcpy(fname," "); current_wnp = NULLP; current_char = 0; strcpy(aname[ 0],"End: "); strcpy(aname[ 1],"Str: "); strcpy(aname[ 2],"Agl: "); strcpy(aname[ 3],"Per: "); strcpy(aname[ 4],"Int: "); strcpy(aname[ 5],"Chr: "); strcpy(aname[ 6]," DF: "); strcpy(aname[ 7],"Max End"); strcpy(aname[ 8],"Max Str"); strcpy(aname[ 9],"Max Agl"); strcpy(aname[10],"Max Per"); strcpy(aname[11],"Max Int"); strcpy(aname[12],"Max Chr"); strcpy(aname[13],"Max DF "); strcpy(aname[14],"WEdge: "); strcpy(aname[15],"WImp : "); strcpy(aname[16],"WFll : "); strcpy(aname[17],"WPol : "); strcpy(aname[18],"WThr : "); strcpy(aname[19],"WBow : "); strcpy(aname[20],"WMsl : "); strcpy(aname[21],"Alch : "); strcpy(aname[22],"Relg : "); strcpy(aname[23],"Virt : "); strcpy(aname[24],"SpkC : "); strcpy(aname[25],"SpkL : "); strcpy(aname[26],"R&W : "); strcpy(aname[27],"Heal : "); strcpy(aname[28],"Arti : "); strcpy(aname[29],"Stlth: "); strcpy(aname[30],"StrWs: "); strcpy(aname[31],"Ride : "); strcpy(aname[32],"WdWse: "); if ((item_file = fopen("DARKLAND.LST","rb")) == NULL) { display_error_msg(_strerror("DARKLAND.LST")); vs_clr(); csr_show(); csr_mv(23,0); exit_vv(); exit(1); } fread(&nc,1,1,item_file); total_items = (int)(nc); fread(&nc,1,1,item_file); total_saints = (int)(nc); fread(&nc,1,1,item_file); total_formula = (int)(nc); num_items = 0; chl_items = mf_def(total_items,19+1); for (i = 0; i < total_items; i++) { fread(buf,46,1,item_file); item_byte[i] = (int)(buf[30]); item_wt[i] = (int)(buf[37]); item_qual[i] = (int)(buf[38]); buf[19] = 0; if (buf[0] != 0) { st_padblank(buf,19); mf_rowins(buf,APPEND_ROW,chl_items); ++num_items; } } if (total_saints > MAX_SAINT) { sprintf(message[0],"%d saints found, only first %d will be available.",total_saints,MAX_SAINT); display_error_msg(message[0]); } num_saints = 0; for (i = 0; i < total_saints; i++) { c = 1; j = 0; while (c != 0) { c = fgetc(item_file); if (j < 23) { saint_name[num_saints][j] = (unsigned char)(c); ++j; } } saint_name[num_saints][22] = 0; st_padblank(saint_name[num_saints],23); if (num_saints < MAX_SAINT) { ++num_saints; } } for (i = 0; i < total_saints; i++) { c = 1; while (c != 0) { c = fgetc(item_file); } } if (total_formula > MAX_FORMULA) { sprintf(message[0],"%d formula found, only first %d will be available.",total_formula,MAX_FORMULA); display_error_msg(message[0]); } num_formula = 0; for (i = 0; i < total_formula; i++) { c = 1; j = 0; while (c != 0) { c = fgetc(item_file); if (j < 31) { formula_name[num_formula][j] = (unsigned char)(c); ++j; } } formula_name[num_formula][30] = 0; st_padblank(formula_name[num_formula],31); if (num_formula < MAX_FORMULA) { ++num_formula; } } fclose(item_file); /* if ((item_file = fopen("item.LST","wt")) == NULL) { display_error_msg(_strerror("item.LST")); return; } for (i = 0; i < num_items; i++) { mf_rowget(buf,i,chl_items); fprintf(item_file,"%3d %s\n",i,buf); } fprintf(item_file,"\n"); for (i = 0; i < num_saints; i++) { fprintf(item_file,"%3d %s\n",i,saint_name[i]); } fprintf(item_file,"\n"); for (i = 0; i < num_formula; i++) { fprintf(item_file,"%3d %s\n",i,formula_name[i]); } fclose(item_file); Last change: 12 Dec 93 10:57 am */ dn_msg(); } /****************************************************************************/ void logon() { WINDOWPTR wallpaperwnp, wnp; unsigned char *program = "Darklands Save Game Editor Version 1.1"; unsigned char *copyright1 = "Steven J. Cotellesse"; unsigned char *copyright2 = ""; wallpaperwnp = wn_def(0,0,25,80,LNORMAL,BDR_NULLP); wn_set(wallpaperwnp); v_chq(176,ENDWN,wallpaperwnp); wn_free(wallpaperwnp); wnp = wn_def(0,0,4,80,(UCHAR)LMESSAGE,BDR_SLNP); wn_set(wnp); sw_clreor(OFF,wnp); sw_csadv(OFF,wnp); sw_csrpl(OFF,wnp); v_stattpl(0,CENTER_TEXT,program,LMESSAGE,STATT,wnp); v_stattpl(1,CENTER_TEXT,copyright1,LMESSAGE,STATT,wnp); /* v_stattpl(2,CENTER_TEXT,copyright2,LMESSAGE,STATT,wnp); */ init_data(); wn_free(wnp); } /****************************************************************************/ void main() { if (getcwd(game_dir,_MAX_DIR) == NULL) { printf("Could not allocate CWD buffer - exiting\n"); return; } strcat(game_dir,"\\"); strcpy(save_dir,game_dir); strcat(save_dir,"SAVES\\"); strcpy(save_dir_tmplt,save_dir); strcat(save_dir_tmplt,"DKSAVE*.SAV"); init_vv(); num_files = load_file_name_list(save_dir_tmplt); if (num_files == 0) { printf("No save game files found in directory %s\n",save_dir); mf_free(chl_fnames); exit_vv(); return; } csr_hide(); vs_clr(); logon(); display_current_adv(); do_main_menu(); vs_clr(); mf_free(chl_fnames); csr_show(); csr_mv(23,0); exit_vv(); } /****************************************************************************/