-+-+-+-+-+-+-+-+ START OF PART 104 -+-+-+-+-+-+-+-+ X`09treas_any_alloc`09`09: `5Bpsect(generate$data)`5D integer; X`09`7B Amount of gold (and gems)`09`09`09`7D X`09treas_gold_alloc`09: `5Bpsect(generate$data)`5D integer; X`09`7B 1/n Chance of item being a Great Item `09`7D X`09obj_great`09`09: `5Bpsect(moria$data)`5D integer; X`09`7B Adjust STD per level`09`09`09`09`7D X`09obj_std_adj`09`09: `5Bpsect(moria$data)`5D real; X`09`7B Minimum STD`09`09`09`09`09`7D X`09obj_std_min`09`09: `5Bpsect(moria$data)`5D integer; X`09`7B Town object generation level`09`09`09`7D X`09obj_town_level`09`09: `5Bpsect(moria$data)`5D integer; X`09`7B Base amount of magic`09`09`09`09`7D X`09obj_base_magic`09`09: `5Bpsect(moria$data)`5D integer; X`09`7B Max amount of magic`09`09`09`09`7D X`09obj_base_max`09`09: `5Bpsect(moria$data)`5D integer; X`09`7B magic_chance/# = special magic`09`09`7D X`09obj_div_special`09`09: `5Bpsect(moria$data)`5D integer; X`09`7B magic_chance/# = cursed items`09`09`09`7D X`09obj_div_cursed`09`09: `5Bpsect(moria$data)`5D real; X`09`7B High value slows multiplication`09`09`7D X`09mon_mult_adj`09`09: `5Bpsect(moria$data)`5D integer; X`09`7B Dun_level/x chance of high level creature`09`7D X`09mon_nasty`09`09: `5Bpsect(moria$data)`5D integer; X X`09`7B Following are feature objects defined for dungeon`09`09`7D X`09trap_lista`09`09: `5Bpsect(generate$data)`5D X`09`09`09`09 array `5B1..max_trapa`5D of treasure_type; X`09trap_listb`09`09: `5Bpsect(generate$data)`5D X`09`09`09`09 array `5B1..max_trapb`5D of treasure_type; X`09scare_monster`09`09: `5Bpsect(generate$data)`5D X`09`09`09`09 treasure_type;`09`7B Special trap`09`7D X`09some_rubble`09`09: `5Bpsect(generate$data)`5D X`09`09`09`09 treasure_type; X`09door_list`09`09: `5Bpsect(generate$data)`5D X`09`09`09`09 array `5B1..3`5D`09`09 of treasure_type; X`09up_stair`09`09: `5Bpsect(generate$data)`5D X`09`09`09`09 treasure_type; X`09down_stair`09`09: `5Bpsect(generate$data)`5D X`09`09`09`09 treasure_type; X`09up_steep`09`09: `5Bpsect(generate$data)`5D X`09`09`09`09 treasure_type; X`09down_steep`09`09: `5Bpsect(generate$data)`5D X`09`09`09`09 treasure_type; X X`09`7B Following are creature arrays and variables`09`09`09`7D X`09c_list`09`09: `5Bpsect(moria$data)`5D X`09`09`09 array `5B1..max_creatures`5D of creature_type; X`09m_list`09`09: `5Bpsect(moria$data)`5D X`09`09`09 array `5B0..max_malloc`5D of monster_type; X`09m_level`09`09: `5Bpsect(generate$data)`5D X`09`09`09 array `5B0..max_mons_level`5D of integer; X`09blank_monster`09: `5Bpsect(generate$data)`5D X`09`09`09 monster_type;`09`7B Blank monster values`09`7D X`09muptr`09`09: `5Bpsect(generate$data)`5D X`09`09`09 integer;`09`7B Cur used monster ptr`09`7D X`09mfptr`09`09: `5Bpsect(generate$data)`5D X`09`09`09 integer;`09`7B Cur free monster ptr`09`7D X`09mon_tot_mult`09: `5Bpsect(moria$data)`5D X`09`09`09 integer;`09`7B # of repro's of creature`09`7D X X`09`7B Following are arrays for descriptive pieces`09`09`09`7D X`09colors`09`09`09: `5Bpsect(setup$data)`5D X`09`09`09`09 array `5B1..max_colors`5D`09 of atype; X`09mushrooms`09`09: `5Bpsect(setup$data)`5D X`09`09`09`09 array `5B1..max_mush`5D of atype; X`09woods`09`09`09: `5Bpsect(setup$data)`5D X`09`09`09`09 array `5B1..max_woods`5D of atype; X`09metals`09`09`09: `5Bpsect(setup$data)`5D X`09`09`09`09 array `5B1..max_metals`5D of atype; X`09horns`09`09`09: `5Bpsect(setup$data)`5D X`09`09`09`09 array `5B1..max_horns`5D`09 of atype; X`09rocks`09`09`09: `5Bpsect(setup$data)`5D X`09`09`09`09 array `5B1..max_rocks`5D of atype; X`09amulets`09`09`09: `5Bpsect(setup$data)`5D X`09`09`09`09 array `5B1..max_amulets`5D of atype; X`09cloths`09`09`09: `5Bpsect(setup$data)`5D X`09`09`09`09 array `5B1..max_cloths`5D of atype; X`09syllables`09`09: `5Bpsect(setup$data)`5D X`09`09`09`09 array `5B1..max_syllables`5D of dtype; X`09vowel_set`09`09: `5Bpsect(moria$data)`5D X`09`09`09`09 char_set; X X`09`7B Following are variables for the Save Character Routines`09`7D X`09finam`09`09`09: `5Bpsect(save$data)`5D X`09`09`09`09 vtype; X`09key_rec`09`09`09: `5Bpsect(save$data)`5D X`09`09`09`09 key_type; X X`09`7B Cursor variables, used for cursor positioning`09`09`09`7D X`09cursor_r`09: `5Bpsect(io$data),global`5D X`09`09`09 array `5B1..24`5D of varying`5B10`5D of char; X`09curlen_r`09: `5Bpsect(io$data),global`5D integer; X`09cursor_c`09: `5Bpsect(io$data),global`5D X`09`09`09 array `5B1..80`5D of varying`5B10`5D of char; X`09curlen_c`09: `5Bpsect(io$data),global`5D integer; X`09cursor_l`09: `5Bpsect(io$data),global`5D integer; X`09row_first`09: `5Bpsect(io$data),global`5D boolean; X`09cursor_erl`09: `5Bpsect(io$data),global`5D varying`5B10`5D of char; X`09cursor_erp`09: `5Bpsect(io$data),global`5D varying`5B10`5D of char; $ CALL UNPACK VARIABLES.INC;1 891537188 $ create 'f' X`09`7B Wands for the aiming...`09`09`09`09`7D X`5Bpsect(misc2$code)`5D procedure aim; X var X`09`09i1`09`09`09`09: unsigned; X`09`09i3,i4,chance,i5`09`09`09: integer; X`09`09dir`09`09`09`09: integer; X`09`09i2,item_ptr`09`09`09: treas_ptr; X`09`09dumy,y_dumy,x_dumy`09`09: integer; X`09`09out_val`09`09`09`09: vtype; X`09`09redraw,ident`09`09`09: boolean; X begin X`09redraw := false; X`09reset_flag := true; X`09if (inven_ctr > 0) then X`09 begin X`09 if (find_range(`5BWand`5D,false,i2,i3)) then X`09 begin X`09`09if (get_item(item_ptr,'Aim which wand?',redraw,i3,trash_char,false)) t Vhen X`09`09 with item_ptr`5E.data do X`09`09 begin X`09`09 if (redraw) then draw_cave; X`09`09 reset_flag := false; X`09`09 redraw := false; X`09`09 y_dumy := char_row; X`09`09 x_dumy := char_col; X`09`09if (get_dir('Which direction?',dir,dumy,y_dumy,x_dumy)) then X`09`09`09begin X`09`09`09 if (py.flags.confused > 0) then X`09`09`09 begin X`09`09`09 msg_print('You are confused...'); X`09`09`09 repeat X`09`09`09`09dir := randint(9); X`09`09`09 until(dir <> 5); X`09`09`09 end; X`09`09`09 i1 := flags; X`09`09`09 ident := false; X`09`09`09 with py.misc do X`09`09`09 chance := save + lev + spell_adj(iq) - level; X`09`09`09 if (py.flags.confused > 0) then X`09`09`09 chance := trunc(chance/2.0); X`09`09`09 if (chance < 0) then chance := 0; X`09`09`09 if (randint(chance) < use_device) then X`09`09`09 msg_print('You failed to use the wand properly.') X`09`09`09 else if (p1 > 0) then X`09`09`09 begin X`09`09`09 p1 := p1 - 1; X`09`09`09 while (i1 > 0) do X`09`09`09`09begin X`09`09`09`09 i5 := bit_pos(i1); X`09`09`09`09 i3 := char_row; X`09`09`09`09 i4 := char_col; X`09`7B Wands`09`09`09`09`09`09`09`7D X`09case (i5) of X`09 1 :`09begin X`09`09 msg_print('A line of blue shimmering light appears.'); X`09`09 light_line(dir,char_row,char_col,1); X`09`09 ident := true; X`09`09end; X`09 2 :`09begin X`09`09 fire_bolt(c_lightning,dir,i3,i4,damroll('3d8') X`09`09`09,'Lightning Bolt'); X`09`09 ident := true; X`09`09end; X`09 3 :`09begin X`09`09 fire_bolt(c_cold,dir,i3,i4,damroll('4d8'),'Frost Bolt'); X`09`09 ident := true; X`09`09end; X`09 4 :`09begin X`09`09 fire_bolt(c_fire,dir,i3,i4,damroll('6d8'),'Fire Bolt'); X`09`09 ident := true; X`09`09end; X`09 5 :`09ident := wall_to_mud(dir,i3,i4); X`09 6 :`09ident := poly_monster(dir,i3,i4); X`09 7 :`09ident := zap_monster(dir,i3,i4,-damroll('4d6'),c_hp); X`09 8 :`09ident := zap_monster(dir,i3,i4,1,c_speed); X`09 9 :`09ident := zap_monster(dir,i3,i4,-1,c_speed); X`09 10 :`09ident := zap_monster(dir,i3,i4,0,c_confuse); X`09 11 :`09ident := zap_monster(dir,i3,i4,0,c_sleep); X`09 12 :`09ident := zap_monster(dir,i3,i4,50,c_drain); X`09 13 :`09ident := td_destroy2(dir,i3,i4); X`09 14 :`09begin X`09`09 fire_bolt(0,dir,i3,i4,damroll('2d6'),'Magic Missile'); X`09`09 ident := true; X`09`09end; X`09 15 :`09ident := build_wall(dir,i3,i4); X`09 16 :`09ident := clone_monster(dir,i3,i4); X`09 17 :`09ident := teleport_monster(dir,i3,i4); X`09 18 :`09ident := disarm_all(dir,i3,i4); X`09 19 :`09begin X`09`09 fire_ball(c_lightning,dir,i3,i4,24,'Lightning Ball'); X`09`09 ident := true; X`09`09end; X`09 20 :`09begin X`09`09 fire_ball(c_cold,dir,i3,i4,32,'Cold Ball'); X`09`09 ident := true; X`09`09end; X`09 21 :`09begin X `09`09 fire_ball(c_fire,dir,i3,i4,48,'Fire Ball'); X `09`09 ident := true; X`09`09end; X`09 22 :`09begin X`09`09 fire_ball(c_gas,dir,i3,i4,8,'Stinking Cloud'); X`09`09 ident := true; X`09`09end; X`09 23 :`09begin X`09`09 fire_ball(c_acid,dir,i3,i4,40,'Acid Ball'); X`09`09 ident := true; X`09`09end; X`09 24 :`09i1 := 2**(randint(24) - 1); X`09 25 : ident := zap_monster(dir,i3,i4,0,c_probe); X`09 otherwise ; X`09end; X`09`7B End of Wands...`09`09`09`09`09`7D X`09`09`09`09end; X`09`09`09 if (ident) then X`09`09`09`09identify(item_ptr`5E.data); X`09`09`09 if (flags <> 0) then X`09`09`09`09with py.misc do X`09`09`09`09 begin X`09`09`09`09 exp := exp + round(level/lev); X`09`09`09`09 prt_experience; X`09`09`09`09 end; X`09`09`09 desc_charges(item_ptr); X`09`09`09 end X`09`09`09end X`09`09 end X`09 end X`09 else X`09 msg_print('You are not carrying any wands.'); X`09 end X`09else X`09 msg_print('But you are not carrying anything.'); X`09if (redraw) then draw_cave; X end; $ CALL UNPACK WANDS.INC;1 1644223679 $ create 'f' X`5Binherit('moria.env','dungeon.env')`5D module wizard; Xtype X`09data_array`09= array `5B1..max_objects`5D of treasure_type; X`09`7B Print Moria credits`09`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(misc1$code)`5D procedure game_version; X var X`09tmp_str`09`09`09: vtype; X begin X`09clear(1,1); X`09writev(tmp_str,' Moria Version ',cur_version:3:2); Xput_buffer(tmp_str,1,1); Xput_buffer('Version 0.1 : 03/25/83',2,1); Xput_buffer('Version 1.0 : 05/01/84',3,1); Xput_buffer('Version 2.0 : 07/10/84',4,1); Xput_buffer('Version 3.0 : 11/20/84',5,1); Xput_buffer('Version 4.0 : 01/20/85',6,1); Xput_buffer('Modules :',8,1); Xput_buffer(' V1.0 Dungeon Generator - RAK',9,1); Xput_buffer(' Character Generator - RAK & JWT',10,1); Xput_buffer(' Moria Module - RAK',11,1); Xput_buffer(' Miscellaneous - RAK & JWT',12,1); Xput_buffer(' V2.0 Town Level & Misc - RAK',13,1); Xput_buffer(' V3.0 Internal Help & Misc - RAK',14,1); Xput_buffer(' V4.0 Source Release Version - RAK',15,1); Xput_buffer('Robert Alan Koeneke Jimmey Wayne Todd Jr.',17,1); Xput_buffer('Student/University of Oklahoma Student/University of Oklahoma V',18,1); Xput_buffer('119 Crystal Bend 1912 Tiffany Dr.',19,1); Xput_buffer('Norman, OK 73069 Norman, OK 73071',20,1); Xput_buffer('(405)-321-2925 (405) 360-6792',21,1); X`09pause(24); X`09draw_cave; X end; X X X`09`7B Light up the dungeon`09`09`09`09`09-RAK-`09`7D X`5Bglobal,psect(wizard$code)`5D procedure wizard_light; X var X`09i1,i2,i3,i4`09: integer; X`09flag`09`09: boolean; X begin X if (cave`5Bchar_row,char_col`5D.pl) then X`09flag := false X else X`09flag := true; X for i1 := 1 to cur_height do X`09for i2 := 1 to cur_width do X`09 if (cave`5Bi1,i2`5D.fval in floor_set) then X`09 for i3 := i1-1 to i1+1 do X`09 for i4 := i2-1 to i2+1 do X`09`09with cave`5Bi3,i4`5D do X`09`09 begin X`09`09 pl := flag; X`09`09 if (not(flag)) then X`09`09 fm := false; X`09`09 end; X prt_map; X detect_trap ; X detect_sdoor ; X end; X X`09`7B Wizard routine for summoning a specific monster -RAD- `7D X `5Bglobal,psect(wizard$code)`5D procedure monster_summon_by_name( X`09`09y,x`09: integer; X`09`09name`09: ctype; X`09`09present`09: boolean; X`09`09sleepy`09: boolean); X var X`09i1,i2,i3,i4 `09`09: integer; X`09monster`09`09`09: ctype; X`09junk`09`09`09: boolean; X begin X if not(present) then X`09begin X`09 prt('Monster desired: ',1,1); X`09 junk := (get_string(monster,1,19,26)); X`09end X else X`09begin X`09 monster := name; X`09 junk := true; X`09end; X if junk then begin X`09i2 := 0; X`09readv(monster,i2,error:=continue); X`09if (i2 < 0) then i2 := 1; X`09if (i2 > max_creatures) then i2 := max_creatures; X`09if (i2 > 0) and (i2 <= max_creatures) then X`09 begin X`09 i1 := 0; X`09 repeat X`09 i3 := y - 2 + randint(3); X`09 i4 := x - 2 + randint(3); X`09 if (in_bounds(i3,i4)) then X`09`09with cave`5Bi3,i4`5D do X`09`09 if (fval in floor_set) then X`09`09 if (fopen) then X`09`09 begin X`09`09`09place_monster(i3,i4,i2,sleepy); X`09`09`09i1 := 8; X`09`09`09y := i3; X`09`09`09x := i4; X`09`09 end; X`09 i1 := i1 + 1; X`09 until (i1 > 8); X`09 end X`09else X`09for i2 := 1 to max_creatures do X`09 if (index(c_list`5Bi2`5D.name,monster)<>0) AND (i1<>10) then X`09`09begin X`09`09 i1 := 0; X`09`09 repeat X`09`09`09i3 := y - 2 + randint(3); X`09`09`09i4 := x - 2 + randint(3); X`09`09`09if (in_bounds(i3,i4)) then X`09`09`09 with cave`5Bi3,i4`5D do X`09`09`09 if (fval in floor_set) then X`09`09`09`09 if (cptr=0) then X`09`09`09`09 if (fopen) then X`09`09`09`09 begin X`09`09`09`09`09 place_monster(i3,i4,i2,sleepy); X`09`09`09`09`09 i1 := 9; X`09`09`09`09`09 y := i3; X`09`09`09`09`09 x := i4; X`09`09`09`09 end; X`09`09`09i1 := i1 + 1; X`09`09 until (i1>9); X`09`09end; X end; X if not(present) then erase_line(msg_line,msg_line); X end; X X X`09`7B Wizard routine to pick an item from the entire list, and X`09 magic it until satisfied`09`09`09`09-DMF-`09`7D X function wizard_moo_item(var back : treasure_type) : boolean; X const X`09display_size = 18; X type X`09list_elem = record X`09`09data`09: treasure_type; X`09`09next`09: `5Elist_elem; X`09end; X`09list_elem_ptr = `5Elist_elem; X var X`09data_list`09: list_elem_ptr; X`09cur_top`09`09: list_elem_ptr; X`09blegga`09`09: list_elem_ptr; X`09curse`09`09: list_elem_ptr; X`09cur_display`09: array `5B1..display_size`5D of list_elem_ptr; X`09cur_display_size: integer; X`09i1,i2,i3,i4`09: integer; X`09temp`09`09: string; X`09exit_flag`09: boolean;`09 X procedure init_data_list;`20 X `7B Code streamlined a bit by Dean Yasuda, to eliminate the X inefficient quicksort/shell-sort combination. Exact duplicate X items eliminated from output list. --MAV `7D X var +-+-+-+-+-+-+-+- END OF PART 104 +-+-+-+-+-+-+-+-