|
JQuilici Adept
Joined: 21 Sep 2005 Posts: 250 Location: Austin, TX
|
Posted: Tue Mar 11, 2008 8:23 pm
Brainstorming: Timed Teleport Rooms (Very Long) |
As has been mentioned often, there are usually at least a dozen valid ways to solve a problem in zScript. This is a good thing, but it sometimes leaves one trying to figure out which is best/most efficient/easiest to maintain or use, etc.
This thread is perhaps the first of many in which I am going to think out loud about a script-design problem I'm facing as I build my next-gen scripts for CMUD. I'll give a description of the problem I'm trying to solve, along with MUD output and other details that seem relevant, plus several approaches that I've thought of. I'm soliciting opinions, feedback, suggestions, criticism, and observations.
My hopes are this will result in a design-level conversation, with several benefits:
- I get feedback on my design decisions, so I can refine my thinking.
- Wiser heads can suggest approaches I have not thought of.
- We all get to show how smart we are, and that we can solve complicated problems.
- We might generate good feature requests for the new mapper (or other parts of CMUD)
Specific code is welcome, of course, but don't feel the need to generate it to participate - I'm more interested in getting the design right. I can implement with the best of 'em.
And don't be shy about suggesting radical changes to my setup. I have no proprietary interest in my scripts (beyond bragging rights), and I don't sell 'em, so ask for any details you think may be relevant.
Ok...on to our first problem:
The Problem
Mozart MUD has several features that I have not seen mentioned much on these forums. I'm primarily concerned right now with Timed Teleport rooms, which I'll call TTRs to save typing. TTRs have the following properties:
- Each TTR has a server-side alarm in it, which fires at predetermined intervals.
- The interval varies for each TTR, from as low as <1 sec to several minutes.
- If a player is standing in the room when the alarm fires, the player is teleported to another room (the 'destination room').
- The destination room is fixed for each TTR (as far as I know)
- For most TTRs, the player is given the name/desc/exits/contents of the destination room when teleported, as if the player had entered normally. However, this is not always the case - some TTRs teleport silently.
- There is no message to the player that the teleport is occurring - he just sees the new room.
TTRs are used in a lot of places in the MUD, some deadly, some not. Examples would include a rickety bridge (it may collapse while you're standing on it), an ambush (player is suddenly moved to a similar-looking room, but full of mobs), falling off of things (a series of TTRs as you fall), etc.
I have several goals:
- The Automapper should follow correctly when a teleport occurs.
- The speedwalk code should be able to plot paths through (non-deadly) TTRs.
- The Automapper should detect TTRs (when they fire) and create new rooms as necessary.
- Speedwalks should pause and recompute if a TTR sucks me off my planned path as I pass through.
- Ideally, I want the mapper to have some visual indication of which rooms are TTRs, and where their destinations are.
MUD Output
The quickest example for an outsider to find is from the mini-mud (the newbie intro area), which has a TTR a few rooms in to move you from the equipping area to the adventuring area. This output starts just after character creation (in case anyone logs in to test or check it out for themselves):
Code: |
Welcome to Mozart Mud!
0) Exit from Mozart.
1) Enter the game.
2) Enter description.
3) Change password.
4) Log in a different character, or create a new one.
Make your choice: 1
Welcome to Mozart Mud! Enjoy your stay.
Welcome to the Realms of Mozart Mud!
The sun is warm on your skin and the air has a fresh rain-washed scent. The
grass is soft and dewy beneath your feet. There is a breathtaking vista of far
off mountains, royal purple and snow capped. Entering these lands of Mozart,
you feel the newness of your body. You can dimly remember being forced to
answer many questions. Who do you want to be? What do you want to be? Now
that you have answered all of those questions, there are others to answer.
What will you make of yourself? Will you fight for the forces of Light or
Darkness, for Truth or Lies? You feel anxious to answer these questions as you
begin your life here on Mozart but are confused and disoriented. There is so
much you need to know. Oddly, in the middle of this primeval wilderness stands
a large leather tome on a tall white marble pedestal and it beckons for your
attention. There is a break in the thick underbrush and the beginnings of a
trail to the south.
Exits: south
A thick leather tome sits atop a pedestal, open for reading. (HELP READ)
The Town Crier shouts, "Welcome to Mozart, Molasar!"
[H:27 M:100 V:161 C:*]> s
Mapping New Terrain
Moving south, you are now on a small dirt trail running through some light,
sun-dappled woods. A refreshing breeze ruffles through the tree leaves and
there is the occasional chirp of a far off bird. Since you came south,
returning north will put you back in the open field. Perhaps by keeping track
of which direction you have moved you can map these new lands. Continuing
east, the trail leads to another clearing where there is a tent on the side of
the path. There is also a large, heavily embellished sign attached to a tree
that catches your eye.
Exits: north, east
Three shiny gold coins lie on the ground, unclaimed.
[H:27 M:100 V:159 C:*]> get all
You get three gold coins.
There were 3 coins.
[H:27 M:100 V:161 C:*]> e
Encakest's Bazaar
A brown tent has been set up on the side of the path, with faded lettering
on one side. The flaps have been tied back to reveal a long oak table that
spans the opening. Hanging from the front of the table is a red stone plaque
with bright white lettering, and a handmade sign is set up on the table
surface. A set of pine shelves has been erected along the back wall of the
tent, and it is covered with books, parchments, and scrolls. The floor is
covered by worn blue rugs, and two small lanterns on either end of the table
fill the room with light.
Exits: south, west
Encakest sits on a stool behind the table, waiting for customers.
Encakest glows with a bright light!
[H:27 M:100 V:160 C:*]> buy wa
Encakest says, "Now be sure to study that carefully; it may save your life!" (HELP READ)
Encakest gives you The Warrior's Weapon Compendium.
[H:27 M:100 V:161 C:*]> s
End of the Path
A small gravel path meets with the base of a large stone building. The
building is only a single story high, but very wide. The walls are made of
off-white blocks about the height of a human, and no windows mar the surface of
the facade. The only opening is a tall wooden door, which is slightly ajar,
allowing a blue light to shine out from the interior.
Exits: north, south
A marble golem blocks the door, staring at everything that moves.
A marble golem glows with a bright light!
[H:27 M:100 V:160 C:*]> s
A marble golem looks at you.
A marble golem says, "You are welcome to pass through, young Molasar. Be sure to read Encakest's wares! It will help you make your next decision!"
Portal Room
In sharp contrast to the white stone on the exterior of the building, the
interior is covered in polished black marble. The only light shines from five
round glowing portals that stand around the room, one against each wall and one
in the center. On the floor in front of each blue portal, a picture of a
weapon has been engraved in silver. A sword lies in front of the center
portal, while a dagger, mace, staff, and claw decorate the others. A small
plaque is attached to the wall.
Exits: north
[H:27 M:100 V:159 C:*]> enter sword
You step through the sword arch and appear elsewhere.
The Equipping Room
This cramped chamber is a small square room, adorned only by a plain blue
rug in the center of the floor. The walls, ceiling, and floor are an off-white
rock that is comfortably warm to the touch. A faint glow emanates from the
stone, providing just enough light to see by. An opening in the wall covered
by a flimsy curtain is the only way out of the room. A sign has been nailed to
the wall next to the exit.
Exits: south
A wrinkled blue robe lies on the ground in an untidy pile.
A pair of discolored leather leggings lie on the ground.
A steel practice sword lies unclaimed on the floor.
A warm set of gloves rest here, ready to be used.
A shiny new helm sits here, waiting to be picked up.
A set of shiny armor waits for you here, perfect for Mozart's newcomers.
A set of brand new sleeves lies on the ground, ready for use.
A pair of unclaimed boots lie on the ground.
A sturdy wooden shield lies unclaimed on the ground.
A leather belt with metal studs lies here.
[H:27 M:100 V:161 C:*]> get all
You get a newbie robe.
You get a set of newbie leggings.
You get a newbie sword.
You get a pair of newbie gloves.
You get a newbie helm.
You get a set of newbie armor.
You get a set of newbie sleeves.
You get a pair of newbie boots.
You get a newbie shield.
You get a newbie belt.
[H:27 M:100 V:161 C:*]> wear all
You clasp a newbie belt about your waist.
You strap a newbie shield onto your arm.
You wear a pair of newbie boots on your feet.
You pull a set of newbie sleeves onto your arms.
You wear a set of newbie armor on your body.
You wear a newbie helm on your head.
You wear a pair of newbie gloves on your hands.
You wield a newbie sword as your primary weapon.
You pull a set of newbie leggings onto your legs.
You wear a newbie robe about your body.
[H:27 M:100 V:161 C:*]> s
Map Room
A large square table occupies nearly all the available floor space in a
small, cramped room. The walls and ceiling are made of dirty white stone, and
the floor is blanketed by a red rug. A detailed map lies spread the top of the
table, open for viewing. A wooden door is along the north wall, while a white
arch stands against the south wall. The archway is filled with a purple
glowing nimbus that blocks the view of what lies on the other side. A bronze
plaque has been hung on the wall next to the arch, while a wooden sign hangs on
the back of the door.
Exits: north (closed), south
Tarcus looks up from a large map, and waits for you to speak. (HELP SAY)
Tarcus glows with a bright light!
[H:28 M:100 V:160 C:*]> s
Jumping Off Point
Black sky filled with stars surrounds a small wooden platform. The landing
floats unsupported in space, yet hovers motionless. The wooden planks extend
southward to the end of the platform. The air is very cold, and it is a
struggle to breathe the thin air.
Exits: north, south
[H:28 M:100 V:160 C:*]> 'Here we go into the TTR
You say, "Here we go into the TTR"
[H:31 M:100 V:161 C:*]> s
An invisible force looks at you.
On Your Way
The world fades into blackness as the universe shifts beneath your feet.
Bright, colorful lights flash by you from all directions, and then fade into
the distance. A disembodied voice booms around you, "Good luck, young one!"
Exits: None
[H:31 M:100 V:160 C:*]>
The Entrance to the Mini-Mud
A tall pedestal covered with engravings occupies the center of a large
windowless room. A white arch stands against the south wall, the archway
filled with a silver glowing nimbus that blocks the view of what lies on the
other side. Lanterns mounted on each wall bathe the room in warm light.
Upholstered chairs in many sizes line the walls, with a padded footstool
sitting in front of each. Three comfortable looking beds, all different
lengths, have been set up along the south wall. A square sign hangs on the
wall above the beds, and a painting of a golden meadow decorates the northern
wall. A smaller replica of the table in the Map Room sits beneath the
painting.
Exits: north, south
A clear vial filled with golden liquid rests atop a white pedestal.
|
Note that the final room description just appears with no command from me. I will also point out that the MUD does use MXP, but only a little bit (it defines about a dozen entities, but only ever sends rname, rdesc, and rexit, and I can't even get a trigger to fire on rdesc):
Code: |
[1;37;40m[1z<rname>[2zThe Entrance to the Mini-Mud[1z</rname>[2z[0;37;40m
[0;37;40m[1z<rdesc>[2z A tall pedestal covered with engravings occupies the center of a large
windowless room. A white arch stands against the south wall, the archway
filled with a silver glowing nimbus that blocks the view of what lies on the
other side. Lanterns mounted on each wall bathe the room in warm light.
Upholstered chairs in many sizes line the walls, with a padded footstool
sitting in front of each. Three comfortable looking beds, all different
lengths, have been set up along the south wall. A square sign hangs on the
wall above the beds, and a painting of a golden meadow decorates the northern
wall. A smaller replica of the table in the Map Room sits beneath the
painting.
[1z</rdesc>[2z[0;37;40m[1;37;40m[1z<rexit>Exits: [1z<ex>[2znorth[1z</ex>[2z, [1z<ex>[2zsouth[1z</ex>[2z[1z</rexit>[2z[0;37;40m
[0;36;40mA clear vial filled with golden liquid rests atop a white pedestal.[0;37;40m
|
Approaches
So far, I have mostly considered how to accomplish the 'follow' and 'display' goals. Capturing the links automatically is a bit harder, and may involve something akin to Vijilante's total mapper rewite. Also, I have not (yet) purchased zMapper, and I'm still unclear on how it or it's successor will work with CMUD. So, with that in mind...
Approach #1: In my existing zMUD scripts, I have really only achieved goal #1. In each TTR, I have a #TEMP trigger in the room script, using the name of the destination room as the pattern, and a #TELEPORT command as the body. E.g. for the room 'On Your Way' in the example shown above, the room script is:
Code: |
#temp tempteleport {The Entrance To The Mini-MUD} {#teleport 6521} |
(I did not originally know to use the 'noclear' argument to preserve the mapper queue, but I'm slowly fixing that.) This approach continues to work in CMUD, but I'd like to do better.
This approach also suffers from a disadvantage when the destination room is also reachable from a regular exit - if I scry into the next room (e.g. 'look <dir>', which shows me the room name/description, etc.), the trigger will fire and move the map cursor, although I have not actually moved.
Under this approach, I have to accomplish all my goals manually, except for the vanilla follow. I can manually color rooms to indicate TTRs. I can manually add the room-script triggers. I can manually detect an unwanted TTR and abort my speedwalk, and I have to manually add new destination rooms.
Approach #2: In each TTR, define an exit with a custom command. The exit will be one-way, from the 'other' direction in the TTR room, to the 'other direction in the destination. The custom-command will be an alias that does nothing at all, except maybe '#say Wating for timed teleport' or something similar.
That SHOULD put a little dot (for the other exit) by the room on the mapper. It also allows the speedwalk code to make paths through the one-way links. It doesn't help much with the unexpected teleports or capture/auto-creation, either.
Approach #3: Define a new direction setting for timed teleports, and link rooms together using it. Fortunately, Mozart is a NSEWUD mud, so I could use any of the diagonals for this 'extra' direction. This approach would work something like #2, I think, but I've never used direction settings, so I don't really know the differences. I believe that I would have to define a 'reverse' direction, though, even though it would never be used.
I'm open to further suggestions, especially regarding the detection of unexpected teleports, which is related to both goals 3 and 4. I'm having trouble finding any reliable way to distinguish between walking, scrying, timed teleports, and other magical transportation (e.g. someone summoning me). More details on that when I have it...this post is long enough as it is. |
|
_________________ Come visit Mozart Mud...and tell an imm that Aerith sent you! |
|
|
|
Fang Xianfu GURU
Joined: 26 Jan 2004 Posts: 5155 Location: United Kingdom
|
Posted: Tue Mar 11, 2008 10:33 pm |
The way speedwalking works at the moment, you're going to have to set the timeout very high to get it to work. Otherwise, when it gets to the room and can't move any further, the walk will timeout.
If that's not your bag, you're going to have to write your own speedwalk engine - as long as there's a link between the TTR and its destination room, the mapper will find the route properly. Your script would need to split the path into two parts - one before the TTR and one after - and resume the walk once you've been teleported.
There are a couple of ways of knowing if you've been teleported or not. The easiest way is to check, when you receive the room description, if you've entered a command recently that would display a room description. Scry, directions, look, etc. If you have, the room it's seeing probably isn't caused by a TTR. You can extend this logic to detecting a TTR you haven't seen before, either by triggering on the rname tag or by making a trigger that fires only on room names, and then seeing if you've done something to display one.
Having done that, though, the mapper will only create a room in that direction if there's a direction in the queue, so if it turns out that a room name is from a teleport, you'll need to add the teleport direction from approach 3 to the queue before you tag the room name to the mapper. Then it'll create a new room.
Your second goal is the only one that can't be solved with this kind of solid TTR detection alone, so I wish you good luck with that one ;) |
|
|
|
JQuilici Adept
Joined: 21 Sep 2005 Posts: 250 Location: Austin, TX
|
Posted: Wed Mar 12, 2008 2:35 am |
Re: the timeout problem: Does the timeout still affect the speedwalker if one uses #PAUSE? In other words, if I pause the speedwalk (in my custom exit command), can I wait for a long time, then confirm and resume the speedwalk once the teleport hits?
I'll put a little thought into detecting whether I've issued a command-that-would-display-a-room recently. There are definitely some hairy problems to be solved - for instance, imagine the following situation: I'm exploring a new area, and I enter a step command, and I get a room, then immediately a prompt and another room. It's not at all clear to me how to distinguish (in code) between (a) I stepped into a room which teleported me, and (b) I teleported before the step was processed, then stepped out of the destination room.
The problem is further complicated by the fact that Mozart supports apparently unlimited type-ahead, AND lets you clear the type-ahead buffer, so maintaining a client-side mirror of the command queue is tricky at best...unless I just throttle all the commands on the client side. Hmm.
Follow-up question: It occurs to me that it may be best to have the code detect POTENTIAL TTRs, and queue them up for human persual. Then, if I confirm one, it will go ahead and add the link and/or room to the map. However, I believe that this would require some of the facilities of the zMapper COM server to work. Is that correct, or is there some way to make the regular mapper create a new link/room at will from a script? (Fang's trick of adding the direction to the queue first only works if the mapper position is still in the TTR, right?) |
|
_________________ Come visit Mozart Mud...and tell an imm that Aerith sent you! |
|
|
|
Vijilante SubAdmin
Joined: 18 Nov 2001 Posts: 5182
|
Posted: Wed Mar 12, 2008 2:46 am |
I am going to suggest that by the time you are done with this you will have overridden nearly every part of the automapper. It is possible though. I once played on a mud that had elevators, where you pushed a button, waited, entered the elevator, pushed a button, waited, exitted the elevator. I did the mapping for it manually, since I only ever found 1. I did have speedwalking able to path through it and work, but I did it the hard way.
Fang is right that you need to establish knowing when you have issued a command that will give you room information that should be ignored. In order to do this right I would suggest using an MXP trigger for the rname element, and an #ONINPUT trigger for all the commands that will cause room information to be received. In your input trigger you set a variable to tell the MXP trigger that you issued the command. The variable would default to 0 or null. Next the MXP trigger checks this flag enables full capturing of the description if appropiate and clears the flag.
That roughly covers a capturing scheme. You will have to capture everything because in order to meet some of your goals you will have to issue #MAKEROOM, with some other room creation stuff. In order to have a visual display of the destination and that it is a teleport I would suggest using a diagonal direction. I suggest this because you mentioned that the mud only uses cardinal directions. Using the other direction type would make more sense, and codewise be about the same; however you would lose the visual aspect. If I remember correctly the mapper, in follow mode, will queue up a direction from the command portion of a #DIR setting even when that command is an alias. I would suggest testing that first, by setting the command of the northeast direction to 'test' instead of "ne|northeast", and creating the #ALIAS test {#SAY yes}. After you enter test at the command line with the mapper open and in follow mode, if it displays 'test' in the mappers queue then it will be easier to use that for following. I can explain how in another post.
Speedwalking...hrm...totally override it. I say this because working with the variable time on the teleports will be much harder with the #PAUSE, #OK, etc controls then it will be with a full script. There also is the possibility that you are on your way through a room and the timing is bad causing an undesired teleport. Such an instance requires the the path be recomputed, and since that requires that you hold the original %destroom until the walk finishes I would suggest it is easier to write your own slow walker. I will say that the script to handle a double-click on the map is a little bit tricky, but it can be captured and overridden.
For your second goal, simply using Do Not Enter is the easiest and likely best way. |
|
_________________ The only good questions are the ones we have never answered before.
Search the Forums |
|
|
|
Vijilante SubAdmin
Joined: 18 Nov 2001 Posts: 5182
|
Posted: Wed Mar 12, 2008 2:58 am |
Quote: |
for instance, imagine the following situation: I'm exploring a new area, and I enter a step command, and I get a room, then immediately a prompt and another room. |
A slightly tricky problem. The first thing to solving this is examining the exits. If the direction entered was invalid in the first room then you were teleported and then your move occurred/you got teleported again. If the direction was invalid in the middle room then you moved and got teleported. Does Mozart give a message for invalid directions?
Quote: |
The problem is further complicated by the fact that Mozart supports apparently unlimited type-ahead, AND lets you clear the type-ahead buffer, so maintaining a client-side mirror of the command queue is tricky at best...unless I just throttle all the commands on the client side. Hmm. |
Never send more then 1 direction at a time while mapping. That is all there is to it. I have written a direction queue into one of my mapping systems, but never would I use it while actually mapping. I used it for running around already mapped sections. It is just too risky to do otherwise.
It is possible to queue up a list of possible TTR's, but I really don't see the need. Take your time while mapping. |
|
_________________ The only good questions are the ones we have never answered before.
Search the Forums |
|
|
|
JQuilici Adept
Joined: 21 Sep 2005 Posts: 250 Location: Austin, TX
|
Posted: Wed Mar 12, 2008 3:42 am |
Vijilante wrote: |
Fang is right that you need to establish knowing when you have issued a command that will give you room information that should be ignored. In order to do this right I would suggest using an MXP trigger for the rname element, and an #ONINPUT trigger for all the commands that will cause room information to be received. In your input trigger you set a variable to tell the MXP trigger that you issued the command. The variable would default to 0 or null. Next the MXP trigger checks this flag enables full capturing of the description if appropiate and clears the flag.
That roughly covers a capturing scheme. You will have to capture everything because in order to meet some of your goals you will have to issue #MAKEROOM, with some other room creation stuff. |
I'm already working on a complete room-capture, since it would be useful for several reasons (e.g. to create rooms that I've only scried into, without having to go in - quite useful in dangerous areas - or building a proper flee script that figures out where I went). The real trick, as I mentioned, is going to be dealing with possible command-queueing on the server side due to type-ahead. Using a single capture/don't-capture variable won't be enough, but I may be able to build a queue of such values, and pop one off each time I get an rname tag. (see below for why this might be necessary, or at least desirable.)
Vij, IIRC your full mapper override required use of the zMapper COM object to work properly. I also seem to remember you stating that zMapper was not working well enough (yet) with CMUD to support those scripts. Am I correct? (I'll have to go dig that script up on the Finished board and read it in detail)
Vijilante wrote: |
Quote: |
The problem is further complicated by the fact that Mozart supports apparently unlimited type-ahead, AND lets you clear the type-ahead buffer, so maintaining a client-side mirror of the command queue is tricky at best...unless I just throttle all the commands on the client side. Hmm. |
Never send more then 1 direction at a time while mapping. That is all there is to it. I have written a direction queue into one of my mapping systems, but never would I use it while actually mapping. I used it for running around already mapped sections. It is just too risky to do otherwise.
It is possible to queue up a list of possible TTR's, but I really don't see the need. Take your time while mapping. |
Good advice, and almost always practical. When mapping dangerous areas, though, I will sometimes want to, say, run into a room with a Big Aggressive Mob, scry the two potential exits (to see if either one is a deathtrap), and retreat to my original room, all as fast as possible. Then I can peruse the output and decide what to do (try to run past the mob, attack, look elsewhere, etc.) If my sneak skills work properly, the BAM won't attack me...but the longer I hang out in the room, the more likely he is to notice. My command line usually gets something like 's;look e;look w;n' under those circumstances. (However, I could build in some sort of special-case code to allow this.)
[Side note: on Mozart, issuing 'look <dir>' only gives you the room name/desc/etc. of the adjoining room if you have the 'scry' spell on, otherwise you just get something like 'You can travel to the <dir>' or 'The door to the <dir> is open'. Hence, I call it 'scrying', even though the command is 'look'. FYI]
I guess it's not that I expect to queue up a whole lot of potential TTRs, really. But I may want to save ONE until a bit later, when I can consider it in safety. And I might not be in that room anymore when I do so...
I definitely want the follow part of the script to work with a queue, however.
Vijilante wrote: |
For your second goal, simply using Do Not Enter is the easiest and likely best way. |
Ah. To be clear, yes, I am already marking all DEADLY TTRs as Do Not Enter rooms, so the speedwalker will never take me through them.
My point with goal #2 is that I want to be able to compute paths through the non-deadly ones, since some areas are intended to be accessed through benign TTRs (indeed some can ONLY be accessed that way). Since my initial solution (the #temp triggers) didn't allow that, I had come up with the other two options, which at least promised to do so.
Vijilante wrote: |
Does Mozart give a message for invalid directions? |
Yes, it does...one of a small handful (e.g. 'You can't go that direction') So at least that case is easy to detect. It also gives messages for other sorts of move failures (e.g. trying to step when in combat, moving into the air w/o the 'fly' spell, etc.) and I already have #NODIR triggers for all of those.
A further thought: I may be able to solve some of these problems by creating a 'scry-ahead' mode for mapping, in which I automatically turn all move commands into a scry, then move (e.g. #alias n {look n;~n}). If I can reliably detect the output of scrying vs movement (and I think I can, though it's trickier than you'd think), then I can disambiguate the step-teleport and teleport-step cases. Obviously this would only get turned on when mapping. |
|
_________________ Come visit Mozart Mud...and tell an imm that Aerith sent you! |
|
|
|
Fang Xianfu GURU
Joined: 26 Jan 2004 Posts: 5155 Location: United Kingdom
|
Posted: Wed Mar 12, 2008 5:19 am |
JQuilici wrote: |
I'll have to go dig that script up on the Finished board and read it in detail |
If you find it, please post a link! I've been interested in doing a speedwalker augment that might turn into a rewrite, and code's always nice :) And hopefully it'll be relevant to this discussion too ;) |
|
|
|
Vijilante SubAdmin
Joined: 18 Nov 2001 Posts: 5182
|
Posted: Wed Mar 12, 2008 10:21 am |
I never quite got around to fully rewriting that script for CMud. I did update it significantly to get it working. There are some odd things in how CMud interprets a COM variable that caused it to look like a total failure when I first imported the script into CMud. The use of zMapper was needed for creating one way links, and offset rooms on overlap. Beyond that #MAKEROOM was the standard method for room creation.
Quote: |
A further thought: I may be able to solve some of these problems by creating a 'scry-ahead' mode for mapping, in which I automatically turn all move commands into a scry, then move (e.g. #alias n {look n;~n}). If I can reliably detect the output of scrying vs movement |
If you are going to do this you should probably plan to scry all unmapped exits automatically. Doing that will probably be easier with room creation being under script control. |
|
_________________ The only good questions are the ones we have never answered before.
Search the Forums |
|
|
|
JQuilici Adept
Joined: 21 Sep 2005 Posts: 250 Location: Austin, TX
|
Posted: Wed Mar 12, 2008 12:53 pm |
Fang Xianfu wrote: |
JQuilici wrote: |
I'll have to go dig that script up on the Finished board and read it in detail |
If you find it, please post a link! I've been interested in doing a speedwalker augment that might turn into a rewrite, and code's always nice :) And hopefully it'll be relevant to this discussion too ;) |
Ask and ye shall receive. I believe the Map Mode Override post is the one I was thinking of. If there are others, please let me know.
Vijilante wrote: |
I never quite got around to fully rewriting that script for CMud. I did update it significantly to get it working. There are some odd things in how CMud interprets a COM variable that caused it to look like a total failure when I first imported the script into CMud. The use of zMapper was needed for creating one way links, and offset rooms on overlap. Beyond that #MAKEROOM was the standard method for room creation. |
Since the code I'm contemplating will be making one-way links (for all TTRs), this would indicate that zMapper, or its successor, will be an integral part of the solution. Can you provide any details on the COM issues and/or your partially-rewritten CMUD code?
Vijilante wrote: |
If you are going to do this you should probably plan to scry all unmapped exits automatically. Doing that will probably be easier with room creation being under script control. |
That's a good idea. If I have always scried ahead to unmapped exits, I will never actually step into an unmapped room, and that should help significantly with all my detection problems (plus expand the map faster as I go). |
|
_________________ Come visit Mozart Mud...and tell an imm that Aerith sent you! |
|
|
|
cazador Apprentice
Joined: 08 Dec 2005 Posts: 108
|
Posted: Wed Mar 12, 2008 3:26 pm |
The other option though even more harry is to open up the mapper database up using lua, and edit the database that way. I have a post in this forum where I open up the mapper database and modify the values of the cost to enter portals. The problem of doing it this way is that Zugg is going to be changing the mapper soon(hopefully) and the database format may change which will break the script.
|
|
|
|
Fang Xianfu GURU
Joined: 26 Jan 2004 Posts: 5155 Location: United Kingdom
|
Posted: Wed Mar 12, 2008 4:21 pm |
No may about it - the database format is going to change, to use the same sql format that packages now use. Whether or not that means changes to the data structure remains to be seen, but it probably won't break your Lua script if that's not the case.
|
|
|
|
JQuilici Adept
Joined: 21 Sep 2005 Posts: 250 Location: Austin, TX
|
Posted: Thu Mar 13, 2008 3:46 pm |
Ok...I've done some more investigation and some preliminary coding. Here is what I've learned.
Room Capture Types
I have identified a long list of things that can provoke a room to be displayed. Some are easy to distinguish, and some aren't. The primary indicators (aside from things that I've typed, of course) are messages displayed immediately ahead of the room name, or messages displayed immediately after all of the room contents. In other words, the sequence from the MUD appears to be:
pre-message (if any)
room name (with rname MXP tags)
room description
exits (with rexit MSP tags)
room contents (mobs and objects)
post-message (if any)
prompt
The types of room-captures I've identified are:
- 'look' - shows the current room, with no pre or post-message
- 'look <dir>' - shows the adjacent room (usually - some rooms are blocked), with a pre-message. The pre-message has no fixed text that can be used as a trigger. Most of them are of the form "You can travel to the <dir>", but others are "You see the Nevrast Inn", "The dark forest stretches into the gloom", etc. However, all examples that I have seen are either the standard message, or are prefixed by three spaces (?!?), so I'll try to trigger on that to identify this category.
- Timed teleports - the subject of this discussion. Shows some other room (possibly connected to the current room), with no pre or post-message.
- Normal movement - shows a connected room. Sometimes shows a pre or post-message. SHOULD have the movement direction as %nextdir().
- Movement through a gate (created by 'gate' spell) - shows whatever room you move into (usually a long distance away - the spell basically creates a temporary non-standard exit link between two rooms). Fortunately, there is a unique pre-message for movement through a gate. In addition, it is easy to identify the existence of a gate in the room description whenever one is present, and there are unique messages when gates appear and disappear.
- Looking through a gate - similar to the 'look <dir>' case above, but with a unique pre-message.
- Long-distance scrying ('wizard-eye') - I know this can occur, but I do not have a character that can cast it ATM, so I don't have a capture.
- Fleeing - Shows whatever room you flee into, with a unique POST message ("You flee head over heels"), that does not include the direction in which you fled.
- Following/shadowing another character - shows the room you move into, with a unique pre-message ('You follow <char>'), but does not tell you the direction in which you moved (only the character you followed). There may have been a message earlier showing the followed character leaving, or not, depending on his sneak and my spot skill levels.
- Summon - When some OTHER character 'summon's me, I'll get the room I appear in, with a unique pre-message.
- Other magical transport (e.g. word-of-recall, astral-walk) - Shows the room you arrive in. The only pre-message is the standard 'Ok.' for spell success.
Here is some sample output showing looks, scries, some gate travel, and a flee, for comparison. This is off one of my real characters, so the prompt looks different than the previous example (and ends in a newline, FYI, so my commands always appear on an otherwise blank line).
Code: |
<944/944:149/265:674/674:38057:GhLMORTHISY:none:none:none:none>
l
Forest Trail
A narrow path pushes through the dense forest growth. Leafy branches
overhang the trail, casting surreal shadows upon the ground. To one side of
the path a small space has been cleared within which sputters a pitiful little
fire.
A swirling gate leading to another realm stands here, slowly fading.
Exits: north, south
A bandit grins and draws his sword.
<944/944:151/265:674/674:38057:GhLMORTHISY:none:none:none:none>
l gate
You peer into the gate....
The Magic Shop
Behind the counter you see various items, neatly placed in racks, presumably
most of them are magic.
A swirling gate leading to another realm stands here, slowly fading.
Exits: south
A wombat scuttles along here.
A city guard stands here. (White Aura)
Fizban wanders around his shop, idly talking to the furniture. (White Aura)
<944/944:153/265:674/674:38057:GhLMORTHISY:none:none:none:none>
enter gate
You step into the swirling gate and enter a new realm!
The Magic Shop
Behind the counter you see various items, neatly placed in racks, presumably
most of them are magic.
A swirling gate leading to another realm stands here, slowly fading.
Exits: south
A wombat scuttles along here.
A city guard stands here. (White Aura)
Fizban wanders around his shop, idly talking to the furniture. (White Aura)
<944/944:154/265:674/674:38057:GhLMORTHISY:none:none:none:none>
l s
You see Main Street.
Main Street
You are at the end of the main street of Nevrast. South of here is the
entrance to the Guild of Magic Users. The street continues east towards the
market square. The magic shop is to the north and to the west is the city
gate.
Exits: north, east, south, west
<944/944:154/265:674/674:38057:GhLMORTHISY:none:none:none:none>
enter gate
You step into the swirling gate and enter a new realm!
Forest Trail
A narrow path pushes through the dense forest growth. Leafy branches
overhang the trail, casting surreal shadows upon the ground. To one side of
the path a small space has been cleared within which sputters a pitiful little
fire.
A swirling gate leading to another realm stands here, slowly fading.
Exits: north, south
A bandit grins and draws his sword.
<944/944:156/265:674/674:38057:GhLMORTHISY:none:none:none:none>
l n
You can travel to the north.
Southern Path
This path leads south straight into a large, dark forest, and north to a
crossroads. There is another path to the east.
Exits: north, east, south
<944/944:156/265:674/674:38057:GhLMORTHISY:none:none:none:none>
l s
You can travel to the south.
An Overturned Cart
You have come across an overturned cart, lying in the middle of the road.
One of the wheels is still spinning.
The area is magically bright.
Exits: north, south
<944/944:157/265:674/674:38057:GhLMORTHISY:none:none:none:none>
The gate suddenly fades out completely!
<944/944:163/265:674/674:38057:GhLMORTHISY:none:none:none:none>
l
Forest Trail
A narrow path pushes through the dense forest growth. Leafy branches
overhang the trail, casting surreal shadows upon the ground. To one side of
the path a small space has been cleared within which sputters a pitiful little
fire.
Exits: north, south
A bandit grins and draws his sword.
<944/944:166/265:674/674:38057:GhLMORTHISY:none:none:none:none>
flee
An Overturned Cart
You have come across an overturned cart, lying in the middle of the road.
One of the wheels is still spinning.
The area is magically bright.
Exits: north, south
You flee head over heels.
<944/944:263/265:673/674:38057:GhLMRTHISY:none:none:none:none>
|
Preliminary Design and Coding
I'm going to at least start with Vij's suggestion - I will assume only one command at a time. I'll refine it to handle queued commands later, once I get the basics working, and if I need to. I also liked his suggestion of using a standard diagonal direction, with a non-standard command, to represent the teleports.
My approach is going to be something like the following:
- Pattern trigger on messages for characters/mobs leaving the room. It will have to save a DB variable with the directions each one went (if detected).
- MXP trigger on rname to catch any room name displayed. It will also save %line(1) (the line BEFORE the room name) and the value of %nextdir() for later comparison.
- MXP trigger on exits, to capture exit information
- Some sort of multiline capture trigger to gather up the room description.
- Pattern trigger for the flee post-message. This will set a flag indicating that a flee is occurring.
- Trigger on my prompt (probably an event handler, when they're working properly with variables). This gets to do the fun stuff.
The prompt trigger then has to decide what really happened. Between the 'flee' flag and the saved values of %line(1) and %nextdir, I ought to be able to distinguish regular movement, scries, various gate operations, flees, follows, summons, and random magical transport. If none of those apply, then I'm probably either (a) looking at the room I'm in, which I can detect by comparing with the mapper info for my current room, or (b) I got teleported through no action of my own. I can correctly update my position in the map, and I ought to be able to automatically create links, since case (b) is completely determined.
I have started coding this. I have all the triggers present and operating, except the multiline trigger for the room description. The prompt code is correctly identifying normal steps, scries, peers through gates, and flees. (Not the directions yet, just that they've happened)
Next, I'm going to put together some functions to do comparisons between mapper-stored info and captured info. That will likely involve some sort of 'normalization' of room descriptions and exits, but it will make identifying destination rooms a lot simpler and more uniform.
So far, I THINK I can avoid having to keep track of what my 'recent' commands were (other than the stuff automatically stored in the mapper queue). If I wind up having to do so, I might try to use the mapper queue to manage it, using #queue and #nodir to push and pop non-direction commands that might produce room views. (But how do I add random commands to the END of the mapper queue, not the beginning? More investigation is required.)
I also have not yet disabled or overridden any of the automatic step confirmation and speedwalking stuff, though I'm starting to see it looming on the horizon. In fact, doing so will likely make it EASIER to use the mapper queue to manage my list of room-showing actions, since there would be no worries about the mapper messing with the queue behind my back.
More news when I have it. As always, comments and suggestions are welcome.
PS - Re: Cazador: I am leery of doing direct mapper DB manipulation right now, since I know that the DB layer is going to change (and the table layout may well change, also). In addition, I think there are synchronization issues if you diddle the DB behind the mapper's back. Using the built-in commands should avoid both problems.
PPS - Do people want to see the code as I do this? Or only at the end? Or not at all (because it'll get long and spammy)? |
|
_________________ Come visit Mozart Mud...and tell an imm that Aerith sent you! |
|
|
|
Arde Enchanter
Joined: 09 Sep 2007 Posts: 605
|
Posted: Thu Mar 13, 2008 4:14 pm |
JQuilici wrote: |
PPS - Do people want to see the code as I do this? |
Yes! Step-by-step! What sense in making a topic with final code only? At least, I'll learn how to override the mapper properly. |
|
|
|
Fang Xianfu GURU
Joined: 26 Jan 2004 Posts: 5155 Location: United Kingdom
|
Posted: Thu Mar 13, 2008 4:26 pm |
JQuilici wrote: |
'wizard-eye' |
Sounds like a disease you suffer from peering at spellbooks too long ;)
Perhaps more relevant - I don't think the script needs to distinguish between the different types of movement. The only things it needs to know are when something's a TTR and when it isn't, so it doesn't matter if the pre- or post-text changes, because TTR's don't have either. If either is present, it can be rejected as a potential TTR. After that, the only other ones you need to worry about are the other kinds of messageless movement, that is directions and look. |
|
|
|
JQuilici Adept
Joined: 21 Sep 2005 Posts: 250 Location: Austin, TX
|
Posted: Thu Mar 13, 2008 4:45 pm |
Fang Xianfu wrote: |
JQuilici wrote: |
'wizard-eye' |
Sounds like a disease you suffer from peering at spellbooks too long ;) |
Heh. 'cast wizard-eye <mob>' gives you a peek at the room a given mob is standing in. Requires a level 55+ mage, and my only mage char is currently level 34. It's quite useful while exploring, and if a mob escapes combat and you're trying to track it down.
Fang Xianfu wrote: |
Perhaps more relevant - I don't think the script needs to distinguish between the different types of movement. The only things it needs to know are when something's a TTR and when it isn't, so it doesn't matter if the pre- or post-text changes, because TTR's don't have either. If either is present, it can be rejected as a potential TTR. After that, the only other ones you need to worry about are the other kinds of messageless movement, that is directions and look. |
True, I might be overthinking this. But I don't think it's that simple, unfortunately. The existence of a pre-message COULD be a red-herring, due to timing. For instance, here is an example from a simple 'look' (which produces no pre-message), but someone else in the room happens to do something at the same time:
Code: |
<954/954:300/300:676/676:38057:AGhLMNOTHSY:none:none:none:none>
l
Natron puts a packet of standard rations in a bag of holding.
Main Street
You are on the main street passing through the city of Nevrast. To the
south of here is the entrance to the Armory, and Wolfsford's Delicatessen is to
the north. East of here is the market square, the centerpiece of town.
Exits: north, east, south, west
Natron the High Elf Spell Slinger is standing here.
Natron glows with a bright light!
The Elite Guard stands here, keeping order. (White Aura)
<954/954:300/300:676/676:38057:AGhLMNOTHSY:none:none:none:none> |
I strongly suspect that the same could occur with, say, a weather message hitting right before a TTR. So I think I have to actually examine the pre-message to see if it's something I recognize, before I can decide what to do.
The other advantage to detecting all of those different types of pre/post message, of course, is that it lets me use this same framework to detect flees, gate travel, recalls, etc. and update the mapper position correctly. Not in my original set of goals, but it looks like I'm going to do 90% of that work anyway, so I might as well roll them in. |
|
_________________ Come visit Mozart Mud...and tell an imm that Aerith sent you! |
|
|
|
JQuilici Adept
Joined: 21 Sep 2005 Posts: 250 Location: Austin, TX
|
Posted: Thu Mar 13, 2008 9:47 pm TTR Code Dump #1 |
Arde wrote: |
JQuilici wrote: |
PPS - Do people want to see the code as I do this? |
Yes! Step-by-step! What sense in making a topic with final code only? At least, I'll learn how to override the mapper properly. |
Ok...you asked for it.
Here's the code dump, so far. I have not included the whole package (there's a lot of stuff that's not relevant to this discussion), but this class should have most everything:
Code: |
<class name="RoomCapture" id="121">
<trigger type="MXP" priority="1220" id="122">
<pattern>rname</pattern>
<value>$name=%params(0)
#tag name
// MXP triggers seem to have trouble accessing vars in the
// main window. So we set the module and class to avoid
// spamming duplicate variables. REMOVE WHEN BUG IS FIXED
#module %window
#class mlc/roomCap
#var roomCapName $name
#if (!@roomCapDir) {
#var roomCapDir %nextdir()
}
#var roomCapLine1 %line(1)
#if (%line(1)=~"^ %w") {
// Non-standard scry messages seem to start w/ three spaces (?!?)
//#var roomCapType "scry"
//#var roomCapDir "unknown"
tagRoomCapture scry unknown
}
#if (%line(1)=~"^Ok.$") {
// Some spell just completed...assume this is a magical move
tagRoomCapture mmove
}
#class 0
#module 0</value>
</trigger>
<trigger type="MXP" priority="1230" id="123">
<pattern>rexit</pattern>
<value>#var $exit {%params(0)}
;infomsg {rexit: $exit}
#tag exit
;#var roomCapExit $exit
#module %window
#class mlc/roomCap
roomCapExit=$exit
#class 0
#module 0</value>
</trigger>
<trigger type="MXP" priority="1240" newline="false" prompt="true" id="124">
<pattern>rdesc</pattern>
<value>#var $desc {%params(0)}
infomsg {rdesc: $desc}
#tag desc
#var roomCapDesc $desc</value>
</trigger>
<class name="RoomCapTypes" id="293">
<trigger priority="2900" id="290">
<pattern>^You peer into the gate....</pattern>
<value>tagRoomCapture mlook</value>
</trigger>
<trigger priority="2910" id="291">
<pattern>You can travel to the (*).</pattern>
<value>tagRoomCapture scry %1</value>
</trigger>
<trigger priority="2940" id="294">
<pattern>^The (%a) (%w)wards is ({open|closed})</pattern>
<value>#door %2 %1
tagRoomCapture scry %2</value>
</trigger>
<trigger priority="2950" id="295">
<pattern>^The (%a) to the (%w) is ({open|closed})</pattern>
<value>#door %2 %1
tagRoomCapture scry %2</value>
</trigger>
<trigger priority="2960" id="296">
<pattern>Your sight cannot penetrate</pattern>
<value>infomsg Can't look that direction~!
; May be able to delete this if no cleanup is needed.</value>
</trigger>
<alias name="tagRoomCapture" id="299">
<value>// Some triggers and events seem to have trouble accessing vars
// in the main window. So we set the module and class to avoid
// spamming duplicate variables. REMOVE WHEN BUG IS FIXED
#module %window
#class mlc/roomCap
#var roomCapType $type
#var roomCapDir $dir
#class 0
#module 0</value>
<arglist>$type,$dir</arglist>
</alias>
<trigger priority="3010" id="301">
<pattern>You flee head over heels</pattern>
<value>tagRoomCapture flee</value>
</trigger>
<trigger priority="3700" id="370">
<pattern>^You follow (*).$</pattern>
<value>tagRoomCapture follow
// Need to take a guess at the direction, too, if we've
// seen %1 exit this room.</value>
</trigger>
<trigger priority="3730" id="373">
<pattern>^You step into the swirling gate and enter a new realm</pattern>
<value>tagRoomCapture mmove</value>
</trigger>
<trigger priority="3740" id="374">
<pattern>^(%w) has summoned you</pattern>
<value>tagRoomCapture mmove</value>
</trigger>
</class>
<trigger priority="3000" id="300">
<pattern>^onPromptWorkaround</pattern>
<value>#if (@roomCapName) {
#switch (@roomCapType)
("scry") {
infomsg Scrying adjacent room ~(@roomCapDir~)
}
("mlook") {
infomsg Magic look room capture detected ~(ignoring~)
}
("mmove") {
infomsg Magic movement room capture detected
}
("flee") {
infomsg Fleeing...
moveMapCursorToNeighborV1 %roomnum() @roomCapName
}
("follow") {
infomsg Following...
moveMapCursorToNeighborV1 %roomnum() @roomCapName
}
("") {#switch (@roomCapDir != "") {
infomsg Step room capture detected ~(@roomCapDir~)
}
(%roomname() = @roomCapName) {
// Clearly this needs to be more robust
infomsg Look at current room detected ~(ignoring~)
}
{ // Dunno...might be a TTR?
infoseparator
infomsg Unexpected room capture detected ~(no type~)
infomsg Dir: @roomCapDir
infomsg Line1: @roomCapLine1
infoSeparator
}
}
}
// Clear everything out
#var roomCapType ""
#var roomCapDir ""
#var roomCapLine1 ""
#var roomCapName ""
#var roomCapDesc ""
#var roomCapExit ""</value>
</trigger>
<trigger priority="3220" id="322">
<pattern>^onLoadWorkaround</pattern>
<value>// Some triggers and events seem to have trouble accessing vars
// in the main window. So we set the module and class to avoid
// spamming duplicate variables. REMOVE WHEN BUG IS FIXED
#module %window
#class mlc/roomCap
roomCapType=""
roomCapDir=""
roomCapLine1=""
roomCapName=""
roomCapDesc=""
roomCapExit=""
#class 0
#module 0</value>
</trigger>
<class name="LocationRecovery" id="331">
<alias name="moveMapCursorToNeighborV1" id="332">
<value>$nmatches=""
$dmatches=""
$ematches=""
$dirs=""
#forall %roomexit($rNum) {
$rlink=%roomlink($rNum,%i,)
//infomsg {%i -~> %roomname($rlink) ~($rlink~)}
#if ($rname = %roomname($rlink)) {
#additem $nmatches $rlink
#additem $dirs %i
}
}
//infomsg matches~: $nmatches
#if (%numitems($nmatches)=1) {
#teleport $nmatches noclear
infomsg Map cursor moved $dirs to room $nmatches
} {
// More than one room matches
infomsg Matched %numitems($nmatches) rooms...
}
</value>
<arglist>$rNum,$rname</arglist>
</alias>
</class>
<class name="RoomParsing" id="367">
<func name="parseRoomExits" id="366">
<value>; parseRoomExits($exitLine)
;
; Parses an 'Exits:' line to extract the room's exits
;
; Arguments:
; exitLine = the room exit line from the MUD
;
; Returns: a normalized stringlist of the exits
;
$exitList=""
// under development
#return $exitList</value>
<arglist>$exitLine</arglist>
</func>
</class>
</class>
|
Notes:
- This is probably easier to read if you paste the XML into a test package somewhere, and let CMUD parse it into settings for you.
- I am spammy with comments. Now that stuff is compiled to byte-codes, there's no real downside to having a lot of comments in scripts. Hopefully this will help people reading, though it makes the XML dumps a lot longer.
- The 'infomsg' alias sprinkled throughout just dumps its arguments as a message into a child window that I'm using for debugging all this stuff.
- Similarly, 'infoSeparator' just puts a line of '-----------' into that window. It also ensures that two-or-more separator lines in a row collapse to one separator line, just to avoid clutter. I use it for grouping a bunch of infomsg lines together.
- I'm using triggers instead of events for onPrompt and onLoad, just to work around a current bug with accessing session-window variables from a script in a different package. Pretend that those are event handlers.
- The logic is still sadly incomplete. I'm basically using tagRoomCapture in a bunch of triggers to indicate what type of thing is going on right now, then checking that value in the onPrompt code to decide what to do.
- It properly handles flees and follows (moves the map position to an adjacent room), but it's only checking room NAMES right now. If <>1 room names match, it gives up.
- It properly detects looks through gates, and does nothing.
- It properly detects scries into adjacent rooms, and does nothing. I'll eventually add something there to create a room in the appropriate direction if one does not exist. The logic for detecting which direction I'm looking is still incomplete.
- It detects magical movement, but it does not yet move the map position in response.
- It assumes that an untagged capture, while a direction exists on the mapper queue, is a normal step, and just lets the automapper move the cursor (I haven't overridden step confirmation).
- It assumes that an untagged capture, with no direction on the queue, is a look at the current room, if the name matches.
- If the capture is untagged, and none of the other things match, it guesses that we've hit a TTR. Currently, it just dumps info to the info window, rather than doing anything about it.
|
|
_________________ Come visit Mozart Mud...and tell an imm that Aerith sent you! |
|
|
|
JQuilici Adept
Joined: 21 Sep 2005 Posts: 250 Location: Austin, TX
|
Posted: Tue Mar 18, 2008 10:52 pm |
Sorry for the delay. Now that I seem to have gotten my zone-crossing crashes resolved, I'll be back to this project in the next day or two. (Gotta get through a business trip first.)
Next up is the code to figure out which room I've wound up in, and if it's one I already have on my map. That code will be usable for all sorts of magical transportation, flees, follows, and, of course, TTRs.
Then I can finally get down to TTR detection and processing. |
|
_________________ Come visit Mozart Mud...and tell an imm that Aerith sent you! |
|
|
|
Vijilante SubAdmin
Joined: 18 Nov 2001 Posts: 5182
|
Posted: Wed Mar 19, 2008 1:14 am |
For determining what room you are in you could probably use the queries from my Toolbox package. Those sorts of things were mostly what I was aiming at making the queries for. Having an excellent example of how to make use of them would be helpful. Also I do still plan on writing a fair bit more for the flee type logic.
I am always open to suggestions for improvement in the toolbox, I want it to be the most downloaded package in the library. |
|
_________________ The only good questions are the ones we have never answered before.
Search the Forums |
|
|
|
JQuilici Adept
Joined: 21 Sep 2005 Posts: 250 Location: Austin, TX
|
Posted: Wed Mar 19, 2008 2:09 am |
Will do. I have yet to make use of the Package Library, so it's good to have a reason to learn about it. I also intend to publish my Mozart stuff eventually, so I'm sure that I (and the lurkers) can pick up some good tips on package construction, too.
|
|
_________________ Come visit Mozart Mud...and tell an imm that Aerith sent you! |
|
|
|
|
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|