-+-+-+-+-+-+-+-+ START OF PART 73 -+-+-+-+-+-+-+-+ X`09`09 readv(in_rec,tval,subval,weight,number,tohit,todam,ac, X`09`09`09toac,p1,flags,flags2,level,cost,error:=continue) X`09`09 end; X`09 end; X X`09`09`7B Re-identify objects`09`09`09`7D X`09 read_decrypt(in_rec); X`09 for i1 := 1 to max_objects do X`09 if (in_rec`5Bi1`5D = 'T') then X`09`09identify(object_list`5Bi1`5D) X`09 else X`09`09object_ident`5Bi1`5D := false; X X`09`09`7B Restore the Monster List`09`09`7D X`09 mlink; X`09 read_decrypt(in_rec); X`09 readv(in_rec,tot_monsters,error:=continue); X`09 i3 := 0; X`09 for i1 := 1 to tot_monsters do X`09 begin X`09`09read_decrypt(in_rec); X`09`09popm(i2); X`09`09with m_list`5Bi2`5D do X`09`09 begin X`09`09 readv(in_rec,fy,fx,mptr,hp,cspeed,csleep,cdis,ml,confused, X`09`09`09`09 error:=continue); X`09`09 cave`5Bfy,fx`5D.cptr := i2; X`09`09 if (muptr = 0) then X`09`09 muptr := i2 X`09`09 else X`09`09 m_list`5Bi3`5D.nptr := i2; X`09`09 nptr := 0; X`09`09 i3 := i2; X`09`09 end; X`09 end; X X`09`09`7B Restore the town level stores `09`7D X`09 read_decrypt(in_rec); X`09 readv(in_rec,town_seed,error:=continue); X`09 read_decrypt(in_rec); X`09 readv(in_rec,bank`5B0`5D,bank`5B6`5D,bank`5B5`5D,bank`5B4`5D,bank`5B3 V`5D,bank`5B2`5D, X`09`09bank`5B1`5D,error:=continue); X`09 for i1 := 1 to max_stores do X`09 if (i1 < 7) or (save_version >= 4.82) then X`09`09with store`5Bi1`5D do X`09`09 begin X`09`09 read_decrypt(in_rec); X`09`09 readv(in_rec,i2,error:=continue); X`09`09 store_ctr := i2; X`09`09 for i3 := 1 to i2 do X`09`09 with store_inven`5Bi3`5D.sitem do X`09`09`09begin X`09`09`09 read_decrypt(in_rec); X`09`09`09 readv(in_rec,store_inven`5Bi3`5D.scost,error:=continue); X`09`09`09 read_decrypt(in_rec); X`09`09`09 readv(in_rec,tchar,name,error:=continue); X`09`09`09 read_decrypt(in_rec); X`09`09`09 readv(in_rec,damage,error:=continue); X`09`09`09 read_decrypt(in_rec); X`09`09`09 readv(in_rec,tval,subval,weight,number,tohit,todam, X`09`09`09`09ac,toac,p1,flags,flags2,level,cost, X`09`09`09`09error:=continue) X`09`09`09end; X`09`09 `7B If not current version then re-outfit the stores `7D X`09`09 read_decrypt(in_rec); X`09`09 with store_open do X`09`09 readv(in_rec,i3,insult_cur,year,month,day,hour,secs, X`09`09`09 error:=continue); X`09`09 if ( save_version > 4.81 ) then owner := i3; X`09`09 end X`09 end; X X`09close(f1,error:=continue); X`09seed := get_seed; X`09get_char := dun_flag; Xpanic:`09if (paniced) then exit; X end; X X X`09`7B Wizard command for restoring character`09`09-RAK-`09`7D X`5Bglobal,psect(save$code)`5D procedure restore_char ( X`09`09fnam`09: vtype; X`09`09present`09: boolean; X`09`09undead`09: boolean); X var X`09i1`09`09`09`09`09: integer; X`09in_rec,temp`09`09`09`09: ntype; X`09temp_id`09`09`09`09`09: ssn_type; X`09f1`09`09`09`09`09: text; X`09f2`09`09`09`09`09: file of key_type; X`09flag,bleah_flag,exit_flag`09`09: boolean; X`09command`09`09`09`09`09: char; X begin X`09exit_flag := false; X`09bleah_flag := true; X`09if not(present) then X`09 begin X`09 if (not(undead)) then X`09 repeat X`09 msg_print('What kind of restore? (eath-flag, aster-file) '); X`09 if (get_com('',command)) then X`09`09case command of X`09`09 'd' : begin X`09`09`09 exit_flag := true; X`09`09`09 undead := true; X`09`09`09end; X`09`09 'm' : begin X`09`09`09 exit_flag := true; X`09`09`09 undead := false; X`09`09`09end; X`09`09end X`09 else X`09`09bleah_flag := false; X`09 until (exit_flag); X`09 if (bleah_flag) then X`09 begin X`09`09prt('Name of file to be restored: ',1,1); X`09`09flag := get_string(fnam,1,30,48); X`09 end X`09 else X`09 flag := false; X`09 end X`09else X`09 flag := true; X`09if flag then X`09 begin X`09 if (length(fnam) = 0) then fnam := finam; X`09 priv_switch(1); X`09 open (f1,file_name:=fnam, X`09`09record_length:=1024,history:=old,error:=continue); X`09 if (status(f1) <> 0) then X`09 msg_print('Error Opening> '+fnam) X`09 else X`09 begin X`09`09 `7B Check to see if master is openable -JPS- `7D X`09`09flag := true; X`09`09open (f2,file_name:=moria_mas, X`09`09`09access_method:=keyed,organization:=indexed, X`09`09`09history:=old,sharing:=readwrite,error:=continue); X`09`09if (status(f2) <> 0) then X`09`09 begin X`09`09 open (f2,file_name:=moria_mas, X`09`09`09access_method:=keyed,organization:=indexed, X`09`09`09history:=new,sharing:=readwrite,error:=continue); X`09`09 if (status(f2) <> 0) then X`09`09 begin X`09`09`09msg_print('MASTER could not be opened.'); X`09`09`09flag := false; X`09`09 end; X`09`09 end; X`09`09if (flag) then X`09`09 begin X`09`09`09`7B Reset the character in the master file. -JPS- `7D X`09`09 reset(f1,error:=continue); X`09`09 readln(f1,in_rec,error:=continue); X`09`09 seed := encrypt_seed2; X`09`09 decrypt(in_rec); X`09`09 temp := substr(in_rec,14,70); X`09`09 seed := encrypt_seed1; X`09`09 coder(temp); X`09`09 temp_id := temp; X`09`09 for i1 := 1 to 70 do X`09`09 key_rec.file_id`5Bi1`5D := temp`5Bi1`5D; X`09`09 findk(f2,0,temp_id,eql,error:=continue); X`09`09 delete(f2,error:=continue); X`09`09 f2`5E := key_rec; X`09`09 put(f2,error:=continue); X`09`09 if (status(f2) = 0) then X`09`09 msg_print('Character restored...') X`09`09 else X`09`09 msg_print('Could not write ID in MASTER.'); X`09`09 end; X`09`09close(f1,error:=continue); X`09`09close(f2,error:=continue); X`09 end; X`09 seed := get_seed; X`09 priv_switch(0); X`09 end; X`09if (undead) then X`09 begin X`09 get_char(fnam,false); X`09 py.flags.dead := false; X`09 finam := fnam; X`09 save_char(false); X`09 end; X end; X XEnd. $ CALL UNPACK SAVE.PAS;1 1952222714 $ create 'f' X`5Binherit('moria.env','dungeon.env')`5D module screen; X X`09`7B Prints the map of the dungeon`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(screen1$code)`5D procedure prt_map; X var X`09i1,i2,i3,i4,i5`09: integer; X`09ypos,xpos,isp`09: integer; X`09floor_str`09: vtype; X`09tmp_char`09: char; X`09flag`09`09: boolean; X begin X redraw := false;`09`09`09`7B Screen has been redrawn`09`7D X i3 := 1;`09`09`09`09`7B Used for erasing dirty lines`09`7D X i4 := 14;`09`09`09`09`7B Erasure starts in this column `7D X for i1 := panel_row_min to panel_row_max do`09`7B Top to bottom `7D X`09begin X`09 i3 := i3 + 1;`09`09`09`7B Increment dirty line ctr`09`7D X`09 if (used_line`5Bi3`5D) then`09`7B If line is dirty...`09`09`7D X`09 begin X`09 erase_line(i3,i4);`09`7B erase it.`09`09`09`7D X`09 used_line`5Bi3`5D := false;`09`7B Now it's a clean line`09`09`7D X`09 end; X`09 floor_str := '';`09`09`7B Floor_str is string to be printed`7D X`09 ypos := i1;`09`09`09`7B Save row`09`09`09`7D X`09 flag := false;`09`09`7B False until floor_str <> ''`09`7D X`09 isp := 0;`09`09`09`7B Number of blanks encountered`09`7D X`09 for i2 := panel_col_min to panel_col_max do`09`7B Left to right `7D X`09 with cave`5Bi1,i2`5D do X`09 begin`09`09`09`7B Get character for location`09`7D X`09`09if (test_light(i1,i2)) then X`09`09 loc_symbol(i1,i2,tmp_char) X`09`09else if ((cptr = 1) and (not(find_flag))) then X`09`09 tmp_char := '@' X`09`09else if (cptr > 1) then X`09`09 if (m_list`5Bcptr`5D.ml) then X`09`09 loc_symbol(i1,i2,tmp_char) X`09`09 else X`09`09 tmp_char := ' ' X`09`09else X`09`09 tmp_char := ' '; X`09`09if (tmp_char = ' ') then`7B If blank...`09`09`09`7D X`09`09 begin X`09`09 if (flag) then`09`7B If floor_str <> '' then`09`7D X`09`09 begin X`09`09`09isp := isp + 1; `7B Increment blank ctr`09`09`7D X`09`09`09if (isp > 3) then`09`7B Too many blanks, print`7D X`09`09`09 begin`09`09`09`7B floor_str and reset`09`7D X`09`09`09 print(floor_str,ypos,xpos); X`09`09`09 flag := false; X`09`09`09 isp := 0; X`09`09`09 end; X`09`09 end X`09`09 end X`09`09else X`09`09 begin X`09`09 if (flag) then`09`7B Floor_str <> ''`09`09`7D X`09`09 begin X`09`09`09if (isp > 0) then`09`7B Add on the blanks`09`7D X`09`09`09 begin X`09`09`09 for i5 := 1 to isp do X`09`09`09 floor_str := floor_str + ' '; X`09`09`09 isp := 0; X`09`09`09 end;`09`09`09`7B Add on the character`09`7D X`09`09`09floor_str := floor_str + tmp_char; X`09`09 end X`09`09 else X`09`09 begin`09`09`7B Floor_str = ''`09`09`7D X`09`09`09xpos := i2;`09`7B Save column for printing`09`7D X`09`09`09flag := true;`09`7B Set flag to true`09`09`7D X`09`09`09floor_str := tmp_char;`09`7B Floor_str <> ''`09`7D X`09`09 end; X`09`09 end; X`09 end; X`09 if (flag) then`09`09`7B Print remainder, if any`09`7D X`09 print(floor_str,ypos,xpos); X`09end; X end; X X X`09`7B Print character stat in given row, column`09`09-RAK-`09`7D X`5Bglobal,psect(screen$code)`5D procedure prt_stat( X`09`09`09stat_name`09: vtype; X`09`09`09stat`09`09: byteint; X`09`09`09row,column`09: integer); X var X`09`09out_val1`09`09: stat_type; X`09`09out_val2`09`09: vtype; X begin X`09cnv_stat(stat,out_val1); X`09out_val2 := stat_name + out_val1; X`09put_buffer(out_val2,row,column); X end; X X`09`7B Print character info in given row, column`09`09-RAK-`09`7D X`5Bglobal,psect(screen$code)`5D procedure prt_field(info : vtype; row,column V : integer); X var X`09`09out_val1,out_val2`09: vtype; X begin X`09put_buffer(pad(info,' ',14),row,column); X end; X X`09`7B Print number with header at given row, column`09`09-RAK-`09`7D X`5Bglobal,psect(screen$code)`5D procedure prt_num( X`09`09`09header`09`09:`09vtype; X`09`09`09num,row,column`09:`09integer); X var X`09`09out_val`09`09`09: vtype; X begin X`09writev(out_val,header,num:1,' '); X`09put_buffer(out_val,row,column); X end; X X`09`7B Prints title of character's level`09`09`09-RAK-`09`7D X`5Bglobal,psect(screen1$code)`5D procedure prt_title; X begin X prt_field(py.misc.title,title_row,stat_column); X end; X X`09`7B Prints stat (str..cha) in correct row`09`09-STEVEN-`09`7D X`5Bglobal,psect(screen1$code)`5D procedure prt_a_stat(tstat : stat_set); X begin X prt_stat('',py.stat.c`5Btstat`5D,str_row+ord(tstat),stat_column+6); X end; X X`09`7B Prints level`09`09`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(screen1$code)`5D procedure prt_level; X begin X prt_num( '',py.misc.lev,level_row,stat_column+6); X end; X X`09`7B Prints player's mana`09`09`09`09`09-DCJ-`09`7D X`5Bglobal,psect(moria$code)`5D procedure prt_mana; X var X`09`09out_val`09`09`09: vtype; X begin X writev(out_val,trunc(py.misc.cmana):1,'/',py.misc.mana:1,' '); X if ( length(out_val) < 8 ) then out_val := pad(out_val, ' ', 8) ; X put_buffer(out_val,mana_row,stat_column+6); X end; X X`09`7B Prints hit points`09`09`09`09`09-DCJ-`09`7D X`5Bglobal,psect(moria$code)`5D procedure prt_hp; X var X`09`09out_val`09`09`09: vtype; X begin X writev(out_val,trunc(py.misc.chp):1,'/',py.misc.mhp:1,' '); X if ( length(out_val) < 8 ) then out_val := pad(out_val, ' ', 8) ; X put_buffer(out_val,hp_row,stat_column+6); X end; X X`09`7B Prints current AC`09`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(screen2$code)`5D procedure prt_pac; X begin X prt_num( '',py.misc.dis_ac,ac_row,stat_column+6); X end; X X`09`7B Prints current gold`09`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(screen2$code)`5D procedure prt_gold; X begin X prt_num( '',py.misc.money`5Btotal$`5D,gold_row,stat_column+6); X end; X X`09`7B Prints current inventory weight`09`09`09-DCJ-`09`7D X`5Bglobal,psect(screen2$code)`5D procedure prt_weight; X begin X prt_num('',inven_weight div 100,weight_row,stat_column+6); X prt_num('',weight_limit,weight_row+1,stat_column+6); X end; X X`09`7B Print time of game day`09`09`09`09-DMF-`09`7D X`5Bglobal,psect(screen1$code)`5D procedure prt_time; X begin X with py.misc.cur_age do X`09put_buffer(time_string(hour,secs)+' '+day_of_week_string(day,2)+' '+ X`09`09 place_string(day),time_row,stat_column); X end; X X`09`7B Prints depth in stat area`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(screen1$code)`5D procedure prt_depth; X var X`09`09depths`09: vtype; X`09`09depth`09: integer; X begin X`09depth := dun_level*50; X`09if (depth = 0) then X`09 depths := 'Town level' X`09else if (depth < 10000) then X`09 writev(depths,'Depth: ',depth:1,' (feet)') X else writev(depths,'Depth: ',depth:1,' '); X`09prt(depths,status_row,depth_column); X end; X X`09`7B Prints status of hunger`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(screen1$code)`5D procedure prt_hunger; X begin X if (uand(%X'000002',py.flags.status) <> 0) then X`09put_buffer('Weak ',status_row,hunger_column) X else if (uand(%X'000001',py.flags.status) <> 0) then X`09put_buffer('Hungry ',status_row,hunger_column) X else X`09put_buffer(' ',status_row,hunger_column); X end; X X`09`7B Prints Blind status`09`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(screen1$code)`5D procedure prt_blind; X begin X if (uand(%X'000004',py.flags.status) <> 0) then X`09put_buffer('Blind ',status_row,blind_column) X else X`09put_buffer(' ',status_row,blind_column); X end; X X`09`7B Prints Confusion status`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(screen1$code)`5D procedure prt_confused; X begin X if (uand(%X'000008',py.flags.status) <> 0) then X`09put_buffer('Confused ',status_row,confused_column) X else X`09put_buffer(' ',status_row,confused_column); X end; X X`09`7B Prints Fear status`09`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(screen1$code)`5D procedure prt_afraid; X begin X if (uand(%X'000010',py.flags.status) <> 0) then X`09put_buffer('Afraid ',status_row,afraid_column) X else X`09put_buffer(' ',status_row,afraid_column); X end; X X`09`7B Prints Poisoned status`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(screen1$code)`5D procedure prt_poisoned; X begin X if (uand(%X'000020',py.flags.status) <> 0) then X`09put_buffer('Poisoned ',status_row,poisoned_column) X else X`09put_buffer(' ',status_row,poisoned_column); X end; X X`09`7B Prints Searching status`09`09`09`09-RAK-`09`7D +-+-+-+-+-+-+-+- END OF PART 73 +-+-+-+-+-+-+-+-