-+-+-+-+-+-+-+-+ START OF PART 14 -+-+-+-+-+-+-+-+ X`09 if (pos > 0) then X`09`09tmp_val := substr(tmp_val,1,pos-1); X`09 end; X`09 insert_num(tmp_val,'%P1',p1,true); X`09 insert_num(tmp_val,'%P2',tohit,true); X`09 insert_num(tmp_val,'%P3',todam,true); X`09 insert_num(tmp_val,'%P4',toac,true); X`09 insert_num(tmp_val,'%P5',p1,false); X`09 insert_num(tmp_val,'%P6',ac,false); X`09 if (number <> 1) then X`09 begin X`09 insert_str(tmp_val,'ch`7E','ches'); X`09 insert_str(tmp_val,'y`7E','ies'); X`09 insert_str(tmp_val,'`7E','s'); X`09 end X`09 else X`09 insert_str(tmp_val,'`7E',''); X`09 if (pref) then X`09 begin X`09 if (index(tmp_val,'&') > 0) then X`09 begin X`09 insert_str(tmp_val,'&',''); X`09 if (number > 1) then X`09 writev(out_val,number:1,tmp_val) X`09`09 else if (number < 1) then X`09`09 writev(out_val,'no more',tmp_val) X`09 else if (tmp_val`5B2`5D in vowel_set) then X`09 writev(out_val,'an',tmp_val) X`09 else X`09 writev(out_val,'a',tmp_val); X`09 end X`09 else X`09 if (number > 0 ) then X`09`09 out_val := tmp_val X`09`09else X`09`09 writev(out_val,'no more ',tmp_val) X`09 end X`09 else X`09 begin X`09 insert_str(tmp_val,'& ',''); X`09 out_val := tmp_val; X`09 end; X`09end; X X end; X XEnd. $ CALL UNPACK DESC.PAS;1 1113920090 $ create 'f' X`09; X`09; Programmer:`09RAK`09V4.3 X`09; Macro function for : X`09; X`09;`09dis := distance(y1,x1,y2,x2) X`09; X`09;`09Distance returned is only an approximation based on : X`09; X`09;`09dy = abs(y1-y2) X`09;`09dx = abs(x1-x2) X`09; X`09;`09distance = 2*(dy+dx) - MIN(dy,dx) X`09;`09`09 ---------------------- X`09;`09`09`09 2 X`09; X`09.title`09DISTANCE`09Integer distance between two points X`09.ident`09/distance/ X`09.psect misc1$code,pic,con,rel,lcl,shr,exe,rd,nowrt,2 X`09.entry`09distance,`5EM<> X`09subl3`094(ap),12(ap),r0 X`09bgeq`091$ X`09mnegl`09r0,r0 X1$:`09subl3`098(ap),16(ap),r1 X`09bgeq`092$ X`09mnegl`09r1,r1 X2$:`09cmpl`09r0,r1 X`09bgeq`093$ X`09addl2`09r1,r1 X`09brb`094$ X3$:`09addl2`09r0,r0 X4$:`09addl2`09r1,r0 X`09ashl`09#-1,r0,r0 X`09ret X`09.end $ CALL UNPACK DISTANCE.MAR;1 1031313756 $ create 'f' X`5Binherit('moria.env','sys$share:starlet'),environment('dungeon.env')`5D Xmodule dungeon; X X var X`09dir_val : integer; `7B For movement `7D X`09y,x,moves : integer; `7B For movement `7D X`09i1,i2,tmp1 : integer; `7B Temporaries `7D X`09old_chp,old_cmana : integer; `7B Detect change `7D X`09regen_amount : real; `7B Regenerate hp and mana`7D X`09command : char; `7B Last command `7D X`09out_val : vtype; `7B For messages `7D X`09tmp_str : vtype; `7B Temporary `7D X`09moria_flag : boolean; `7B Next level when true `7D X`09reset_flag : boolean; `7B Do not move creatures `7D X`09search_flag : boolean; `7B Player is searching `7D X`09teleport_flag : boolean; `7B Handle telport traps `7D X`09player_light : boolean; `7B Player carrying light `7D X`09save_msg_flag : boolean; `7B Msg flag after INKEY `7D X`09s1,s2,s3,s4`09`09: ttype;`09`7B Summon item strings`09`7D X`09i_summ_count`09`09: integer;`09`7B Summon item count`09`7D X`09tstat`09`09`09: stat_set; X`09trash_ptr`09`09: treas_ptr; X`09trash_char`09`09: char; X`09f1`09`09`09: text; X X`09%INCLUDE 'TRADE.INC' X`09%INCLUDE 'INSURANCE.INC' X`09%INCLUDE 'BANK.INC' X`09`7B General spells and misc routines`09`7D X`09%INCLUDE 'SPELLS.INC' X X`09`7B Moves creature record from one space to another`09-RAK-`09`7D X `5Bglobal,psect(moria$code)`5D procedure move_rec(y1,x1,y2,x2 : integer) V; X begin X`09if ((y1 <> y2) or (x1 <> x2)) then X`09 begin X`09 cave`5By2,x2`5D.cptr := cave`5By1,x1`5D.cptr; X`09 cave`5By1,x1`5D.cptr := 0 X`09 end X end; X X `5Bglobal,psect(moria$code)`5D procedure update_stat(tstat : stat_set); X begin X`09with py.stat do X`09 c`5Btstat`5D := squish_stat(p`5Btstat`5D + 10*m`5Btstat`5D - l`5Btstat` V5D); X end; X X`09`7B Changes stats up or down for magic items`09`09-RAK-`09`7D X `5Bglobal,psect(moria$code)`5D procedure change_stat( X`09`09`09tstat`09: stat_set; X`09`09`09amount`09: integer; X`09`09`09factor`09: integer); X begin X`09with py.stat do X`09 begin X`09 m`5Btstat`5D := m`5Btstat`5D + amount*factor; X`09 update_stat(tstat) X`09 end; X end; X X`09`7B Changes speed of monsters relative to player`09`09-RAK-`09`7D X`09`7B Note: When the player is sped up or slowed down, I simply `7D X`09`7B change the speed of all the monsters. This greatly `7D X`09`7B simplified the logic... `7D X `5Bglobal,psect(moria$code)`5D procedure change_speed(num : integer); X var X`09`09i1,old`09`09`09: integer; X begin X`09py.flags.speed := py.flags.speed + num; X`09i1 := muptr; X`09while (i1 <> 0) do X`09 begin X`09 m_list`5Bi1`5D.cspeed := m_list`5Bi1`5D.cspeed + num; X`09 i1 := m_list`5Bi1`5D.nptr; X`09 end; X end; X X X`09`7B Player bonuses`09`09`09`09`09-RAK-`09`7D X`09`7B When an item is worn or taken off, this re-adjusts the player `7D X`09`7B bonuses. Factor=1 : wear; Factor=-1 : removed `7D X `5Bglobal,psect(moria$code)`5D procedure py_bonuses( X`09`09`09tobj`09: treasure_type; X`09`09`09factor`09: integer); X var X`09item_flags,item_flags2 : unsigned; X`09i1,i2,old_dis_ac : integer; X begin X`09with py.flags do X`09 begin X`09 if (slow_digest) then X`09 food_digested := food_digested + 1; X`09 if (regenerate) then X`09 food_digested := food_digested - 3; X`09 see_inv := false; X`09 teleport := false; X`09 free_act := false; X`09 slow_digest := false; X`09 aggravate := false; X`09 for tstat := sr to ca do X`09 sustain`5Btstat`5D := false; X`09 fire_resist := false; X`09 hunger_item := false; X`09 acid_resist := false; X`09 cold_resist := false; X`09 regenerate := false; X`09 lght_resist := false; X`09 ffall := false; X`09 end; X X`09if (uand(strength_worn_bit,tobj.flags) <> 0) then X`09 begin X`09 change_stat(sr,tobj.p1,factor); X`09 print_stat := uor(%X'0001',print_stat); X`09 end; X`09if (uand(magic_proof_worn_bit,tobj.flags2) <> 0) then X`09 begin X`09 py.misc.save := py.misc.save + (25 * factor); X`09 end; X`09if (uand(bad_repute_worn_bit,tobj.flags2) <> 0) then X`09 begin X`09 change_rep(-100*factor); `7BXXX hey! this is bad! new variable!-ste` V7D X`09 end; X`09if (uand(disarm_worn_bit,tobj.flags2) <> 0) then X`09 begin X`09 py.misc.disarm := py.misc.disarm + (tobj.p1 * factor); X`09 end; X`09if (uand(dexterity_worn_bit,tobj.flags) <> 0) then X`09 begin X`09 change_stat(dx,tobj.p1,factor); X`09 print_stat := uor(%X'0002',print_stat); X`09 end; X`09if (uand(constitution_worn_bit,tobj.flags) <> 0) then X`09 begin X`09 change_stat(cn,tobj.p1,factor); X`09 print_stat := uor(%X'0004',print_stat); X`09 end; X`09if (uand(intelligence_worn_bit,tobj.flags) <> 0) then X`09 begin X`09 change_stat(iq,tobj.p1,factor); X`09 print_stat := uor(%X'0008',print_stat); X`09 end; X`09if (uand(wisdom_worn_bit,tobj.flags) <> 0) then X`09 begin X`09 change_stat(ws,tobj.p1,factor); X`09 print_stat := uor(%X'0010',print_stat); X`09 end; X`09if (uand(charisma_worn_bit,tobj.flags) <> 0) then X`09 begin X`09 change_stat(ca,tobj.p1,factor); X`09 print_stat := uor(%X'0020',print_stat); X`09 end; X`09if (uand(searching_worn_bit,tobj.flags) <> 0) then X`09 begin X`09 py.misc.srh := py.misc.srh + (tobj.p1 * factor); X`09 py.misc.fos := py.misc.fos - (tobj.p1 * factor); X`09 end; X`09if (uand(stealth_worn_bit,tobj.flags) <> 0) then X`09 py.misc.stl := py.misc.stl + (tobj.p1 * factor) + factor; X`09if (uand(speed_worn_bit,tobj.flags) <> 0) then X`09 begin X`09 i1 := tobj.p1*factor; X`09 change_speed(-i1); X`09 end; X`09if (uand(blindness_worn_bit,tobj.flags) <> 0) then X`09 if (factor > 0) then X`09 py.flags.blind := py.flags.blind + 1000; X`09if (uand(timidness_worn_bit,tobj.flags) <> 0) then X`09 if (factor > 0) then X`09 py.flags.afraid := py.flags.afraid + 50; X`09if (uand(infra_vision_worn_bit,tobj.flags) <> 0) then X`09 py.flags.see_infra := py.flags.see_infra + (tobj.p1 * factor); X`09if (uand(swimming_worn_bit,tobj.flags2) <> 0) then X`09 begin X`09 i1 := tobj.p1*factor; X`09 end; X`09if (uand(increase_carry_worn_bit,tobj.flags2) <> 0) then X`09 begin X`09 case tobj.p1 of X`09 1 : i1 := 500; X`09 2 : i1 := 1000; X`09 3 : i1 := 1750; X`09 4 : i1 := 2500; X`09 5 : i1 := 3500; X`09 6 : i1 := 4500; X`09 7 : i1 := 6000; X`09 end; X`09 py.misc.xtr_wgt := py.misc.xtr_wgt + i1 * factor; X`09 end; X`09with py.misc do X`09 begin X`09 old_dis_ac := dis_ac; X`09 ptohit := tohit_adj; `7B Real To Hit `7D X`09 ptodam := todam_adj; `7B Real To Dam `7D X`09 ptoac := toac_adj; `7B Real To AC `7D X`09 pac := 0; `7B Real AC `7D X`09 dis_th := ptohit; `7B Display To Hit `7D X`09 dis_td := ptodam; `7B Display To Dam `7D X`09 dis_ac := 0; `7B Display To AC `7D X`09 dis_tac := ptoac; `7B Display AC `7D X`09 for i1 := equipment_min to equip_max-2 do X`09 with equipment`5Bi1`5D do X`09`09if (tval > 0) then X`09`09 begin X`09`09 if (uand(cursed_worn_bit,flags) = 0) then X`09`09 begin X`09`09`09pac := pac + ac; X`09`09`09dis_ac := dis_ac + ac; X`09`09 end; X`09`09 ptohit := ptohit + tohit; X`09`09 ptodam := ptodam + todam; X`09`09 ptoac := ptoac + toac; X`09`09 if (index(name,'`5E') = 0) then X`09`09 begin X`09`09`09dis_th := dis_th + tohit; X`09`09`09dis_td := dis_td + todam; X`09`09`09dis_tac := dis_tac + toac; X`09`09 end; X`09`09 end; X`09 dis_ac := dis_ac + dis_tac; X X`09`09`7B Add in temporary spell increases`09`7D X`09 with py.flags do X`09 begin X`09`09if (invuln > 0) then X`09`09 begin X`09`09 pac := pac + 100; X`09`09 dis_ac := dis_ac + 100; X`09`09 end; X`09`09if (blessed > 0) then X`09`09 begin X`09`09 pac := pac + 5; X`09`09 dis_ac := dis_ac + 5; X`09`09 end; X`09`09if (detect_inv > 0) then X`09`09 see_inv := true; X`09 end; X X`09 if (old_dis_ac <> dis_ac) then X`09 print_stat := uor(%X'0040',print_stat); X`09 item_flags2 := 0; X`09 item_flags := 0; X`09 for i1 := equipment_min to equip_max-2 do X`09 with equipment`5Bi1`5D do X`09`09begin X`09`09 item_flags := uor(item_flags,flags); X`09`09 item_flags2 := uor(item_flags2,flags2); X`09`09end; X`09 with py.flags do X`09 begin X`09`09slow_digest := uand(slow_digestion_worn_bit,item_flags) <> 0; X`09 aggravate := uand(aggravation_worn_bit,item_flags) <> 0; X`09`09teleport := uand(teleportation_worn_bit,item_flags) <> 0; X`09`09regenerate := uand(regeneration_worn_bit,item_flags) <> 0; X`09`09hunger_item := uand(hunger_worn_bit,item_flags2) <> 0; X`09`09fire_resist := uand(resist_fire_worn_bit,item_flags) <> 0; X`09`09acid_resist := uand(resist_acid_worn_bit,item_flags) <> 0; X`09`09cold_resist := uand(resist_cold_worn_bit,item_flags) <> 0; X`09`09free_act := uand(free_action_worn_bit,item_flags) <> 0; X`09`09see_inv := uand(see_invisible_worn_bit,item_flags) <> 0; X`09`09lght_resist := uand(resist_lightning_worn_bit,item_flags) <> 0; X`09`09ffall := uand(feather_fall_worn_bit,item_flags) <> 0; X`09 end; X`09 for i1 := equipment_min to equip_max-2 do X`09 with equipment`5Bi1`5D do X`09`09if (uand(sustain_stat_worn_bit,flags) <> 0) then X`09`09 if ((p1>0) and (p1<7)) then X`09`09 py.flags.sustain`5Bp1-1`5D := true; X`09 with py.flags do X`09 begin X`09`09if (slow_digest) then X`09`09 food_digested := food_digested - 1; X`09`09if (regenerate) then X`09`09 food_digested := food_digested + 3; X`09 end; X`09 end; X end; X X X`09`7B Given an row (y) and col (x), this routine detects -RAK-`09`7D X`09`7B when a move off the screen has occurred and figures new borders`7D X `5Bglobal,psect(moria$code)`5D function get_panel(y,x : integer) : boole Van; X var X`09`09prow,pcol : integer; X begin X`09prow := panel_row; X`09pcol := panel_col; X`09if ((y < panel_row_min + 2) or (y > panel_row_max - 2)) then X`09 begin X`09 prow := trunc((y - 2)/(screen_height/2)); X`09 if (prow > max_panel_rows) then X`09 prow := max_panel_rows; X`09 end; X`09if ((x < panel_col_min + 3) or (x > panel_col_max - 3)) then X`09 begin X`09 pcol := trunc((x - 3)/(screen_width/2)); X`09 if (pcol > max_panel_cols) then X`09 pcol := max_panel_cols; X`09 end; X`09if ((prow <> panel_row) or (pcol <> panel_col) or not(cave_flag)) then X`09 begin X`09 panel_row := prow; X`09 panel_col := pcol; X`09 panel_bounds; X`09 get_panel := true; X`09 cave_flag := true; X`09 end X`09else X`09 get_panel := false; X end; X X X`09`7B Searches for hidden things... `09`09`09-RAK-`09`7D X `5Bglobal,psect(moria$code)`5D procedure search(y,x,chance : integer); X var X`09`09i1,i2 : integer; X begin X`09with py.flags do X`09 if (confused+blind > 0) then X`09 chance := trunc(chance/10.0) X`09 else if (no_light) then X`09 chance := trunc(chance/5.0); X`09for i1 := (y - 1) to (y + 1) do X`09 for i2 := (x - 1) to (x + 1) do X`09 if (in_bounds(i1,i2)) then X`09 if ((i1 <> y) or (i2 <> x)) then X`09`09if (randint(100) < chance) then X`09`09 with cave`5Bi1,i2`5D do X`09`7B Search for hidden objects `7D X`09`09 if (tptr > 0) then X`09`09 with t_list`5Btptr`5D do X`09`09`7B Trap on floor? `7D X`09`09`09if (tval = Unseen_trap) then X`09`09`09 begin X`09`09`09 msg_print('You have found ' + name + '.'); X`09`09`09 change_trap(i1,i2); X`09`09`09 find_flag := false; X`09`09`09 end +-+-+-+-+-+-+-+- END OF PART 14 +-+-+-+-+-+-+-+-