-+-+-+-+-+-+-+-+ START OF PART 72 -+-+-+-+-+-+-+-+ X`09`09`09`09 month:1,' ',day:1,' ',hour:1,' ',secs:1); X`09`09 encrypt_write(out_rec); X`09`09 end; X`09 end; X`09 close(f1,error:=continue); X`09 end; X`09if (flag and not py.flags.dead) then X`09 begin X`09 writev(out_rec,'Character saved. `5BMoria Version ', X`09`09`09`09`09`09cur_version:5:2,'`5D'); X`09 prt(out_rec,2,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`5Bglobal,psect(save$code)`5D function get_char(fnam : vtype; prop : boolean V) : boolean; X label X`09panic; `20 X var X`09tot_treasures,tot_monsters : integer; X`09i1,i2,i3,i4,dummy : integer; X`09xfloor,save_seed : unsigned; X`09save_version : real; X`09in_rec,temp : ntype; X`09temp_id`09`09`09`09`09: ssn_type; X`09f1 : text; X`09f2 : file of key_type; X`09dun_flag : boolean; X`09cheated`09`09`09`09`09: boolean; X`09n_stores`09`09`09`09: integer; X`09was_dead,bag_lost,paniced`09`09: boolean; X`09lost_inven_count,lost_equip_count`09: integer; X`09ptr,curse,cur_bag`09`09`09: treas_ptr; X`09trash_char`09`09`09`09: char; X X procedure read_decrypt (var line:ntype); X begin X readln(f1,line); X decrypt(line) X end; X X procedure add_item; `7BExtensive clarifications and bug fixes here by Dean V`7D X begin X new(ptr); X if (inventory_list = nil) then X`09inventory_list := ptr X else X`09begin X curse := inventory_list; X while (curse`5E.next <> nil) do X`09`09curse := curse`5E.next; X curse`5E.next := ptr; X`09end; X ptr`5E.data := inven_temp`5E.data; X ptr`5E.is_in := inven_temp`5E.is_in; X ptr`5E.insides := inven_temp`5E.insides; X ptr`5E.ok := false; X ptr`5E.next := nil; X if (ptr`5E.data.tval = bag_or_sack) then cur_bag := ptr; X if (ptr`5E.is_in) and (cur_bag <> nil) then X`09cur_bag`5E.insides := cur_bag`5E.insides + 1; X end; X X begin X`09dun_flag := false; X`09paniced := 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 paniced := true; X`09 goto panic; X`09 end; X`09reset(f1,ERROR:=continue); X`09seed := encrypt_seed2; X`09read_decrypt(in_rec); X`09temp := substr(in_rec,1,12); X`09readv(temp,save_seed,error:=continue); X`09temp := substr(in_rec,14,70); X`09py.misc.ssn := temp; X`09seed := encrypt_seed1; X`09coder(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 paniced := true; X`09 goto panic; X`09 end; X`09findk(f2,0,temp_id,eql,error:=continue); X`09`7BFXJLM -- have it exit if the index isn't found!`7D X`09if (EOF(f2)) then begin X`09 writeln('--------------------------------------------------------'); X`09 writeln('`7C There was a data corruption error with the character `7C V'); X`09 writeln('`7C Terminating IMORIA now. `7C V'); X`09 writeln('--------------------------------------------------------'); X`09 HALT; X`09end; X`09delete(f2,error:=continue); X`09`7BFXJLM -- end of kluge`7D 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`09read_decrypt(in_rec); X`09readv(in_rec,save_version,error:=continue); X`09if (save_version <> cur_version) then X`09 begin X`09 prt('Save file is incompatible 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 ',cur_version:5:2,'`5D'); X`09 prt(in_rec,4,1); X X`09 if (save_version > 4.0) and (save_version < cur_version) then X`09 dun_flag := true X`09 else X`09 exit; X`09 prt('Updating character for newer version...',5,1); X`09 pause(24); X`09 end; X X`09read_decrypt(in_rec); X`09with py.misc do X`09 readv(in_rec,py.misc.xtr_wgt,py.misc.account,money`5B0`5D,money`5B6`5D, X`09money`5B5`5D,money`5B4`5D,money`5B3`5D,money`5B2`5D,money`5B1`5D,diffic,e Vrror:=continue); X`09read_decrypt(in_rec); X X`7B X`09with py.misc do X`09 readv(in_rec,mr,error:=continue); X`09read_decrypt(in_rec); X`7D X X`09with py.misc.birth do `20 X`09 readv(in_rec,year,month,day,hour,secs,error:=continue); X X`09read_decrypt(in_rec); X`09with py.misc.cur_age do X`09 readv(in_rec,year,month,day,hour,secs,error:=continue); X X`7BFUBAR modification for quests`7D X`09if (dun_flag) X`09 then begin X`09`09 py.flags.quested := false; X`09`09 py.misc.cur_quest := 0; X`09`09 py.misc.quests := 0; X`09 end X`09 else begin X`09`09 read_decrypt(in_rec); X`09`09 readv(in_rec,py.flags.quested,py.misc.cur_quest,py.misc.quests); X end; X X`09read_decrypt(in_rec); X`09with py.misc.play_tm do X`09 readv(in_rec,years,months,days,hours,minutes,seconds,hundredths, X`09`09 error:=continue); X X`09read_decrypt(in_rec); X`09with py.misc do X`09 readv(in_rec,name,error:=continue); X X`09read_decrypt(in_rec); X`09with py.misc do X`09 readv(in_rec,race,error:=continue); X X`09read_decrypt(in_rec); X`09with py.misc do X`09 readv(in_rec,sex,error:=continue); X X`09read_decrypt(in_rec); X`09with py.misc do X`09 readv(in_rec,tclass,error:=continue); X X`09read_decrypt(in_rec); X`09with py.misc do X`09 readv(in_rec,title,error:=continue); X X`09for i1 := 1 to 5 do X`09 begin X`09 read_decrypt(in_rec); X `09 py.misc.history`5Bi1`5D := in_rec; X`09 end; X X`09read_decrypt(in_rec); X`09readv(in_rec,cheated,error:=continue); X`09py.misc.cheated := py.misc.cheated or cheated; X X`09read_decrypt(in_rec); X`09with py.misc do X`09 begin X`09 readv(in_rec,char_row,char_col,pclass,prace,age,ht,wt,sc, X`09`09 max_exp,exp,rep,deaths,premium,lev,max_lev,expfact, X`09`09 error:=continue); X`09 if wt > max_allowable_weight then X`09`09wt := TRUNC ( 0.9*max_allowable_weight ) X`09 else if wt < min_allowable_weight then X`09`09wt := TRUNC ( 1.10*min_allowable_weight ) ; X`09 end ; X X`09case py.misc.pclass of X`09 1`09: py.misc.mr := -10; X`09 2,3`09: py.misc.mr := 0; X`09otherwise py.misc.mr := -5; X`09end; X X`09read_decrypt(in_rec); X`09with py.misc do X`09 readv(in_rec,srh,fos,stl,bth,bthb,mana,cmana,mhp,chp, X`09`09ptohit,ptodam,pac,ptoac,dis_th,dis_td,dis_ac,dis_tac, X`09`09disarm,save,hitdie,error:=continue); X X`09read_decrypt(in_rec); X`09readv(in_rec,inven_ctr,inven_weight,equip_ctr,dun_level, X`09 missle_ctr,mon_tot_mult,turn,randes_seed,error:=continue); X X`09with py.flags do X`09 begin X`09 read_decrypt(in_rec); X`09 readv(in_rec,insured,dead,error:=continue); X`7B`09 if dead and prop then X`09 begin X`09`09msg_print('Hmmm, it would appear that you are dead.'); X`09`09if insured then X`09`09 begin X`09`09 msg_print('Luckily, your insurance is paid up!'); X`09`09 py.misc.deaths := py.misc.deaths + 1; X`09`09 insured := false; X`09`09 end X`09`09else X`09`09 begin X`09`09 msg_print('Unfortunately, you hadn''t paid for insurance.'); X`09`09 exit; X`09`09 end; X`09 end X`09 else X`09 was_dead := false; `7D X`09 end; X`09was_dead := false; X`09`7B Read in the inventory records.`09`7D X`09inventory_list := nil; X`09lost_inven_count := 0; X`09bag_lost := false; X cur_bag := nil; X`09`7Buse of i2 to store inven_ctr deleted by Dean`7D X`09for i1 := 1 to inven_ctr do X`09 begin X`09 read_decrypt(in_rec); X`09 readv(in_rec,inven_temp`5E.data.tchar,inven_temp`5E.data.name, X`09`09`09 error:=continue); X X`09 read_decrypt(in_rec); X`09 readv(in_rec,trash_char,inven_temp`5E.insides,error:=continue); X`09 inven_temp`5E.is_in := trash_char = 'T'; X`09 read_decrypt(in_rec); X`09 readv(in_rec,inven_temp`5E.data.damage,error:=continue); X X`09 read_decrypt(in_rec); X`09 with inven_temp`5E.data do X`09 readv(in_rec,tval,subval,weight,number,tohit,todam,ac, X`09`09`09toac,p1,flags,flags2,level,cost,error:=continue); X`09 if ((was_dead) and X`09`09(uand(inven_temp`5E.data.flags2,insured_bit) = 0)) then X`09 begin X`09`09if (inven_temp`5E.data.tval = bag_or_sack) then`20 X`09`09 bag_lost := true; X`09`09lost_inven_count := lost_inven_count + 1; X`09`09inven_weight := inven_weight - inven_temp`5E.data.number * X`09`09`09`09`09 inven_temp`5E.data.weight; X`09 end X`09 else if (bag_lost and inven_temp`5E.is_in) then X`09 lost_inven_count := lost_inven_count + 1 X`09 else X`09 begin X`09`09if (was_dead) then X`09`09 inven_temp`5E.data.flags2 := uand(inven_temp`5E.data.flags2, X`09`09`09`09`09`09 %X'BFFFFFFF'); X`09`09add_item; X bag_lost := false X`09 end; X`09 end; X`09inven_ctr := 0; X`09ptr := inventory_list; X`09while (ptr <> nil) do X`09 begin X`09 ptr := ptr`5E.next; X`09 inven_ctr := inven_ctr + 1; X`09 end; X`09if (lost_inven_count = 1) then X`09 msg_print('You lost an item that wasn''t insured.') X`09else if (lost_inven_count > 1) then X`09 msg_print('You lost several items that weren''t insured.'); X X`09`7B Read in the equipment records.`09`7D X`09lost_equip_count := 0; X`09for i1 := Equipment_min to equip_max-1 do X`09 with inven_temp`5E.data do X`09 begin X`09 read_decrypt(in_rec); X`09 readv(in_rec,tchar,name,error:=continue); X X`09 read_decrypt(in_rec); X`09 readv(in_rec,damage,error:=continue); X X`09 read_decrypt(in_rec); X`09 readv(in_rec,tval,subval,weight,number,tohit,todam,ac, X`09`09`09toac,p1,flags,flags2,level,cost,error:=continue); X`09 if ((was_dead) and (tval > 0) and`20 X`09`09 (uand(flags2,insured_bit) = 0)) then X`09`09begin X`09`09 lost_equip_count := lost_equip_count + 1; X`09`09 equipment`5Bi1`5D := blank_treasure; X`09`09 inven_weight := inven_weight - inven_temp`5E.data.number * X`09`09`09`09`09`09 inven_temp`5E.data.weight; X`09`09 if (i1 <> equip_max-1) then X`09`09 py_bonuses(inven_temp`5E.data,-1); X`09`09end X`09 else X`09`09begin X`09`09 if (was_dead) then X`09`09 inven_temp`5E.data.flags2 := uand(inven_temp`5E.data.flags2, X`09`09`09`09`09`09`09%X'BFFFFFFF'); X`09`09 equipment`5Bi1`5D := inven_temp`5E.data; X`09`09end; X`09 end; X`09equip_ctr := equip_ctr - lost_equip_count; X`09if (lost_equip_count = 1) then X`09 msg_print('You lost a piece of equipment that wasn''t insured.') X`09else if (lost_equip_count > 1) then X`09 msg_print('You lost several pieces of equipment that weren''t insured.' V); X X`09if (was_dead) then msg_print(' '); X X`09read_decrypt(in_rec); X`09with py.stat do X`09 readv(in_rec,p`5Bsr`5D,c`5Bsr`5D,m`5Bsr`5D,l`5Bsr`5D,p`5Biq`5D,c`5Biq`5 VD,m`5Biq`5D,l`5Biq`5D, X`09`09p`5Bws`5D,c`5Bws`5D,m`5Bws`5D,l`5Bws`5D,p`5Bdx`5D,c`5Bdx`5D,m`5Bdx`5D, Vl`5Bdx`5D,p`5Bcn`5D,c`5Bcn`5D, X`09`09m`5Bcn`5D,l`5Bcn`5D,p`5Bca`5D,c`5Bca`5D,m`5Bca`5D,l`5Bca`5D,error:=con Vtinue); X`09with py.flags do X`09 begin X`09 read_decrypt(in_rec); X`09 readv(in_rec,status,blind,confused,food,food_digested,protection, X`09`09`09speed,afraid,poisoned,see_inv,error:=continue); X X`09 read_decrypt(in_rec); X`09 readv(in_rec,fast,slow,protevil,teleport,free_act, X`09`09`09slow_digest,petrification,error:=continue); X X`09 read_decrypt(in_rec); X`09 readv(in_rec,aggravate,sustain`5Bsr`5D,sustain`5Biq`5D,sustain`5Bws`5 VD, X`09`09`09sustain`5Bcn`5D,sustain`5Bdx`5D,sustain`5Bca`5D,error:=continue); X X`09 read_decrypt(in_rec); X`09 readv(in_rec,fire_resist,cold_resist,acid_resist,regenerate, X`09`09`09lght_resist,ffall,confuse_monster,error:=continue); X X`09 read_decrypt(in_rec); X`09 readv(in_rec,image,invuln,hero,shero,blessed,resist_heat, X`09`09`09resist_cold,detect_inv,word_recall,see_infra, X`09`09`09tim_infra,error:=continue); X X`09 read_decrypt(in_rec); X`09 readv(in_rec,resist_lght,free_time,ring_fire,protmon,hoarse, X`09`09`09magic_prot,ring_ice,temp_stealth,resist_petri, X`09`09`09blade_ring,error:=continue); X`09 end; X X`09for i1 := 1 to max_spells do X`09 with magic_spell`5Bpy.misc.pclass,i1`5D do X`09 begin X`09 read_decrypt(in_rec); X`09 readv(in_rec,learned,sexp,error:=continue) X`09 end; X X`09`09`7B If same version, restore dungeon level...`09`7D X`09if (save_version > 4.8) then X`09 begin X`09`09`7B Read the important dungeon info and floor `7D X`09 read_decrypt(in_rec); X`09 readv(in_rec,cur_height,cur_width,max_panel_rows,max_panel_cols, X`09`09`09 error:=continue); X X`09`09`7B Restore the floor`09`7D X`09 for i1 := 1 to cur_height do X`09 begin X`09`09read_decrypt(in_rec); X`09`09for i2 := 1 to cur_width do X`09`09 begin X`09`09 xfloor := ord(in_rec`5Bi2`5D); X`09`09 with cave`5Bi1,i2`5D do X`09`09 begin X`09`09`09fval := int(uand(%X'1F',xfloor)); X`09`09`09if (uand(%X'20',xfloor) <> 0) then X`09`09`09 fopen := true; X`09`09`09if (uand(%X'40',xfloor) <> 0) then X`09`09`09 pl := true; X`09`09`09if (uand(%X'80',xfloor) <> 0) then X`09`09`09 fm := true; X`09`09`09tl := false; X`09`09`09tptr := 0; X`09`09`09cptr := 0; X`09`09 end; X`09`09 end; X`09 end; X X`09`09`7B Restore the Treasure List`09`09`7D X`09 tlink; X`09 read_decrypt(in_rec); X`09 readv(in_rec,tot_treasures,error:=continue); X`09 for i1 := 1 to tot_treasures do X`09 begin X`09`09popt(i2); X`09`09with t_list`5Bi2`5D do X`09`09 begin X`09`09 read_decrypt(in_rec); X`09`09 readv(in_rec,i3,i4,error:=continue); X`09`09 cave`5Bi3,i4`5D.tptr := i2; X X`09`09 read_decrypt(in_rec); X`09`09 readv(in_rec,tchar,name,error:=continue); X X`09`09 read_decrypt(in_rec); X`09`09 readv(in_rec,damage,error:=continue); X X`09`09 read_decrypt(in_rec); +-+-+-+-+-+-+-+- END OF PART 72 +-+-+-+-+-+-+-+-