-+-+-+-+-+-+-+-+ START OF PART 62 -+-+-+-+-+-+-+-+
X                          else if (p1 > 0) then
X                            begin
X                              p1 := p1 - 1;
X                              while (i1 > 0) do
X                                begin
X                                  i2 := bit_pos(i1);
X                                  i3 := char_row;
X                                  i4 := char_col;
X        `7B Ray Guns  `7D
X        case (i2) of
X          1  :  begin
X                  msg_print('A line of blue shimmering light appears.');
X                  light_line(dir,char_row,char_col,damroll('2d8'),false);
X                  ident := true;
X                end;
X          2  :  begin
X                  fire_bolt(1,dir,i3,i4,damroll('3d8'),'Lightning Bolt');
X                  ident := true;
X                end;
X          3  :  begin
X                  fire_bolt(4,dir,i3,i4,damroll('4d8'),'Frost Bolt');
X                  ident := true;
X                end;
X          4  :  begin
X                  fire_bolt(5,dir,i3,i4,damroll('6d8'),'Fire Bolt');
X                  ident := true;
X                end;
X          5  :  ident := wall_to_mud(dir,i3,i4);
X          6  :  ident := poly_monster(dir,i3,i4);
X          7  :  ident := hp_monster(dir,i3,i4,-damroll('4d6'));
X          8  :  ident := speed_monster(dir,i3,i4,1);
X          9  :  ident := speed_monster(dir,i3,i4,-1);
X          10 :  ident := confuse_monster(dir,i3,i4);
X          11 :  ident := sleep_monster(dir,i3,i4);
X          12 :  ident := drain_life(dir,i3,i4);
X          13 :  ident := td_destroy2(dir,i3,i4);
X          14 :  begin
X                  fire_bolt(0,dir,i3,i4,damroll('2d6'),'Energy Bolt');
X                  ident := true;
X                end;
X          15 :  ident := build_wall(dir,i3,i4);
X          16 :  ident := clone_monster(dir,i3,i4);
X          17 :  ident := teleport_monster(dir,i3,i4);
X          18 :  ident := disarm_all(dir,i3,i4);
X          19 :  begin
X                  fire_ball(1,dir,i3,i4,24,2,false,'Lightning Ball');
X                  ident := true;
X                end;
X          20 :  begin
X                  fire_ball(4,dir,i3,i4,32,2,false,'Cold Ball');
X                  ident := true;
X                end;
X          21 :  begin
X                  fire_ball(5,dir,i3,i4,48,2,false,'Fire Ball');
X                  ident := true;
X                end;
X          22 :  begin
X                  fire_ball(2,dir,i3,i4,8,2,false,'Poison Gas');
X                  ident := true;
X                end;
X          23 :  begin
X                  fire_ball(3,dir,i3,i4,40,2,false,'Acid Ball');
X                  ident := true;
X                end;
X          24 :  i1 := 2**(randint(24) - 1);
X`09  25 : writeln ('Unimplemented Wand');
X          otherwise ;
X        end;
X        `7B End of Wands...                                       `7D
X                                end;
X                              if (ident) then
X                                identify(inventory`5Bitem_val`5D);
X                              if (flags <> 0) then
X                                with py.misc do
X                                  begin
X                                    exp := exp + round(level/lev);
X                                    prt_experience;
X                                  end;
X                              desc_charges(item_val);
X                            end
X                        end
X                    end
X              end
X            else
X              msg_print('You are not carrying any ray guns.');
X          end
X        else
X          msg_print('But you are not carrying anything.');
X        if (redraw) then draw_cave;
X      end;
$ CALL UNPACK [.INC]RAYGUN.INC;1 68559275
$ create 'f'
X`7B Data Corruption means character is dead, or save file was screwed with.
X  Keep them guessing as to what is actually wrong.`7D
X`5Bpsect(save$code)`5D procedure data_exception;
X      begin
X        clear(1,1);
X        prt('%BOSS-F-ATTREUSE,Attempted Reuse of a Character',1,1);
X        prt('',2,1);
X        exit;`20
X      end;
X
X`5Bpsect(save$code)`5D procedure data_exception1;
X      begin
X        clear(1,1);
X        prt('%BOSS-F-BADCHECK,Data Exceptyion Error,Corruption',1,1);
X        prt('',2,1);
X        exit;`20
X      end;
X`20
X`20
X`7B Uses XOR function to encode data `7D
X`5Bpsect(save$code)`5D procedure coder(var line : ntype);
X      var
X                i1                      : integer;
X                i2,i3,i4                : unsigned;
X      begin
X        for i1 := 1 to length(line) do
X          begin
X            i2 := uint(ord(line`5Bi1`5D));
X            i3 := uint(randint(256)-1);
X            i4 := uxor(i2,i3);
X            line`5Bi1`5D := chr(i4);
X          end;
X      end;
X`20
X`20
X`7B Encrypts a line of text, complete with a data-check sum `7D
X`5Bpsect(save$code)`5D procedure encrypt(var line : ntype);
X      var
X        i1,i2           : integer;
X        temp            : ntype;
X`20
X      begin
X        i2 := 0;
X        for i1 := 1 to length(line) do
X          i2 := i2 + ord(line`5Bi1`5D) + i1;
X        temp := line;
X        writev(line,i2:1,' ',temp);
X        coder(line);
X      end;
X`20
X`20
X`7B Decrypts a line of text, complete with a data-check sum `7D
X`5Bpsect(save$code)`5D procedure decrypt(var line : ntype);
X      var
X        i1,i2,i3        : integer;
X        temp            : ntype;
X        tmp             : char;
X`20
X      begin
X        i2 := 0;
X        coder(line);
X        temp := line;
X        readv(temp,i3,tmp,line);
X        for i1 := 1 to length(line) do
X          i2 := i2 + ord(line`5Bi1`5D) + i1;
X        if (i2 <> i3) then data_exception1;
X      end;
X`20
X`20
X`7B Actual save procedure `7D
X`5Bpsect(save$code)`5D function save_char : boolean;
X      var
X        tot_monsters,tot_treasure     : integer;
X        i1,i2,trys                    : integer;
X        xfloor                        : unsigned;
X        save_seed                     : unsigned;
X        fnam,saveline                 : vtype;
X        temp                          : packed array `5B1..70`5D of char;
X        out_rec,title1,title2         : ntype;
X        f1                            : text;
X        f2                            : file of key_type;
X        flag,file_flag                : boolean;
X`20
X      begin
X        prt('Enter Filename:',1,1);
X        flag := false;
X`7B Open the user's save file `7D
X        if (get_string(fnam,1,17,60)) then
X          begin
X            if (length(fnam) = 0) then fnam := 'BOSSCHR.SAV';
X            open (f1,FILE_NAME:=fnam,record_length:=1024,ERROR:=continue);
X            if (status(f1) <> 0) then
X              msg_print('Error creating> ' + fnam)
X            else
X              flag := true;
X          end;
X   `20
X    `7B Make an attempt to open the MASTER file               -JWT-   `7D
X        if (flag) then
X          begin
X            rewrite(f1,error:=continue);
X            priv_switch(1);
X            open (f2,file_name:=boss_mas,
X                    error:=continue,access_method:=keyed,organization:=index
Ved,
X                    history:=old,sharing:=readwrite);
X            if (status(f2) <> 0) then
X              begin
X                priv_switch(0);
X                open (f2,file_name:=boss_mas,
X                        error:=continue,access_method:=keyed,
X                        organization:=indexed,history:=new,sharing:=readwrit
Ve);
X              end;
X            if (status(f2) <> 0) then
X                begin
X                  msg_print('Error saving character, contact BOSS Wizard.');
X                  close(f1,error:=continue);
X                  flag := false;
X                end;
X          end;
X        `7B Make an attempt to create a unique ID and write to MASTER -RAK-`
V7D
X        if (flag) then
X          begin
X            trys := 0;
X            file_flag := false;
X            repeat
X              for i1 := 1 to 70 do temp`5Bi1`5D := chr(31+randint(95));
X              title1 := temp;
X              seed := encrypt_seed1;
X              encrypt(title1);
X              for i1 := 1 to 70 do
X                key_rec.file_id`5Bi1`5D := title1`5Bi1`5D;
X              f2`5E := key_rec;
X              put(f2,error:=continue);
X              if (status(f2) <> 0) then
X                begin
X                  trys := trys + 1;
X                  if (trys > 5) then
X                    begin
X                      file_flag := true;
X                      flag := false;
X                      msg_print('Error in writing to MASTER.');
X                    end;
X                end
X              else
X                file_flag := true;
X            until(file_flag);
X            close(f2,error:=continue);
X            priv_switch(0);
X          end;
X        `7B If ID was written to MASTER, continue saving          -RAK-   `7
VD
X
X        if (flag) then
X          begin
X            save_seed := get_seed;
X            writev(title2,save_seed:12,' ',temp);
X            seed := encrypt_seed2;
X            encrypt(title2);
X            writeln(f1,title2,error:=continue);
X            seed := save_seed;
X                `7B Message to player on what is happening`7D
X            clear(1,1);
X            writev(saveline,'Saving character as ',fnam,'...');`20
X            prt(saveline,1,1);
X            put_qio;
X                `7B Version number of Boss               `7D
X            writev(out_rec,cur_version);
X            encrypt(out_rec);
X            writeln(f1,out_rec,error:=continue);
X`20
X                `7B Write out the player record.  `7D
X            with py.misc do
X              begin
X   writev(out_rec,name); encrypt(out_rec); writeln(f1,out_rec,error:=continu
Ve);
X   writev(out_rec,race); encrypt(out_rec); writeln(f1,out_rec,error:=continu
Ve);
X   writev(out_rec,sex);  encrypt(out_rec); writeln(f1,out_rec,error:=continu
Ve);
X  writev(out_rec,tclass);encrypt(out_rec); writeln(f1,out_rec,error:=continu
Ve);
X   writev(out_rec,title);encrypt(out_rec); writeln(f1,out_rec,error:=continu
Ve);
X`20
X                for i1 := 1 to 5 do
X                  begin
X                    out_rec := history`5Bi1`5D;
X                    encrypt(out_rec);
X                    writeln(f1,out_rec,error:=continue);
X                  end;
X`20
X                writev(out_rec,char_row:1,' ',char_col:1,' ',
X                  pclass:1,' ',prace:1,' ', pskill:1, ' ',
X                  age:1,' ',ht:1,' ',wt:1,' ',sc:1,' ',max_exp:1,' ',
X                  exp:1,' ',lev:1,' ',max_lev:1,' ',expfact:2:1);
X`20
X                encrypt(out_rec);
X                writeln(f1,out_rec,error:=continue);
X`20
X                writev(out_rec,srh:1,' ',perc:1,' ',stl:1,' ',bth:1,' ',
X`09`09`09bthb:1,' ',mana:1,' ',cmana:1,' ',mhp:1,' ',
X`09`09`09chp:1:1,' ',au:1,' ',ptohit:1,' ',ptodam:1,' ',
X`09`09`09pac:1,' ',ptoac:1,' ',dis_th:1,' ',dis_td:1,' ',
X`09`09`09dis_ac:1,' ',dis_tac:1,' ',disarm:1,' ',
X`09`09`09wierd:1,' ',save:1,' ',hitdie:1);
X`20
X                encrypt(out_rec);
X                writeln(f1,out_rec,error:=continue);
X              end;
X
X            writev(out_rec,inven_ctr:1,' ',
X            inven_weight:1,' ',equip_ctr:1,' ',dun_level:1,' ',
X            missle_ctr:1,' ',mon_tot_mult:1,' ',turn:1,' ',day:1,
X`09                  ' ',town_num:1,' ',defeated_badguy:1,
X`09`09`09  ' ',randes_seed:12);
X            encrypt(out_rec);
X            writeln(f1,out_rec,error:=continue);
X`20
X `09`09`7BWrite out the kill list`7D
X`09    for i1 := 1 to 400 do
X`09      begin
X`09        writev(out_rec,kill_list`5Bi1`5D:1);
X`09`09encrypt(out_rec);
X`09`09writeln(f1,out_rec,error:=continue);
X`09      end;
X
X      `09`09`7BWrite out bank records`7D`20
X`09    writev(out_rec,act_bal:1,' ',principal:1,' ',payment_count:1,
X                  ' ',iod_val:2:1,' ',iol_val:2:1,' ',danny_cut:2:1);
X`09    encrypt(out_rec);
X`09    writeln(f1,out_rec,error:=continue);
X
X                `7B Write out the inventory records.      `7D
X            for i1 := 1 to inven_ctr do
X              begin
X                writev(out_rec,inventory`5Bi1`5D.tchar,inventory`5Bi1`5D.nam
Ve);
X                encrypt(out_rec);
X                writeln(f1,out_rec,error:=continue);
X`20
X                writev(out_rec,inventory`5Bi1`5D.damage);
X                encrypt(out_rec);
X                writeln(f1,out_rec,error:=continue);
X`20
X                with inventory`5Bi1`5D do
X                  writev(out_rec,tval:1,' ',subval:1,' ',weight:1,' ',
X                        number:1,' ',tohit:1,' ',todam:1,' ',ac:1,' ',
X                        toac:1,' ',p1:1,' ',flags:1,' ',level:1,' ',cost:1);
X                encrypt(out_rec);
X                writeln(f1,out_rec,error:=continue);
X              end;
X`20
X                `7B Write out the equipment records.      `7D
X            for i1 := 23 to equip_max do
X              begin
X                writev(out_rec,equipment`5Bi1`5D.tchar,equipment`5Bi1`5D.nam
Ve);
X                encrypt(out_rec);
X                writeln(f1,out_rec,error:=continue);
X`20
X                writev(out_rec,equipment`5Bi1`5D.damage);
X                encrypt(out_rec);
X                writeln(f1,out_rec,error:=continue);
X`20
X                with equipment`5Bi1`5D do
X                  writev(out_rec,tval:1,' ',subval:1,' ',weight:1,' ',
X                        number:1,' ',tohit:1,' ',todam:1,' ',ac:1,' ',
X                        toac:1,' ',p1:1,' ',flags:1,' ',level:1,' ',cost:1);
X                encrypt(out_rec);
X                writeln(f1,out_rec,error:=continue);
X              end;
X`20
X            with py.stat do
X              begin
X                writev(out_rec,str:1,' ',cstr:1,' ',dex:1,' ',cdex:1,' ',
X                        con:1,' ',ccon:1,' ',int:1,' ',cint:1,' ',wis:1,' ',
X                        cwis:1,' ',chr:1,' ',cchr:1);
X                encrypt(out_rec);
X                writeln(f1,out_rec,error:=continue);
X              end;
X`20
X            with py.flags do
X              begin
X                writev(out_rec,status:1,' ',blind:1,' ',confused:1,' ',
X                        food:1,' ',food_digested:1,' ',protection:1,' ',
X                        speed:1,' ',afraid:1,' ',
X                        poisoned:1,' ',see_inv:1);
X                encrypt(out_rec);
+-+-+-+-+-+-+-+-  END  OF PART 62 +-+-+-+-+-+-+-+-
