! Following is a handy little routine for Hugo 2.5+ that provides exit ! descriptions for rooms. All you need to do to use it is make sure you ! use the dir.to properties to code your exits, and *don't put any other ! code in them*. For example, ! ! e_to DinkyRoom ! ! is acceptable, while something like ! ! e_to { move thingie to player : return DinkyRoom } ! ! is not. Also, each location that needs to be referred to with a preposition ! needs to be supplied with one. For example, ! ! room street "street running in front of the park" ! { ... ! prep " a" ! ... ! } ! ! Notice the leading space in the preposition property. That is reqired ! in order to allow rooms that *don't* need a preposition to print ! out properly. Now, all you need to do to make this thing work is to call ! YouCanGo() after each room's long description: ! ! room street "street running in front of the park" ! { ... ! prep " a" ! long_desc { "You are on a narrow street fronting the park." ! YouCanGo() ! } ! } ! ! That's it! Everything else is automatic, including door-handling. ! Enjoy! This document copyright (c) 2000 by Cardinal Teulbachs array go_dirs[13] routine YouCanGo { local n, p, cnt, the_dir, list_ref go_dirs[1] = location.n_to go_dirs[2] = location.s_to go_dirs[3] = location.e_to go_dirs[4] = location.w_to go_dirs[5] = location.ne_to go_dirs[6] = location.nw_to go_dirs[7] = location.se_to go_dirs[8] = location.sw_to go_dirs[9] = location.in_to go_dirs[10] = location.out_to go_dirs[11] = location.u_to go_dirs[12] = location.d_to for(n = 1; n <= 12; n++) { if go_dirs[n] { go_dirs[0] = 1 break } else go_dirs[0] = 0 } if go_dirs[0] = 0 ! if nowhere to go { "\n\_ There are no obvious exits from here." return true ! bail out } "\n\_ You can go "; for (n=1; n<=12; n++) ! begin Exits loop { if go_dirs[n] ~= 0 ! skip empty array elements { if go_dirs[n].type = door { local x for (x=1; x<=2; x++) { if go_dirs[n].between#x ~= location the_dir = go_dirs[n].between#x } } else the_dir = go_dirs[n] if go_dirs[n] = location.n_to : print "north to"; the_dir.prep; " "; the_dir.name; elseif go_dirs[n] = location.s_to : print "south to"; the_dir.prep; " "; the_dir.name; elseif go_dirs[n] = location.e_to : print "east to"; the_dir.prep; " "; the_dir.name; elseif go_dirs[n] = location.w_to : print "west to"; the_dir.prep; " "; the_dir.name; elseif go_dirs[n] = location.ne_to : print "northeast to"; the_dir.prep; " "; the_dir.name; elseif go_dirs[n] = location.nw_to : print "northwest to"; the_dir.prep; " "; the_dir.name; elseif go_dirs[n] = location.se_to : print "southeast to"; the_dir.prep; " "; the_dir.name; elseif go_dirs[n] = location.sw_to : print "southwest to"; the_dir.prep; " "; the_dir.name; elseif go_dirs[n] = location.in_to : print "in to"; the_dir.prep; " "; the_dir.name; elseif go_dirs[n] = location.out_to : print "out to"; the_dir.prep; " "; the_dir.name; elseif go_dirs[n] = location.u_to : print "up to"; the_dir.prep; " "; the_dir.name; elseif go_dirs[n] = location.d_to : print "down to"; the_dir.prep; " "; the_dir.name; cnt = 0 for (p=n; p<=12; p=p+1) ! determine whether list end { if go_dirs[p] ~= 0 cnt++ } if cnt = 2 : ", or "; ! choose appropriate punct. elseif cnt >= 3 : ", "; elseif cnt = 1 : { "." : break } ! and break if end cnt = 0 ! reset counter for next pass list_ref = 0 } } local m for (m=0; m<=12; m++) ! flush array go_dirs[m] = 0 return true ! return true to advance turn }