Register to post in forums, or Log in to your existing account
 

Play RetroMUD
Post new topic  Reply to topic     Home » Forums » Finished MUD Scripts
T
Newbie


Joined: 20 Feb 2001
Posts: 9
Location: USA

PostPosted: Mon Mar 05, 2001 1:51 am   

Combat Bot
 

Combat Bot Part 1 - Summary



This code works for the Dead Of Night LP mud, round.locallink.net port 3443, specifically,
for a "merfolk, cleric, war mage". I am posting it for two reasons. The first is
that it is my first attempt at scripting in Zmud and I would love suggestions for
improvement. The second is that maybe the example might help some people who really just
need yet another example.

Because the script is customized specifically for me, I'm going to present it in such a
way that you might use the process to develop your own personal script. Experienced
Zmud programmers, feel free to point out flaws so that we can all benefit. Thanks!

What's it do?



The main part of the Combat Bot is a command loop that heals or attacks based on current
stats. Using a trigger, it waits until all the commands are processed before sending
more. This prevents too many commands from being sent to the mud at one time, and
prevents waiting for a lot "useless" commands to execute so you can go on. It also does
not oversend through lags, and sends the correct commands for the current health/ability.

Additional Features



  • On/off button and alias for speedy cancellation of loop.

  • End of combat corpse looting.

  • Starts automatically if attacked.

  • Single vs. group monster attacks.

  • Optional monster trailing.

  • Periodic check for shield, weapon wielded, and other initializing.

  • On/off buttons for special attacks.

  • Spam gag on/off button.

  • Tracking of HP (hit points), AP (energy), WP (water points), CP (cleric spell points), SP (mage spell points), EXP, loop iterations, monster health.

  • Easy to customize with power growth and new abilities.

  • Calculates combat efficiency.



What doesn't it do?



It does not follow a path, seeking monsters to hunt. And a lot of other things I'm sure
you'll think of that you need. However, while I guarantee that this will have been
tweaked and changed within a day of my posting it here (my nature), I would prefer not
to receive requests for additional programming.

Steps



  1. Write what you want it to do.

  2. Write down what you do to heal, what you do to attack, and what stat criteria you use to decide which to do.

  3. Get the Combat Bot on/off button and aliases working. Use basic #SHOW to test.

  4. Define your variables (consistent naming helps!).

  5. Get your stat variables filling in correctly both in and out of combat. Might as well add your status bar display of these (or gauges).

  6. Define your heal functions and attack functions (consisitent naming helps!). Do not include any #WAIT, and try to keep each the actual number of commands sent as small as possible. Group these logically based on your stat requirements, required delays, and your need to turn them on/off dynamically.

  7. Write your loop function. Don't panic about getting it correctly adjusted the first time. There's more than enough time for tweaking later. (More to follow on this.)

  8. Test it. Fix it.

  9. Add your special features, one at a time, testing as you go.

  10. Adjust healing and attacks and stat criteria to suit.


That's it. Simple. More to follow as I get it formatted.
Reply with quote
T
Newbie


Joined: 20 Feb 2001
Posts: 9
Location: USA

PostPosted: Mon Mar 05, 2001 1:54 am   
 

Combat Bot Part 2 - Variables



Here's what mine look like.

Basic stats:
#VAR stat_hp {100} {0}
#VAR stat_sp {97} {0}
#VAR stat_wp {100} {0}
#VAR stat_ap {100} {0}
#VAR stat_cp {100} {0}
#VAR stat_exp {110130240} {0}

What is low for those stats (point I need healing):
#VAR low_hp {60} {60}
#VAR low_sp {60} {60}
#VAR low_wp {50} {50}
#VAR low_ap {30} {30}
#VAR low_cp {30} {30}
#VAR low_ap_quake {66} {66}

Muscle:
#VAR combat_target {demon} {demon}
#VAR loop_command {flip} {flip}
#VAR combat_count {0} {0}
#VAR captivate_target {2} {2}

On/off features:
#VAR combat_empower {0} {0}
#VAR combat_gag {1} {1}
#VAR combat_single {1} {1}

Experience calculation:
#VAR stat_exp_begin {0} {0}
#VAR stat_exp_end {0} {0}
#VAR stat_exp_calc {0} {0}
#VAR stat_shape {None} {None}
#VAR stat_exp_avg {0} {0}
Reply with quote
T
Newbie


Joined: 20 Feb 2001
Posts: 9
Location: USA

PostPosted: Mon Mar 05, 2001 2:04 am   
 

Combat Bot Part 3 - Attack Loop



Use a command that requires a response from your game to trigger to the loop.

For example, the loop output might be:


missile
missile
missile
quake
flip

And the loop would be in a trigger on:


You flip head over heels.

Your loop should include any #WAIT statements to prevent dumping too much to the game.
You should not have #WAIT statements in your function calls, because your loop will
keep going and Zmud seems to trip up on itself sometimes manifesting as memory errors
and program locking.

Your loop should use variables for low amounts, and function calls for attacks. This
makes it easy to customize as you grow. Keep the output on your loop short enough to
check your stats often enough, and long enough to prevent too many calculations. This
is easier to do while tracking your combat efficiency (how much experience you gain
for the amount of time you spent getting it).

My loop:


Should the loop end?
Yes. End loop.
No. Are my hit points low?
Yes. Heal me. End loop because I may need to run.
No. Are my stats too low to attack?
Yes. Heal me. Loop.
No. Increment loop count. Do delayed attacks?
Yes. Attack. Do initialization?
Yes. Initialize. Loop.
No. Loop.
No. Attack. Loop.



#IF (!@combat_killing) {
#SAY LOOP TERMINATED
#COLOR red
} {
#IF (@stat_hp < @low_hp) {
#PLAY "C:flashkit_soundsdislikesfx0050.wav"
#REPEAT 5 {
shield
cheal
}
#REPEAT 4 {
#EXEC {@drink_water}
}
} {
#IF ((@stat_sp < @low_sp) or (@stat_ap < @low_ap) or
(@stat_wp < @low_wp)) {
#REPEAT 4 {
#EXEC {@drink_water}
}
} {
#IF (%mod(@combat_count, 4)=0) {
look at @combat_target
#EXEC {@attack_cp}
#EXEC {@attack_empower}
#IF (@stat_ap > @low_ap_quake) {
#EXEC {@attack_ap}
}
#IF (%mod(@combat_count, 8)=0) {
#EXEC {@attack_init}
}
} {
#IF (@combat_single) {
#EXEC {@attack_sp}
} {
#EXEC {@attack_sp_group}
#WAIT 3000
#EXEC {@attack_sp}
}
}
#WAIT 1000
#ADD combat_count 1
}
@loop_command
}
}

Starting your loop:



Add an alias that starts your combat, and a trigger that catches when you get attacked.
Turn on the combat_killing variable (which also turns on the button), and do your loop
command.

For example:


#ALIAS go {#IF (@combat_killing) {#SAY COMBAT ALREADY ENABLED;#COLOR red}
{#VAR combat_killing 1;#VAR combat_target %1;#VAR combat_count 0;
#VAR stat_shape "None";#T+ DoN|Combat_Bot|Exp_Begin;#WAIT 2000;score short;
#IF (%2) {trail @combat_target} {trail off};look at @combat_target;
kill @combat_target;#EXEC {@loop_command}}}

#TRIGGER {Your energy shield blocks all of the attack!} {#IF (@combat_gag) {#GAG};
#IF (!@combat_killing) {#VAR combat_killing 1;#BEEP;#EXEC {@attack_init};
@loop_command}} "" {case|verbatim}

Stopping your loop:



Write triggers to turn off your combat_killing variable. These group rather nicely
in a sub-class. Put your corpse looting, exp calculation, etc. in the code when the
combat_killing button turns off.


#ALIAS cgo {#VAR combat_killing 0}

#BUTTON 1 {Peace} {#SAY KILLING MODE ON;#COLOR red;shield;equip} {Combat}
{#SAY KILLING MODE OFF;#COLOR red;#T+ DoN|Combat_Bot|Exp_End;#WAIT 2000;
score short;get all from corpse;put all in bag;#WAIT 3000} {}
{combat_killing} {} {} {} {} {} {} {} {95} {47} {} {} "" {} {} {QUICK_STOP}
Reply with quote
T
Newbie


Joined: 20 Feb 2001
Posts: 9
Location: USA

PostPosted: Mon Mar 05, 2001 2:11 am   
 

Combat Bot Part 4 - Some Features



Combat Efficiency Calculation

At the beginning and end of your combat, record your experience. I have a couple of
classes I turn on when I start and end combat. After they trigger to store, they
turn off, freezing the values.


#CLASS {DoN|Combat_Bot|Exp_Begin}
#TRIGGER {Exp%s:%s(%d)%sLevel} {#MATH stat_exp_begin (%1/1000);
#T- DoN|Combat_Bot|Exp_Begin} "" {case}
#CLASS 0

#CLASS {DoN|Combat_Bot|Exp_End}
#TRIGGER {Exp%s:%s(%d)%sLevel} {#MATH stat_exp_end {%1/1000};
#T- DoN|Combat_Bot|Exp_End} "" {case}
#CLASS 0

In your function that calculates:


#MATH stat_exp_calc @stat_exp_end-@stat_exp_begin
#IF (@combat_count) {
#MATH stat_exp_avg (@stat_exp_calc/@combat_count)
} {
#VAR stat_exp_avg 0
}
#WAIT 3000
#SHOW {@stat_exp_begin @stat_exp_end @stat_exp_calc EXPERIENCE @stat_exp_avg AVERAGE}
#COLOR red

Notice that this figures the average (combat efficiency) based on my damage loop count
without healing loops. I'll probably change this soon as it does not tell me if I have
too many heals firing. Also note that the calculations do not have spaces between
the ()'s and the variables. There were some syntax problems when I had spaces.

Tracking Monster Health

Every so often in my main loop, I look at the monster. I use this subclass to capture
the health level to display on the status bar, so I don't need to read through the
combat spam trying to see it. It also counts down from 8, perfect health, to 0, dead,
so at any time, I know precisely how much farther I have to go.


#CLASS {DoN|Combat_Bot|Damage_Track}
#TRIGGER {perfect shape} {#VAR stat_shape "Perfect 8"} "" {case|verbatim}
#TRIGGER {a lot of cuts and scratches} {#VAR stat_shape "A Lot Of Cuts 6"}
#TRIGGER {few nicks here and there} {#VAR stat_shape "Few Nicks 7"} "" {case|verbatim}
#TRIGGER {grievously injured} {#VAR stat_shape "Grievous 3"} "" {case|verbatim}
#TRIGGER {severely wounded} {#VAR stat_shape "Severe 4"} "" {case|verbatim}
#TRIGGER {few cuts and scrapes} {#VAR stat_shape "Few Cuts"} "" {case|verbatim}
#TRIGGER {several deep gashes} {#VAR stat_shape "Deep Gashes 5"} "" {case|verbatim}
#TRIGGER {Death's door} {#VAR stat_shape "Death's Door 1"} "" {case|verbatim}
#TRIGGER {mortally wounded} {#VAR stat_shape "Mortally 2"} "" {case|verbatim}
#CLASS 0

On/Off Buttons

I have basic buttons that set variables. I check these variables within various
functions to decide what happens.


#VAR combat_empower {0} {0}
#VAR combat_gag {1} {1}
#VAR combat_single {1} {1}

#BUTTON 2 {Empower} {#SAY EMPOWER MODE ON;#COLOR red} {Empower}
{#SAY EMPOWER MODE OFF;#COLOR red} {} {combat_empower}
{} {} {} {} {} {} {} {95} {47} {} {} "" {} {} {STOP_EMPOWER}
#BUTTON 3 {Gag Off} {#T+ DoN|Combat_Bot|Combat_Gags;#SAY GAG MODE ON;
#COLOR red} {Gag On} {#T- DoN|Combat_Bot|Combat_Gags;#SAY GAG MODE OFF;
#COLOR red} {} {combat_gag} {} {} {} {} {} {} {} {95} {47} {} {} ""
{} {} {STOP_GAG}
#BUTTON 4 {Group} {#SAY SINGLE MODE;#COLOR red} {Single} {#SAY GROUP MODE;
#COLOR red} {} {combat_single} {} {} {} {} {} {} {} {95} {47} {} {} "" {}
{} {SINGLE_GROUP}

For example:


#VAR attack_empower {
#IF (@combat_empower) {
get oil from bag
empower hammer with flame
}
}

There are posts on these forums about counting your inventory, and I suppose one day
I'll get bored handling stuff like whether I have oil or not with buttons, but for
now, it works.
Reply with quote
T
Newbie


Joined: 20 Feb 2001
Posts: 9
Location: USA

PostPosted: Mon Mar 05, 2001 2:19 am   
 

Combat Bot Part 5 - The Code



In all it's mind numbing, eye killing gore...
You'll notice that the trail class is empty. I got the triggers for that from someone
else, and it's not fair for me to post his code. However, I don't feel this is a great
omission given the number of posts on the forums that deal with that.


#CLASS {DoN} {enable}
#STAT {CP: @stat_cp HP: @stat_hp SP: @stat_sp AP: @stat_ap WP: @stat_wp
EXP: @stat_exp @combat_count : @stat_shape}
#CLASS 0

#CLASS {DoN|Combat_Bot}
#ALIAS dr {#EXEC {@drink_water}}
#ALIAS go {#IF (@combat_killing) {#SAY COMBAT ALREADY ENABLED;#COLOR red}
{#VAR combat_killing 1;#VAR combat_target %1;#VAR combat_count 0;
#VAR stat_shape "None";#T+ DoN|Combat_Bot|Exp_Begin;#WAIT 2000;score short;
#IF (%2) {trail @combat_target} {trail off};look at @combat_target;
kill @combat_target;#EXEC {@loop_command}}}
#ALIAS cgo {#VAR combat_killing 0}
#ALIAS cap {#T+ DoN|Combat_Bot|Sing;#VAR captivate_target {%1};captivate %1}
#ALIAS ca {#EXEC {@attack_calculate}}
#VAR stat_hp {100} {0}
#VAR stat_sp {97} {0}
#VAR stat_wp {100} {0}
#VAR stat_ap {100} {0}
#VAR stat_cp {100} {0}
#VAR stat_exp {110130240} {0}
#VAR attack_sp {#SHOW MISSILES;#COLOR red;#REPEAT 6 {m}}
#VAR attack_cp {ahabsorb;ccause;sacrifice}
#VAR attack_sp_group {fireball}
#VAR attack_ap {quake}
#VAR combat_target {demon} {demon}
#VAR loop_command {flip} {flip}
#VAR drink_water {spring;#REPEAT 10 {drink water}}
#VAR low_hp {60} {60}
#VAR low_sp {60} {60}
#VAR low_wp {50} {50}
#VAR low_ap {30} {30}
#VAR low_cp {30} {30}
#VAR low_ap_quake {66} {66}
#VAR attack_snakes {get all staff;#REPEAT 5 {get staff from bag}
#REPEAT 5 {sticksnakes staff};put all staff in bag}
#VAR combat_count {0} {0}
#VAR combat_killing {0} {0}
#VAR stat_exp_begin {0} {0}
#VAR stat_exp_end {0} {0}
#VAR stat_exp_calc {0} {0}
#VAR stat_shape {None} {None}
#VAR stat_exp_avg {0} {0}
#VAR captivate_target {2} {2}
#VAR combat_empower {0} {0}
#VAR combat_gag {1} {1}
#VAR attack_empower {#IF (@combat_empower) {get oil from bag;empower hammer with flame}}
#VAR attack_calculate {#MATH stat_exp_calc @stat_exp_end-@stat_exp_begin
#IF (@combat_count) {#MATH stat_exp_avg (@stat_exp_calc/@combat_count)
} { #VAR stat_exp_avg 0 }
#WAIT 3000
#SHOW {@stat_exp_begin @stat_exp_end @stat_exp_calc EXPERIENCE @stat_exp_avg AVERAGE}
#COLOR red}
#VAR attack_init {shield
equip
captivate @combat_target 2
#EXEC { @attack_snakes}}
#VAR person {me} {me}
#VAR combat_single {1} {1}
#TRIGGER {CP~:(&%dstat_cp)~%%sHP~:(&%dstat_hp)~%%sSP~:(&%dstat_sp)~%%sAP~:(&%dstat_ap)
~%%sWP~:(&%dstat_wp)~%%sEXP~:(&%dstat_exp)} {}
#TRIGGER {You flip head over heels} {#IF (!@combat_killing) {#SAY LOOP TERMINATED;
#COLOR red} { #IF (@stat_hp < @low_hp) {#PLAY "C:flashkit_soundsdislikesfx0050.wav";
#REPEAT 5 {shield;cheal};#REPEAT 4 { #EXEC {@drink_water}}}
{#IF ((@stat_sp < @low_sp) or (@stat_ap < @low_ap) or (@stat_wp < @low_wp))
{ #REPEAT 4 { #EXEC {@drink_water}}} {#IF (%mod(@combat_count, 4)=0)
{look at @combat_target;#EXEC {@attack_cp};#EXEC {@attack_empower};
#IF (@stat_ap > @low_ap_quake) { #EXEC {@attack_ap}};#IF (%mod(@combat_count, 8)=0)
{ #EXEC {@attack_init}}} { #IF (@combat_single) { #EXEC {@attack_sp}}
{#EXEC {@attack_sp_group};#WAIT 3000;#EXEC {@attack_sp}}};#WAIT 1000;
#ADD combat_count 1};@loop_command}}} "" {case|verbatim}
#TRIGGER {Your energy shield blocks all of the attack!} {#IF (@combat_gag) {#GAG};
#IF (!@combat_killing) {#VAR combat_killing 1;#BEEP;#EXEC {@attack_init};
@loop_command}} "" {case|verbatim}
#BUTTON 1 {Peace} {#SAY KILLING MODE ON;#COLOR red;shield;equip} {Combat}
{#SAY KILLING MODE OFF;#COLOR red;#T+ DoN|Combat_Bot|Exp_End;#WAIT 2000;
score short;get all from corpse;put all in bag} {} {combat_killing}
{} {} {} {} {} {} {} {95} {47} {} {} "" {} {} {QUICK_STOP}
#BUTTON 2 {Empower} {#SAY EMPOWER MODE ON;#COLOR red} {Empower}
{#SAY EMPOWER MODE OFF;#COLOR red} {} {combat_empower} {} {} {} {} {} {}
{} {95} {47} {} {} "" {} {} {STOP_EMPOWER}
#BUTTON 3 {Gag Off} {#T+ DoN|Combat_Bot|Combat_Gags;#SAY GAG MODE ON;#COLOR red}
{Gag On} {#T- DoN|Combat_Bot|Combat_Gags;#SAY GAG MODE OFF;#COLOR red} {}
{combat_gag} {} {} {} {} {} {} {} {95} {47} {} {} "" {} {} {STOP_GAG}
#BUTTON 4 {Group} {#SAY SINGLE MODE;#COLOR red} {Single} {#SAY GROUP MODE;#COLOR red}
{} {combat_single} {} {} {} {} {} {} {} {95} {47} {} {} "" {} {} {SINGLE_GROUP}
#CLASS 0

#CLASS {DoN|Combat_Bot|Exp_Begin}
#TRIGGER {Exp%s:%s(%d)%sLevel} {#MATH stat_exp_begin (%1/1000);
#T- DoN|Combat_Bot|Exp_Begin} "" {case}
#CLASS 0

#CLASS {DoN|Combat_Bot|Exp_End}
#TRIGGER {Exp%s:%s(%d)%sLevel} {#MATH stat_exp_end {%1/1000};
#T- DoN|Combat_Bot|Exp_End} "" {case}
#CLASS 0

#CLASS {DoN|Combat_Bot|Combat_General}
#ALIAS tr2 {#IF (@combat_gag) {get all from corpse;#GAG;put all in bag;#GAG;
#LOO 2,10 {get all from corpse %{i};#GAG;put all in bag;#GAG}}
{get all from corpse;put all in bag;
#LOO 2,10 {get all from corpse %{i};put all in bag}}}
#ALIAS trail {#IF ("%1"="off") {#VAR person none;#SH TRAIL OFF;#COLOR red;
#T- DoN|Combat_Bot|Trail} {#VAR person %1;#SH TRAIL ON %1;#COLOR red;
#T+ DoN|Combat_Bot|Trail}}
#TRIGGER {The snake fades from existence, and in its place a staff appears.}
{get staff;put staff in bag} "" {case|verbatim}
#TRIGGER {Your magical shield dissipates into nothing.}
{#5 shield;#PLAY "C:flashkit_soundslikesdoor.wav"} "" {case|verbatim}
#TRIGGER {Do you intend to beat your fist on the ground}
{#PLAY "C:flashkit_soundslikeszap2.wav"} "" {case|verbatim}
#TRIGGER {war hammer appears in your hands} {wield hammer} "" {case|verbatim}
#TRIGGER {war hammer fades from existence} {chammer} "" {case|verbatim}
#TRIGGER {You begin a hypnotic song of the sea}
{#PLAY "C:flashkit_soundslikeslaser2.wav"} "" {case|verbatim}
#TRIGGER {You must be outdoors to create a spring.}
{#REPEAT 5 {drink wine}} "" {case|verbatim}
#TRIGGER {There is no oil in your bag of infinity (worn).}
{#VAR combat_empower 0} "" {case|verbatim}
#CLASS 0

#CLASS {DoN|Combat_Bot|Combat_Gags}
#TRIGGER {>: You already have a protective shield.} {#GAG} "" {case|verbatim}
#TRIGGER {>: You drink some fresh water from the spring.} {#GAG} "" {case|verbatim}
#TRIGGER {>: Your enemy must be present for a snake to assist.} {#GAG} "" {case|verbatim}
#TRIGGER {You continue your captivating tune.} {#GAG} "" {case|verbatim}
#TRIGGER {You launch a bolt of} {#GAG} "" {case|verbatim}
#TRIGGER {The spring's supply of water has been exhausted.} {#GAG} "" {case|verbatim}
#TRIGGER {>: You don't seem to have a staff to turn into a snake.} {#GAG} ""
{case|verbatim}
#TRIGGER {>: There is no staff in your bag of infinity (worn).} {#GAG} "" {case|verbatim}
#TRIGGER {this time.} {#GAG} "" {case|verbatim}
#TRIGGER {>: Your current use of that skill prevents you from using it again at} {#GAG}
#CLASS 0

#CLASS {DoN|Combat_Bot|Damage_Track}
#TRIGGER {perfect shape} {#VAR stat_shape "Perfect 8"} "" {case|verbatim}
#TRIGGER {a lot of cuts and scratches} {#VAR stat_shape "A Lot Of Cuts 6"}
#TRIGGER {few nicks here and there} {#VAR stat_shape "Few Nicks 7"} "" {case|verbatim}
#TRIGGER {grievously injured} {#VAR stat_shape "Grievous 3"} "" {case|verbatim}
#TRIGGER {severely wounded} {#VAR stat_shape "Severe 4"} "" {case|verbatim}
#TRIGGER {few cuts and scrapes} {#VAR stat_shape "Few Cuts"} "" {case|verbatim}
#TRIGGER {several deep gashes} {#VAR stat_shape "Deep Gashes 5"} "" {case|verbatim}
#TRIGGER {Death's door} {#VAR stat_shape "Death's Door 1"} "" {case|verbatim}
#TRIGGER {mortally wounded} {#VAR stat_shape "Mortally 2"} "" {case|verbatim}
#CLASS 0

#CLASS {DoN|Combat_Bot|End_Triggers}
#TRIGGER {You killed %w} {#PLAY C:flashkit_soundslikesdeath.wav;#VAR combat_killing 0}
#TRIGGER {fades away in a black mist.} {#PLAY C:flashkit_soundslikesdeath.wav;
#VAR combat_killing 0} "" {case|verbatim}
#TRIGGER {There is no demon here.} {#VAR combat_killing 0}
#TRIGGER {Missile whom?} {#VAR combat_killing 0} "" {case|verbatim}
#TRIGGER {>: Kill what?} {#VAR combat_killing 0} "" {case|verbatim}
#TRIGGER {You must be in the same room!} {#VAR combat_killing 0}
#TRIGGER {Your god's presence leaves you as it appears you no longer}
{#VAR combat_killing 0} "" {case|verbatim}
#CLASS 0

#CLASS {DoN|Combat_Bot|Sing}
#TRIGGER {You can not captivate that!} {#T- DoN|Combat_Bot|Sing}
#TRIGGER {You begin a hypnotic song of the sea.} {#T- DoN|Combat_Bot|Sing}
#TRIGGER {You are already singing a captivating sea song.} {#T- DoN|Combat_Bot|Sing}
#TRIGGER {Your song fails to take on its hypnotic effect.} {captivate @captivate_target}
#TRIGGER {You are too dry.} {#REPEAT 3 {@drink_water};#WAIT 2000;
captivate @captivate_target}
#TRIGGER {Enchant whom?} {#T- DoN|Combat_Bot|Sing}
#CLASS 0

#CLASS {DoN|Combat_Bot|Trail}
#CLASS 0
Reply with quote
Display posts from previous:   
Post new topic   Reply to topic     Home » Forums » Finished MUD Scripts All times are GMT
Page 1 of 1

 
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

© 2009 Zugg Software. Hosted by Wolfpaw.net