-+-+-+-+-+-+-+-+ START OF PART 51 -+-+-+-+-+-+-+-+ X 18 : if (get_dir('Which direction?',dir,dumy,y_dumy,x_dumy)) then X fire_ball(6,dir,char_row,char_col, X damroll('3d6')+py.misc.lev,'Black Sphere'); X 19 : hp_player(damroll('8d4'),'a prayer.'); X 20 : detect_inv2(randint(24)+24); X 21 : protect_evil; X 22 : earthquake; X 23 : map_area; X 24 : hp_player(damroll('16d4'),'a prayer.'); X 25 : turn_undead; X 26 : bless(randint(48)+48); X 27 : dispell_creature(%X'0008',3*py.misc.lev); X 28 : hp_player(200,'a prayer.'); X 29 : dispell_creature(%X'0004',3*py.misc.lev); X 30 : warding_glyph; X 31 : begin X dispell_creature(%X'0004',4*py.misc.lev); X cure_confusion; X remove_fear; X cure_poison; X cure_blindness; X hp_player(1000,'a prayer.'); X end; X otherwise ; X end; X `7B End of prayers... `7D X if (not(reset_flag)) then X with py.misc do X begin X exp := exp + sexp; X prt_experience; X sexp := 0; X end X end; X with py.misc do X if (not(reset_flag)) then X begin X if (smana > cmana) then X begin X msg_print('You faint from fatigue!'); X py.flags.paralysis := X randint(5*trunc(smana-cmana)); X cmana := 0; X if (randint(3) = 1) then X begin X msg_print('You have damaged your health!') V; X py.stat.ccon := de_statp(py.stat.ccon); X prt_constitution; X end; X end X else X cmana := cmana - smana; X prt_mana; X end X end X end X else X if (redraw) then draw_cave; X end X else X msg_print('But you are not carrying any Holy Books!'); X end X else X msg_print('But you are not carrying any Holy Books!') X else X msg_print('Pray hard enough and your prayers may be answered.'); X end; $ CALL UNPACK [.SOURCE.INCLUDE]PRAYER.INC;1 2117428299 $ 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('%MORIA-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('%MORIA-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 := 'MORIACHR.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:=moria_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:=moria_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 MORIA Wizard.') V; 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`7B prt('Saving character...',1,1); `7D X writev(saveline,'Saving character as ',fnam,'...');`20 X`7B prt('Saving character as ',fnam,'...',1,1);`7D X prt(saveline,1,1); X put_qio; X `7B Version number of Moria `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); X encrypt(out_rec); X writeln(f1,out_rec,error:=continue); X`20 X writev(out_rec,race); X encrypt(out_rec); X writeln(f1,out_rec,error:=continue); X`20 X writev(out_rec,sex); X encrypt(out_rec); X writeln(f1,out_rec,error:=continue); X`20 X writev(out_rec,tclass); X encrypt(out_rec); X writeln(f1,out_rec,error:=continue); X`20 X writev(out_rec,title); X encrypt(out_rec); X writeln(f1,out_rec,error:=continue); 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,' ', 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,' ',fos:1,' ',stl:1,' ',bth:1,' ', X bthb:1,' ', X mana:1,' ',cmana:1,' ',mhp:1,' ',chp:1:1,' ',au:1,' ', X ptohit:1,' ',ptodam:1,' ',pac:1,' ',ptoac:1,' ', X dis_th:1,' ',dis_td:1,' ',dis_ac:1,' ',dis_tac:1,' ', X disarm:1,' ',save:1,' ',hitdie:1); X`20 X encrypt(out_rec); X writeln(f1,out_rec,error:=continue); X`20 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,' ',uand(%X'F',turn):1, X ' ',randes_seed:12); X`20 X encrypt(out_rec); X writeln(f1,out_rec,error:=continue); X end; X`20 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 inven_max-1 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 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); X writeln(f1,out_rec,error:=continue); X`20 X writev(out_rec,fast:1,' ',slow:1,' ',protevil:1,' ', X teleport:1,' ',free_act:1,' ',slow_digest:1); X encrypt(out_rec); X writeln(f1,out_rec,error:=continue); X`20 X writev(out_rec,aggravate:1,' ',sustain_str:1,' ', X sustain_int:1,' ',sustain_wis:1,' ',sustain_con:1,' V ', X sustain_dex:1,' ',sustain_chr:1); X encrypt(out_rec); X writeln(f1,out_rec,error:=continue); X`20 X writev(out_rec,fire_resist:1,' ',cold_resist:1,' ', X acid_resist:1,' ',regenerate:1,' ',lght_resist:1,' ' V, X ffall:1,' ',confuse_monster:1); +-+-+-+-+-+-+-+- END OF PART 51 +-+-+-+-+-+-+-+-