-+-+-+-+-+-+-+-+ 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 +-+-+-+-+-+-+-+-