-+-+-+-+-+-+-+-+ START OF PART 18 -+-+-+-+-+-+-+-+ X fix_room(pl`5Bnow`5D.attrib_ex`5Bst_base`5D+myview,short_range); Xend; X X`5Basynchronous`5D Xprocedure check_location(first:boolean := true); X`7BThis is gonna check for those all important things that happen when you X stand in a special place such as... X Taking damage from foreground effect X Printing a description. X Triggering a trap_door...`7D Xvar X slot,i:integer; Xbegin X`7Bif debug and not human then Xbegin X writev(qpqp,pl`5Bnow`5D.where.x,pl`5Bnow`5D.where.y,plr`5Bnow`5D.log,now); X bug_out(qpqp); Xend;`7D X for i := 1 to fg_layers do X begin X slot := fg.map`5Bpl`5Bnow`5D.where.x,pl`5Bnow`5D.where.y,i`5D; X if slot <> 0 then X with fg.effect`5Bslot`5D do X if overlap(base,altitude,pl`5Bnow`5D.attrib_ex`5Bst_base`5D,pl`5Bnow`5D. Vattrib`5Bat_size`5D) then X begin X if (not fg_printed`5Bslot`5D) and on then X begin X`09print(dsc); X`09fg_printed`5Bslot`5D := true; X end; X if on and first then X case kind of Xfg_view`09:do_view(true); Xfg_turn_on:if not pl`5Bnow`5D.sts`5Bps_dead`5D.on then turn_on_fg(slot); Xfg_turn_off:if not pl`5Bnow`5D.sts`5Bps_dead`5D.on then turn_off_fg(slot); Xfg_toggle:if not pl`5Bnow`5D.sts`5Bps_dead`5D.on then toggle_fg(slot); Xfg_delay :freeze(fparm1 / 100); Xfg_race :if fparm1 <> 0 then wl('You feel the presence of the '+ X`09 name`5Bna_race`5D.id`5Bfparm1`5D+' god here.') X`09 else wl('You feel an unknown presence here.'); Xfg_class :if fparm1 <> 0 then wl('The '+class_name`5Bfparm1`5D+ X`09 ' Guildmaster is in.') X`09 else wl('The Guildmaster is out.'); Xfg_college:if fparm1 <> 0 then`20 X`09wl('Welcome to the college of '+attrib_name`5Bfparm1`5D+'.') X`09else if fparm2 <> 0 then X`09wl('Welcome to the college of '+element`5Bfparm2`5D+'.'); Xfg_rebirth:if pl`5Bnow`5D.sts`5Bps_dead`5D.on then wl('You feel a great ene Vrgy around you.'); X end X else if on then X case kind of Xfg_hurt :if not pl`5Bnow`5D.sts`5Bps_dead`5D.on then get_attack(0,pl`5Bnow` V5D.where.x,pl`5Bnow`5D.where.y, X`09fparm2,fparm3,fparm1,fg.name`5Bslot`5D); Xfg_poison:begin X`09 wl('You feel very sick.'); X`09 if not pl`5Bnow`5D.sts`5Bps_poisoned`5D.on then X`09 begin X`09 pl`5Bnow`5D.sts`5Bps_poisoned`5D.on := true; X`09 pl`5Bnow`5D.sts`5Bps_poisoned`5D.time := getticks + 300; X`09 end X`09 else X`09 pl`5Bnow`5D.sts`5Bps_poisoned`5D.time := X`09 pl`5Bnow`5D.sts`5Bps_poisoned`5D.time + 300; X`09 end; Xfg_sliding:do_go(fparm1,false,fparm2); X end; X end; X end; Xend; X X`5Basynchronous`5D Xfunction object_here:integer; Xvar X found:boolean := false; X i:integer := 1; Xbegin X object_here := 0; X while (i <= obj_layers) and (not found) do X if obj_map`5Bpl`5Bnow`5D.where.x,pl`5Bnow`5D.where.y,i`5D <> 0 then X begin X with fg.object`5Bobj_map`5Bpl`5Bnow`5D.where.x,pl`5Bnow`5D.where.y,i`5D` V5D do X if overlap(base,altitude,pl`5Bnow`5D.attrib_ex`5Bst_base`5D,pl`5Bnow`5D. Vattrib`5Bat_size`5D) then X begin X found := true; X object_here := obj_map`5Bpl`5Bnow`5D.where.x,pl`5Bnow`5D.where.y,i`5D; X end X else i := i + 1; X end X else i := i + 1; Xend; X X`5Basynchronous`5D Xprocedure check_objects; Xvar X n:integer; X s:string; Xbegin X n := object_here; X if n > 0 then X with fg.object`5Bn`5D.object do X if num > 0 then wl('There is '+object_name(num)+' here.') X else X begin X writev(s,'There is ',condition:0,' gold here.'); X wl(s); X end; Xend; X X`5Basynchronous`5D Xfunction paid_toll:boolean; Xvar X fg_slot:integer; X s:string; Xbegin X paid_toll := false; X if foreground_found(pl`5Bnow`5D.where.x,pl`5Bnow`5D.where.y, X pl`5Bnow`5D.attrib_ex`5Bst_base`5D,pl`5Bnow`5D.attrib`5Bat_size`5D,fg_exit V,fg_slot) then X begin X if fg.effect`5Bfg_slot`5D.fparm1 <> 0 then X begin X if pl`5Bnow`5D.attrib`5Bat_wealth`5D >= fg.effect`5Bfg_slot`5D.fparm1 V then X begin X`09writev(s,'Do you wish to pay the ',fg.effect`5Bfg_slot`5D.fparm1:0, X`09' gold toll'); X`09if grab_yes(s) then X`09begin X`09 paid_toll := true; X`09 change_stat(at_wealth,pl`5Bnow`5D.attrib`5Bat_wealth`5D - X fg.effect`5Bfg_slot`5D.fparm1); X`09 save_player; X`09end; X end X else wl('You cannot afford the toll.'); X end X else paid_toll := true; X end; Xend; X Xprocedure do_go`7B(dirnum:integer; move_delay:boolean := true; X`09`09`09move_modifier:integer := 0)`7D; Xvar X mask,tempx,tempy:integer := 0; X s:string; X light:boolean := true; Xbegin X if not (frozen and move_delay) then X begin X if drag_char <> chr(0) then here.background`5Bpl`5Bnow`5D.where.x, X pl`5Bnow`5D.where.y`5D := drag_char; X if fg_map > 0 then map_foreground(fg_map,g_point,pl`5Bnow`5D.where.x,pl` V5Bnow`5D.where.y) X else if fg_map < 0 then map_foreground(abs(fg_map) X `09`09`09,g_point,pl`5Bnow`5D.where.x,pl`5Bnow`5D.where.y,,,false); X new_coords(pl`5Bnow`5D.where.x,pl`5Bnow`5D.where.y,tempx,tempy,dirnum); X if (tempx < 1) or (tempx > here.size.x) or X (tempy < 1) or (tempy > here.size.y) then do_exit(dirnum) X else if (dirnum = 5) then X begin X if paid_toll then do_exit(dirnum); X end X else X if can_move(tempx,tempy,dirnum) then X begin X people_map`5Bpl`5Bnow`5D.where.x,pl`5Bnow`5D.where.y`5D := 0; X fix_scenery(pl`5Bnow`5D.where.x,pl`5Bnow`5D.where.y); X person`5Bplr`5Bnow`5D.log`5D.loc.x := tempx; X person`5Bplr`5Bnow`5D.log`5D.loc.y := tempy; X pl`5Bnow`5D.where.x := tempx; X pl`5Bnow`5D.where.y := tempy; X people_map`5Bpl`5Bnow`5D.where.x,pl`5Bnow`5D.where.y`5D := plr`5Bnow`5 VD.log; X mask := do_mask(not pl`5Bnow`5D.sts`5Bps_dead`5D.on,m_alive,human,m_hu Vman, X pl`5Bnow`5D.sts`5Bps_invisible`5D.on,m_invisible); X if not pl`5Bnow`5D.sts`5Bps_invisible`5D.on then X act_out(plr`5Bnow`5D.log,e_move,pl`5Bnow`5D.where.x,pl`5Bnow`5D.where. Vy, X pl`5Bnow`5D.attrib_ex`5Bst_base`5D,pl`5Bnow`5D.attrib`5Bat_size`5D,,ma Vsk); X center_me; X draw_me; X check_location(true); X check_objects; X if (not checkprivs(8)) and move_delay then X freeze((pl`5Bnow`5D.attrib`5Bat_mv_delay`5D+move_modifier) / 100) X else freeze (move_modifier / 100); X end; X end; Xend; X Xfunction find_fg(lookingfor:integer := 0; var slot:integer):boolean; Xvar X i:integer; X found:boolean := false; Xbegin X slot := 0; X i := 1; X while (i <= maxfg) and (not found) do X if fg.effect`5Bi`5D.kind = 0 then X begin X slot := i; X found := true; X end X else i := i + 1; X find_fg := found; Xend; X Xend. $ CALL UNPACK SRMOVE.PAS;1 391344987 $ create 'f' X`5Binherit ('srinit','srsys','srother','srmisc','srio','srmenu'), X environment('srop')`5D X Xmodule srop; X X`5Bhidden,external`5D Xfunction getkey(key_mode:integer := 0):char; Xexternal; X Xprocedure grab_kind(prompt:string; var kind:integer); Xbegin X case grab_key(prompt,key_kind) of X 'r':kind := na_race; X 'o':kind := na_obj; X 'R':kind := na_room; X 'f':kind := na_foreground; X 'p':kind := na_player; X 's':kind := na_spell; X 'q':kind := 0; X end; Xend; X Xprocedure install_foregrounds; Xbegin X getfg; X X with fg.effect`5B1`5D do X begin X fg.name`5B1`5D`09:= 'Wall'; X icon`09:= ' '; X rendition`09:= reverse; X base`09:= 0; X altitude`09:= 20; X kind`09:= fg_normal; X fparm1`09:= 0; X fparm2`09:= 0; X dsc`09`09:= ''; X on`09`09:= true; X walk_through:= false; X walk_on`09:= false; X climb`09:= false; X end; X X with fg.effect`5B2`5D do X begin X fg.name`5B2`5D := 'Closed door'; X icon`09:= '+'; X rendition`09:= reverse; X base`09:= 0; X altitude`09:= 20; X kind`09:= fg_door; X fparm1`09:= 3; X fparm2`09:= 0; X dsc`09`09:= ''; X on`09`09:= true; X walk_through:= false; X walk_on`09:= false; X climb`09:= false; X end; X X with fg.effect`5B3`5D do X begin X fg.name`5B3`5D`09:= 'Open door'; X icon`09:= '-'; X rendition`09:= bold; X base`09:= 0; X altitude`09:= 20; X kind`09:= fg_door; X fparm1`09:= 2; X fparm2`09:= 0; X dsc`09`09:= ''; X on`09`09:= true; X walk_through:= true; X walk_on`09:= false; X climb`09:= false; X end; X X with fg.effect`5B4`5D do X begin X fg.name`5B4`5D`09:= 'Stairway down'; X icon`09:= '<'; X rendition`09:= bold; X base`09:= 0; X altitude`09:= 0; X kind`09:= fg_exit; X fparm1`09:= 0; X fparm2`09:= 0; X dsc`09`09:= ''; X on`09`09:= true; X walk_through:= true; X walk_on`09:= true; X climb`09:= true; X end; X X with fg.effect`5B5`5D do X begin X fg.name`5B5`5D := 'Stairway Up'; X icon`09:= '>'; X rendition`09:= bold; X base`09:= 0; X altitude`09:= 0; X kind`09:= fg_exit; X fparm1`09:= 0; X fparm2`09:= 0; X dsc`09`09:= ''; X on`09`09:= true; X walk_through:= true; X walk_on`09:= true; X climb`09:= true; X end; X X putfg; Xend; X Xprocedure balance_distribution; Xvar X i,j:integer; X s:string; X class_array:array`5B1..maxclass`5D of integer; X race_array:array`5B1..maxindex`5D of integer; Xbegin X for i := 1 to maxclass do class_array`5Bi`5D := 0; X for i := 1 to maxindex do race_array`5Bi`5D := 0; X for i := 1 to indx`5Bi_player`5D.top do X if indx`5Bi_player`5D.on`5Bi`5D and (not indx`5Bi_npc`5D.on`5Bi`5D) then X begin X getplayer(i); X freeplayer; X if player.attrib_ex`5Bst_class`5D <> 0 then X class_array`5B player.attrib_ex`5Bst_class`5D `5D := X class_array`5B player.attrib_ex`5Bst_class`5D `5D + 1; X X if player.attrib_ex`5Bst_race`5D <> 0 then X race_array`5B player.attrib_ex`5Bst_race`5D `5D := X race_array`5B player.attrib_ex`5Bst_race`5D `5D + 1; X end; X wl('Class distribution'); X for i := 1 to maxclass do X if class_array`5Bi`5D > 0 then X begin X writev(s,write_nice(class_name`5Bi`5D,20),':',class_array`5Bi`5D:0); X wl(s); X end; X wl('Race distribution'); X for i := 1 to indx`5Bi_race`5D.top do X if race_array`5Bi`5D > 0 then X begin X writev(s,write_nice(name`5Bna_race`5D.id`5Bi`5D,20),':',race_array`5Bi`5 VD:0); X wl(s); X end; Xend; X Xprocedure find_gold; Xvar X i:integer; X s:string; Xbegin X for i := 1 to indx`5Bi_player`5D.top do X begin X getplayer(i); X freeplayer; X if player.attrib`5Bat_wealth`5D <> 0 then X begin X writev(s,write_nice(name`5Bna_player`5D.id`5Bi`5D,20),':', X player.attrib`5Bat_wealth`5D:0); X wl(s); X end; X end; Xend; X Xprocedure create_race(s:string); Xvar X racenum,i:integer; Xbegin X if allocate(i_race,racenum) then X begin X getname(na_race); X name`5Bna_race`5D.id`5Bracenum`5D := s; X putname(na_race); X getrace(racenum); X with race do X begin X for i := 1 to el_max do X with armor`5Bi`5D do X begin X`09chance := 0; X`09magnitude := 0; X end; X for i := 1 to maxnaturalweapon do weapon`5Bi`5D := 0; X for i := 1 to at_max do attrib`5Bi`5D := 0; X for i := 1 to el_max do proficiency`5Bi`5D := 0; X hands := false; X sound := 'Hi!'; X end; X putrace; X end; Xend; X Xprocedure designate_randoms; Xvar X n:integer; Xbegin X if get_name(name`5Bna_player`5D.id,'Player',n,,i_npc) then X begin X getindex(i_npc); X indx`5Bi_npc`5D.on`5Bn`5D := not indx`5Bi_npc`5D.on`5Bn`5D; X putindex(i_npc); X if indx`5Bi_npc`5D.on`5Bn`5D then X wl(name`5Bna_player`5D.id`5Bn`5D+' is now a random.') X else wl(name`5Bna_player`5D.id`5Bn`5D+' is not longer a random.') X end; Xend; X Xprocedure custom_race(n:integer); Xvar X d_st,s:string; X d_ss:shortstring; X d_bo:boolean; X d_ic:char; X i,d_in:integer; Xbegin X mc := 1; X getrace(n); X freerace; X with race do X begin X set_menu('Name of race',,k_sst,,name`5Bna_race`5D.id`5Bn`5D); X set_menu('Sound race makes','(Direction): this_string',k_str,,sound); X set_menu('Can use weapons',,k_boo,,,hands); X for i := 1 to maxnaturalweapon do X begin X writev(s,'Attack spell #',i:0); X set_menu(s,,k_spe,weapon`5Bi`5D,,,,,,na_spell); X end; X for i := 1 to at_max do X set_menu(attrib_name`5Bi`5D,,k_int,attrib`5Bi`5D); X for i := 1 to el_max do X set_menu('Proficiency '+element`5Bi`5D,,k_int,proficiency`5Bi`5D); X for i := 1 to el_max do X begin X set_menu('% chance ('+element`5Bi`5D+')', X '% chance this attack form will be modified',k_int,armor`5Bi`5D.chance V); X set_menu('% block ('+element`5Bi`5D+')', X '% damage taken off if attack is to be modified',k_int, X armor`5Bi`5D.magnitude); X end; `20 X end; X do_menu('race.help'); X getname(na_race); X get_menu_sst(name`5Bna_race`5D.id`5Bn`5D); X putname(na_race); X getrace(n); X get_menu_str(race.sound); X get_menu_boo(race.hands); X with race do X begin X for i := 1 to maxnaturalweapon do get_menu_int(weapon`5Bi`5D); X for i := 1 to at_max do get_menu_int(attrib`5Bi`5D); X for i := 1 to el_max do get_menu_int(proficiency`5Bi`5D); X for i := 1 to el_max do X with armor`5Bi`5D do X begin X get_menu_int(chance); X get_menu_int(magnitude); X end; X end; X putrace; Xend; X Xprocedure create_room(s:string; x,y:integer := 0); Xvar X roomnum,i,j,k:integer; Xbegin X if x = 0 then grab_num('Room size X',x,1,maxhoriz,40); X if y = 0 then grab_num('Room size Y',y,1,maxvert,13); X if allocate(i_room,roomnum) then X begin X getname(na_room); X name`5Bna_room`5D.id`5Broomnum`5D := s; X putname(na_room); X getroom(roomnum); X with here do X begin X level := 50; X size.x := x; X size.y := y; X for j := 1 to y do X`09for i := 1 to x do X`09 background`5Bi,j`5D := ' '; X end; X putroom; X getfg(roomnum); X with fg do X begin X for i := 1 to maxhoriz do X for j := 1 to maxvert do X for k := 1 to fg_layers do fg.map`5Bi,j,k`5D := 0; X for i := 1 to maxobjs do X with object`5Bi`5D do X begin X`09object.num := 0; X`09object.condition := 0; +-+-+-+-+-+-+-+- END OF PART 18 +-+-+-+-+-+-+-+-