-+-+-+-+-+-+-+-+ START OF PART 47 -+-+-+-+-+-+-+-+ X`09 begin X`09`09priv_switch(0); X`09`09open (f2,file_name:=moria_mas, X`09`09 error:=continue,access_method:=keyed, X`09`09 organization:=indexed,history:=new,sharing:=readwrite); X`09 end; X`09 if (status(f2) <> 0) then X`09 begin X`09`09 msg_print('Error saving character, contact MORIA Wizard.'); X`09`09 close(f1,error:=continue); X`09`09 flag := false; X`09 end; X`09 end; X`09`7B Make an attempt to create a unique ID and write to MASTER -RAK-`7D X`09if (flag) then X`09 begin X`09 trys := 0; X`09 file_flag := false; X`09 repeat X`09 for i1 := 1 to 70 do temp`5Bi1`5D := chr(31+randint(95)); X`09 title1 := temp; X`09 seed := encrypt_seed1; X`09 encrypt(title1); X`09 for i1 := 1 to 70 do X`09 key_rec.file_id`5Bi1`5D := title1`5Bi1`5D; X`09 f2`5E := key_rec; X`09 put(f2,error:=continue); X`09 if (status(f2) <> 0) then X`09`09begin X`09`09 trys := trys + 1; X`09`09 if (trys > 5) then`20 X`09`09 begin X`09`09 file_flag := true; X`09`09 flag := false; X`09`09 msg_print('Error in writing to MASTER.'); X`09`09 end; X`09 end X`09 else X`09`09file_flag := true; X`09 until(file_flag); X`09 close(f2,error:=continue); X`09 priv_switch(0); X`09 end; X`09`7B If ID was written to MASTER, continue saving`09`09-RAK-`09`7D X`09if (flag) then X`09 begin X`09 save_seed := get_seed; X`09 writev(title2,save_seed:12,' ',temp); X`09 seed := encrypt_seed2; X`09 encrypt(title2); X`09 writeln(f1,title2,error:=continue); X`09 seed := save_seed; X`09`09`7B Message to player on what is happening`7D X`09 clear(1,1); X`09 prt('Saving character...',1,1); X`09 put_qio; X`09`09`7B Version number of Moria`09`09`7D X`09 writev(out_rec,save_file_version); X`09 encrypt(out_rec); X`09 writeln(f1,out_rec,error:=continue); X X`09`09`7B Write out the player record. `09`7D X`09 with py.misc do X`09 begin X`09`09writev(out_rec,name); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09writev(out_rec,race); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09writev(out_rec,sex); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09writev(out_rec,tclass); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09writev(out_rec,title); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09for i1 := 1 to 5 do X`09`09 begin X`09`09 out_rec := history`5Bi1`5D; X`09`09 encrypt(out_rec); X`09`09 writeln(f1,out_rec,error:=continue); X`09`09 end; X X`09`09writev(out_rec,char_row:1,' ',char_col:1,' ', X`09`09 pclass:1,' ',prace:1,' ', X`09`09 age:1,' ',ht:1,' ',wt:1,' ',sc:1,' ',max_exp:1,' ', X`09`09 exp:1,' ',lev:1,' ',max_lev:1,' ',expfact:2:1); X X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09writev(out_rec,srh:1,' ',fos:1,' ',stl:1,' ',bth:1,' ', X`09`09 bthb:1,' ', X`09`09 mana:1,' ',cmana:1,' ',mhp:1,' ',chp:1:1,' ',au:1,' ', X`09`09 ptohit:1,' ',ptodam:1,' ',pac:1,' ',ptoac:1,' ', X`09`09 dis_th:1,' ',dis_td:1,' ',dis_ac:1,' ',dis_tac:1,' ', X`09`09 disarm:1,' ',save:1,' ',hitdie:1); X X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09writev(out_rec,inven_ctr:1,' ', X`09`09 inven_weight:1,' ',equip_ctr:1,' ',dun_level:1,' ', X`09`09 missle_ctr:1,' ',mon_tot_mult:1,' ',uand(%X'F',turn):1, X`09`09 ' ',randes_seed:12); X X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X`09 end; X X`09`09`7B Write out the inventory records.`09`7D X`09 for i1 := 1 to inven_ctr do X`09 begin X`09`09writev(out_rec,inventory`5Bi1`5D.tchar,inventory`5Bi1`5D.name); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09writev(out_rec,inventory`5Bi1`5D.damage); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09with inventory`5Bi1`5D do X`09`09 writev(out_rec,tval:1,' ',subval:1,' ',weight:1,' ', X`09`09`09number:1,' ',tohit:1,' ',todam:1,' ',ac:1,' ', X`09`09`09toac:1,' ',p1:1,' ',flags:1,' ',level:1,' ',cost:1); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X`09 end; X X`09`09`7B Write out the equipment records.`09`7D X`09 for i1 := 23 to inven_max-1 do X`09 begin X`09`09writev(out_rec,inventory`5Bi1`5D.tchar,inventory`5Bi1`5D.name); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09writev(out_rec,inventory`5Bi1`5D.damage); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09with inventory`5Bi1`5D do X`09`09 writev(out_rec,tval:1,' ',subval:1,' ',weight:1,' ', X`09`09`09number:1,' ',tohit:1,' ',todam:1,' ',ac:1,' ', X`09`09`09toac:1,' ',p1:1,' ',flags:1,' ',level:1,' ',cost:1); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X`09 end; X X`09 with py.stat do X`09 begin X`09`09writev(out_rec,str:1,' ',cstr:1,' ',dex:1,' ',cdex:1,' ', X`09`09`09con:1,' ',ccon:1,' ',int:1,' ',cint:1,' ',wis:1,' ', X`09`09`09cwis:1,' ',chr:1,' ',cchr:1); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X`09 end; X X`09 with py.flags do X`09 begin X`09`09writev(out_rec,status:1,' ',blind:1,' ',confused:1,' ', X`09`09`09food:1,' ',food_digested:1,' ',protection:1,' ', X`09`09`09speed:1,' ',afraid:1,' ', X`09`09`09poisoned:1,' ',see_inv:1); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09writev(out_rec,fast:1,' ',slow:1,' ',protevil:1,' ', X`09`09`09teleport:1,' ',free_act:1,' ',slow_digest:1); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09writev(out_rec,aggravate:1,' ',sustain_str:1,' ', X`09`09`09sustain_int:1,' ',sustain_wis:1,' ',sustain_con:1,' ', X`09`09`09sustain_dex:1,' ',sustain_chr:1); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09writev(out_rec,fire_resist:1,' ',cold_resist:1,' ', X`09`09`09acid_resist:1,' ',regenerate:1,' ',lght_resist:1,' ', X`09`09`09ffall:1,' ',confuse_monster:1); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X X`09`09writev(out_rec,image:1,' ',invuln:1,' ',hero:1,' ', X`09`09`09shero:1,' ',blessed:1,' ', X`09`09`09resist_heat:1,' ',resist_cold:1,' ',detect_inv:1,' ', X`09`09`09word_recall:1,' ',see_infra:1,' ',tim_infra:1); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue); X`09 end; X X`09 for i1 := 1 to 31 do X`09 begin X`09`09writev(out_rec,magic_spell`5Bpy.misc.pclass,i1`5D.learned:5); X`09`09encrypt(out_rec); X`09`09writeln(f1,out_rec,error:=continue) X`09 end; X X`09`09`7B Write the important dungeon info and floor`09-RAK-`09`7D X`09 begin X`09 writev(out_rec,cur_height:1,' ',cur_width:1,' ', X`09`09max_panel_rows:1,' ',max_panel_cols:1); X`09 encrypt(out_rec); X`09 writeln(f1,out_rec,error:=continue); X X`09`09`7B Save the floor`09`7D X`09 tot_treasure := 0; X`09 for i1 := 1 to cur_height do X`09`09begin X`09`09 out_rec := pad(' ',' ',cur_width); X`09`09 for i2 := 1 to cur_width do X`09`09 begin X`09`09 with cave`5Bi1,i2`5D do X`09`09`09begin X`09`09`09 xfloor := fval; X`09`09`09 if (fopen) then X`09`09`09 xfloor := uor(xfloor,%X'10'); X`09`09`09 if (pl) then X`09`09`09 xfloor := uor(xfloor,%X'20'); X`09`09`09 if (fm) then X`09`09`09 xfloor := uor(xfloor,%X'40'); X`09`09`09 out_rec`5Bi2`5D := chr(xfloor); X`09`09`09 if (tptr > 0) then X`09`09`09 tot_treasure := tot_treasure + 1; X`09`09`09end; X`09`09 end; X`09`09 encrypt(out_rec); X`09`09 writeln(f1,out_rec,error:=continue); X`09`09end; X X`09`09`7B Save the Treasure List`09`09`7D X`09 writev(out_rec,tot_treasure:1); X`09 encrypt(out_rec); X`09 writeln(f1,out_rec,error:=continue); X`09 for i1 := 1 to cur_height do X`09`09for i2 := 1 to cur_width do X`09`09 if (cave`5Bi1,i2`5D.tptr > 0) then X`09`09 with t_list`5Bcave`5Bi1,i2`5D.tptr`5D do X`09`09 begin X`09`09`09writev(out_rec,i1:1,' ',i2:1); X`09`09`09encrypt(out_rec); X`09`09`09writeln(f1,out_rec,error:=continue); X X`09`09`09writev(out_rec,tchar,name); X`09`09`09encrypt(out_rec); X`09`09`09writeln(f1,out_rec,error:=continue); X X`09`09`09writev(out_rec,damage); X`09`09`09encrypt(out_rec); X`09`09`09writeln(f1,out_rec,error:=continue); X X`09`09`09writev(out_rec,tval:1,' ',subval:1,' ',weight:1,' ', X`09`09`09 number:1,' ',tohit:1,' ',todam:1,' ',ac:1,' ', X`09`09`09 toac:1,' ',p1:1,' ',flags:1,' ',level:1,' ',cost:1); X`09`09`09encrypt(out_rec); X`09`09`09writeln(f1,out_rec,error:=continue); X`09`09 end; X X`09`09`7B Save identified list`09`09`09`7D X`09 out_rec := ''; X`09 for i1 := 1 to max_objects do X`09`09begin X`09`09 if (object_ident`5Bi1`5D) then X`09`09 out_rec := out_rec + 'T' X`09`09 else X`09`09 out_rec := out_rec + 'F'; X`09`09end; X`09 encrypt(out_rec); X`09 writeln(f1,out_rec,error:=continue); X X`09`09`7B Save the Monster List`09`09`09`7D X`09 i1 := muptr; X`09 tot_monsters := 0; X`09 if (i1 > 0) then X`09`09repeat X`09`09 tot_monsters := tot_monsters + 1; X`09`09 with m_list`5Bi1`5D do X`09`09 i1 := nptr; X`09`09until (i1 = 0); X`09 writev(out_rec,tot_monsters:1); X`09 encrypt(out_rec); X`09 writeln(f1,out_rec,error:=continue); X`09 i1 := muptr; X`09 if (i1 > 0) then X`09`09repeat X`09`09 with m_list`5Bi1`5D do X`09`09 begin X`09`09 writev(out_rec,fy:1,' ',fx:1,' ',mptr:1,' ',hp:1, X`09`09`09' ',cspeed:1,' ',csleep:1,' ',cdis:1,' ',ml:1, X`09`09`09' ',confused:1); X`09`09 encrypt(out_rec); X`09`09 writeln(f1,out_rec,error:=continue); X`09`09 i1 := nptr; X`09`09 end; X`09`09until (i1 = 0); X X`09`09`7B Save the town level stores`09`09`7D X`09 writev(out_rec,town_seed:12); X`09 encrypt(out_rec); X`09 writeln(f1,out_rec,error:=continue); X`09 for i1 := 1 to max_stores do X`09`09with store`5Bi1`5D do X`09`09 begin X`09`09`7B Save items...`09`09`09`7D X`09`09 writev(out_rec,store_ctr:1); X`09`09 encrypt(out_rec); X`09`09 writeln(f1,out_rec,error:=continue); X`09`09 for i2 := 1 to store_ctr do X`09`09 with store_inven`5Bi2`5D.sitem do X`09`09 begin X`09`09`09 writev(out_rec,store_inven`5Bi2`5D.scost); X`09`09`09 encrypt(out_rec); X`09`09`09 writeln(f1,out_rec,error:=continue); X`09`09`09 writev(out_rec,tchar,name); X`09`09`09 encrypt(out_rec); X`09`09`09 writeln(f1,out_rec,error:=continue); X`09`09`09 writev(out_rec,damage); X`09`09`09 encrypt(out_rec); X`09`09`09 writeln(f1,out_rec,error:=continue); X`09`09`09 writev(out_rec,tval:1,' ',subval:1,' ',weight:1, X`09`09`09`09' ',number:1,' ',tohit:1,' ',todam:1,' ', X`09`09`09`09ac:1,' ',toac:1,' ',p1:1,' ',flags:1,' ', X`09`09`09`09level:1,' ',cost:1); X`09`09`09 encrypt(out_rec); X`09`09`09 writeln(f1,out_rec,error:=continue); X`09`09 end; X`09`09 if (store_open > turn) then X`09`09 store_open := store_open - turn + 15 X`09`09 else X`09`09 store_open := 0; X`09`09 writev(out_rec,owner:1,' ',insult_cur:1,' ',store_open:1); X`09`09 encrypt(out_rec); X`09`09 writeln(f1,out_rec,error:=continue); X`09`09 end; X`09 end; X`09 close(f1,error:=continue) X`09 end; X`09if (flag) then X`09 begin X`09 writev(out_rec,'Character saved. `5BMoria Version M', X`09`09`09`09`09`09cur_version:5:2,'`5D'); X`09 prt(out_rec,1,1); X`09 exit; X`09 end; X`09save_char := flag; X`09seed := get_seed; X end; X X X`09`7B Restore a saved game`09`09`09`09-RAK- & -JWT-`09`7D X`5Bpsect(save$code)`5D function get_char(fnam : vtype) : boolean; X var X`09tot_treasures,tot_monsters`09`09: integer; X`09i1,i2,i3,i4,dummy`09`09`09: integer; X`09xfloor,save_seed`09`09`09: unsigned; X`09save_version`09`09`09`09: real; X`09in_rec,temp`09`09`09`09: ntype; X`09temp_id`09`09`09`09`09: packed array `5B1..70`5D of char; X`09f1`09`09`09`09`09: text; X`09f2`09`09`09`09`09: file of key_type; X`09dun_flag`09 `09`09`09: boolean; X X begin X`09dun_flag := false; X`09clear(1,1); X`09open (f1,FILE_NAME:=fnam,record_length:=1024,ERROR:=continue, X`09`09HISTORY:=OLD); X`09if (status(f1) <> 0) then X`09 begin X`09 prt('Error Opening> '+fnam,1,1); X`09 prt('',2,1); X`09 exit; X`09 end; X`09reset(f1,ERROR:=continue); X`09readln(f1,in_rec); X`09seed := encrypt_seed2; X`09decrypt(in_rec); X`09temp := substr(in_rec,1,12); X`09readv(temp,save_seed); X`09temp := substr(in_rec,14,70); X`09seed := encrypt_seed1; X`09encrypt(temp); X`09temp_id := temp; X`09priv_switch(1); X`09open (f2,file_name:=moria_mas, X`09`09access_method:=keyed,organization:=indexed, X`09`09history:=old,sharing:=readwrite,error:=continue); X`09if (status(f2) <> 0) then X`09 begin X`09 prt('ERROR opening file MASTER.',1,1); X`09 exit; X`09 end; X`09findk(f2,0,temp_id,eql,error:=continue); X`09delete(f2,error:=continue); X`09if (status(f2) <> 0) then X`09 data_exception; X`09close(f2); X`09priv_switch(0); X`09seed := save_seed; X`09prt('Restoring Character...',1,1); X`09put_qio; X`09readln(f1,in_rec); X`09decrypt(in_rec); X`09readv(in_rec,save_version); X`09if (save_version <> save_file_version) then X`09 begin X`09 prt('Save file is incompatable with this version.',2,1); X`09 writev(in_rec,' `5BSave file version ',save_version:5:2,'`5D'); X`09 prt(in_rec,3,1); X`09 writev(in_rec,' `5BMoria version M',cur_version:5:2,'`5D'); X`09 prt(in_rec,4,1); X`09 if (save_version > 4.2) then X`09 prt('Updating character for newer version...',5,1) X`09 else if (save_version > 4.0) then X`09 begin X`09 prt('Updating character for newer version...',5,1); X`09 dun_flag := true; X`09 end X`09 else X`09 exit; X`09 pause(24); X`09 end; X X`09readln(f1,in_rec); X`09decrypt(in_rec); X`09with py.misc do X`09 readv(in_rec,name); X X`09readln(f1,in_rec); X`09decrypt(in_rec); X`09with py.misc do X`09 readv(in_rec,race); X X`09readln(f1,in_rec); X`09decrypt(in_rec); X`09with py.misc do X`09 readv(in_rec,sex); X X`09readln(f1,in_rec); X`09decrypt(in_rec); X`09with py.misc do X`09 readv(in_rec,tclass); X X`09readln(f1,in_rec); X`09decrypt(in_rec); +-+-+-+-+-+-+-+- END OF PART 47 +-+-+-+-+-+-+-+-