-+-+-+-+-+-+-+-+ START OF PART 9 -+-+-+-+-+-+-+-+ Vnteger; X `20 X var X`09count`09`09: integer; X`09maybe`09`09: boolean; X X`09begin X`09 maybe := false; X`09 for count := 1 to max_creatures do X`09 begin X`09 if (not maybe) then X`09 begin X`09 if (virtual_name = c_list`5Bcount`5D.name) then`20 X`09 begin X`09`09 find_mon := count; X`09`09 maybe := true; X`09 end; X`09 end; X`09 end; X`09 if (maybe = false) then find_mon := 0; X`09end; X X X`09`7B Makes sure new creature gets lit up`09`09`09-RAK-`09`7D X `5Bglobal,psect(creature$code)`5D 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 Flies are fun! `7D X `5Bglobal,psect(creature$code)`5D procedure multiply_monster(y,x,z : integ Ver; slp : boolean); X var X`09i1,i2,i3 : integer; X 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 `5Bglobal,psect(creature$code)`5D procedure creatures(attack : boolean); X var X`09`09i1,i2,i3,moldy,moldx : integer; X`09`09hear_count`09`09: integer; X X procedure update_mon(monptr : integer); X`09var X`09`09flag : boolean; X`09`09h_range,s_range`09: integer;`09 X`09begin X`09 with m_list`5Bmonptr`5D do X`09 with cave`5Bfy,fx`5D do X`09 begin X`09`09flag := false; X`09`09if (fval in water_set) and`09`7Bin water, not flying`7D X`09`09 (uand(c_list`5Bmptr`5D.cmove,%X'00800000') = 0) then X`09`09 begin X`09`09 h_range := 10; X`09`09 s_range := 5; X`09`09 end X`09`09else X`09`09 begin X`09`09 h_range := -1; X`09`09 s_range := max_sight; X`09`09 end; X`09`09if ((py.flags.blind < 1) and panel_contains(fy,fx)) then X`09`09 if (wizard2) then X`09`09 flag := true X`09`09 else if (los(char_row,char_col,fy,fx) and (cdis <= s_range)) then X`09`09 with c_list`5Bmptr`5D do X`09`09 if ((pl) or (tl)) then`09`7Bcan see creature?`7D X`09`09`09flag := py.flags.see_inv or (uand(%X'10000',cmove)=0) X`09`09 else if (py.flags.see_infra > 0) then`09`7Binfravision?`7D X`09`09`09flag := (cdis <= py.flags.see_infra) and (uand(%X'2000',cdefense) < V> 0); X`09`09if (los(char_row,char_col,fy,fx) and (not flag) and X`09`09 (cdis <= h_range)) then `7Bnoise in water?`7D X`09`09 hear_count := hear_count + 1; X`09`7B Light it up... `7D X`09`09if (flag) then X`09`09 begin X`09`09 if (not(ml)) then X`09`09 begin X`09`09`09print(c_list`5Bmptr`5D.cchar,fy,fx); X`09`09`09ml := true; X`09`09`09if (search_flag) then X`09`09`09 search_off; X`09`09`09if (py.flags.rest > 0) then X`09`09`09 rest_off; X`09`09`09flush; X`09`09`09if (find_flag) then X`09`09`09 begin X`09`09`09 find_flag := false; X`09`09`09 move_char(5); X`09`09`09 end; X`09`09 end; X`09`09 end X`09`7B Turn it off... `7D X`09`09else if (ml) then X`09`09 begin X`09`09 ml := false; X`09`09 if ((tl) or (pl)) then X`09`09 lite_spot(fy,fx) X`09`09 else X`09`09 unlite_spot(fy,fx); X`09`09 end; X`09 end; X`09end; X X X`09`7B Move the critters about the dungeon`09`09`09-RAK-`09`7D X function mon_move(monptr : integer) : boolean; X`09type X`09`09mm_type = array `5B1..5`5D of integer; X`09var X`09`09i1,i2,i3 : integer; X`09`09mm : mm_type; X`09`09out_val : vtype; X`09`09move_test : boolean; X X`09`7B Choose correct directions for monster movement`09-RAK-`09`7D X`09procedure get_moves(monptr : integer; var mm : mm_type); X`09 var X`09`09move_val,octant_side,a_cptr : integer; X`09`7B octant_side = +/-1 `7D X`09 begin X`09 if (m_list`5Bmonptr`5D.csleep <> 0) then m_list`5Bmonptr`5D.csleep := V 0; X`09 y := char_row - m_list`5Bmonptr`5D.fy; X`09 x := char_col - m_list`5Bmonptr`5D.fx; X`09 move_val := get_hexdecant(y,x); X`09 octant_side := 2*(move_val mod 2)-1; X`09 mm`5B1`5D := key_of`5Bmove_val div 2`5D; X`09 mm`5B2`5D := rotate_dir(mm`5B1`5D,octant_side); X`09 mm`5B3`5D := rotate_dir(mm`5B1`5D,-octant_side); X`09 mm`5B4`5D := rotate_dir(mm`5B2`5D,octant_side); X`09 mm`5B5`5D := rotate_dir(mm`5B3`5D,-octant_side); X`09 end; X X X`09`7B Make an attack on the player (chuckle...)`09`09-RAK-`09`7D X`09procedure make_attack(monptr : integer); X`09 var X`09`09xpos,atype,adesc,dam : integer; X`09`09acount`09`09`09: integer; X`09`09i1,i2,i3,i4,i5 : integer; X`09`09attstr,attx : vtype; X`09`09cdesc,mdesc,ddesc : vtype; X`09`09damstr : etype; X`09`09flag : boolean; X`09`09ident`09`09`09: boolean; X`09`09item_ptr`09`09: treas_ptr; X`09 begin X`09 with m_list`5Bmonptr`5D do X`09 with c_list`5Bmptr`5D do X`09 begin X`09`09attstr := damage; X`09`09find_monster_name( cdesc, monptr, true ); X`09`09cdesc := cdesc + ' '; X`09`09`7B For 'DIED_FROM' string `7D X`09`09if (uand(%X'80000000',cmove) <> 0) then X`09`09 ddesc := 'The ' + name X`09`09else X`09`09 ddesc := '& ' + name; X`09`09inven_temp`5E.data.name := ddesc; X`09`09inven_temp`5E.data.number := 1; X`09`09objdes(ddesc,inven_temp,true); X`09`09died_from := ddesc; X`09`09`7B End DIED_FROM `7D X`09`09while (length(attstr) > 0) do X`09`09 begin X`09`09 xpos := index(attstr,'`7C'); X`09`09 if (xpos > 0) then X`09`09 begin X`09`09`09attx := substr(attstr,1,xpos-1); X`09`09`09attstr := substr(attstr,xpos+1,length(attstr)-xpos); X`09`09 end X`09`09 else X`09`09 begin X`09`09`09attx := attstr; X`09`09`09attstr := ''; X`09`09 end; X`09`09 readv(attx,atype,adesc,damstr,error:=continue); X`09`09 if (py.flags.protevil > 0) then X`09`09 if (uand(cdefense,%X'0004') <> 0) then X`09`09`09if ((py.misc.lev+1) > level) then X`09`09`09 begin X`09`09`09 atype := 99; X`09`09`09 adesc := 99; X`09`09`09 end; X`09`09 if (py.flags.protmon > 0) then X`09`09 if (uand(cdefense,%X'0002') <> 0) then X`09`09`09if ((py.misc.lev+1) > level) then X`09`09`09 begin X`09`09`09 atype := 99; X`09`09`09 adesc := 99; X`09`09`09 end; X`09`09 if (index(damstr,'-')) > 0 then X`09`09 begin X`09`09`09insert_str(damstr,'-',' '); X`09`09`09readv(damstr,acount,damstr,error:=continue); X`09`09 end X`09`09 else X`09`09 acount := 1; X`09`09 with py.misc do X`09`09 for i5 := 1 to acount do begin X`09`09 case atype of X`7BNormal attack `7D 1 : flag := test_hit(60,level,0,pac+ptoac); X`7BPoison Strength`7D 2 : flag := test_hit(-3,level,0,pac+ptoac); X`7BConfusion attack`7D 3 : flag := test_hit(10,level,0,pac+ptoac); X`7BFear attack `7D 4 : flag := test_hit(10,level,0,pac+ptoac); X`7BFire attack `7D 5 : flag := test_hit(10,level,0,pac+ptoac); X`7BAcid attack `7D 6 : flag := test_hit(0,level,0,pac+ptoac); X`7BCold attack `7D 7 : flag := test_hit(10,level,0,pac+ptoac); X`7BLightning attack`7D 8 : flag := test_hit(10,level,0,pac+ptoac); X`7BCorrosion attack`7D 9 : flag := test_hit(0,level,0,pac+ptoac); X`7BBlindness attack`7D 10 : flag := test_hit(2,level,0,pac+ptoac); X`7BParalysis attack`7D 11 : flag := test_hit(2,level,0,pac+ptoac); X`7BSteal Money `7D 12 : flag := test_hit(5,level,0,py.misc.lev) and X`09`09`09`09(py.misc.money`5Btotal$`5D > 0); X`7BSteal Object `7D 13 : flag := test_hit(2,level,0,py.misc.lev) and X`09`09`09`09(inven_ctr > 0); X`7BPoison `7D 14 : flag := test_hit(5,level,0,pac+ptoac); X`7BLose dexterity`7D 15 : flag := test_hit(0,level,0,pac+ptoac); X`7BLose constitution`7D 16 : flag := test_hit(0,level,0,pac+ptoac); X`7BLose intelligence`7D 17 : flag := test_hit(2,level,0,pac+ptoac); X`7BLose wisdom`7D 18 : flag := test_hit(0,level,0,pac+ptoac); X`7BLose experience`7D 19 : flag := test_hit(5,level,0,pac+ptoac); X`7BAggravate monsters`7D 20 : flag := true; X`7BDisenchant `7D 21 : flag := test_hit(20,level,0,pac+ptoac); X`7BEat food `7D 22 : flag := test_hit(5,level,0,pac+ptoac); X`7BEat light `7D 23 : flag := test_hit(5,level,0,pac+ptoac); X`7BEat charges `7D 24 : flag := test_hit(15,level,0,pac+ptoac); X`7BLose charisma `7D 25 : flag := test_hit(2,level,0,pac+ptoac); X`7BPetrification `7D 26 : flag := test_hit(10,level,0,pac+ptoac); X`7BPOISON poison `7D 27 : flag := test_hit(5,level,0,pac+ptoac); X`09`09 99 : flag := true; X`09`09 otherwise flag := false; X`09`09 end; X`09`09 if (flag) then X`09`09 begin X`09`09`09case adesc of X`09`09`09 1 : msg_print(cdesc + 'hits you.'); X`09`09`09 2 : msg_print(cdesc + 'bites you.'); X`09`09`09 3 : msg_print(cdesc + 'claws you.'); X`09`09`09 4 : msg_print(cdesc + 'stings you.'); X`09`09`09 5 : msg_print(cdesc + 'touches you.'); X`09`09`09 6 : msg_print(cdesc + 'kicks you.'); X`09`09`09 7 : msg_print(cdesc + 'gazes at you.'); X`09`09`09 8 : msg_print(cdesc + 'breathes on you.'); X`09`09`09 9 : msg_print(cdesc + 'spits on you.'); X`09`09`09 10 : msg_print(cdesc + 'makes a horrible wail.'); X`09`09`09 11 : msg_print(cdesc + 'embraces you.'); X`09`09`09 12 : msg_print(cdesc + 'crawls on you.'); X`09`09`09 13 : msg_print(cdesc + 'releases a cloud of spores.'); X`09`09`09 14 : msg_print(cdesc + 'begs you for money.'); X`09`09`09 15 : msg_print('You''ve been slimed!'); X`09`09`09 16 : msg_print(cdesc + 'crushes you.'); X`09`09`09 17 : msg_print(cdesc + 'tramples you.'); X`09`09`09 18 : msg_print(cdesc + 'drools on you.'); X`09`09`09 19 : case randint(9) of X`09`09`09`091 : msg_print(cdesc + 'insults you!'); X`09`09`09`092 : msg_print(cdesc + 'insults your mother!'); X`09`09`09`093 : msg_print(cdesc + 'gives you the finger!'); X`09`09`09`094 : msg_print(cdesc + 'humiliates you!'); X`09`09`09`095 : msg_print(cdesc + 'wets on your leg!'); X`09`09`09`096 : msg_print(cdesc + 'defiles you!'); X`09`09`09`097 : msg_print(cdesc + 'dances around you!'); X`09`09`09`098 : msg_print(cdesc + 'makes obscene gestures!'); X`09`09`09`099 : msg_print(cdesc + 'moons you!!!'); X`09`09`09 end; X`09`09`09 23 : msg_print(cdesc + 'sings a charming song'); X`09`09`09 24 : msg_print(cdesc + 'kisses you'); X`09`09`09 25 : msg_print(cdesc + 'gores you'); X`09`09`09 26 : case randint(2) of X`09`09`09`091 : msg_print(cdesc + 'moos forlornly'); X`09`09`09`092 : msg_print(cdesc + 'questioningly looks at you'); X`09`09`09 end; X`09`09`09 27 : msg_print(cdesc + 'shocks you'); X`09`09`09 28 : msg_print(cdesc + 'squirts ink at you'); X`09`09`09 29 : msg_print(cdesc + 'entangles you'); X`09`09`09 30 : msg_print(cdesc + 'sucks your blood'); X`09`09`09 31 : msg_print(cdesc + 'goes for your throat!'); X`09`09`09 32 : msg_print(cdesc + 'blows bubbles at you'); X`09`09`09 33 : msg_print(cdesc + 'squawks at you'); X`09`09`09 34 : msg_print(cdesc + 'pecks at you'); X`09`09`09 35 : msg_print(cdesc + 'barks at you'); X`09`09`09 36 : msg_print(cdesc + 'rubs against your leg'); X`09`09`09 37 : msg_print(cdesc + 'follows you around'); X `09 99 : msg_print(cdesc + 'is repelled.'); X`09`09`09 otherwise ; X`09`09`09end; X`09`09`09case atype of X`7BNormal attack `7D 1 : begin X`09`09`09`09 dam := damroll(damstr); X`09`09`09`09 with py.misc do X`09`09`09`09 dam :=dam - round(((pac+ptoac)/200.0)*dam); X`09`09`09`09 take_hit(dam,ddesc); X`09`09`09`09 prt_hp; X`09`09`09`09end; X`7BPoison Strength`7D 2 : begin X`09`09`09`09 take_hit(damroll(damstr),ddesc); X`09`09`09`09 ident := lose_stat(sr,'You feel weaker.','You feel weaker for V a moment, then it passes.'); X`09`09`09`09 prt_hp; X`09`09`09`09end; X`7BConfusion attack`7D 3 : with py.flags do X`09`09`09`09 begin X`09`09`09`09 take_hit(damroll(damstr),ddesc); X`09`09`09`09 if (randint(2) = 1) then X`09`09`09`09 begin X`09`09`09`09`09if (confused < 1) then X`09`09`09`09`09 begin X`09`09`09`09`09 msg_print('You feel confused.'); X`09`09`09`09`09 confused:=confused+randint(level); X`09`09`09`09`09 end; X`09`09`09`09`09confused := confused + 3; X`09`09`09`09 end; X`09`09`09`09 prt_hp; X`09`09`09`09 end; X`7BFear attack `7D 4 : with py.flags do X`09`09`09`09 begin X`09`09`09`09 take_hit(damroll(damstr),ddesc); X`09`09`09`09 if (player_spell_saves) then X`09`09`09`09 msg_print('You resist the effects!') X`09`09`09`09 else if (afraid < 1) then X`09`09`09`09 begin X`09`09`09`09`09msg_print('You are suddenly afraid!'); X`09`09`09`09`09afraid := afraid + 3 + randint(level); X`09`09`09`09 end X`09`09`09`09 else X`09`09`09`09 afraid := afraid + 3; X`09`09`09`09 prt_hp; X`09`09`09`09 end; X`7BFire attack `7D 5 : begin X`09`09`09`09 msg_print('You are enveloped in flames!'); X`09`09`09`09 fire_dam(damroll(damstr),ddesc); X`09`09`09`09end; X`7BAcid attack `7D 6 : begin X`09`09`09`09 msg_print('You are covered in acid!'); X`09`09`09`09 acid_dam(damroll(damstr),ddesc); X`09`09`09`09end; X`7BCold attack `7D 7 : begin X`09`09`09`09 msg_print('You are covered with frost!'); X`09`09`09`09 cold_dam(damroll(damstr),ddesc); X`09`09`09`09end; X`7BLightning attack`7D 8 : begin X`09`09`09`09 msg_print('Lightning strikes you!'); +-+-+-+-+-+-+-+- END OF PART 9 +-+-+-+-+-+-+-+-