-+-+-+-+-+-+-+-+ START OF PART 40 -+-+-+-+-+-+-+-+ X`7B CON Dart`7D 18: begin X`09`09 if (test_hit(125,0,0,pac+ptoac)) then X`09`09 begin X`09`09`09if (not py.flags.sustain_con) then X`09`09`09 begin X`09`09`09 py.stat.ccon := de_statp(py.stat.ccon); X`09`09`09 take_hit(dam,'a dart trap.'); X`09`09`09 print_stat := uor(%X'0004',print_stat); X`09`09`09 msg_print('A small dart weakens you!'); X`09`09`09 end X`09`09`09else X`09`09`09 msg_print('A small dart hits you.'); X`09`09 end X`09`09 else X`09`09 msg_print('A small dart barely misses you.'); X`09`09 end; X`7BSecret Door`7D 19: ; X`7B Scare Mon`7D 99: ; X X`09`09`09`7B Town level traps are special, the stores...`09`7D X`7B General `7D101: enter_store(1); X`7B Armory `7D102: enter_store(2); X`7B Weaponsmith`7D103: enter_store(3); X`7B Temple `7D104: enter_store(4); X`7B Alchemy `7D105: enter_store(5); X`7B Magic-User `7D106: enter_store(6); X X`09`09otherwise`09msg_print('Unknown trap value'); X`09 end X`09 end X end; X X X`09`7B Return spell number and failure chance`09`09-RAK-`09`7D X function cast_spell(prompt : vtype; X`09`09`09item_val : integer; X`09`09`09var sn,sc : integer; X`09`09`09var redraw : boolean) : boolean; X var X`09`09i2 : unsigned; X`09`09i1,i3 : integer; X`09`09spell : spl_type; X begin X`09i1 := 0; X`09i2 := inventory`5Bitem_val`5D.flags; X`09repeat X`09 i3 := bit_pos(i2); X`09 if (i3 > 0) then X`09 with magic_spell`5Bpy.misc.pclass,i3`5D do X`09 if (slevel <= py.misc.lev) then X`09`09if (learned) then X`09`09 begin X`09`09 i1 := i1 + 1; X`09`09 spell`5Bi1`5D.splnum := i3; X`09`09 end; X`09until(i2 = 0); X`09if (i1 > 0) then X`09 cast_spell := get_spell(spell,i1,sn,sc,prompt,redraw); X`09if (redraw) then X`09 draw_cave; X end; X X X`09`7B Finds range of item in inventory list `09`09-RAK-`09`7D X function find_range(item_val : obj_set; var i2,i3 : integer) : boolean; X var X`09`09i1 : integer; X`09`09flag : boolean; X begin X`09i1 := 0; X`09i2 := 0; X`09i3 := 0; X`09flag := false; X`09while(i1 < inven_ctr) do X`09 begin X`09 i1 := i1 + 1; X`09 if ((inventory`5Bi1`5D.tval in item_val) and (not (flag))) then X`09 begin X`09`09flag := true; X`09`09i2 := i1; X`09 end; X`09 if ((not(inventory`5Bi1`5D.tval in item_val)) and (flag) and X`09`09`09`09`09`09`09`09(i3 = 0)) then X`09 i3 := i1 - 1; X`09 end; X`09if ((flag) and (i3 = 0)) then X`09 i3 := inven_ctr; X`09find_range := flag; X end; X X X`09`7B Examine a Book`09`09`09`09`09-RAK-`09`7D X procedure examine_book; X var X`09`09i2 : unsigned; X`09`09i1,i3,item_val : integer; X`09`09redraw,flag : boolean; X`09`09dummy : char; X`09`09out_val : vtype; X begin X`09redraw := false; X`09if (not(find_range(`5B90,91`5D,i1,i3))) then X`09 msg_print('You are not carrying any books.') X`09else if (get_item(item_val,'Which Book?',redraw,i1,i3)) then X`09 begin X`09 flag := true; X`09 with inventory`5Bitem_val`5D do X`09 if (class`5Bpy.misc.pclass`5D.mspell) then X`09`09begin X`09`09 if (tval <> 90) then X`09`09 begin X`09`09 msg_print('You do not understand the language.'); X`09`09 flag := false; X`09`09 end; X`09`09end X`09 else if (class`5Bpy.misc.pclass`5D.pspell) then X`09`09begin X`09`09 if (tval <> 91) then X`09`09 begin X`09`09 msg_print('You do not understand the language.'); X`09`09 flag := false; X`09`09 end; X`09`09end X`09 else X`09`09begin X`09`09 msg_print('You do not understand the language.'); X`09`09 flag := false; X`09`09end; X`09 if (flag) then X`09 begin X`09`09redraw := true; X`09`09i1 := 0; X`09`09i2 := inventory`5Bitem_val`5D.flags; X`09`09clear(1,1); X`09writev(out_val,' Name Level Mana Known'); X`09`09prt(out_val,1,1); X`09`09repeat X`09`09 i3 := bit_pos(i2); X`09`09 if (i3 > 0) then X`09`09 with magic_spell`5Bpy.misc.pclass,i3`5D do X`09`09 begin X`09`09`09i1 := i1 + 1; X`09`09`09if (slevel < 99) then X`09`09`09 begin X`09`09`09 writev(out_val,chr(96+i1),') ',pad(sname,' ',30), X`09`09`09`09slevel:2,' ',smana:2,' ',learned); X`09`09`09 prt(out_val,i1+1,1); X`09`09`09 end X`09`09`09else X`09`09`09 prt('',i1+1,1); X`09`09 end; X`09`09until (i2 = 0); X`09`09prt('`5BPress any key to continue`5D',24,20); X`09`09inkey(dummy); X`09 end; X`09 end; X`09if (redraw) then draw_cave; X end; X X X`09`7B Player is on an object. Many things can happen BASED -RAK-`09`7D X`09`7B on the TVAL of the object. Traps are set off, money and most `7D X`09`7B objects are picked up. Some objects, such as open doors, just`7D X`09`7B sit there... `7D X procedure carry(y,x : integer); X var X`09item_val : integer; X`09out_val : vtype; X begin X`09find_flag := false; X`09with cave`5By,x`5D do X`09 begin X`09 inventory`5Binven_max`5D := t_list`5Btptr`5D; X`09`09`7B There's GOLD in them thar hills! `7D X`09 if (t_list`5Btptr`5D.tval = 100) then X`09 begin X`09`09pusht(tptr); X`09`09tptr := 0; X`09`09with inventory`5Binven_max`5D do X`09`09 begin X`09`09 py.misc.au := py.misc.au + cost; X`09`09 writev(out_val,'You have found ',cost:1, X`09`09`09`09' gold pieces worth of ',name,'.'); X`09`09 end; X`09`09prt_gold; X`09`09msg_print(out_val); X`09 end X`09`09`7B OPPS! `7D X`09 else if (t_list`5Btptr`5D.tval in trap_set) then X`09 hit_trap(y,x) X`09`09`7B Attempt to pick up an object. `7D X`09 else if (t_list`5Btptr`5D.tval < 100) then X`09 begin X`09`09if (inven_check_weight) then `7B Weight limit check `7D X`09`09 if (inven_check_num) then `7B Too many objects? `7D X`09`09 begin `7B Okay, pick it up `7D X`09`09 pusht(tptr); X`09`09 tptr := 0; X`09`09 inven_carry(item_val); X`09`09 objdes(out_val,item_val,true); X`09`09 out_val := 'You have ' + out_val + ' (' + X`09`09`09`09chr(item_val+96) + cur_char1(item_val); X`09`09 msg_print(out_val); X`09`09 end X`09`09 else X`09`09 msg_print('You can''t carry that many items.') X`09`09else X`09`09 msg_print('You can''t carry that much weight.'); X`09 end; X`09 end; X end; X X X`09`7B Drop an object being carried`09`09`09`09-RAK-`09`7D X`09`7B Note: Only one object per floor spot... `7D X procedure drop; X var X`09`09com_val,i1,i2 : integer; X`09`09redraw : boolean; X`09`09out_val : vtype; X begin X`09if (inven_ctr > 0) then X`09 begin X`09 if (get_item(com_val,'Which one? ',redraw,1,inven_ctr)) then X`09 begin X`09`09if (redraw) then draw_cave; X`09`09with cave`5Bchar_row,char_col`5D do X`09`09 if (tptr > 0) then X`09`09 msg_print('There is something there already.') X`09`09 else X`09`09 begin X`09`09 inven_drop(com_val,char_row,char_col); X`09`09 objdes(out_val,inven_max,true); X`09`09 out_val := 'Dropped ' + out_val; X`09`09 msg_print(out_val); X`09`09 end X`09 end X`09 else if (redraw) then X`09 draw_cave; X`09 end X`09else X`09 msg_print('You are not carrying anything.'); X end; X X X`09`7B Deletes a monster entry from the level`09`09-RAK-`09`7D X procedure delete_monster(i2 : integer); X var X`09`09i1,i3 : integer; X begin X`09i1 := muptr; X`09i3 := m_list`5Bi2`5D.nptr; X`09if (i1 = i2) then X`09 muptr := i3 X`09else X`09 begin X`09 while (m_list`5Bi1`5D.nptr <> i2) do X`09 i1 := m_list`5Bi1`5D.nptr; X`09 m_list`5Bi1`5D.nptr := i3; X`09 end; X`09with m_list`5Bi2`5D do X`09 begin X`09 cave`5Bfy,fx`5D.cptr := 0; X`09 if (ml) then X`09 with cave`5Bfy,fx`5D do X`09`09if ((pl) or (tl)) then X`09`09 lite_spot(fy,fx) X`09`09else X`09`09 unlite_spot(fy,fx); X`09 pushm(i2); X`09 end; X`09mon_tot_mult := mon_tot_mult - 1; X end; X X X`09`7B Makes sure new creature gets lit up`09`09`09-RAK-`09`7D X procedure check_mon_lite(y,x : integer); X begin X with cave`5By,x`5D do X`09if (cptr > 1) then X`09 if (not(m_list`5Bcptr`5D.ml)) then X`09 if ((tl) or (pl)) then X`09 if (los(char_row,char_col,y,x)) then X`09`09begin X`09`09 m_list`5Bcptr`5D.ml := true; X`09`09 lite_spot(y,x); X`09`09end; X end; X X X`09`7B Places creature adjacent to given location`09`09-RAK-`09`7D X`09`7B Rats and Flys are fun! `7D X procedure multiply_monster(y,x,z : integer; slp : boolean); X var X`09i1,i2,i3 : integer; X begin X i1 := 0; X repeat X`09i2 := y - 2 + randint(3); X`09i3 := x - 2 + randint(3); X`09if (in_bounds(i2,i3)) then X`09 with cave`5Bi2,i3`5D do X`09 if (fval in floor_set) then X`09 if ((tptr = 0) and (cptr <> 1)) then X`09`09begin X`09`09 if (cptr > 1) then `7B Creature there already? `7D X`09`09 begin X`09`09`09`7B Some critters are canabalistic! `7D X`09`09 if (uand(c_list`5Bz`5D.cmove,%X'00080000') <> 0) then X`09`09`09begin X`09`09`09 delete_monster(cptr); X`09`09`09 place_monster(i2,i3,z,slp); X`09`09`09 check_mon_lite(i2,i3); X`09`09`09 mon_tot_mult := mon_tot_mult + 1; X`09`09`09end; X`09`09 end X`09`09 else X`09`09`09`7B All clear, place a monster `7D X`09`09 begin X`09`09 place_monster(i2,i3,z,slp); X`09`09 check_mon_lite(i2,i3); X`09`09 mon_tot_mult := mon_tot_mult + 1; X`09`09 end; X`09`09 i1 := 18; X`09`09end; X`09i1 := i1 + 1; X until (i1 > 18); X end; X X X`09`7B Creates objects nearby the coordinates given`09`09-RAK-`09`7D X`09`7B BUG: Because of the range, objects can actually be placed into`7D X`09`7B areas closed off to the player, this is rarely noticable,`7D X`09`7B and never a problem to the game. `7D X procedure summon_object(y,x,num,typ : integer); X var X`09i1,i2,i3 : integer; X begin X repeat X`09i1 := 0; X`09repeat X`09 i2 := y - 3 + randint(5); X`09 i3 := x - 3 + randint(5); X`09 if (in_bounds(i2,i3)) then X`09 with cave`5Bi2,i3`5D do X`09 if (fval in floor_set) then X`09`09if (tptr = 0) then X`09`09 begin X`09`09 case typ of `7B Select type of object `7D X`09`09 1 : place_object(i2,i3); X`09`09 2 : place_gold(i2,i3); X`09`09 3 : if (randint(100) < 50) then X`09`09`09 place_object(i2,i3) X`09`09`09 else X`09`09`09 place_gold(i2,i3); X`09`09 otherwise ; X`09`09 end; X`09`09 if (test_light(i2,i3)) then X`09`09 lite_spot(i2,i3); X`09`09 i1 := 10; X`09`09 end; X`09 i1 := i1 + 1; X`09until (i1 > 10); X`09num := num - 1; X until (num = 0); X end; X X X`09`7B Deletes object from given location`09`09`09-RAK-`09`7D X function delete_object(y,x : integer) : boolean; X begin X delete_object := false; X with cave`5By,x`5D do X`09begin X`09 if (t_list`5Btptr`5D.tval = 109) then X`09 fval := corr_floor3.ftval; X`09 fopen := true; X`09 pusht(tptr); X`09 tptr := 0; X`09 fm := false; X`09 if (test_light(y,x)) then X`09 begin X`09 lite_spot(y,x); X`09 delete_object := true; X`09 end X`09 else X`09 unlite_spot(y,x); X`09end; X end; X X X`09`7B Allocates objects upon a creatures death`09`09-RAK-`09`7D X`09`7B Oh well, another creature bites the dust... Reward the victor`7D X`09`7B based on flags set in the main creature record `7D X procedure monster_death(y,x : integer; flags : unsigned); X var X`09i1 : integer; X begin X if (uand(flags,%X'01000000') <> 0) then X`09i1 := 1 X else X`09i1 := 0; X if (uand(flags,%X'02000000') <> 0) then X`09i1 := i1 + 2; X if (uand(flags,%X'04000000') <> 0) then X`09if (randint(100) < 60) then X`09 summon_object(y,x,1,i1); X if (uand(flags,%X'08000000') <> 0) then X`09if (randint(100) < 90) then X`09 summon_object(y,x,1,i1); X if (uand(flags,%X'10000000') <> 0) then X`09summon_object(y,x,randint(2),i1); X if (uand(flags,%X'20000000') <> 0) then X`09summon_object(y,x,damroll('2d2'),i1); X if (uand(flags,%X'40000000') <> 0) then X`09summon_object(y,x,damroll('4d3'),i1); X if (uand(flags,%X'80000000') <> 0) then X`09begin X`09 total_winner := true; X`09 prt_winner; X`09 msg_print('*** CONGRATULATIONS *** You have won the game...'); X`09 msg_print('Use -Y when you are ready to quit.'); X`09end; X end; X X X`09`7B Decreases monsters hit points and deletes monster in needed.`09`7D X`09`7B (Picking on my babies...) -RAK- `7D X function mon_take_hit(monptr,dam : integer) : integer; X var X`09acc_tmp : real; X begin X`09with m_list`5Bmonptr`5D do X`09 begin X`09 hp := hp - dam; X`09 csleep := 0; X`09 if (hp < 0) then X`09 begin X`09`09monster_death(fy,fx,c_list`5Bmptr`5D.cmove); X`09`09with c_list`5Bmptr`5D do X`09`09 with py.misc do X`09`09 begin X`09`09 acc_tmp := mexp*((level+0.1)/lev); X`09`09 i1 := trunc(acc_tmp); X`09`09 acc_exp := acc_exp + (acc_tmp - i1); X`09`09 if (acc_exp > 1) then X`09`09`09begin X`09`09`09 i1 := i1 + 1; X`09`09`09 acc_exp := acc_exp - 1.0; X`09`09`09end; X`09`09 exp := exp + i1; X`09`09 if (i1 > 0) then prt_experience; X`09`09 end; X`09`09mon_take_hit := mptr; X`09`09delete_monster(monptr); X`09 end X`09 else X`09 mon_take_hit := 0; X`09 end X end; X X X`09`7B Special damage due to magical abilities of object`09-RAK-`09`7D X function tot_dam(item : treasure_type; tdam : integer; X`09`09 monster : creature_type) : integer; X begin X`09with item do X`09 if (tval in `5B10,11,12,20,21,22,23,77`5D) then X`09 with monster do X`09 begin X`09`09`7B Slay Dragon `7D X`09`09if ((uand(cdefense,%X'0001') <> 0) and X`09`09 (uand(flags,%X'00002000') <> 0)) then X`09`09 tdam := tdam*4 X`09`09`7B Slay Undead `7D +-+-+-+-+-+-+-+- END OF PART 40 +-+-+-+-+-+-+-+-