-+-+-+-+-+-+-+-+ START OF PART 12 -+-+-+-+-+-+-+-+ X`09`09`7B Does the critter multiply? `7D X`09 if (uand(cmove,%X'00200000') <> 0) then X`09`09if (max_mon_mult >= mon_tot_mult) then X`09`09 if ((py.flags.rest mod mon_mult_adj) = 0) then X`09`09 with m_list`5Bmonptr`5D do X`09`09 begin X`09`09`09i3 := 0; X`09`09`09for i1 := fy-1 to fy+1 do X`09`09`09 for i2 := fx-1 to fx+1 do X`09`09`09 if (in_bounds(i1,i2)) then X`09`09`09 if (cave`5Bi1,i2`5D.cptr > 1) then X`09`09`09`09i3 := i3 + 1; X`09`09`09if (i3 < 4) then X`09`09`09 if (randint(i3*mon_mult_adj) = 1) then X`09`09`09 multiply_monster(fy,fx,mptr,false); X`09`09 end; X`09`09`7B Creature is confused? Chance it becomes un-confused `7D X`09 move_test := false; X`09 if (m_list`5Bmonptr`5D.confused) then X`09`09begin X`09`09 mon_move := move_confused(monptr,mm); X`09`09 m_list`5Bmonptr`5D.confused := (randint(8) <> 1); X`09`09 move_test := true; X`09`09end X`09`09`7B Creature may cast a spell `7D X`09 else if (spells > 0) then X`09`09mon_move := cast_spell(monptr,move_test); X`09 if (not(move_test)) then X`09`09begin X`09`09`7B 75% random movement `7D X`09`09 if ((randint(100) <= 75) and X`09`09 (uand(cmove,%X'00000008') <> 0)) then X`09`09`09mon_move := move_confused(monptr,mm) X`09`09`7B 40% random movement `7D X`09`09 else if ((randint(100) <= 40) and X`09`09 (uand(cmove,%X'00000004') <> 0)) then X`09`09`09mon_move := move_confused(monptr,mm) X`09`09`7B 20% random movement `7D X`09`09 else if ((randint(100) <= 20) and X`09`09 (uand(cmove,%X'00000002') <> 0)) then X`09`09 `09mon_move := move_confused(monptr,mm) X`09`09`7B Normal movement `7D X`09`09 else if (uand(cmove,%X'00000001') = 0) then X`09`09 begin X`09`09 if (randint(200) = 1) then X`09`09`09mon_move := move_confused(monptr,mm) X`09`09 else X`09`09`09begin X`09`09`09 get_moves(monptr,mm); X`09`09 mon_move := make_move(monptr,mm); X`09`09 end; X`09`09 end X`09`09`7B Attack, but don't move `7D X`09`09else X`09`09 if (m_list`5Bmonptr`5D.cdis < 2) then X`09`09 begin X`09`09 get_moves(monptr,mm); X`09`09 mon_move := make_move(monptr,mm); X`09`09 end; X`09`09end; X`09 end; X`09end; X X`09procedure splash(monptr : integer); X`09var i1,mon_swimming,drown_dam : integer; X`09begin X`09 with m_list`5Bmonptr`5D do X`09 with c_list`5Bmptr`5D do begin X`09 mon_swimming := INT(uand(cmove,%X'00000700')) DIV 256; X`09 drown_dam := randint(out_of_env_dam); X`7B here will also be modifiers due to waterspeed,depth `7D X`7B divide damage by 2 for each mon_swimming level, random rounding procedur Ve `7D X`09 for i1 := 1 to mon_swimming do X`09`09drown_dam := (drown_dam+(randint(3)-1)) div 3; X`09 hp := hp - drown_dam; X`09 csleep := 0; X`09 if (hp < 0) then begin X`09`09monster_death(fy,fx,cmove); X`09`09with cave`5Bfy,fx`5D do X`09`09 delete_monster(cptr); X`09 end; X`09 end; X`09end; X X`09`7B Main procedure for creatures`09`09`09`09-RAK-`09`7D X begin X`09get_player_move_rate; X`09if (muptr > 0) then X`09 begin X`09`7B Process the monsters `7D X`09hear_count := 0; X`09i1 := muptr; X`09repeat X`09 with m_list`5Bi1`5D do X`09 begin X`09 cdis := distance(char_row,char_col,fy,fx); X`09 if (attack) then `7B Attack is argument passed to CREATURE`7D X`09`09begin X`09`09 i3 := movement_rate(cspeed,i1); X`09`09 if (i3 > 0) then X`09`09 for i2 := 1 to i3 do X`09`09 begin X`09`09`09if ((cdis <= c_list`5Bmptr`5D.aaf) or (ml)) then X`09`09`09 begin X`09`09`09 if (csleep > 0) then X`09`09`09 if (py.flags.aggravate) then X`09`09`09`09csleep := 0 X`09`09`09 else if (py.flags.rest < 1) then X`09`09`09`09if (randint(10) > py.misc.stl) then X`09`09`09`09 csleep := csleep - trunc(75.0/cdis); X`09`09`09 if (stunned > 0) then X`09`09`09`09stunned := stunned - 1; X`09`09`09 if ((csleep <= 0) and (stunned <= 0)) then X`09`09`09 begin X`09`09`09`09moldy := fy; X`09`09`09`09moldx := fx; X`09`09`09`09if (mon_move(i1)) then X`09`09`09`09 if (ml) then X`09`09`09`09 begin X`09`09`09`09 ml := false; X`09`09`09`09 if (test_light(moldy,moldx)) then X`09`09`09`09`09lite_spot(moldy,moldx) X`09`09`09`09 else X`09`09`09`09`09unlite_spot(moldy,moldx); X`09`09`09`09 end; X`09`09`09 end; X`09`09`09 end; X`09`09`09update_mon(i1); X`09`09 end `7Bfor 1 to i3 loop`7D X`09`09 else X`09`09 update_mon(i1); X`09`09end `7Bif attacking`7D X`09 else X`09`09update_mon(i1); X`09 if (cave`5Bfy,fx`5D.fval in floor_set) then X`09 if (((cave`5Bfy,fx`5D.fval in water_set) <> X`09`09 (uand(c_list`5Bmptr`5D.cmove,%X'00000010') <> 0)) and X`09`09 (uand(c_list`5Bmptr`5D.cmove,%X'00000040') <> 0)) then X`09`09splash(i1); X`09 end; X`09 i1 := m_list`5Bi1`5D.nptr; X`09until ((i1 = 0) or (moria_flag)); X`09if (want_warn) then X`09 if (hear_count = 1) then X`09 msg_print('You hear a noise in the water.') X`09 else if (hear_count > 1) then X`09 msg_print('You hear some noises in the water.'); X`09`7B End processing monsters `7D X`09 end; X end; Xend. $ CALL UNPACK CREATURE.PAS;1 722879319 $ create 'f' X`5BInherit('Moria.Env')`5D Module Death; X Xvar X`09f1`09: text; X f2 : file of key_type; X`09dstr`09: array `5B0..19`5D of vtype; X X`09`7B Handles the gravestone and top-twenty routines`09-RAK-`09`7D X`5Bglobal,psect(death$code)`5D procedure upon_death; X type X`09word`09= 0..65535; X`09recj`09= record X`09`09`09unameinfo`09: packed record X`09`09`09`09unamelen`09: word; X`09`09`09`09jpi$_username`09: word; X`09`09`09end; X`09`09`09ptr_uname`09: `5Eusernam; X`09`09`09ptr_unamelen`09: `5Einteger; X`09`09`09endlist`09`09: integer X`09end; X`09usernam`09`09= packed array `5B1..12`5D of char; X X var X X temp_id : ssn_type; X temp : ntype; X X`09`7B function returns the players USERNAME`09`09`09-JWT-`09`7D X function get_username : usernam; X var X`09user`09`09: usernam; X`09icode`09`09: integer; X`09jpirec`09`09: recj; X X`09`7B calls GETJPI routine to return the USERNAME`09`09-JWT-`09`7D X function sys$getjpi`09(%immed`09p1`09: integer; X`09`09`09 `09%immed`09p2`09: integer; X`09`09`09 `09%immed`09p3`09: integer; X`09`09`09 `09var`09itmlst`09: recj; X`09`09`09 `09%immed`09p4`09: integer; X`09`09`09 `09%immed`09p5`09: integer; X`09`09`09 `09%immed`09p6`09: integer) : integer; X external; X X begin X`09with jpirec do X`09 begin X`09 unameinfo.unamelen`09`09:= 12; X`09 unameinfo.jpi$_username`09:= %x202; X`09 new (ptr_uname); X`09 ptr_uname`5E`09`09`09:= ' '; X`09 new (ptr_unamelen); X`09 ptr_unamelen`5E`09`09:= 0; X`09 endlist`09`09`09:= 0 X`09 end; X`09icode := SYS$GETJPI (0,0,0,jpirec,0,0,0); X`09if not odd(icode) then X`09 begin X`09 writeln('Error in GETJPI process'); X`09 halt X`09 end X`09else X`09 get_username := jpirec.ptr_uname`5E X`09end; X X X X`09`7B Centers a string within a 31 character string`09`09-JWT-`09`7D X function fill_str (p1 : vtype) : vtype; X var X`09s1`09: vtype; X`09i1`09: integer; X begin X s1 := ''; X i1 := trunc(length(p1) / 2); X fill_str := substr(pad(s1,' ',15-i1) + pad(p1,' ',31),1,31); X end; X X X`09`7B Prints a line to the screen efficiently`09`09-RAK-`09`7D X procedure dprint(str : vtype; row : integer); X var X`09i1,i2,nblanks,xpos`09`09`09: integer; X`09prt_str`09`09`09`09`09: vtype; X begin X`09prt_str := ''; X`09nblanks := 0; X xpos := 0; X`09for i1 := 1 to length(str) do X`09 begin X`09 if (str`5Bi1`5D = ' ') then X`09 begin X`09`09if (xpos > 0) then X`09`09 begin X`09`09 nblanks := nblanks + 1; X`09`09 if (nblanks > 5) then X`09`09 begin X`09`09`09nblanks := 0; X`09`09`09put_buffer(prt_str,row,xpos); X`09`09`09prt_str := ''; X`09`09`09xpos := 0; X`09`09 end X`09`09 end; X`09 end X`09 else X`09 begin X`09`09if (xpos = 0) then xpos := i1; X`09`09if (nblanks > 0) then X`09`09 begin X`09`09 for i2 := 1 to nblanks do X`09`09 prt_str := prt_str + ' '; X`09`09 nblanks := 0; X`09`09 end; X`09`09prt_str := prt_str + str`5Bi1`5D; X`09 end; X`09 end; X`09if (xpos > 0) then X`09 put_buffer(prt_str,row,xpos); X end; X X X`5Bglobal,psect(death$code)`5D procedure make_tomb; X var X`09str1,str2,str3,str4,str5,str6,str7,str8 : vtype; X`09i1 : integer; X`09day : packed array `5B1..11`5D of char; X begin X date(day); X`09str1 := fill_str(py.misc.name); X`09str2 := fill_str(py.misc.title); X`09str3 := fill_str(py.misc.tclass); X writev(str4,'Level : ',py.misc.lev:1); X`09str4 := fill_str(str4); X writev(str5,py.misc.exp:1,' Exp'); X`09str5 := fill_str(str5); X`09writev(str6,(py.misc.account+py.misc.money`5Btotal$`5D):1,' Au'); X`09str6 := fill_str(str6); X`09writev(str7,'Died on Level : ',dun_level:1); X`09str7 := fill_str(str7); X`09str8 := fill_str(died_from); Xdstr`5B00`5D := ' '; Xdstr`5B01`5D := ' _______________________'; Xdstr`5B02`5D := ' / \ ___'; Xdstr`5B03`5D := ' / \ ___ / \ _ V__'; Xdstr`5B04`5D := ' / RIP \ \ : : / V \'; Xdstr`5B05`5D := ' / \ : _;,,,;_ : V :'; Xdstr`5B06`5D := ' /'+str1+ '\,;_ _;, V,,;_'; Xdstr`5B07`5D := ' `7C the `7C ___'; Xdstr`5B08`5D := ' `7C '+str2+ ' `7C / \'; Xdstr`5B09`5D := ' `7C `7C : :'; Xdstr`5B10`5D := ' `7C '+str3+ ' `7C _;,,,;_ V ____'; Xdstr`5B11`5D := ' `7C '+str4+ ' `7C / V \'; Xdstr`5B12`5D := ' `7C '+str5+ ' `7C : V :'; Xdstr`5B13`5D := ' `7C '+str6+ ' `7C : V :'; Xdstr`5B14`5D := ' `7C '+str7+ ' `7C _; V,,,,;_'; Xdstr`5B15`5D := ' `7C killed by `7C'; Xdstr`5B16`5D := ' `7C '+str8+ ' `7C'; Xdstr`5B17`5D := ' `7C '+day+ ' `7C'; Xdstr`5B18`5D := ' *`7C * * * * * * `7C *'; Xdstr`5B19`5D := '________)/\\_)_/___(\/___(//_\)/_\//__\\(/_`7C_)_______'; X`09clear(1,1); X`09for i1 := 0 to 19 do X`09 dprint(dstr`5Bi1`5D,i1+1); X`09flush; X end; X X`5Bglobal,psect(death$code)`5D procedure write_tomb; X var X`09fnam : vtype; X`09command : char; X`09f1`09: text; X`09i1 : integer; X`09flag`09: boolean; X begin X`09if (get_com('Print to file? (Y/N)',command)) then X`09 case command of X`09 'y','Y': begin X`09`09`09prt('Enter Filename:',1,1); X`09`09`09flag := false; X`09`09`09repeat X`09`09`09 if (get_string(fnam,1,17,60)) then X`09`09`09 begin X`09`09`09 if (length(fnam) = 0) then fnam:='MORIACHR.DIE'; X`09`09`09 open (f1,file_name:=fnam,error:=continue); X`09`09`09 if (status(f1) <> 0) then X`09`09`09 prt('Error creating> ' + fnam,2,1) X`09`09`09 else X`09`09`09 begin X`09`09`09`09 flag := true; X`09`09`09`09 rewrite(f1,error:=continue); X`09`09`09`09 for i1 := 0 to 19 do X`09`09`09`09 writeln(f1,dstr`5Bi1`5D,error:=continue); X`09`09`09`09end; X`09`09`09 close(f1,error:=continue); X`09 `09`09 end X`09`09`09 else X`09`09`09 flag := true; X`09`09`09until(flag); X`09`09 end; X`09 otherwise ; X`09 end; X end; X X`09`7B Prints the gravestone of the character`09`09-RAK-`09`7D X procedure print_tomb; X var X`09fnam`09`09`09`09`09: vtype; X`09command`09`09`09`09`09: char; X`09i1`09`09`09`09`09: integer; X`09flag`09`09`09`09`09: boolean; X`09user`09`09`09`09`09: usernam; X X begin X if (py.misc.lev > 10) then X`09begin X `09user := get_username; X`09open(f1,file_name:=MORIA_DTH,history:=old,sharing:=none, X`09 access_method:=sequential, error:=continue); X`09if (status(f1) = 0) then X`09 begin X`09 extend(f1,error:=continue); X`09 if (py.misc.cheated) then X`09 writeln(f1, '*',user,py.misc.diffic:2,' ',py.misc.prace:2,' ', X`09`09py.misc.pclass:2,py.misc.lev:3,' ',dun_level:4,' ', X`09`09py.misc.max_lev:4,' ',died_from) X`09 else X`09 writeln(f1, ' ',user,py.misc.diffic:2,' ',py.misc.prace:2,' ', X`09`09py.misc.pclass:2,py.misc.lev:3,' ',dun_level:4,' ', X`09`09py.misc.max_lev:4,' ',died_from); X`09 writeln(f1,' ',substr(py.misc.ssn,1,44) +' '+show_current_time); X`09 end; X`09 close(f1,error:=continue); X`09end; X`09make_tomb; X`09write_tomb; X end; X X X`09`7B Calculates the total number of points earned`09`09-JWT-`09`7D X`09`7B The formula was changed to reflect the difficulty of low exp. X`09 modifier classes like warriors`09`09`09-Cap'n- `7D X function total_points : integer; X begin X`09with py.misc do X`09 if (expfact = 0) then X`09 total_points := max_exp + 100*max_lev X`09 else X`09 total_points := trunc(max_exp / expfact) + 100*max_lev; X end; X X X`09`7B Allow the bozo to print out his dead character...`09-KRC-`09`7D X`5Bglobal,psect(death$code)`5D procedure print_dead_character; X var X`09command : char; X begin X`09if (get_com('Print character sheet to file? (Y/N)',command)) then X`09 case command of X`09 'y','Y': file_character; X`09 otherwise ; X`09 end; X end; X X X`09`7B Enters a players name on the top twenty list`09`09-JWT-`09`7D X`5Bglobal,psect(death$code)`5D procedure top_twenty; X var X`09list`09`09: array `5B1..max_high_scores`5D of string; X`09blank`09`09: packed array `5B1..13`5D of char; X`09i1,i2,i3,i4`09: integer; X`09n1`09`09: integer; X`09trys`09`09: integer; X`09o1,o2`09`09: vtype; X`09f1`09`09: text; X`09flag,file_flag`09: boolean; X`09temp`09`09: ntype; X`09ch`09`09: char; X begin X`09if (py.misc.cheated) then exit; X`09clear(1,1); +-+-+-+-+-+-+-+- END OF PART 12 +-+-+-+-+-+-+-+-