-+-+-+-+-+-+-+-+ START OF PART 17 -+-+-+-+-+-+-+-+ X`09`09 misc.ptodam := todam_adj; X`09`09 misc.ptohit := tohit_adj; X`09`09 misc.ptoac := 0; X`09`09 misc.pac := toac_adj; X`09`09 misc.expfact:= b_exp; X`09`09 flags.see_infra := infra; X`09`09 exit_flag := true; X`09`09 choose_race := true; X`09`09 put_buffer(py.misc.race,4,15); X`09 end X`09else if (s = '?') then X`09 begin X`09 moria_help('Character Races'); X`09 exit_flag := true; X`09 choose_race := false; X`09 end; X until (exit_flag); X end; X X X`09`7B Will print the history of a character`09`09`09-JWT-`09`7D X procedure print_history; X var X`09i1`09`09: integer; X begin X put_buffer('Character Background',14,28); X for i1 := 1 to 5 do X`09put_buffer(py.misc.history`5Bi1`5D,i1+14,5) X end; X X X`09`7B Get the racial history, determines social class`09-RAK-`09`7D X`09`7B Assumtions:`09Each race has init history beginning at `09`7D X`09`7B`09`09(race-1)*3+1`09`09`09`09`09`7D X`09`7B`09`09All history parts are in accending order`09`7D X procedure get_history; X var X`09hist_ptr,cur_ptr,test_roll`09: integer; X`09start_pos,end_pos,cur_len`09: integer; X`09line_ctr,new_start,social_class`09: integer; X`09history_block`09`09`09: varying `5B400`5D of char; X`09flag`09`09`09`09: boolean; X begin X`09`7B Get a block of history text`09`09`09`09`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`09flag := false; X`09repeat X`09 cur_ptr := cur_ptr + 1; X`09 if (background`5Bcur_ptr`5D.chart = hist_ptr) then X`09 begin X`09 test_roll := randint(100); X`09 while (test_roll > background`5Bcur_ptr`5D.roll) do X`09`09cur_ptr := cur_ptr + 1; X`09 with background`5Bcur_ptr`5D do X`09`09begin X`09`09 history_block := history_block + info; X`09`09 social_class := social_class + bonus; X`09`09 if (hist_ptr > next) then cur_ptr := 0; X`09`09 hist_ptr := next; X`09`09end; X`09 flag := true; X`09 end; X`09until(flag); X until(hist_ptr < 1); X`09`7B Process block of history text for pretty output`09`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`09end_pos := end_pos - 1; X repeat X`09while (history_block`5Bstart_pos`5D = ' ') do X`09 start_pos := start_pos + 1; X`09cur_len := end_pos - start_pos + 1; X`09if (cur_len > 70) then`20 X`09 begin X`09 cur_len := 70; X`09 while (history_block`5Bstart_pos+cur_len-1`5D <> ' ') do X`09 cur_len := cur_len - 1; X`09 new_start := start_pos + cur_len; X`09 while (history_block`5Bstart_pos+cur_len-1`5D = ' ') do X`09 cur_len := cur_len - 1; X`09 end X`09else X`09 flag := true; X`09py.misc.history`5Bline_ctr`5D := substr(history_block,start_pos,cur_len); X`09line_ctr := line_ctr + 1; X`09start_pos := new_start; X until(flag); X`09`7B Compute social class for player`09`09`09`7D X if (social_class > 100) then`20 X`09social_class := 100 X else if(social_class < 1) then X`09social_class := 1; X py.misc.sc := social_class; X end; X X X`09`7B Gets the character's sex`09`09`09`09-JWT-`09`7D X function get_sex : boolean; X var X`09s `09`09`09: char; X`09exit_flag`09`09: 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`09inkey_flush(s); X`09case s of X`09 'f' : begin X`09`09 py.misc.sex := 'Female'; X`09`09 prt(py.misc.sex,5,15); X`09`09 exit_flag := true; X`09`09 get_sex := true; X`09`09end; X`09 'm' : begin X`09`09 py.misc.sex := 'Male'; X`09`09 prt(py.misc.sex,5,15); X`09`09 exit_flag := true; X`09`09 get_sex := true; X`09`09end; X`09 '?' : begin X`09`09 moria_help('Character Sex'); X`09`09 exit_flag := true; X`09`09 get_sex := false; X`09`09end; X`09 otherwise ; X`09 end; X until (exit_flag); X end; X X X`09`7B Computes character's age, height, and weight`09`09-JWT-`09`7D X procedure get_ahw; X var X`09i1 `09: 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`09 py.misc.ht := randnor(race`5Bi1`5D.f_b_ht,race`5Bi1`5D.f_m_ht); X`09 py.misc.wt := randnor(race`5Bi1`5D.f_b_wt,race`5Bi1`5D.f_m_wt) X`09 end; X 2 : begin X`09 py.misc.ht := randnor(race`5Bi1`5D.m_b_ht,race`5Bi1`5D.m_m_ht); X`09 py.misc.wt := randnor(race`5Bi1`5D.m_b_wt,race`5Bi1`5D.m_m_wt) X`09 end X end; X py.misc.disarm := race`5Bi1`5D.b_dis + todis_adj; X end; X X X`09`7B Gets a character class`09`09`09`09-JWT-`09`7D X function get_class : boolean; X var X`09i1,i2,i3,i4,i5`09`09: integer; X`09cl`09`09`09: array `5B0..max_class`5D of integer; X`09s`09`09`09: char; X`09exit_flag`09`09: boolean; X begin X for i2 := 1 to max_class do cl`5Bi2`5D := 0; X i1 := py.misc.prace; X i2 := 1; X i3 := 0; X i4 := 3; X i5 := 22; X clear(21,1); X prt('Choose a class (= another player, ? for Help):',21,3); X repeat X`09if (uand(race`5Bi1`5D.tclass,bit_array`5Bi2`5D) <> 0) then X`09 begin X`09 i3 := i3 + 1; X`09 put_buffer (chr(i3+96)+') '+class`5Bi2`5D.title,i5,i4); X`09 cl`5Bi3`5D := i2; X`09 i4 := i4 + 15; X`09 if (i4 > 70) then X`09 begin X`09`09i4 := 3; X`09`09i5 := i5 + 1 X`09 end; X`09 end; X`09i2 := i2 + 1; X until (i2 > max_class); X py.misc.pclass := 0; X put_buffer('',21,58); X exit_flag := false; X repeat X`09inkey_flush(s); X`09i2 := index('abcdefghijklmnopqrstuvwxyz',s); X`09if ((i2 <= i3) and (i2 >= 1)) then X`09 begin X`09 py.misc.tclass := class`5Bcl`5Bi2`5D`5D.title; X`09 py.misc.pclass := cl`5Bi2`5D; X`09 exit_flag := true; X`09 get_class := true; X`09 clear(21,1); X`09 put_buffer(py.misc.tclass,6,15); X`09 with py.misc do X`09 begin X`09 hitdie := hitdie + class`5Bpclass`5D.adj_hd; X mhp := con_adj + hitdie; X`09 chp`09 := mhp; X bth := bth + class`5Bpclass`5D.mbth; X`09 bthb := bthb + class`5Bpclass`5D.mbthb;`09`7BRAK`7D 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`09 save := save + class`5Bpclass`5D.msav; X title := player_title`5Bpclass,1`5D; X`09 expfact:= expfact + class`5Bpclass`5D.m_exp; X`09 end; X`09`7B Adjust the stats for the class adjustment`09`09-RAK-`09`7D X with py do X`09 begin X`09 stat.str := change_stat(stat.str,class`5Bmisc.pclass`5D.madj_str V); X`09 stat.int := change_stat(stat.int,class`5Bmisc.pclass`5D.madj_int V); X`09 stat.wis := change_stat(stat.wis,class`5Bmisc.pclass`5D.madj_wis V); X`09 stat.dex := change_stat(stat.dex,class`5Bmisc.pclass`5D.madj_dex V); X`09 stat.con := change_stat(stat.con,class`5Bmisc.pclass`5D.madj_con V); X`09 stat.chr := change_stat(stat.chr,class`5Bmisc.pclass`5D.madj_chr V); X`09 stat.cstr := stat.str; X`09 stat.cint := stat.int; X`09 stat.cwis := stat.wis; X`09 stat.cdex := stat.dex; X`09 stat.ccon := stat.con; X`09 stat.cchr := stat.chr; X`09 misc.ptodam := todam_adj;`09`7B Real values`09`09`7D X`09 misc.ptohit := tohit_adj; X`09 misc.ptoac := toac_adj; X`09 misc.pac := 0; X`09`09misc.dis_td := misc.ptodam;`09`7B Displayed values`09`7D X`09`09misc.dis_th := misc.ptohit; X`09`09misc.dis_tac:= misc.ptoac; X`09`09misc.dis_ac := misc.pac; X`09 end; X`09 end X`09else if (s = '?') then X`09 begin X`09 moria_help('Character Classes'); X`09 exit_flag := true; X`09 get_class := false; X`09 end X`09else if (ord(s) = 27) then X`09 begin X`09 exit_flag := true; X`09 get_class := false; X`09 end; X until(exit_flag); X end; X X procedure get_money; X var X`09tmp`09`09`09: integer; X begin X with py.stat do X`09tmp := cstr + cint + cwis + cdex + ccon + cchr; X with py.misc do X`09begin X`09 au := sc*6 + randint(25) + 325;`09`7B Social Class adj`09`7D X`09 au := au - tmp;`09`09`09`7B Stat adj`09`09`7D X`09 au := au + py.stat.cchr;`09`09`7B Charisma adj`09`09`7D X`09 if (au < 80) then au := 80;`09`09`7B Minimum`09`09`7D X`09end; X end; X X X`09`7B ---------- M A I N for Character Creation Routine ---------- `7D X`09`7B`09`09`09`09`09`09`09-JWT-`09`7D X X begin X repeat`20 X begin X`09`7B This delay may be reduced, but is recomended to keep players`09`7D X`09`7B from continuously rolling up characters, which can be VERY`09`7D X`09`7B expensive CPU wise.`09`09`09`09`09`09`7D X`09repeat X`09 put_character; X`09until(choose_race); X`09while (not(get_sex)) do put_character; X`09get_history; X`09get_ahw; X`09print_history; X`09put_misc1; X`09put_stats; X end until (get_class); X`09put_character; X`09print_history; X`09put_misc1; X`09put_stats; X`09get_money; X`09put_stats; X`09put_misc2; X`09put_misc3; X`09get_name; X`09pause_exit(24,player_exit_pause); X end; $ CALL UNPACK [.SOURCE.INCLUDE]CREATE.INC;1 1467892369 $ create 'f' X`09`7B Creatures movement and attacking are done from here`09-RAK-`09`7D X procedure creatures; X var X`09`09i1,i2,i3,moldy,moldx`09: integer; X X X`09`7B Updates screen when monsters move about`09`09-RAK-`09`7D X procedure update_mon(monptr : integer); X`09var X`09`09flag`09`09: boolean; 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 (cdis <= max_sight) then X`09`09 if (py.flags.blind < 1) then X`09`09 if (panel_contains(fy,fx)) then X`09`09 if (los(char_row,char_col,fy,fx)) then X`09`09`09with c_list`5Bmptr`5D do X`09`09`09 begin X`09`7B Normal sight...`09`7D X`09`09`09 if ((pl) or (tl)) then X`09`09`09 begin X`09`09`09 if (py.flags.see_inv) then X`09`09`09 flag := true X`09`09`09 else if (uand(%X'10000',cmove) = 0) then X`09`09`09 flag := true; X`09`09`09 end X`09`7B Infra vision...`09`7D X`09`09`09 else if (py.flags.see_infra > 0) then X`09`09`09`09if (cdis <= py.flags.see_infra) then X`09`09`09`09 if (uand(%X'2000',cdefense) <> 0) then X`09`09`09 flag := true; X`09`09`09 end; X`09`7B Light it up...`09`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...`09`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 criiters about the dungeon`09`09`09-RAK-`09`7D X function mon_move(monptr : integer) : boolean; X type X`09`09mm_type = array `5B1..5`5D of integer; X var X`09`09i1,i2,i3`09`09: integer; X`09`09mm`09`09`09: mm_type; X`09`09out_val`09`09`09: vtype; X`09`09move_test`09`09: boolean; X X`09`7B Choose correct directions for monster movement`09-RAK-`09`7D X procedure get_moves(monptr : integer; var mm : mm_type); X`09 var X`09`09y,ay,x,ax,move_val`09: integer; X`09 begin X`09 y := m_list`5Bmonptr`5D.fy - char_row; X`09 x := m_list`5Bmonptr`5D.fx - char_col; X`09 ay := abs(y); X`09 ax := abs(x); X`09 if (y < 0) then X`09 move_val := 8 X`09 else X`09 move_val := 0; X`09 if (x > 0) then X`09 move_val := move_val + 4; X`09 if (ay > (ax*1.7321)) then X`09 move_val := move_val + 2 X`09 else if (ax > (ay*1.7321)) then X`09 move_val := move_val + 1; X`09 case move_val of X`09 0 :`09begin X`09`09`09 mm`5B1`5D := 9; X`09`09`09 if (ay > ax) then X`09`09`09 begin X`09`09`09 mm`5B2`5D := 8; X`09`09`09 mm`5B3`5D := 6; X`09`09`09 mm`5B4`5D := 7; X`09`09`09 mm`5B5`5D := 3; X`09`09`09 end X`09`09`09 else X`09`09`09 begin X`09`09`09 mm`5B2`5D := 6; X`09`09`09 mm`5B3`5D := 8; X`09`09`09 mm`5B4`5D := 3; X`09`09`09 mm`5B5`5D := 7; X`09`09`09 end X`09`09`09end; X`09 1,9 :`09begin X`09`09`09 mm`5B1`5D := 6; X`09`09`09 if (y < 0) then X`09`09`09 begin X`09`09`09 mm`5B2`5D := 3; X`09`09`09 mm`5B3`5D := 9; X`09`09`09 mm`5B4`5D := 2; X`09`09`09 mm`5B5`5D := 8; X`09`09`09 end X`09`09`09 else X`09`09`09 begin X`09`09`09 mm`5B2`5D := 9; X`09`09`09 mm`5B3`5D := 3; X`09`09`09 mm`5B4`5D := 8; X`09`09`09 mm`5B5`5D := 2; X`09`09`09 end X`09`09`09end; X`09 2,6 :`09begin X`09`09`09 mm`5B1`5D := 8; X`09`09`09 if (x < 0) then X`09`09`09 begin X`09`09`09 mm`5B2`5D := 9; X`09`09`09 mm`5B3`5D := 7; X`09`09`09 mm`5B4`5D := 6; X`09`09`09 mm`5B5`5D := 4; X`09`09`09 end X`09`09`09 else X`09`09`09 begin X`09`09`09 mm`5B2`5D := 7; X`09`09`09 mm`5B3`5D := 9; X`09`09`09 mm`5B4`5D := 4; X`09`09`09 mm`5B5`5D := 6; X`09`09`09 end X`09`09`09end; X`09 4 :`09begin X`09`09`09 mm`5B1`5D := 7; X`09`09`09 if (ay > ax) then X`09`09`09 begin X`09`09`09 mm`5B2`5D := 8; X`09`09`09 mm`5B3`5D := 4; X`09`09`09 mm`5B4`5D := 9; X`09`09`09 mm`5B5`5D := 1; X`09`09`09 end X`09`09`09 else X`09`09`09 begin X`09`09`09 mm`5B2`5D := 4; X`09`09`09 mm`5B3`5D := 8; X`09`09`09 mm`5B4`5D := 1; X`09`09`09 mm`5B5`5D := 9; X`09`09`09 end X`09`09`09end; X`09 5,13 :`09begin X`09`09`09 mm`5B1`5D := 4; X`09`09`09 if (y < 0) then X`09`09`09 begin +-+-+-+-+-+-+-+- END OF PART 17 +-+-+-+-+-+-+-+-