-+-+-+-+-+-+-+-+ 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? (<d>eath-flag, <m>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 +-+-+-+-+-+-+-+-
