MOB Combat AI
Goto page 1, 2  Next
 
Post new topic   Reply to topic    mudlab.org Forum Index -> Design
View previous topic :: View next topic  
Author Message
BobTHJ



Joined: 19 Nov 2005
Posts: 31

PostPosted: Sun Nov 27, 2005 3:48 pm    Post subject: MOB Combat AI Reply with quote

I'm trying to determine how to write the combat AI for mobs, and I seem to be drawing a blank. Does anyone have any ideas on how to structure it? Suggestions on improving AI? etc?
Back to top
View user's profile Send private message Send e-mail
Author Message
Kjartan



Joined: 13 May 2005
Posts: 110

PostPosted: Sun Nov 27, 2005 6:50 pm    Post subject: Reply with quote

It's hard to answer this without knowing something about your mud. I will describe what I do.

I have a diku-derivative room-based mud, where the only really complicated mob combat is mob spellcasters. I basically use heuristics, which works quite well. I also use exhaustive searches over options sometimes: for example, if the mob decides to use a damage-inflicting spell, it runs down the list of all of the damage-inflicting spells it knows, throws out the ones that it knows won't work (for instance, because it already tried to cast fireball at this person and the fireball evidently didn't do any damage because he has fire immunity) and picks the remaining one that does the most damage.

If you have a 2D map that plays an important part in combat, you may need something else. Breadth-first searches are good for finding optimal routes around maps.
Back to top
View user's profile Send private message Visit poster's website
Author Message
BobTHJ



Joined: 19 Nov 2005
Posts: 31

PostPosted: Sun Nov 27, 2005 8:16 pm    Post subject: Reply with quote

I suppose it would be good to specify what kind of a MUD I am working with. I am working with my own custom MUD engine. I use a traditional room-based system. My MUD treats mobs the same way it does a PC (mobs send normal text commands which are parsed and processed).

I'm going to have a rather large variety of skills and spells, and I have a utility that randomly generates skill and spell lists for mobs based on who they are and what they do. Here's some of the questions I've been considering:

1. How does a mob decide which target to attack?

2. When does a mob decide to flee/heal itself?

3. When does a mob decide to chase a fleeing enemy to another room?

4. If a mob is fighting with allies, how does it work with / synergize with them for maximum effectiveness?

5. How does a mob decide which skill or spell to use? Your example works for damage spells, but what about buff/debuff spells, or "setup" skills/spells that put the mob in a good position (or put the enemy in a bad position).

6. How does a mob react to the skills and spells that are used against it?

7. My MUD uses "stances" (Aggressive, Defensive, Normal, Extended, Poised, Crouched, Prone, Planted, Focused). Each stance has an effect on your overall attack power and defence power. Also, most special combat moves require that you be in a certain stance to perform them. Many combat moves will either change your stance or change the stance of your opponent. How does a mob determine which series of stances to take to allow it to maximize is special combat moves?

I had considered using a genetic algorithm or something similar to determine the best choices, but with so many variables involved, I'm not quite sure how to approach it.
Back to top
View user's profile Send private message Send e-mail
Author Message
MikeRozak



Joined: 27 Nov 2005
Posts: 15
Location: Australia

PostPosted: Sun Nov 27, 2005 9:05 pm    Post subject: Reply with quote

The simple answer is: The mob AI should be different for each (class of) mob. Goblins should use different fighting tactics than elves, for example.

You might also look at http://www.mxac.com.au/drt/SubGameVariation.htm.
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Author Message
BobTHJ



Joined: 19 Nov 2005
Posts: 31

PostPosted: Sun Nov 27, 2005 9:43 pm    Post subject: Reply with quote

I agree completly. If every mob fought the same way, it would lead to a rather boring game. With the rare exception, I find most of WOW to be this way. I can take on just about any monster in the game by fist casting spell A, then spell B, then spell C, followed by ranged/melee attack.

What I would like to see are monsters that force the player to think and use a variety of spells/skills, so that each combat is a new and unique experience, instead of a boring repetitive task. That's why I want mobs that are "smarter" than the average mob of today.

For example, if you hit a mob with a Frost spell, the mob should be smart enough to activate it's Frost sheild to prevent futher Frost damage, forcing you to change tactics. If you are hitting the mob with a high frequency of low power attacks, it should use it's curse spell to reduce your attack damage by 5 points per attack. Alternatly, if you are hitting the mob with low frequency high power attacks, it should instead use it's dodging skills to concentrate on parrying your blows altogether.

In addition to defensive intelligence, mobs should also be able to find and exploit player weaknesses. For example, if the player has a high Fire resistance but low Frost resistance, the mob should be smart enough to concentrate on using it's Frost spells. If a player performs a special move that places them in a weak stance (see my note on stances above), the mob should be smart enough to use a special move that will maximize it's gain from the player being in that stance.

Now as for Elves fighting differently than Goblins, this will naturally occur somewhat as Elves will typically draw their available skills/spells from a different pool than Goblins. However, how can I make all this work without coding a separate combat AI script for each mob type?
Back to top
View user's profile Send private message Send e-mail
Author Message
Kjartan



Joined: 13 May 2005
Posts: 110

PostPosted: Sun Nov 27, 2005 10:06 pm    Post subject: Reply with quote

BobTHJ wrote:
What I would like to see are monsters that force the player to think and use a variety of spells/skills, so that each combat is a new and unique experience, instead of a boring repetitive task. That's why I want mobs that are "smarter" than the average mob of today.

This isn't just a function of the mob AI, it's also important to design the combat system to support this. I found myself in the situation of having most mobs with no access to any magic, which limited what they could do in combat; one thing that helped with this was to distribute one-use items like potions to appropriate mobs, and script them so they know when to use them. Since the mobs mostly use the items before they get killed, this doesn't have to lead to treasure inflation.

I also have a current problem that our damaging spells are spaced out too much in damage, meaning that the best fire spell is still better than the best ice spell even if a mob is 50% fire resistant.

BobTHJ wrote:
In addition to defensive intelligence, mobs should also be able to find and exploit player weaknesses. For example, if the player has a high Fire resistance but low Frost resistance, the mob should be smart enough to concentrate on using it's Frost spells.

In fact this is a place where the mob can be smart, or it can be magic - knowing things it really has no way of knowing. I keep a chunk of data on mobs of "what do I know" which contains items like "player Bob had fire immunity at 12:30 PM on Jan 17". Rather than looking directly at the player when it's about to cast a spell and checking him for fire immunity, the mob just checks its knowledge. Every time the mob attacks (and also in your case when it gets hit) it can record some more info in its knowledge store.

Players are mildly annoyed when mobs "cheat", i.e. the same mob that fireballed you yesterday now opens with frost bolts because you have resist fire up.

BobTHJ wrote:
If a player performs a special move that places them in a weak stance (see my note on stances above), the mob should be smart enough to use a special move that will maximize it's gain from the player being in that stance.

It sounds like the mob doesn't have THAT many options so that rather than some fancy technique like genetic algorithms, you could just use an exhaustive search over all of the possibilities for the next round or two, and pick the best one. It's easy to create a mob that's better than the players by doing this, so you may want to have an intelligence stat that gives him a chance of making a mistake. It's a great help to making these decisions if (1) you have the ability to "run" the round for various different possibilities without the player seeing it and (2) you have some scoring system for deciding how good each outcome is.
Back to top
View user's profile Send private message Visit poster's website
Author Message
BobTHJ



Joined: 19 Nov 2005
Posts: 31

PostPosted: Mon Nov 28, 2005 4:33 am    Post subject: Reply with quote

My goal is to have a large enough variety of skills that you can have Mobs will a full set of tactics without requiring that they have access to spells (although some certainly will). As I mentioned earlier, combat will be a game of moving in and out of the above listed "stances". For example, you will be able to perform a defensive move that will put you in the Poised stance when it completes. While in the Poised stance you will have a small penalty to attack and defense. However, from the Poised stance you can use your "Uber-slice" or some such maneuver that allows you to make an attack for 3 times normal damage with a 2 second stun effect. Of course this attack leaves you in the Extended stance, where you have a severe penalty to defence...

I agree that it is an annoyance to players to allow mobs access to information that the player doesn't have. I will be implementing a factional memory system, so mobs will have a limited memory capability that they share with other mobs who have the same "faction" (reputation score), see my post in the Good/Evil Alignment thread for more information on the reputation/faction system. This way, if you use Fire spells against an orc from the Greenbriar Clan, when you encounter other orcs from the Greenbriar clan, they will put their fire sheilds up before attacking you.

I don't know if something as complex as a genetic algorithm is what I need. However, I don't currently have a way to quantify how good one action is in comparison to another. I'm not sure how you would measure this. If you do it on amount of damage dealt, then a defensive buff spell will always have a score of 0 as it deals no damage. Perhaps a combination of damage dealt, amount of time survived, if the mob survived the battle (and how much health/mana it had left). Anyway, how would you go about quantifying how successful an action is?
Back to top
View user's profile Send private message Send e-mail
Author Message
MikeRozak



Joined: 27 Nov 2005
Posts: 15
Location: Australia

PostPosted: Mon Nov 28, 2005 6:53 am    Post subject: Reply with quote

Some more thoughts:

1) Players may not want mobs to be smart; they might just want variety. MMORPG mobs are intentionally dumbed down. Of course, this depends on your player base.

2) Make replacable AI modules (or sub-modules) that allow you to mix and match different tactics easier. For example: One module might be "run when wounded", while another might be "cast healing spells". I have programmed in "goals" which perform a similar function. Richard Bartle wrote up some info on goals in www.skotos.net articles archive.

3) Have these AI modules controlled by a few parameters. Set these by hand. IE: "Run when wounded" if "wounds > 58.6%". "Cast healing spell" if "wounds > 25%" and "mana reserves > 10%".

4) To maximize AI efficiency, create a virtual arena of mob vs. mob, run thousands to millions of combats and fine-tune the parameters. Find the set of parameters with the highest success rate.

5) Allow players to write their own script for mob AI and make a game out of who can make the best combat AI... there was a game named Robot Wars for the Apple ][ which did this. Of course, the winning AIs get promoted to mob AIs (assuming they don't suck too much CPU).
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Author Message
DaTroof



Joined: 28 Nov 2005
Posts: 1

PostPosted: Mon Nov 28, 2005 9:16 am    Post subject: Reply with quote

This topic is fascinating to me. One of my goals with my own codebase is to make NPC interaction as engaging as possible, and combat is an important aspect of that.

BobTHJ, your major concern seems to be strategy. How does an NPC choose an offensive or defensive action? What makes it change its approach? Etc....

This discussion reminds me of some of the algorithms I've seen for chess AI. One effective approach I saw was to apply scores to possible moves; for example, if a move put the AI's queen in danger, the move lost 1000 points in value, but if it also put the opponent's queen in danger, it gained 1000 points. (It didn't necessarily work tit-for-tat, but you get the idea.) The AI would calculate several moves and choose the one with the highest score.

The problem becomes a little different with MUDs. In a chess game, there's one ultimate solution: checkmate the king. In a MUD combat, the NPC's goal can be more varied. Some will always fight to the death. Others will defend a particular location and stop fighting when the invasion retreats. And of course, different NPCs will have different combat skills, or magic spells, or whatever else available to them. There are six pieces with unique moves in chess; most MUDs would be embarrassed to have so small a derivation. (In reality, most MUDs have at least that small a derivation; but they have the illusion of more.)

First, let's try to make the solution as generic as possible. The NPCs need to know what combat skills they have. This means that any skill, whether it involves the use of magic or weapons or bare hands, needs to be flagged a combat skill. It works even better if we can differentiate offensive and defensive skills. Better still if NPCs can determine what skills are required by the equipment in their inventory. It's possible to build a system where NPCs, individually or en masse, learn this stuff by trial and error, but it doesn't have to be (and probably shouldn't be) completely random. One example of scripted strategy:

* Shaman orc has fireball spell, short sword, and jumpkick skill. It picks the fireball spell first because it does the most damage.
* Player has fire resistance. Here's where we cheat a little. The orc knows its success value should have resulted in X damage, but it resulted in 50% of X damage instead. Now it compares the possible damage it can do with its sword. If the sword damage is greater, it switches.
* Player has armor that reduces piercing damage. The orc performs the same calculation with its jumpkick skill, and selects sword or kick based on the max possible damage.

The next question is how much the NPC remembers between combats. Let's say the player is a member of the Anti-Fire Guild. Next time the shaman orc attacks a member of that guild, maybe it should remember that fireballs were ineffective and use the sword first. But then you have to consider how the NPC differentiates between groups. If the player is a werewolf in the Anti-Fire Guild and is wearing pierce-proof armor, will the NPC try the jumpkick or its silver dagger first? Furthermore, how much of this information should the NPC recognize on sight?

Yet another question: what about future planning? Should the NPC be able to know that its potential with the sword is greater if it earns more skill through experience? Should the NPC therefore use the sword because it expects to be able to do more damage in future combats? Ouch.

And now we're getting into real learning systems, and how to distribute them. How do we decide what knowledge the NPC can access? How does learned knowledge propagate? Theory alone is giving me a damn headache.

The only part of this problem I've solved in my own codebase is letting the NPC determine which of its available attacks causes the most potential damage; and it might switch to another attack if the actual damage caused is less than expected. Beyond that, I've only been able to script simple goals: attack any PC in a given location, retreat after X damage, etc. If anyone has a good approach to these types of problems, I'd love to hear about them.
Back to top
View user's profile Send private message
Author Message
KaVir



Joined: 11 May 2005
Posts: 565
Location: Munich

PostPosted: Mon Nov 28, 2005 9:34 am    Post subject: Reply with quote

MikeRozak wrote:
Players may not want mobs to be smart; they might just want variety.


I think you definitely need to make some sort of compromise between "smart" and "varied". If the mobs are too smart you end up with the same problem you started out with, with every mob fighting in much the same way.

My own approach is to give mobs fairly strong - but fixed (and specialised) - tactics. This results in each mob fighting in its own way, and allows players to learn and exploit the weaknesses of the different mobs. It's also considerably quicker and easier to implement than a learning system!

I could see definite advantages in having certain mobs that adapt to their situation and use smarter tactics, but for the majority of animals and monsters (particularly the unintelligent ones) I think it makes sense (and actually adds to the gameplay) if they fight in a more fixed manner. It might seem "cool" from a design perspective to have mobs that constantly outsmart the players, but from a playability perspective I think it could end up being very discouraging for players.

MikeRozak wrote:
Allow players to write their own script for mob AI and make a game out of who can make the best combat AI...


I very cool idea, and one which was touched on in the Player-bred monsters thread. I think such a game could add a great deal to the mud itself, as well as provide an excellent way to test the mob AI.
Back to top
View user's profile Send private message Visit poster's website
Author Message
shasarak



Joined: 29 Jun 2005
Posts: 134
Location: Emily's Shop

PostPosted: Mon Nov 28, 2005 11:08 am    Post subject: Reply with quote

One thing I'd like to see is monsters making use of the environment a bit more, and using cooperative tactics.

For example:

- A monster preparing a trap of some kind (a concealed pit, say) and then apparently fleeing from a fight in such a way as to lure the player into the trap - or perhaps, attacking hard so as to back the player over a cliff.

- A monster acting as a diversion so one of its colleagues can achieve the real objective (like stealing something).

- A monster luring a player into an ambush (NPCs lurking in the undergrowth with loaded crossbows).

- A monster that is being hurt by fire spells running into a river (assuming fire spells don't work underwater).

- A monster taking advantage of the combination of environment and its own abilities (e.g. if it can see in the dark, it might try to lure a player into a dark location).

- Monsters confusing players (e.g. waving lots of torches and speaking in different voices to make it seem like there are more of them then there really are).

- Monsters fleeing towards a place where they know they can find a healing potion.

I think the best thing is to start by sitting down and analysing how you as a player would fight - what tactics would you employ, how would you make the decisions that you make in a fight? - and then think about whether or not you could translate the same decision-making process into code.

It also has to be said that a lot of this is highly dependent on how monsters are coded generally, and how the combat system works. For instance, I'd like to have a combat system where almost any object can be picked up and used as a weapon. If you have a system like this, and a bar-room brawl breaks out, it's going to be more or less automatic for NPCs to pick up chairs and smash them over the heads of players, or to break the chairs so they can use one as a club, or break bottles for use as weapons. If you don't, in general, allow a bottle to be used as a club or a bottle to be broken and thus form a dangerous slashing weapon, this is much harder to add in as a special case.
Back to top
View user's profile Send private message
Author Message
BobTHJ



Joined: 19 Nov 2005
Posts: 31

PostPosted: Mon Nov 28, 2005 5:04 pm    Post subject: Reply with quote

I read the above referenced Bartle articles on planning engines last week, and I think this is the route I will take. This solves mob AI both in and out of combat.

To solve the problems that Bartle brought up about inability to adapt when using a planning engine, I intend for each mob to have a second "behind the scenes" goal of self-preservation. This goal would usurp their current goal whenever the mob was threatened, and would put the mob in "combat mode". The combat planning goals would be much smaller goal chains, and thus should work when in a rapidly changing environment like combat.

Each spell, skill, and usable item will represent a goal step, as well as a plethora of additional goal steps (such as Flee, Attack, etc) and advanced goal steps (Set ambush, make the room dark, etc.). To make sure mobs are not alike, you can limit what goal steps a mob can used based on it's Intelligence score (and possibly other attributes).

To make it work, I will use a system of weighted lists. Whenever the mob has a goal to complete, the mob evaluates all possible actions that can complete this goal. Each action will return a number that determines how successful the action might be. These numbers are used to form a weighted list, and then an option is chosen from the list at random. For example, if the mob has a goal of "Make this room dark" while in combat (to gain a tactical advantage because the mob is noctural and has night vision) it has the following possible options:

Extinguish the light source
Cast a darkness spell

Now, if the mob is on a city street at night lit by torchlight, the first option will return a high value as will the second. So the mob will have about an even chance of choosing each option. Of course, if the mob is low on Mana, then the second option will return a smaller value, thus causing the mob to be more likely to choose the first option. However, if the mob is in an open feild during broad daylight, the first option will return a value of 0 (since there is no way for the mob to extingish the light source), however the second option is still viable, and thus will be chosen by the mob.

A mob's capability for reasoning can be built into the system. A simple minded non-sentient mob will receive 0 return scores from all actions that require reasoned thinking. Lower intelligence mobs like Goblins will have their return scores weighted toward less complex actions. This, combined with each mob having it's own sampling of skills and spells should result in each mob being slightly unique, providing a large variety. At the same time, mobs should be similar enough that two mobs of the same type will use roughly the same tactics. Also, mobs will not always choose the best option (as the choice is random from a weighted list) so the mobs shouldn't be "undefeatable", and shouldn't always make the same choices.

When I first started thinking this subject over, I thought about the idea of players being able to write custom AI for pets, guards, etc., as was suggested above. I think this system allows for and simplifies this process. Players should be able to write an AI script by simply providing the overall Goals that the mob should attempt to complete. Thus an AI script has been simplified to a list of Goals and responses to actions of other mobs/players by changing or modifying those Goals. This way the player can simply give a mob a single command "Patrol from room A to room B" and the planning system can handle the details of this action without the player having to write an entire script to move the mob from A to B and back again while engaging any enemies sighted along the way. Of course, I may give players the option of writing their own custom Goal steps, for those people who want to micro-manage their mobs Smile

One issue I'm still working on is allowing mobs to share their goals with their allies, and work together to complete those goals using group tactics. This would allow the more advanced actions suggested above like one mob distracting the player so another mob can sneak by and enter the city... If you read Bartle's articles on Skotos, this could be integrated into the planning engine / Quest system. Mobs could offer "quests" to either players (which would be displayed as a prose request with a specified reward) or to other mobs (by passing the mob the specific sub-goal), allowing mob B to complete a goal-step for Mob A. To do this, mobs would need a means of evaluating a offered goal-step and determining if the reward for completeing it is more important than completing it's own goal. If so, it would accept the "quest" and make that goal-step it's priority. It's own goal would be held in stasis until it completed the "quest" goal-step, at which point it could resume work on it's own goal.

Mobs could be made to be ready allies of another mob. For example, a soldier mob might have the goal of "Assist the squad leader". The mob's goal would then be to ask the squad leader for any goal-steps it can complete. The Squad Leader mob would have a master goal, and the soldier mobs would do it's bidding and carry out the actual work.

You could also have "mercenary" mobs which could be hired by players to carry out a goal-step, but would only accept if "the price is right". If so, their goal becomes "Assist player X". The player could then give them goal-step commands like "Fetch item X from room Y", and the mob could complete the task using the planning engine.

Picture also a Cult Leader mob. The mob could go around attempting to convince other mobs to join it's cult. Once those mobs were persuaded, their goals would change to "Assist Cult Leader", and he could use them to carry out his nefarious schemes.

Of course, 500+ mobs running around the mud each trying to complete it's own goals could really lag the server, so I will need to implement a system to "shut down" planning for non-essential mobs when no players are around.

I'm still very interested in more thoughts and discussion on this subject, and specifically the above plan.
Back to top
View user's profile Send private message Send e-mail
Author Message
MikeRozak



Joined: 27 Nov 2005
Posts: 15
Location: Australia

PostPosted: Mon Nov 28, 2005 9:03 pm    Post subject: Reply with quote

The way I have implimented goals is (basically) as follows:

1) Each AI has a set (5+) of goals that they try to achieve concurrently. for example, the goals are: wander around, pick flowers, try to sell flower, rest at night, etc.

2) When a mob enters combat some new goals are added: run away, attack, loot enemy, etc.

3) Each goal has a priority score, with the highest priority goal being run on every "tick" (once a second).

4) However, goals are given the chance to augment/decrease their normal goal score. Thus, if a NPC has lots of flowers in hand, it's "pick flowers" goal will have lower score. Likewise, if it's very injured, its "run away" score might be higher.

This causes the AI to (usually) follow and complete the highest priority goal, and then move on to the next. However, goals sometimes change priority, as in the event of combat or the NPC being hungry, etc. Likewise, if a PC talks to the NPC, the NPC stops performing other goals (except combat) and talks to the PC until the conversation is over.

I also have sub-goals. They aren't as necessary for combat, although I use them as follows: An AI may have a goal of attacking an enemy. The sub-goal is to make sure the AI has a weapon; if the AI doesn't, it will pick up a weapon from the ground (or a dead body) and use it. The next sub-goal is to ensure it's equipped, etc.
Back to top
View user's profile Send private message Send e-mail Visit poster's website
Author Message
BobTHJ



Joined: 19 Nov 2005
Posts: 31

PostPosted: Mon Nov 28, 2005 9:37 pm    Post subject: Reply with quote

Thanks! That's similar to the system I was trying to describe in my post above...I just muddled and confused everything and droned on forever. Basically, I want the mob to have multiple concurrent goals, but only one goal will have precedence at any one time. However, the environment around the mob can change augment one goal above another, forcing the diminished goal to "wait on the sidelines" until it takes precedence again (because the primary goal is completed, abandon, or is no longer a priority).

It seems to me the key with this type of a system is to ensure that the priority changes among the mob's goals remain infrequent. Otherwise you have a mob that is confused:

I'm gonna pick flowers...
(mob heads to the fields)
no wait, I'm gonna sell supplies in the city...
(mob turns around when halfway to the fields and returns to the city)
no wait, I'm gonna pick flowers...

In the end the mob ends up patrolling the road between the fields and the city without actually ever reaching either destination...


Perhaps sub-goals could be treated as primary goals with their own priorities in some cases. For example, every mob would (with the exception of undead, etc.) have a "Self Preservation" goal. This goal would keep track of the mob's vitals (hunger, thirst, health, environmental security) and would spawn additional goals as the mob required them:

Hunger is too high, spawn a "Get Food" sub-goal
Low on Health, spawn a "Increase Health" sub-goal (which in turn would contain a "Flee Combat" or "Use Healing Potion" subgoal)
The Dark Woods scare me...spawn a "Leave Area" sub-goal

Each active goal has a priority, and could in turn contain it's own sub-goals (the selected method for carrying out the goal). Some goals would work well by spawning new Goals (like the self preservation goal above) while other goals would work better by selecting and executing a series of sub-goals. Example:

Get Item X -->
(The mob knows Item X is at Shop A and selects the following sub-goal)
Get to Shop A -->
(The mob now selects one of the following sub-goals:)
Walk to Shop A (generates a path and moves the mob) or
Use Teleport Crystal to get to Shop A
(after the selected prior sub-goal is complete)
Buy Item X
Back to top
View user's profile Send private message Send e-mail
Author Message
Kelson



Joined: 18 May 2005
Posts: 71
Location: SC

PostPosted: Tue Nov 29, 2005 6:40 pm    Post subject: Reply with quote

How do you plan to avoid hard-coding responses to all these goals?
Back to top
View user's profile Send private message Send e-mail AIM Address
Display posts from previous:   
Post new topic   Reply to topic    mudlab.org Forum Index -> Design All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
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

Powered by phpBB © 2001, 2002 phpBB Group
BBTech Template by © 2003-04 MDesign