-+-+-+-+-+-+-+-+ START OF PART 13 -+-+-+-+-+-+-+-+ X moria_help('Character Races'); X exit_flag := true; X choose_race := false; X end; X until (exit_flag); X end; X`20 X`20 X`7BWill print the history of a character `7D Xprocedure print_history; Xvar X i1 : integer; Xbegin X clear(14,1); X put_buffer('Character Background',14,28); X for i1 := 1 to 5 do X put_buffer(py.misc.history`5Bi1`5D,i1+14,5) Xend; X`20 X`20 X`7B Get the racial history, determines social class`20 X Assumtions: Each race has init history beginning at X (race-1)*3+1 X All history parts are in accending order `7D X procedure get_history; X var X hist_ptr,cur_ptr,test_roll, X start_pos,end_pos,cur_len, X line_ctr,new_start,social_class : integer; X history_block : varying `5B400`5D of char; X flag : boolean; X begin X`7B Get a block of history text `7D X hist_ptr := (py.misc.prace-1)*3 + 1; X history_block := ''; X social_class := randint(4); X cur_ptr := 0; X repeat X flag := false; X repeat X cur_ptr := cur_ptr + 1; X if (background`5Bcur_ptr`5D.chart = hist_ptr) then X begin X test_roll := randint(100); X while (test_roll > background`5Bcur_ptr`5D.roll) do X cur_ptr := cur_ptr + 1; X with background`5Bcur_ptr`5D do X begin X history_block := history_block + info; X social_class := social_class + bonus; X if (hist_ptr > next) then cur_ptr := 0; X hist_ptr := next; X end; X flag := true; X end; X until(flag); X until(hist_ptr < 1); X`7B Process block of history text for pretty output `7D X start_pos := 1; X end_pos := length(history_block); X line_ctr := 1; X flag := false; X while (history_block`5Bend_pos`5D = ' ') do X end_pos := end_pos - 1; X repeat X while (history_block`5Bstart_pos`5D = ' ') do X start_pos := start_pos + 1; X cur_len := end_pos - start_pos + 1; X if (cur_len > 70) then X begin X cur_len := 70; X while (history_block`5Bstart_pos+cur_len-1`5D <> ' ') do X cur_len := cur_len - 1; X new_start := start_pos + cur_len; X while (history_block`5Bstart_pos+cur_len-1`5D = ' ') do X cur_len := cur_len - 1; X end X else X flag := true; X py.misc.history`5Bline_ctr`5D := substr(history_block,start_pos,cur_ Vlen); X line_ctr := line_ctr + 1; X start_pos := new_start; X until(flag); X`7BCompute social class for player`7D X if (social_class > 100) then X social_class := 100 X else X if (social_class < 1) then X social_class := 1; X py.misc.sc := social_class; X end; X `20 X`20 X`7BGets the character's sex `7D X function get_sex : boolean; X var X s : char; X exit_flag : boolean; X begin X py.misc.sex := ''; X clear(21,1); X prt('Choose a sex (? for Help):',21,3); X prt('m) Male f) Female',22,3); X prt('',21,29); X repeat X inkey_flush(s); X case s of X 'f' : begin X py.misc.sex := 'Female'; X prt(py.misc.sex,5,11); X exit_flag := true; X get_sex := true; X end; X 'm' : begin X py.misc.sex := 'Male'; X prt(py.misc.sex,5,11); X exit_flag := true; X get_sex := true; X end; X '?' : begin X moria_help('Character Sex'); X exit_flag := true; X get_sex := false X end; X otherwise X end; X until (exit_flag) X end; X`20 X `20 X`7BComputes character's age, height, and weight `7D X procedure get_ahw; X var X i1 : integer; X begin X i1 := py.misc.prace; X py.misc.age := race`5Bi1`5D.b_age + randint(race`5Bi1`5D.m_age); X case trunc((index(sex_type,py.misc.sex)+5)/6) of X 1 : begin X py.misc.ht := randnor(race`5Bi1`5D.f_b_ht,race`5Bi1`5D.f_m_ht); X py.misc.wt := randnor(race`5Bi1`5D.f_b_wt,race`5Bi1`5D.f_m_wt) X end; X 2 : begin X py.misc.ht := randnor(race`5Bi1`5D.m_b_ht,race`5Bi1`5D.m_m_ht); X py.misc.wt := randnor(race`5Bi1`5D.m_b_wt,race`5Bi1`5D.m_m_wt) X end X end; X py.misc.disarm := race`5Bi1`5D.b_dis + todis_adj; X end; X`20 X `20 X`7BGets a character class `7D X function get_class : boolean; X var X i1,i2,i3,i4,i5 : integer; X cl : array `5B0..max_class`5D of integer; X s : char; X exit_flag : boolean; `20 X begin X for i2 := 1 to max_class do cl`5Bi2`5D := 0; X i1 := py.misc.prace; `20 X i2 := 1; X i3 := 0; X i4 := 3; X i5 := 22; X clear(21,1); X prt('Choose a class ( to reroll stats, ? for Help):',21,3); X repeat X if (uand(race`5Bi1`5D.tclass,bit_array`5Bi2`5D) <> 0) then X begin X i3 := i3 + 1; X put_buffer (chr(i3+96)+') '+class`5Bi2`5D.title,i5,i4); X cl`5Bi3`5D := i2; X i4 := i4 + 15; X if (i4 > 70) then X begin X i4 := 3; X i5 := i5 + 1 X end; X end; X i2 := i2 + 1; X until (i2 > max_class); X py.misc.pclass := 0; X put_buffer('',21,58); X exit_flag := false; X repeat X inkey_flush(s); X i2 := index('abcdefghijklmnopqrstuvwxyz',s); X if ((i2 <= i3) and (i2 >= 1)) then X begin X py.misc.tclass := class`5Bcl`5Bi2`5D`5D.title; X py.misc.pclass := cl`5Bi2`5D; X exit_flag := true; X get_class := true; X clear(21,1); X put_buffer(py.misc.tclass,6,11); X with py.misc do X begin X hitdie := hitdie + class`5Bpclass`5D.adj_hd; X mhp := con_adj + hitdie; X chp := mhp; X bth := bth + class`5Bpclass`5D.mbth; X bthb := bthb + class`5Bpclass`5D.mbthb; X srh := srh + class`5Bpclass`5D.msrh; X disarm := disarm + class`5Bpclass`5D.mdis; X fos := fos + class`5Bpclass`5D.mfos; X stl := stl + class`5Bpclass`5D.mstl; X save := save + class`5Bpclass`5D.msav; X title := player_title`5Bpclass,1`5D; X expfact:= expfact + class`5Bpclass`5D.m_exp; X end; X`7B Adjust the stats for the class adjustment `7D X with py do X begin X stat.str := change_stat(stat.str,class`5Bmisc.pclass`5D.mad Vj_str); X stat.int := change_stat(stat.int,class`5Bmisc.pclass`5D.mad Vj_int); X stat.wis := change_stat(stat.wis,class`5Bmisc.pclass`5D.mad Vj_wis); X stat.dex := change_stat(stat.dex,class`5Bmisc.pclass`5D.mad Vj_dex); X stat.con := change_stat(stat.con,class`5Bmisc.pclass`5D.mad Vj_con); X stat.chr := change_stat(stat.chr,class`5Bmisc.pclass`5D.mad Vj_chr); X stat.cstr := stat.str; X stat.cint := stat.int; X stat.cwis := stat.wis; X stat.cdex := stat.dex; X stat.ccon := stat.con; X stat.cchr := stat.chr; X`7B Real values `7D misc.ptodam := todam_adj; X misc.ptohit := tohit_adj; X misc.ptoac := toac_adj; X misc.pac := 0; X`7B Displayed values `7D misc.dis_td := misc.ptodam; X misc.dis_th := misc.ptohit; X misc.dis_tac:= misc.ptoac; X misc.dis_ac := misc.pac X end X end X else X if (s = '?') then X begin X moria_help('Character Classes'); X exit_flag := true; X get_class := false X end X else X if (s = chr(27)) then X BEGIN X exit_flag := true; X get_class := false X END; X until(exit_flag); X end; X `20 X`20 X procedure get_money; X var X tmp : integer; X begin X with py.stat do X tmp := cstr + cint + cwis + cdex + ccon + cchr; X with py.misc do `20 X begin X au := sc*6 + randint(25) + 325; `7B Social Class adj `7D X au := au - tmp; `7B Stat adj `7D X au := au + py.stat.cchr; `7B Charisma adj `7D X if (au < 80) then au := 80; `7B Minimum `7D X end; X end; X`20 X`7Bbegin create procedure`7D X begin X with py do X begin X`7B Allow players to re-roll stats - mwk`7D X repeat `20 X put_character; X until(choose_race); X while (not(get_sex)) do put_character; X get_history; X get_ahw; X print_history; X put_misc1; X put_stats; X while (not(get_class)) do X begin X get_history; X get_ahw; X print_history; X put_misc1; X roll_stats(misc.prace); X put_stats X end; X get_money; X put_stats; X put_misc2; X put_misc3; X get_name; X pause_exit(24,player_exit_pause) X end X end; $ CALL UNPACK [.SOURCE.INCLUDE]CREATE.INC;1 158965345 $ create 'f' X`7B Creatures movement and attacking are done from here `7D X procedure creatures; X VAR X i1,i2,i3,moldy,moldx : integer; X`20 X`20 X`7B Updates screen when monsters move about `7D X PROCEDURE update_mon(monptr : integer); X VAR X flag : boolean; X BEGIN X with m_list`5Bmonptr`5D do X with cave`5Bfy,fx`5D do X BEGIN X flag := false; X if (cdis <= max_sight) then X if (py.flags.blind < 1) then X if (panel_contains(fy,fx)) then X if (los(char_row,char_col,fy,fx)) then X with c_list`5Bmptr`5D do X BEGIN X`7B Normal sight. `7D X if ((pl) or (tl)) then X BEGIN X if (py.flags.see_inv) then X flag := true X else if (uand(%X'10000',cmove) = 0) then X flag := true X END X`7B Infra vision. `7D X else if (py.flags.see_infra > 0) then X if (cdis <= py.flags.see_infra) then X if (uand(%X'2000',cdefense) <> 0) then X flag := true X END; X`7B Light it up. `7D X if (flag) then X BEGIN X if (not(ml)) then X BEGIN X print(c_list`5Bmptr`5D.cchar,fy,fx); X ml := true; X if (search_flag) then X search_off; X if (py.flags.rest > 0) then X rest_off; X flush; X if (find_flag) then X BEGIN X find_flag := false; X move_char(5) X END X END X END X`7B Turn it off.`7D X else if (ml) then X BEGIN X ml := false; X if ((tl) or (pl)) then X lite_spot(fy,fx) X else X unlite_spot(fy,fx) X END X END X END; X`20 X`20 X`7B Move the critters about the dungeon `7D X FUNCTION mon_move(monptr : integer) : boolean; X TYPE X mm_type = array `5B1..5`5D of integer; X VAR X i1,i2,i3 : integer; X mm : mm_type; X out_val : vtype; X move_test : boolean; X`20 X`7B Choose correct directions for monster movement `7D X PROCEDURE get_moves(monptr : integer; var mm : mm_type); X VAR X y,ay,x,ax,move_val : integer; X BEGIN X y := m_list`5Bmonptr`5D.fy - char_row; X x := m_list`5Bmonptr`5D.fx - char_col; X ay := abs(y); X ax := abs(x); X if (y < 0) then X move_val := 8 X else X move_val := 0; X if (x > 0) then X move_val := move_val + 4; X if (ay > (ax*1.7321)) then X move_val := move_val + 2 X else if (ax > (ay*1.7321)) then X move_val := move_val + 1; X CASE move_val of X 0 : BEGIN X mm`5B1`5D := 9; X if (ay > ax) then X BEGIN X mm`5B2`5D := 8; X mm`5B3`5D := 6; X mm`5B4`5D := 7; X mm`5B5`5D := 3 X END X else X BEGIN X mm`5B2`5D := 6; X mm`5B3`5D := 8; X mm`5B4`5D := 3; X mm`5B5`5D := 7 X END X END; X 1,9 : BEGIN X mm`5B1`5D := 6; X if (y < 0) then X BEGIN X mm`5B2`5D := 3; X mm`5B3`5D := 9; +-+-+-+-+-+-+-+- END OF PART 13 +-+-+-+-+-+-+-+-