@q @program SloMo.muf 1 9999 d i ( SloMo.muf, by Jessy @ FurryMUCK 10/17/95 SloMo.muf makes 'slow exits', to simulate semi-realistic travel. It is a simpler, less flexible, and far more user-friendly companion to TravelSim.muf. The program moves the user to an 'enroute' room -- typically desc'd as a vehicle -- and, optionally, displays 'travel events'... lists saying what happens along the way. After travel events are displayed, the program moves the user to a destination room. To use SloMo.muf, @dig a room where the user will be while travelling. In rooms linked via SloMo.muf -- rooms served by the simulated vehicle, as it were -- @open an exit and @link it to SloMo.muf. On the *exit*, set the following props, without # signs where a dbref is used: @set <exit> = destination:<dbref of room where user will go> @set <exit> = enroute:<dbref of vehicle room> Those two props are necessary; the following are optional. lsedit <exit> = message<N>a list that will be shown to travellers, to be used for 'events' along the way. N is the number of the message. For a trip that includes three events, you would make lists message1, message2, and message3.> @set <exit> = sleepfor:<number of seconds between events. Defaults to 10> The vehicle room can have a standard desc, or it can have a desc that changes depending on which exit the player used, either for increased realism or to let one vehicle room act as several different kinds of vehicles. To use changing descs,... @set <exit> = desc:<desc text> Since SloMo.muf adds an extra room to the process of moving from one room to another, succ, osucc, drop, and odrop messages may not work as intended. If so, leave these unset and instead set props _succ, _osucc, _drop, and _odrop on the exit. MPI embedded in these prop strings will be parsed as normal. SloMo.muf may be freely ported. Please comment any changes. ) lvar counter1 lvar counter2 lvar thismessage lvar saypose : parsethis ( d s -- s ) ( returns d's prop s, parsed for MPI ) dup 3 pick swap getpropstr 0 parseprop ; : tell ( s -- ) ( notify user with s ) me @ swap notify ; : ltell ( s -- ) ( notify players at loc with s ) me @ location swap 0 swap notify_exclude ; : thissucc ( -- ) ( display an emulated @succ message ) trigger @ trigger @ "_succ" getpropstr "_succ" swap 0 parseprop tell ; : thisosucc ( -- ) ( display an emulated @osucc message ) trigger @ trigger @ "_osucc" getpropstr "_osucc" swap 0 parseprop me @ name " " strcat swap strcat ltell ; : thisdrop ( -- ) ( display an emulated @drop message ) trigger @ trigger @ "_drop" getpropstr "_drop" swap 0 parseprop tell ; : thisodrop ( -- ) ( display an emulated @odrop message ) trigger @ trigger @ "_odrop" getpropstr "_odrop" swap 0 parseprop me @ name " " strcat swap strcat ltell ; : pause ( -- ) ( sleep for set number of seconds, or default of 10 ) trigger @ "sleepfor" getpropstr dup not if pop 10 sleep else atoi sleep then exit ; : ridetell ( s -- ) ( notify 'me' and anyone carried by me with s ) thismessage ! me @ thismessage @ notify me @ "RIDE/ontaur" getpropstr if "zrbrt" me @ "RIDE/ontaur" getpropstr " " explode pop begin dup "zrbrt" smatch not if 1 strcut swap pop atoi dbref thismessage @ notify else exit then repeat then "zzz" exit ; : main trig "enroute" getpropstr trig "destination" getpropstr and not if "You can't go that way." .tell trig owner me @ dbcmp if "You need to set the exit's `destination' and `enroute' " "properties before it can be used with slomo.muf." strcat .tell then exit then ( go background, so user can do other stuff while enroute ) background ( initialize counters) "1" counter1 ! "1" counter2 ! ( set enroute desc unique to triggering exit, if present) trigger @ "desc" getpropstr if trigger @ "enroute" getpropstr atoi dbref trigger @ "desc" getpropstr setdesc then ( run emulated @succ/@osucc, if present ) trigger @ "_succ" getpropstr if thissucc then trigger @ "_osucc" getpropstr if thisosucc then ( move user to enroute room ) me @ trigger @ "enroute" getpropstr atoi dbref moveto pause ( loop, telling user trip event messages ) begin ( see if user has left enroute room prematurely. if so, exit ) trigger @ "enroute" getpropstr atoi dbref me @ location dbcmp not if exit then ( any more messages in this loop? if not, exit ) trigger @ "message" counter1 @ strcat "#/1" strcat getpropstr dup not if ( run emulated @drop/@odrop, if present ) trigger @ "_drop" getpropstr if thisdrop then trigger @ "_odrop" getpropstr if thisodrop then ( move to dest, and quit ) me @ trigger @ "destination" getpropstr atoi dbref moveto exit then ( reinitialize list counter ) "1" counter2 ! ( quick loop telling user a listed message ) begin trigger @ "message" counter1 @ strcat "#/" strcat counter2 @ strcat parsethis dup not if pop "1" counter2 ! break then ridetell pop counter2 @ atoi 1 + intostr counter2 ! repeat ( loiter for the appointed amount of time ) pause counter1 @ atoi 1 + intostr counter1 ! ( let's try it again ) repeat ; . c q