Initial commit of Merc 2.1

This commit is contained in:
Alex McHale 2009-07-22 20:56:56 +00:00
commit 358bed4591
88 changed files with 106967 additions and 0 deletions

153
README Normal file
View file

@ -0,0 +1,153 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Introduction
Merc Diku Mud is a Diku Mud with many enhancements and contributions. See our
'contrib.txt' and 'help merc' for acknowledgements. Send us your contribution,
and you'll be in there too!
Enjoy our mud. May your visit here be ... Mercenary.
This is the 2.1 production release of Merc.
=== Copyright and License
Diku Mud is copyright (C) 1990, 1991 by Sebastian Hammer, Michael Seifert,
Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. Their license agreement
is in the file 'license.doc'.
Merc Diku Mud is a derivative of the original Diku Mud and is subject to their
copyright and license agreement. Merc Diku Mud contains substantial
enhancements to Diku Mud. These enhancements are copyright 1992, 1993 by
Michael Chastain, Michael Quan, and Mitchell Tse. Our license agreement is in
'license.txt'.
The license terms boil down to this: the people who wrote this mud want due
credit for their work.
=== Contents of the Release
area Area files.
doc Documentation.
log Log files (initially empty).
player Player files (initially empty).
src Source files.
=== How to Install
First, group with your highest level Unix guru, and have him or her tank.
Merc is easier to install than other muds, but every site is different.
(1) Get the release Merc_21.tar.gz from one of these fine anonymous ftp
sites:
ftp.tcp.com (formerly ferkel.ucsb.edu)
ftp.math.okstate.edu
(2) Unpack the release:
gzip -d -c Merc_21.tar.gz | tar xvf -
(3) Go into the 'src' directory. Choose the Makefile for your operating
system and copy it into 'Makefile':
Makefile Most machines with 'gcc'
Makefile.aix AIX
Makefile.hp Hp/UX
Makefile.isc Interactive Systems Unix
Makefile.mip Mips Risc/OS
Makefile.nex NeXT
Makefile.sol SunSoft Solaris 2.1
Makefile.tra Traditional C (see 'trad.txt')
Merc.exe, a pre-built MsDos executable, is included in the release.
See 'port.txt' for more information on porting, including the
single-user MsDos and Macintosh versions.
(4) Run 'make' with the following options:
make -k >&! make.out
This will take 10 minutes to 60 minutes, depending on the speed of your
computer.
If you encounter errors with 'make', send us your 'make.out' file:
mail -s make.out mec@shell.portal.com < make.out
Also we'll need to know what kind of hardware, operating system,
and C compiler you have.
We will help you get Merc running, but obviously we can't guarantee
Merc will run on any particular machine.
(5) Start the game:
startup &
telnet localhost 4000
(6) To make your first immortal character, just start as a mortal
character, play at least as far as level 2, and then edit the
player file and change your level. (After the first immortal,
you can advance the rest).
(7) If you haven't already done so, read 'license.doc' and 'license.txt'.
Because Merc is a derivative work of Diku Mud, you must register
your mud with the original Diku implementors.
(8) Of course you're going to change the title screen, help files, and so on.
Don't just globally erase the 'Merc' references, ok? You wouldn't
like it if we did that to your work, so don't do it to ours.
=== Support
First, read the documentation in the 'doc' directory. We rewrote all of the
documentation files from scratch for the 2.0 Alpha release, and have been
keeping them up-to-date since.
Also check the 'wizhelp' command and read the 'help' descriptions for the
individual immortal commands.
There is a mailing list at 'merc@kpc.com'. Send mail to 'merc-request@kpc.com'
to join the list.
You can write to us directly at the e-mail addresses at the top of this
document.
When you write us, we need to know what kind of machine you're running on. If
you can give us specific information about the problem, that helps too.
Specific information means: an adb or gdb stack trace (if you're reporting a
crash), or a syslog with the relevant commands logged. The player files are
ascii files -- dump them into your mail message too.
If your e-mail is too vague, we're likely to bounce it back. There are three
of us and dozens of you -- we simply can't engage in long-distance debugging,
on unknown platforms, with the added factor of more code that you've dropped in
since the release.
=== Future Plans
We have finished core development of Merc. There will never be a Merc 3.
It's your mud now -- the end of our development is the beginning of yours.
We will continue making maintenance releases to fix bugs, add new platform
support, and fold in contributed code and areas. The next release of Merc,
version 2.2, will be on 05 Sep 1993.

1217
area/air.are Normal file

File diff suppressed because it is too large Load diff

1259
area/arachnos.are Normal file

File diff suppressed because it is too large Load diff

45
area/area.lst Normal file
View file

@ -0,0 +1,45 @@
help.are
limbo.are
smurf.are
plains.are
ofcol2.are
olympus.are
air.are
shire.are
hitower.are
gnome.are
wyvern.are
catacomb.are
hood.are
draconia.are
mahntor.are
trollden.are
firenewt.are
midgaard.are
chapel.are
midennir.are
grave.are
school.are
moria.are
juargan.are
eastern.are
drow.are
thalos.are
mirror.are
ofcol.are
haon.are
arachnos.are
dwarven.are
daycare.are
sewer.are
valley.are
redferne.are
mega1.are
marsh.are
dream.are
grove.are
dylan.are
canyon.are
galaxy.are
mobfact.are
$

2015
area/canyon.are Normal file

File diff suppressed because it is too large Load diff

1731
area/catacomb.are Normal file

File diff suppressed because it is too large Load diff

1952
area/chapel.are Normal file

File diff suppressed because it is too large Load diff

597
area/daycare.are Normal file
View file

@ -0,0 +1,597 @@
#AREA { 1 5} Sandman Dwarven Day Care~
#MOBILES
#6600
youth dwarven dwarf~
the dwarven youth~
A young dwarf plays with a toy axe.
~
This is a young but not totally harmless creature.
~
68 0 -5 S
3 17 6 1d4+30 1d4+3
50 400
6 8 1
#6601
teddy bear~
a teddy bear~
A cute and fuzzy teddy bear stands here.
~
This is a tiny little bear with a heart on his chest.
~
68 0 500 S
1 19 9 1d10+10 1d4+1
75 75
8 8 1
#6602
doll raggedy anne~
a raggedy anne doll~
A raggedy anne doll is sitting here.
~
You see a small little cute rag doll.
~
68 0 300 S
2 18 9 2d5+19 1d5+1
250 200
6 8 1
#6603
soldier toy~
a toy soldier~
A toy soldier is standing here.
~
The toy is looking for target practice.
~
68 0 -300 S
3 18 7 3d5+26 2d3+2
400 300
8 8 1
#6604
bear ugly~
the ugly bear~
An ugly stuffed bear stands here.
~
This is obviously a reject from the factory.
He snarls and growls at you.
~
68 0 -400 S
3 17 6 3d4+25 1d5+2
100 300
8 8 1
#6605
doll old~
an old doll~
An abused and old doll is here.
~
This doll has been hugged and played with until there is almost nothing left.
~
68 0 -2 S
1 20 10 1d10+1 1d4+2
50 50
8 8 0
#6606
nanny~
the nanny~
An old wrinkled nanny stands here, looking over the little ones.
~
You see an old dwarven lady who has been hunched over with age. However, it
appears that there is still some fight left in her.
~
64 0 10 S
5 16 6 4d4+50 1d8+2
750 750
8 8 2
#6607
guard~
the armed guard~
An armed guard stands here looking lost.
~
This is a big mean bully who is tired of being lost in this maze.
You suddenly think that you had better flee.
~
70 8 -800 S
8 9 2 3d10+100 3d5+2
2000 2000
8 8 1
#6608
brat spoiled~
the spoiled brat~
A spoiled brat is crying here.
~
You see a little tyke who has always gotten what he wanted. You have the
biggest urge to put him out of his misery.
~
70 0 -400 S
1 18 9 2d4+15 2d2+1
2000 50
8 8 1
#0
#OBJECTS
#6600
axe toy~
a toy axe~
An axe made of plastic lies here.~
~
5 0 8193
0 1 6 3
15 600 200
#6601
ring pink ice~
a pink ice ring~
A pink ice ring draws your eye.~
~
9 0 3
1 0 0 0
8 7000 2500
A
1 1
A
13 6
#6621
robe linen~
a linen robe~
A linen robe is crumpled into a ball here.~
~
9 0 1025
1 0 0 0
5 4000 2000
A
4 1
A
12 5
#6644
meat steak~
a juicy steak~
A juicy steak sits on a plate here.~
~
19 0 1
15 0 0 0
5 15 2
#6645
steak rotten~
a rotten steak~
A dry steak lies on the floor.~
~
19 0 1
4 0 0 1
5 14 1
#6646
potion amber~
an amber potion~
An amber potion sits in a corner.~
~
10 0 1
30 16 1 0
1 1500 500
#6647
gun toy~
a toy gun~
A toy gun with a sharp bayonet lies here.~
~
5 0 8193
0 2 3 7
5 1700 1000
#0
#ROOMS
#6601
The Dwarven Drop Off~
This is where the dwarven mommies and daddies come to drop off their
annoying little brats. You have the urge to leave. There is a sign here.
~
66 12 0
D2
You see a large room full of noisy brats.
~
~
1 -1 6602
D0
~
~
0 -1 6500
E
sign~
This is an area for newbies, so have fun. -- Sandman
~
S
#6602
Day Care Center~
You are in the north-east corner of the main part of the center. Toys and
toddlers are all over the room. There is a kitchen to the east.
~
66 8 0
D0
You see the drop off.
~
~
0 -1 6601
D3
You see a large room full of noisy brats.
~
~
0 -1 6603
D2
You see a large room full of noisy brats.
~
~
0 -1 6604
D1
You see an extremely messy kitchen.
~
~
0 -1 6626
S
#6603
Day Care Center~
You are in the north-west corner of the main part of the center. Toys and
toddlers are all over the room. There is a bathroom to the west.
~
66 8 0
D1
You see a large room full of noisy brats.
~
~
0 -1 6602
D2
You see a large room full of noisy brats.
~
~
0 -1 6605
D3
You see a messy bathroom.
~
~
0 -1 6606
S
#6604
Day Care Center~
You are in the south-east corner of the main part of the center. Toys and
toddlers are all over the room. There is a playground to the east.
~
66 8 0
D0
You see a large room full of noisy brats.
~
~
0 -1 6602
D1
You see the playground.
~
~
0 -1 6610
D3
You see a large room full of noisy brats.
~
~
0 -1 6605
S
#6605
Day Care Center~
You are in the south-west corner of the main part of the center. Toys and
toddlers are all over the room. There is a staircase to the west.
~
66 8 0
D0
You see a large room full of noisy brats.
~
~
0 -1 6603
D1
You see a large room full of noisy brats.
~
~
0 -1 6604
D3
You see a staircase leading down.
~
~
0 -1 6607
S
#6606
The Messy Bathroom~
You hold your nose as you realize you have made the worst mistake of your
life. The air is rancid and the walls are stained.
~
66 8 0
D1
You see a large room full of noisy brats.
~
~
0 -1 6603
S
#6607
The Staircase~
You stand on top of a staircase leading down, and wonder what mystery could
lie down under. Beware!
~
66 8 0
D1
You see a large room full of noisy brats.
~
~
0 -1 6605
D5
You see the entrance to something.
~
~
0 -1 6612
S
#6608
The Playground~
You are in the north-west corner of the playground.
~
66 0 2
D1
You see the playground.
~
~
0 -1 6609
D2
You see the playground.
~
~
0 -1 6610
S
#6609
The Playground~
You are in the north-east corner of the playground.
~
66 0 2
D2
You see the playground.
~
~
0 -1 6611
D3
You see the playground.
~
~
0 -1 6608
S
#6610
The Playground~
You are in the south-west corner of the playground.
~
66 0 2
D0
You see the playground.
~
~
0 -1 6608
D1
You see the playground.
~
~
0 -1 6611
D3
You see a large room full of noisy brats.
~
~
0 -1 6604
S
#6611
The Playground~
You are in the south-east corner of the playground.
~
66 0 2
D0
You see the playground.
~
~
0 -1 6609
D3
You see the playground.
~
~
0 -1 6610
S
#6612
Entrance to the Mini-Maze~
You stand in the entrance to a small, but confusing maze. You really hope
that you don't get lost.
~
66 13 2
D1
~
~
0 -1 6613
D4
You see some stairs.
~
~
0 -1 6607
S
#6613
Mini-Maze~
You are in a small passage that looks just like every other one.
~
66 9 2
D3
~
~
0 -1 6612
D2
~
~
0 -1 6615
D1
~
~
0 -1 6614
S
#6614
Mini-Maze~
You are in a small passage that looks just like every other one.
~
66 9 2
D2
~
~
0 -1 6616
D3
~
~
0 -1 6613
S
#6615
Mini-Maze~
You are in a small passage that looks just like every other one.
~
66 9 2
D0
~
~
0 -1 6613
D1
~
~
0 -1 6616
S
#6616
Mini-Maze~
You are in a small passage that looks just like every other one.
~
66 9 2
D3
~
~
0 -1 6615
D0
~
~
0 -1 6614
D2
~
~
0 -1 6624
S
#6624
End of the Mini-Maze~
You stand at the end of your journey. There is a big sign here and you had
better read it!
~
66 9 2
D0
~
~
0 -1 6616
D2
~
~
0 -1 6631
E
sign~
If you are not level 6 or above, then don't go south!!!! It is a dangerous
area, but congrats for getting this far - Sandman
~
S
#6626
Messy Kitchen~
You stand in the kitchen and eating area of the day care center. Pots and
pans are everywhere, while the toddlers continue to create chaos.
~
66 8 0
D3
You see a large room full of noisy brats.
~
~
0 -1 6602
S
#6631
The End?~
You have reached the final lair. It is dominated by a huge five headed
dragon (actually an overgrown brat with a Halloween mask).
~
66 9 2
D0
~
~
0 -1 6624
S
#0
#RESETS
R 0 6613 4
R 0 6614 4
R 0 6615 4
R 0 6616 4
*
M 0 6607 1 6624
M 0 6608 1 6631
M 0 6600 3 6602
E 1 6600 10 16
M 0 6601 2 6602
M 0 6602 2 6602
M 0 6606 2 6602
G 1 6646 20
G 1 6644 20
E 1 6621 20 12
*
M 0 6600 3 6603
E 1 6600 10 16
*
M 0 6600 3 6604
E 1 6600 10 16
M 0 6602 2 6604
M 0 6606 2 6604
G 1 6646 20
M 0 6605 2 6604
*
M 0 6600 3 6605
E 1 6600 10 16
M 0 6602 2 6605
G 1 6645 20
M 0 6605 2 6605
E 1 6601 20 1
*
M 0 6600 2 6608
M 0 6603 3 6608
E 1 6647 10 16
*
M 0 6600 2 6609
M 0 6604 3 6609
M 0 6603 3 6609
E 1 6647 10 16
M 0 6603 3 6609
E 1 6647 10 16
*
M 0 6600 2 6610
M 0 6604 3 6610
M 0 6603 3 6610
E 1 6647 10 16
M 0 6605 2 6610
*
M 0 6604 3 6611
M 0 6603 3 6611
E 1 6647 10 16
M 0 6603 3 6611
E 1 6647 10 16
*
M 0 6605 3 6606
M 0 6601 3 6606
S
#SPECIALS
M 6600 spec_thief
M 6601 spec_thief
M 6602 spec_thief
M 6603 spec_thief
M 6604 spec_thief
M 6605 spec_thief
M 6606 spec_cast_cleric
M 6608 spec_thief
S
#$

1557
area/draconia.are Normal file

File diff suppressed because it is too large Load diff

1355
area/dream.are Normal file

File diff suppressed because it is too large Load diff

1218
area/drow.are Normal file

File diff suppressed because it is too large Load diff

1302
area/dwarven.are Normal file

File diff suppressed because it is too large Load diff

1798
area/dylan.are Normal file

File diff suppressed because it is too large Load diff

1438
area/eastern.are Normal file

File diff suppressed because it is too large Load diff

996
area/firenewt.are Normal file
View file

@ -0,0 +1,996 @@
#AREA { 5 15} Nirrad Land of the Fire Newts~
#MOBILES
#2901
black mountain goat~
a mountain goat~
A mountain goat is standing here.
~
It looks hungry and searches for food.
~
2 0 -100 S
2 18 10 2d2+30 1d4+2
14 150
8 8 1
#2902
black mountain ewe~
a mountain ewe~
A mountain ewe is standing here.
~
The ewe is watching her young.
~
2 0 -100 S
2 19 10 2d2+30 1d4+1
10 125
8 8 2
#2903
black mountain kid~
a mountain kid~
A mountain kid is standing here.
~
The kid is playing with its siblings.
~
2 0 -100 S
1 20 10 3d6+1 1d3+1
6 100
8 8 0
#2904
fire newt worker~
a fire newt worker~
A fire newt worker is standing here.
~
The fire newt worker looks hot and sweaty.
~
4|32|64 0 -400 S
2 18 8 3d12+8 1d6+2
23 200
8 8 1
#2905
fire newt guard~
a fire newt guard~
A fire newt guard is standing here.
~
The fire newt guard thinks you would be better dead.
~
2|32 0 -450 S
3 17 7 3d3+35 1d10+2
30 300
8 8 1
#2906
fire newt worker~
a fire newt worker~
A fire newt worker is standing here.
~
The fire newt worker looks hot and sweaty.
~
2 8 -400 S
2 18 8 3d12+8 1d6+2
23 200
8 8 2
#2907
fire newt guard~
fire newt guard~
A fire newt guard is standing here.
~
The fire newt guard wants to kill you!
~
32|64 0 -450 S
3 17 7 3d3+35 1d10+2
30 300
8 8 2
#2908
fire newt mother~
a fire newt mother~
A fire newt mother is standing here.
~
The fire newt mother is watching her kids.
~
2 0 -355 S
2 18 8 3d10+8 1d6+2
26 200
8 8 2
#2909
fire newt baby~
a fire newt baby~
A fire newt baby is crawling here.
~
The fire newt baby is crawling and drooling here.
~
2|4 0 -350 S
0 20 10 3d2+1 1d3+0
6 50
8 8 0
#2910
fire newt sergeant~
a fire newt sergeant~
A fire newt sergeant patrols this area.
~
He's just found something that doesn't belong here!
~
2|32 0 -500 S
5 15 4 12d10+20 1d12+4
200 700
8 8 1
#2911
fire newt general~
a fire newt general~
A fire newt general is standing here.
~
The fire newt general grins evilly at you.
~
34 0 -700 S
8 13 3 8d8+100 1d15+4
400 2000
8 8 1
#2912
fire newt leader~
a fire newt leader~
A fire newt leader is standing here.
~
The fire newt leader screams, 'I'm going to hose you!'
~
2|32 8|128 -1000 S
13 9 1 13d13+150 1d5+12
1000 8000
8 8 1
#2913
fire newt priest~
a fire newt priest~
A fire newt priest is standing here.
~
The fire newt priest is preparing for worship.
~
2|32 8 -1000 S
10 11 2 10d10+100 1d4+8
700 3500
8 8 1
#2914
fire lizard~
a fire lizard~
A fire lizard is crawling here.
~
The fire lizard flicks its tongue at you.
~
2|32 8 -100 S
11 10 2 11d11+110 2d12+8
1000 5000
8 8 0
#0
#OBJECTS
#2901
horns~
horns~
a set of horns lies here.~
~
5 0 1|8192
0 1 6 7
2 10 3
#2902
bladder milk~
milk bladder~
a milk bladder lies here.~
~
17 0 1
20 20 10 0
1 2 2
#2903
shovel~
shovel~
a shovel lies here.~
~
5 0 1|8192
0 1 6 7
2 10 3
#2904
short sword~
short sword~
a short sword lies here.~
~
5 0 1|8192
0 1 6 11
3 30 3
#2905
hand axe~
hand axe~
a hand axe lies here.~
~
5 0 1|8192
0 1 6 3
3 30 3
#2906
chainmail~
chainmail~
a chainmail shirt lies here.~
~
9 0 1|8
4 0 0 0
10 1000 10
#2907
pick~
pick~
a pick lies here.~
~
5 0 1|8192
0 1 9 11
2 1000 10
#2911
broad axe~
broad axe~
a broad axe lies here.~
~
5 64|512 1|8192
0 2 8 3
15 600 100
A
18 1
A
19 2
#2912
leather suit~
leather suit~
a leather suit lies here.~
~
9 1|64 1|8
4 0 0 0
3 1000 100
A
2 1
#2913
mace~
mace~
a mace lies here.~
~
5 2|64 1|8192
0 2 6 6
10 300 20
A
18 2
A
19 2
#2914
potion~
orange potion~
an orange potion lies here.~
~
10 64 1
10 22 17 28
1 100 10
#2915
egg newt~
a newt egg~
a newt egg lies here.~
~
19 0 1
10 0 0 0
1 1 1
#0
#ROOMS
#2900
Obsidian hills~
You see before you some shiny black hills. There is very little vegetation
here. The hills appear to lead to a high mountain to the south east
~
29 4 3
D0
You see a path leading back towards the Turning Point.
~
~
0 0 4785
D2
You see some more hills. They continue south.
~
~
0 0 2901
E
hills~
The hills are a very shiny black color.
~
S
#2901
Obsidian hills~
You see before you some shiny black hills. There is very little vegetation
here. The hills appear to lead to a high mountain to the south east
~
29 4 3
D2
You see some more hills to the south.
~
~
0 0 2902
D0
You see some hills to the north.
~
~
0 0 2900
E
hills~
The hills are a very shiny black color.
~
S
#2902
Obsidian hills~
You see before you some shiny black hills. There is very little vegetation
here. The hills appear to lead to a high mountain to the south east
~
29 4 3
D1
You see the side of the mountain to the east.
~
~
0 0 2903
D0
You see some hills to the north.
~
~
0 0 2901
E
hills~
They are a very shiny black color.
~
S
#2903
Mountain side~
The mountain is very high and looks to be quite old. There are a few cracks
in the side of the mountain
~
29 0 4
D2
The mountain continues.
~
~
0 0 2904
D3
You see some hills to the west.
~
~
0 0 2902
E
mountain~
The mountain looks like it was formed from something sliding down and stopping.
~
S
#2904
Mountain side~
The mountain is very high and looks to be quite old. There is smoke coming
from the top of the mountain.
~
29 0 4
D2
The mountain continues.
~
~
0 0 2905
D0
You see mountains to the north.
~
~
0 0 2903
E
smoke~
The smoke is grey and puffs out of the top of the mountain.
~
S
#2905
Mountain top~
You've reached the top of the mountain. You can see more smoke from up here.
The smoke seems to come from a hole to the south.
~
29 4 4
D2
You see a hole to the south. It looks like an entrance.
~
~
0 0 2906
D0
You see the side of the mountain to the north.
~
~
0 0 2904
E
top of mountain~
The top of the mountain is a large area with a hole in the middle.
~
E
smoke~
The smoke is grey and is coming from the hole.
~
S
#2906
Entrance to the mountain~
The smoke comes from inside the hole. It also looks like there is a path
that leads down.
~
29 4 4
D5
You can see down inside the mountain.
~
~
0 0 2910
D0
You see the top of the mountain to the north.
~
~
0 0 2905
D1
You see the top of the mountain to the east.
~
~
0 0 2907
D2
You see the top of the mountain to the south.
~
~
0 0 2909
D3
You see the top of the mountain to the west.
~
~
0 0 2908
S
#2907
Mountain top~
You are standing at the top of the mountain. The mountain looks like it has
been ravaged by something.
~
29 4 4
D3
You see the entrance to the mountain to the west.
~
~
0 0 2906
S
#2908
Mountain top~
You are standing at the top of the mountain. There are several cracks in the
ground and you don't feel safe!
~
29 4 4
D1
You see the entrance to the mountain to the north.
~
~
0 0 2906
S
#2909
Mountain top~
You are standing on the top of the mountain and think you should move north.
~
29 4 4
D0
You see the entrance to the mountain to the north.
~
~
0 0 2906
S
#2910
Inside the mountain~
You are standing inside the mountain.
~
29 9 2
D5
The shaft continues down.
~
~
0 0 2913
D4
Entrance to the mountain.
~
~
0 0 2906
D1
You see guard barracks.
~
~
0 0 2911
D3
You see guard barracks.
~
~
0 0 2912
S
#2911
Guard room~
You are standing in a room with beds, tables, and fire newts!
There are paintings on the wall. They show battle scenes.
~
29 9 2
D3
You see the dark tunnel shaft.
~
~
0 0 2910
E
beds~
The beds are made of metal and rock.
~
E
chairs~
The chairs are made of stone and look very heavy.
~
E
tables~
The tables are long and wide. They are made of stone and obviously too heavy
to move.
~
S
#2912
Guard room~
You are standing in a room with beds, chairs, tables, and fire newts!
There are paintings on the wall that show great leaders.
~
29 9 2
D1
You see the shaft in the mountain.
~
~
0 0 2910
E
beds~
The beds are made of metal and rock.
~
E
chairs~
The chairs are made of stone and look very heavy.
~
E
tables~
The tables are long and wide. They are made of stone and are obviously to
heavy to move.
~
S
#2913
Inside the mountain~
You are standing inside the mountain.
~
29 9 2
D5
The shaft continues down.
~
~
0 0 2916
D4
You see the dark mountain shaft.
~
~
0 0 2910
D0
You see a large storage room.
~
~
0 0 2914
D2
You see workers' quarters.
~
~
0 0 2915
S
#2914
Store room~
You see nothing special in this room. There are some boxes and fire newt
workers here. There is also some trash piled up in the room.
~
29 9 2
D2
You see the dark mountain shaft.
~
~
0 0 2913
S
#2915
Workers' quarters~
You are standing in the workers' quarters. There are several workers here.
The room is messy and has nothing of value in it. The party the night before
must have destroyed everything.
~
29 9 2
D0
You see the dark mountain shaft.
~
~
0 0 2913
S
#2916
Bottom of the mountain~
You are standing at the bottom of the shaft.
~
29 9 2
D0
You see the dark tunnel.
~
~
0 0 2917
D4
You see the mountain shaft.
~
~
0 0 2913
S
#2917
The tunnel~
You are standing in a dry, dark tunnel.
~
29 9 2
D0
You see a bend in the tunnel.
~
~
0 0 2918
D2
You see the bottom of the shaft.
~
~
0 0 2916
S
#2918
Bend in the tunnel~
You are standing in a dark tunnel.
~
29 9 2
D1
The tunnel continues into the dark.
~
~
0 0 2919
D2
You see that the tunnel leads back.
~
~
0 0 2917
S
#2919
The tunnel~
You are standing in a dark tunnel.
~
29 9 2
D0
The tunnel continues into the dark.
~
~
0 0 2921
D3
You see a bend in the tunnel.
~
~
0 0 2918
D1
You see a small fire newt house.
~
~
0 0 2920
S
#2920
Fire Newt House~
You are standing in a fire newt house. There is a mother fire newt here
playing with her children. The room is full of newt toys- they look very
boring.
~
29 9 2
D3
You see the dark tunnel.
~
~
0 0 2919
S
#2921
The tunnel~
You are standing in a dark tunnel.
~
29 9 2
D3
You see a fire newt house.
~
~
0 0 2922
D2
The dark tunnel.
~
~
0 0 2919
D0
The tunnel continues on.
~
~
0 0 2923
S
#2922
Fire Newt House~
You are standing in a fire newt house. There is a fire newt mother here
playing with her children. The room has several torn baby newt diapers here
... how disgusting!
~
29 9 2
D1
You see the dark tunnel.
~
~
0 0 2921
S
#2923
The tunnel~
You are standing in the dark tunnel.
~
29 9 2
D3
You see the entrance to the town hall.
~
~
0 0 2924
D2
You see the dark tunnel.
~
~
0 0 2921
D1
You see a fire newt temple.
~
~
0 0 2927
S
#2924
Entrance to the town hall~
You are standing in the entrance to the town hall. The room is large and
ornate.
~
29 9 2
D3
You see a waiting room.
~
~
0 0 2925
D1
You see the dark tunnel.
~
~
0 0 2923
S
#2925
The Waiting Room~
You are standing in the waiting room of the town hall. There is a big door
to the west. The room has pictures of the villages history.
~
29 9 2
D3
You see a large office.
~
~
0 0 2926
D1
You see the entrance to the town hall.
~
~
0 0 2924
S
#2926
The Leader's Office~
You are standing in the fire newt leader's office.
~
29 9 2
D1
You see the waiting room.
~
~
0 0 2925
S
#2927
Outside the temple~
You are standing outside the fire newt temple. The temple has some very
large arches and towers.
~
29 9 2
D1
You see the entrance to the fire newt temple.
~
~
0 0 2928
D3
You see the dark tunnel.
~
~
0 0 2923
S
#2928
Entrance to the temple~
You are standing at the entrance to the temple. The temple is very neat.
The sates are set in straight rows and the alter is very large.
~
29 9 2
D1
You see the door, that leads to the inside of the temple.
~
door~
1 -1 2929
D3
You see the outside of the temple.
~
~
0 0 2927
S
#2929
Inside the Temple~
You are standing inside the fire newt temple.
~
29 9 2
D3
You see the door that leads to the temple entrance.
~
door~
1 -1 2928
D5
You see a large trap door.
~
~
0 0 2930
S
#2930
The room before the doors~
You are standing before a pair of huge doors.
~
29 9 2
D1
You see two large doors.
~
doors~
1 -1 2931
D4
You see the inside of the temple.
~
~
0 0 2929
S
#2931
The Egg Room~
You are standing in a room that has several dozen piles of eggs. There is
a chest on the floor also.
~
29 13 2
D3
You see two large doors.
~
doors~
1 -1 2930
S
#0
#RESETS
*
M 0 2901 2 2903
E 1 2901 500 16
M 0 2901 2 2904
E 1 2901 500 16
*
M 0 2902 2 2904
G 1 2902 100
M 0 2902 2 2904
G 1 2902 100
*
M 0 2903 6 2904
M 0 2903 6 2904
M 0 2903 6 2904
M 0 2903 6 2904
M 0 2903 6 2904
M 0 2903 6 2904
*
M 0 2904 10 2910
E 1 2903 100 16
M 0 2904 10 2914
M 0 2904 10 2914
E 1 2903 100 16
M 0 2904 10 2916
E 1 2903 100 16
M 0 2904 10 2917
M 0 2904 10 2918
E 1 2903 100 16
M 0 2904 10 2919
E 1 2903 100 16
M 0 2904 10 2921
M 0 2904 10 2923
E 1 2903 100 16
M 0 2904 10 2921
*
M 0 2905 6 2911
E 1 2904 100 16
M 0 2905 6 2911
E 1 2904 100 16
M 0 2905 6 2911
E 1 2904 100 16
M 0 2905 6 2912
E 1 2905 100 16
M 0 2905 6 2912
E 1 2904 100 16
M 0 2905 6 2912
E 1 2905 100 16
*
M 0 2906 4 2915
E 1 2903 100 16
M 0 2906 4 2915
E 1 2903 100 16
M 0 2906 4 2915
M 0 2906 4 2915
*
M 0 2907 6 2919
E 1 2905 100 16
M 0 2907 6 2921
E 1 2905 100 16
M 0 2907 6 2923
E 1 2904 100 16
M 0 2907 6 2923
M 0 2907 6 2918
E 1 2904 100 16
M 0 2907 6 2917
E 1 2904 100 16
*
O 0 2906 20 2915
*
M 0 2908 2 2920
M 0 2908 2 2922
*
M 0 2909 12 2920
M 0 2909 12 2920
M 0 2909 12 2920
M 0 2909 12 2920
M 0 2909 12 2920
M 0 2909 12 2920
M 0 2909 12 2922
M 0 2909 12 2922
M 0 2909 12 2922
M 0 2909 12 2922
M 0 2909 12 2922
M 0 2909 12 2922
*
M 0 2910 2 2924
E 1 2906 20 5
E 1 2907 20 16
M 0 2910 2 2927
E 1 2906 20 5
E 1 2907 20 16
*
M 0 2911 4 2925
E 1 2906 20 5
E 1 2907 20 16
M 0 2911 4 2925
E 1 2906 20 5
E 1 2907 20 16
M 0 2911 4 2928
E 1 2906 20 5
E 1 2907 20 16
M 0 2911 4 2928
E 1 2906 20 5
E 1 2907 20 16
*
M 0 2912 1 2926
E 1 2911 10 16
E 1 2912 10 5
*
M 0 2913 1 2929
E 1 2913 10 16
*
M 0 2914 2 2930
G 1 2914 10
M 0 2914 2 2930
G 1 2914 10
*
O 0 2915 100 2931
D 0 2928 1 1
D 0 2929 3 1
S
#SPECIALS
M 2913 spec_cast_cleric * fire newt priest
M 2914 spec_breath_fire * fire lizard
S
#$

1915
area/galaxy.are Normal file

File diff suppressed because it is too large Load diff

2229
area/gnome.are Normal file

File diff suppressed because it is too large Load diff

921
area/grave.are Normal file
View file

@ -0,0 +1,921 @@
#AREA { 5 10} Alfa Graveyard~
#MOBILES
#3600
henry gardener~
Henry the Gardener~
Henry the Gardener is sitting here, looking drunk.
~
He is a tall but bulky man in his late fifties. His features are worn with
decades of hard work and his somewhat crouched expression is one of deep
sorrow and depression. He is haunted by a memory of a lost paradise.
~
64 0 350 S
4 15 8 1d12+48 1d6+1
50 800
6 6 1
#3601
zombie~
the rotting zombie~
A rotting zombie is staggering towards you with outstretched hands.
~
Maggots crawl all over its decaying body.
~
34 512 -750 S
4 16 5 2d6+60 1d8+2
50 800
8 8 1
#3602
ghoul~
the ghastly ghoul~
A ghastly ghoul is here.
~
It is a walking corpse with long fangs and long, sharp nails that most of
resemble claws. Its eyes are a dark yellow colour and glare hungrily at you.
~
34 512 -750 S
6 15 4 2d6+72 1d10+2
100 1500
8 8 1
#3603
skeleton~
a dusty skeleton~
A dusty skeleton lies here.
~
The dusty bones are almost brown. It must have been buried for a very long
time.
~
34 512 -750 S
3 17 7 1d12+36 1d6+2
10 600
8 8 1
#3604
skeleton~
a dusty skeleton~
A dusty skeleton lies here.
~
The dusty bones are almost brown. It must have been buried for a very long
time.
~
32 512 -750 S
3 17 7 1d12+36 1d6+2
10 600
8 8 1
#3605
zombie~
the rotting zombie~
A rotting zombie is staggering towards you with outstretched hands.
~
Maggots crawl all over its decaying body.
~
32 512 -750 S
4 16 5 2d6+60 1d8+2
100 800
8 8 1
#0
#OBJECTS
#3600
candlestick~
a candlestick~
A pewter candlestick is standing here.~
~
1 0 16385
0 0 24 0
5 150 50
E
candlestick~
It is a rather old-looking three-armed candlestick made from pewter. Its
candles are a yellowish white colour.
~
#3601
brandy bottle~
a brandy bottle~
A brandy bottle is lying here.~
~
17 0 1
10 10 5 0
2 50 10
E
brandy bottle~
The bottle is a special 'Dragon Blood' brandy bottle. Its neck is shaped
like a small dragon's head. Bottles like these are often worth a small
amount money, even when empty.
~
#3602
brandy bottle~
a brandy bottle~
A brandy bottle is lying here.~
~
17 0 1
10 0 5 0
2 50 10
E
brandy bottle~
The bottle is a special 'Dragon Blood' brandy bottle. Its neck is shaped
like a small dragon's head. Bottles like these are often worth some money,
even when empty.
~
#3603
wheelbarrow~
a wheelbarrow~
A green-painted wheelbarrow is standing here.~
~
22 0 1
0 0 0 0
100 100 100
E
wheelbarrow~
It is a heavy wheelbarrow made from solid oaken planks that have been painted
a dark, green colour.
~
#3604
shovel~
a shovel~
A shovel is lying here.~
~
5 0 8193
0 1 5 7
8 30 10
E
shovel~
It is a large metal shovel with a solid wooden handle.
~
#3605
rake~
a rake~
A rake is lying here.~
~
5 0 8193
0 1 4 5
8 30 10
E
rake~
It is a large metal rake with a solid wooden handle.
~
#3610
skeleton~
a dusty skeleton~
A dusty skeleton lies here.~
~
12 0 1
0 0 0 0
15 0 0
E
skeleton~
The dusty bones are almost brown. It must have been buried for a very long
time.
A dusty skeleton is in an excellent condition.
~
#3611
amethyst gem~
a amethyst~
A large, beautifully polished amethyst has been left here.~
~
8 0 16385
0 0 0 0
1 3000 40
E
amethyst~
It has a very deep purple colour.
~
#3612
pendant silver~
a silver pendant~
A silver pendant has been left here.~
~
9 0 1|4
4 0 0 0
1 400 80
E
pendant silver~
It resembles Thor's hammer and appears to be made of solid silver.
~
#3613
dagger silver~
a silver dagger~
A long silver dagger is lying here.~
pierce~
5 0 8193
0 2 4 11
1 100 20
E
dagger silver~
It has a long, sharp blade that is made entirely from silver. A small rune
has been engraved on the blade next to the hilt.
~
A
19 1
#0
#ROOMS
#3600
A Gravel Road on the Graveyard~
You are on a well-kept gravel road that leads north-south through the
graveyard. On both sides of the road grow dark evergreen trees. An iron
grate is to the north and narrow gravel paths lead east and west.
~
36 0 2
D0
Through the solid iron bars you see the Concourse.
~
grate~
1 3121 3129
D1
The gravel path leads eastwards between the dark evergreen trees.
~
~
0 -1 3650
D2
The gravel road continues southwards.
~
~
0 -1 3601
D3
The gravel path leads westwards between the dark evergreen trees.
~
~
0 -1 3606
S
#3601
A Gravel Road on the Graveyard~
You are on a well-kept gravel road that leads north-south through the
graveyard. On both sides of the road grow dark evergreen trees.
~
36 0 2
D0
The gravel road continues northwards.
~
~
0 -1 3600
D2
The gravel road continues southwards.
~
~
0 -1 3602
S
#3602
A Gravel Road on the Graveyard~
You are on a well-kept gravel road that leads north-south through the
graveyard. On both sides of the road grow dark evergreen trees.
~
36 0 2
D0
The gravel road continues northwards.
~
~
0 -1 3601
D2
The gravel road continues southwards.
~
~
0 -1 3603
S
#3603
A Gravel Road on the Graveyard~
You are on a well-kept gravel road that leads north-south through the
graveyard. On both sides of the road grow dark evergreen trees.
~
36 0 2
D0
The gravel road continues northwards.
~
~
0 -1 3602
D2
The gravel road continues southwards to an open space before a small
building.
~
~
0 -1 3604
S
#3604
In front of the Chapel~
You are on an open space before a small chapel. A gravel road leads north
through the graveyard and the chapel entrance is to the south.
~
36 0 2
D0
The gravel road continues northwards.
~
~
0 -1 3603
D1
The gravel path leads eastwards between the dark evergreen trees.
~
~
0 -1 3638
D2
The chapel door is made of dark wood.
~
door~
1 -1 3405
D3
The gravel path leads westwards between the dark evergreen trees.
~
~
0 -1 3618
S
#3606
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. An old tomb is here.
~
36 0 2
D1
The gravel path continues eastwards towards a gravel road.
~
~
0 -1 3600
D2
The gravel path continues southwards.
~
~
0 -1 3608
D5
~
tomb stone~
1 -1 3607
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3607
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3606
S
#3608
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads north and west. An old tomb is here.
~
36 0 2
D0
The gravel path continues northwards.
~
~
0 -1 3606
D3
The gravel path continues westwards.
~
~
0 -1 3610
D5
~
tomb stone~
1 -1 3609
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3609
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3608
S
#3610
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads east and south. An old tomb is here.
~
36 0 2
D1
The gravel path continues eastwards.
~
~
0 -1 3608
D2
The gravel path continues southwards.
~
~
0 -1 3612
D5
~
tomb stone~
1 -1 3611
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3611
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3610
S
#3612
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads north and east. A small shed is to the west.
~
36 0 2
D0
The gravel path continues northwards.
~
~
0 -1 3610
D1
The gravel path continues eastwards.
~
~
0 -1 3614
D3
It is a small black-painted shed with a wooden door.
~
door~
1 -1 3613
S
#3613
In a shed on the Graveyard~
You are in a small shed that looks as if it is used to store all sorts of
gardening equipment. The only exit appears to be through a door to the east.
~
36 8 1
D1
~
door~
1 -1 3612
S
#3614
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads south and west. An old tomb is here.
~
36 0 2
D2
The gravel path continues southwards.
~
~
0 -1 3616
D3
The gravel path continues westwards.
~
~
0 -1 3612
D5
~
tomb stone~
1 -1 3615
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3615
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3614
S
#3616
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads north and south. An old tomb is here.
~
36 0 2
D0
The gravel path continues northwards.
~
~
0 -1 3614
D2
The gravel path continues southwards.
~
~
0 -1 3618
D5
~
tomb stone~
1 -1 3617
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3617
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3616
S
#3618
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads north and east. An old tomb is here.
~
36 0 2
D0
The gravel path continues northwards.
~
~
0 -1 3616
D1
The gravel path continues eastwards towards a building of some sort.
~
~
0 -1 3604
D5
~
tomb stone~
1 -1 3619
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3619
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3618
S
#3638
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads north and west. An old tomb is here.
~
36 0 2
D0
The gravel path continues northwards.
~
~
0 -1 3640
D3
The gravel path continues westwards towards a building of some sort.
~
~
0 -1 3604
D5
~
tomb stone~
1 -1 3639
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3639
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3638
S
#3640
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads north and south. An old tomb is here.
~
36 0 2
D0
The gravel path continues northwards.
~
~
0 -1 3642
D2
The gravel path continues southwards.
~
~
0 -1 3638
D5
~
tomb stone~
1 -1 3641
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3641
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3640
S
#3642
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads east and south. An old tomb is here.
~
36 0 2
D1
The gravel path continues eastwards.
~
~
0 -1 3644
D2
The gravel path continues southwards.
~
~
0 -1 3640
D5
~
tomb stone~
1 -1 3643
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3643
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3642
S
#3644
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads north and west. An old tomb is here.
~
36 0 2
D0
The gravel path continues northwards.
~
~
0 -1 3646
D3
The gravel path continues westwards.
~
~
0 -1 3642
D5
~
tomb stone~
1 -1 3645
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3645
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3644
S
#3646
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads south and west. An old tomb is here.
~
36 0 2
D2
The gravel path continues southwards.
~
~
0 -1 3644
D3
The gravel path continues westwards.
~
~
0 -1 3648
D5
~
tomb stone~
1 -1 3647
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3647
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3646
S
#3648
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads north and east. An old tomb is here.
~
36 0 2
D0
The gravel path continues northwards.
~
~
0 -1 3650
D1
The gravel path continues eastwards.
~
~
0 -1 3646
D5
~
tomb stone~
1 -1 3649
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3649
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3648
S
#3650
A Gravel Path on the Graveyard~
You are on a gravel path winding its way between dark evergreen trees on
the graveyard. The path leads south and west. An old tomb is here.
~
36 0 2
D2
The gravel path continues southwards.
~
~
0 -1 3648
D3
The gravel path continues westwards towards a gravel road.
~
~
0 -1 3600
D5
~
tomb stone~
1 -1 3651
E
tomb stone~
It is a large rectangular slab of dark grey stone that has been placed face
up in the ground. The name has been erased by the ravages of time.
~
S
#3651
In a dusty Tomb~
You are in a dark burial chamber beneath a large tomb stone.
The only exit appears to be up.
~
36 9 1
D4
~
tomb stone~
1 -1 3650
S
#0
#RESETS
*
D 0 3129 2 2 Lock graveyard from outside
D 0 3600 0 2 Lock graveyard from inside
D 0 3604 2 1 Close Chapel door from outside
*
D 0 3606 5 1 Close Tomb 3607 from outside
D 0 3607 4 1 Close Tomb 3607 from inside
O 0 3610 13 3607 Skeleton
D 0 3608 5 1 Close Tomb 3609 from outside
D 0 3609 4 1 Close Tomb 3609 from inside
M 0 3603 5 3609 Skeleton
D 0 3610 5 1 Close Tomb 3611 from outside
D 0 3611 4 1 Close Tomb 3611 from inside
M 0 3603 5 3611 Skeleton
O 0 3613 10 3611 Silver Dagger
D 0 3612 3 1 Close Shed from outside
D 0 3613 1 1 Close Shed from inside
M 0 3600 1 3613 Henry the Gardener
G 1 3601 1000 Brandy bottle (full)
O 0 3602 1000 3613 Brandy bottle (empty)
O 0 3603 1 3613 Wheelbarrow
O 0 3604 1000 3613 Shovel
O 0 3605 1000 3613 Rake
D 0 3614 5 1 Close Tomb 3615 from outside
D 0 3615 4 1 Close Tomb 3615 from inside
O 0 3610 13 3615 Skeleton
D 0 3616 5 1 Close Tomb 3617 from outside
D 0 3617 4 1 Close Tomb 3617 from inside
M 0 3602 1 3617 Ghoul
G 1 3612 1000 Silver pendant
D 0 3618 5 1 Close Tomb 3619 from outside
D 0 3619 4 1 Close Tomb 3619 from inside
O 0 3610 13 3619 Skeleton
D 0 3638 5 1 Close Tomb 3639 from outside
D 0 3639 4 1 Close Tomb 3639 from inside
M 0 3603 5 3639 Skeleton
D 0 3640 5 1 Close Tomb 3641 from outside
D 0 3641 4 1 Close Tomb 3641 from inside
O 0 3610 13 3641 Skeleton
D 0 3642 5 1 Close Tomb 3643 from outside
D 0 3643 4 1 Close Tomb 3643 from inside
O 0 3603 5 3643 Skeleton
D 0 3644 5 1 Close Tomb 3645 from outside
D 0 3645 4 1 Close Tomb 3645 from inside
M 0 3601 1 3645 Zombie
G 1 3611 1000 Amethyst
D 0 3646 5 1 Close Tomb 3647 from outside
D 0 3647 4 1 Close Tomb 3647 from inside
O 0 3610 13 3647 Skeleton
D 0 3648 5 1 Close Tomb 3649 from outside
D 0 3649 4 1 Close Tomb 3649 from inside
M 0 3603 5 3649 Skeleton
D 0 3650 5 1 Close Tomb 3651 from outside
D 0 3651 4 1 Close Tomb 3651 from inside
*
M 0 3604 4 3606 random wandering skeletons
M 0 3604 4 3604
M 0 3604 4 3612
M 0 3604 4 3640
M 0 3605 3 3651 random wandering zombies
M 0 3605 3 3644
M 0 3605 3 3638
*
S
#SPECIALS
M 3601 spec_cast_undead
M 3602 spec_cast_undead
M 3603 spec_cast_undead
M 3604 spec_cast_undead
M 3605 spec_cast_undead
S
#$

886
area/grove.are Normal file
View file

@ -0,0 +1,886 @@
#AREA { 5 20} Alfa Holy Grove~
#MOBILES
#8900
hierophant~
The Hierophant~
The old Hierophant of the holy grove is here, gathering hollies.
~
He is a very old man, dressed in an old robe; but from the glint in his
clear blue eyes you can see that He is aware of the world, and wise to its
traps and pitfalls.
~
64|128 8|128|8192 +1000 S
20 0 -5 20d20+180 1d8+12
50 60000
8 8 1
#8901
hierophant~
The Hierophant~
The old Hierophant of the holy grove is here, gathering ivy.
~
She is a very old woman, dressed in an old gown; but from the glint in her
clear blue eyes you can see that She is aware of the world, and wise to its
traps and pitfalls.
~
64|128 8|128|8192 +1000 S
20 0 -5 20d20+180 1d8+12
50 60000
8 8 2
#8902
elder druid~
an elder druid~
An elder druid stands here, watching the local flora and wildlife.
~
He looks ageless, as do all druids. His grey beard contrasts strongly with
his lack of wrinkles.
~
64|128 8192 1000 S
13 7 0 13d13+130 1d4+7
50 15000
8 8 1
#8903
elder druidess~
an elder druidess~
An elder druidess stands here, watching the local fauna and feeding rabbits.
~
She looks ageless, as do all druids. She smiles a beautiful smile at you.
~
64|128 8192 1000 S
13 7 0 13d13+130 1d4+7
50 15000
8 8 2
#8904
doe~
a doe~
A doe is here, munching on grass.
~
This peaceful creature looks at you with big dark eyes. Her nose twitches as
she sniffs at you, but she goes back to chewing some grass.
~
64|128 0 0 S
5 15 5 5d5+55 1d4+3
2 600
8 8 2
#8905
deer~
a deer~
A deer is here, staring back at you.
~
The deer looks angered at your intrusion. He butts his head against you,
albeit ineffectively.
~
64|128 0 0 S
6 14 4 6d6+66 1d4+4
2 800
8 8 1
#8906
stag deer large~
a stag~
A large deer stag is here, protecting his territory.
~
He eyes you with contained anger. You'd better leave him alone!
~
32|64|128 0 0 S
8 12 2 8d8+88 1d4+9
2 2000
8 8 1
#8907
bunny rabbit~
a small bunny~
A small bunny is here, poking from bush to bush.
~
This bunny looks so adorable, you wished you had one just like this!
~
64|128 0 0 S
2 18 8 2d2+22 1d4+1
2 100
8 8 0
#8908
snake~
a harmless snake~
A small snake slithers between the grass.
~
Upon careful inspection, you are sure it is NOT a cobra!
~
32|64|128 32768 0 S
4 16 4 4d4+44 1d8+4
2 500
8 8 0
#8909
druid~
a druid~
A druid is here in meditation.
~
He doesn't like you bothering him, but is too polite to ask you to leave.
~
64|128 8|8192 1000 S
10 10 0 10d10+100 1d4+6
50 5000
8 8 1
#8910
druidess~
a druidess~
A druidess is here, peering at you.
~
She wonders why you are staring at her, and how you got in here.
~
64|128 8|8192 1000 S
10 10 0 10d10+100 1d4+6
50 5000
8 8 2
#0
#OBJECTS
#8901
closet~
a closet~
There is a wooden closet tucked into a corner.~
~
15 0 0
100 1 -1 0
500 0 0
E
closet~
It is large, yet gracefully made, obviously of Scandinavian design.
~
#8902
jar~
a spice jar~
A small unlabeled spice jar is standing here.~
~
15 0 1
5 5 -1 0
1 10 10
#8903
powder black~
some black powder~
Some strong-smelling black powder has been carelessly scattered here.~
~
19 0 1
-2 0 0 0
1 300 10
E
powder~
* * *
* * *
**** AAAHHHH-TSHOU! ****
* * *
* * *
~
#8904
kernel kernels~
some small yellow kernels~
Some small yellow kernels have been accidentally left here.~
~
19 0 16385
1 0 0 0
1 10 10
E
kernel kernels~
Look fairly dull...
~
#8905
paper wad~
a crumpled wad of paper~
There is a crumpled wad of paper here, left behind by some messy bypasser.~
~
13 0 16385
0 0 0 0
1 0 0
E
paper wad~
It looks old and worn, but You can still make out a faint lettering on it,
written in a strange, alien hand:
o WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! WARNING! o
o o
o MSGS: MATRIX CONTROL TO SUBSYSTEMS/<ALL> o
o ACT : REQUIRED T: NOW o
o o
o RECENT DATAQUAKE EVALUATED... EVALUATION FOLLOWS... o
o MASSIVE SEGMENTATION HAS OCCURRED... ALL SUBSIDIARY SECTORS o
o SHUTDOWN... CENTRAL SHUTDOWN: AUTOMATICS ENGAGED... o
o o
o DATALEAK DETECTED... DIRECTION:FOREIGN VIRTUAL REALITY, CODENAME o
o ASSIGNED: 'Midgaard'... o
o SPECIFIC LOCATION: UNCERTAIN, BEING WITHIN 'Midgaard' SUBSECTOR o
o CODENAME ASSIGNED: 'Holy Grove'... o
o BEWARE INTRUSIONS POSSIBLE. ADVISE EXTREME CAUTION... o
o . o
o . o
o . o
o o
o MSGS: MATRIX CONTROL TO SUBSYSTEMS/<Sark> o
o <101110101101> o
o <1101111010101101> o
o ACT : URGENT T: IMMEDIATE o
o o
o INTRUDERS DETECTED IN MAIN MATRIX... DIRECTIVE SEARCH AND o
o ELIMINATE... o
o . o
o . o
o o
~
#8910
staff wooden~
a wooden staff~
You see a wooden staff on the floor.~
~
5 1024 1|8192
0 3 3 7
5 50 50
E
staff wooden~
This oaken staff is very hefty but balanced.
~
#8911
robe brown cloth~
a brown robe~
Some brown cloth is on the floor.~
~
9 1024 1|8
6 0 0 0
5 60 60
E
robe brown cloth~
This robe is rough, but appears quite durable.
~
A
12 10
#8913
herbs~
some bluish herbs~
Some bluish herbs are scattered here.~
~
26 0 1
15 0 0 3
1 1 1
#8914
herbs~
some purplish herbs~
Some purplish herbs are scattered here.~
~
26 0 1
15 0 0 82
1 1 1
#8915
herbs~
some blackish herbs~
Some blackish herbs are scattered here.~
~
26 0 1
5 0 0 4
1 1 1
#8916
herbs~
some grayish herbs~
Some grayish herbs are scattered here.~
~
26 0 1
5 0 39 33
1 1 1
#8917
herbs~
some reddish herbs~
Some reddish herbs are scattered here.~
~
26 0 1
15 0 0 20
1 1 1
#8918
herbs~
some orangish herbs~
Some orangish herbs are scattered here.~
~
26 0 1
5 0 0 16
1 1 1
#8919
herbs~
some pinkish herbs~
Some pinkish herbs are scattered here.~
~
26 0 1
5 0 43 33
1 1 1
#0
#ROOMS
#8901
The holy grove~
You are standing amidst the ancient oaks and poplars in the holy grove. You
can feel a strange sensation of contentedness and relief seeping through You,
as if great burdens have been lifted from Your shoulders. From here, friendly-
looking paths lead east and south.
~
89 0 3
D1
The path wind its way through the tall trees, disappearing out of sight.
~
~
0 -1 8902
D2
The path wind its way through the tall trees, disappearing out of sight.
~
~
0 -1 8904
S
#8902
The holy grove~
You are standing amidst the ancient oaks and poplars in the holy grove. You
feel unusually happy here, as if great burdens have been lifted from Your
shoulders. From here, pleasant-looking paths lead east, west and south.
~
89 0 3
D1
The path wind its way through the tall trees, towards a clearing faintly seen.
~
~
0 -1 8903
D3
The path wind its way through the tall trees, disappearing out of sight.
~
~
0 -1 8901
D2
The path wind its way through the tall trees, towards an open area barely
visible in the distance.
~
~
0 -1 8905
S
#8903
A clearing in the woods~
You are standing in a clearing in the light woods. Somehow, this place
seems powerfully DIFFERENT from the rest of the forest, as if something is
severely strained in the fabric of reality here. There is a small tablet
on one of the trees.
~
89 4 3
D0
A small, narrow path winds north, and is quickly lost in the bushes. It
looks quite a wilderness there!
~
~
0 -1 5378
D2
There is a path winding its way south through the tall poplars, disappearing
out of sight some 100 yds. away.
~
~
0 -1 8906
D3
There is a friendly-looking path leading west through the tall trees.
~
~
0 -1 8902
E
tablet~
This zone has been populated by Merc. 1993
~
S
#8904
The holy grove~
You are standing amidst the ancient oaks and poplars in the holy grove. You
feel calm and relaxed here, as if great burdens have been lifted from Your
shoulders. From here, pleasant-looking paths lead east, north and south. To
the west, through the trees, You can see the road to Midgaard.
~
89 4 3
D1
The path wind its way through the tall trees, towards a clearing faintly seen.
~
~
0 -1 8905
D0
The path wind its way through the tall trees, disappearing out of sight.
~
~
0 -1 8901
D2
The path wind its way through the tall trees, into the grove.
~
~
0 -1 8907
D3
Through the trees, you can see the Midgaard road. Far to the west, You can
barely glimpse the tall walls and the chimney-smokes of the city itself.
~
~
0 -1 3502
S
#8905
The sacred glade~
You are standing in the middle of the sacred glades, where the citizens of
Midgaard come to celebrate the spring, where farmers give thanks for bountiful
harvest in the fall, and where lovers stroll in summer. You feel seasons of
remembered happiness and joy taking Your sorrows and worries away from You,
leaving You calm and invigorated, ready for the world. Paths lead into the
holy grove to the east, north and west, while to the south a wide, sunny field
slopes down to a sparkling lake.
~
89 0 3
D0
The path wind its way north, disappearing through the tall trees.
~
~
0 -1 8902
D1
The path wind its way through the tall trees, disappearing out of sight.
~
~
0 -1 8906
D3
The path wind its way west between stately poplars and oaks.
~
~
0 -1 8904
D2
To the south, a wide, sunny field stretch out, sloping down towards a brightly
glittering lake.
~
~
0 -1 8908
S
#8906
The holy grove~
You are standing amidst the ancient oaks and poplars in the holy grove. You
can feel a strange sensation of joy and calm seeping through You, as if great
burdens have been lifted from Your shoulders. To the south, You glimpse an open
area through the trees, while paths lead away north and west.
~
89 0 3
D0
The path wind its way through the tall trees, disappearing out of sight.
~
~
0 -1 8903
D3
The path wind its way through the tall trees, disappearing out of sight.
~
~
0 -1 8905
D2
To the south, just beyond the trees, you can see a wide green lawn, and past
the lawn, a softly shimmering, rainbow-colored mansion.
~
~
0 -1 8909
E
mansion~
The mansion is a sprawling, two-story affair with three wings, where the top
of one wing serves as balcony. The walls look as marble would do, if marble
changed color slowly, continuously, through the entire spectrum. There are
large windows all over the house.
~
S
#8907
The holy grove~
You are standing amidst the tall, majestic trees in the southern end of the
holy grove. Paths lead north and east. To the east, You can see a wide, open
field, sloping gently down towards a bright, glittering lake. Somehow, here
you feel an inexplicable happiness, as if the world's troubles no longer
really matter to you.
~
89 0 3
D0
The path leading north is soon lost out of sight amongst the ancient oaks and
poplars.
~
~
0 -1 8904
D1
To the east, the path leads out into a wide, sunny summer's field, sloping
south towards a beautiful lake. Past the field You can see a stately mansion,
shimmering gently in all the rainbow's colours.
~
~
0 -1 8908
E
mansion~
The mansion is a sprawling, two-story affair with three wings, where the top
of one wing serves as balcony. The walls look as marble would do, if marble
changed color slowly, continuously, through the entire spectrum. There are
large windows all over the house.
~
S
#8908
The sunny field~
You are standing in the middle of a wide, summery, sunlit field. There is a
fragrance of spring in the air, a sound of summer and a feeling of eternal
Saturday afternoon. To the south is a clear, sparkling lake, and to the north
and west is the holy grove. In the wood's edge, to the east, is a stately man-
sion, shimmering softly through the colors of the rainbow. You feel as if You
could spend the rest of your life here, lying on your back and looking at the
patterns of the clouds as they gently drift across the sky.
~
89 8 2
D0
There is a path leading north towards the sacred glade.
~
~
0 -1 8905
D1
To the east, You can see the rainbow-colored mansion, shimmering like some-
thing out of this world.
~
~
0 -1 8919
D3
There is a small path leading into the woods to the west.
~
~
0 -1 8907
E
mansion~
The mansion is a sprawling, two-story affair with three wings, where the top
of one wing serves as balcony. The walls look as marble would do, if marble
changed color slowly, continuously, through the entire spectrum. There are
large windows all over the house. There is a terrace in front of the house,
next to the low wing, which is almost completely windows.
~
S
#8909
The croquet lawn~
You are standing on a immaculately manicured green lawn, the kind you only
get after 200 years of meticulous work. There is a winding stone path leading
from the wood's edge to the north, to the softly shimmering, rainbow-colored
mansion to the south. This place enjoys a perpetual cool, sunny summers after-
noon.
~
89 4 2
D0
To the north, the winding stone path leads into the holy grove.
~
~
0 -1 8906
D2
To the south, the path leads straight up to the front door of the mansion.
~
door~
1 -1 8910
E
mansion~
The mansion is a sprawling, two-story affair with three wings, where the top
of one wing serves as balcony. The walls look as marble would do, if marble
changed color slowly, continuously, through the entire spectrum. There are
large windows all over the house.
~
S
#8910
The foyer~
You are standing in the foyer of Dragon's mansion. The wide double door to
the croquet lawn is to the north, flanked by large windows. The walls are
panelled in oak and hung with strange paintings. There is door in the south
wall.
~
89 12 0
D0
Through the windows next to the door you can see the croquet lawn, bathed in
afternoon sunlight.
~
door~
1 -1 8909
D2
~
door~
1 -1 8911
E
painting paintings~
They are strange indeed, works of breathtaking precision depicting obviously
impossible motifs, like a sky filled with headless men, all dressed in some
black costume (including hats), or a lady standing, blue from the waist up, or
some pieces of plankwood that seems to be melting away like snow, or a night
sky with a dove-shaped hole of bright day sky in the middle.
~
S
#8911
The hallway~
You are in the north end of a connecting hallway, tastefully decorated with
oak paneling and the coat-of-arms of various famous nobles hung on the walls.
The hallway leads south, and there is a door in the eastern wall.
~
89 8 0
D0
~
door~
1 -1 8910
D1
~
door~
1 -1 8912
D2
~
~
0 -1 8913
S
#8912
The blue room~
You are in the blue room, one of the guest rooms in Dragon's mansion. The
walls are (surprise!) blue, and the rest of the room is decorated in similar
shades, producing a very nice, cool effect. There is a large bed and a
matching set of sofas, easy-chairs and a coffee table. Through the venetian
blinds in front of the large east window you can see the edge of the grove.
~
89 520 0
D3
~
door~
1 -1 8911
S
#8913
The hallway~
You are standing in the south end of the hallway. There are doors in the
elegant oak-panelled walls to the south, east and west. Many different
coat-of-arms adorn the walls here.
~
89 8 0
D0
~
~
0 -1 8911
D1
~
door~
1 -1 8914
D2
~
door~
1 -1 8915
D3
~
door~
1 -1 8916
S
#8914
The red room~
You are in the red room, one of the guest rooms in Dragon's mansion. The
walls are wallpapered a deep warm red, and dark mahogany panelling nicely com-
plements them. There is a large, warm waterbed and a sofa group in dark wood
with leather upholstery, including a coffee table. Heavy brown curtains are
pulled away from the wide windows, to reveal a nice view towards the grove.
~
89 520 0
D3
~
door~
1 -1 8913
S
#8915
The kitchen~
You are standing in the middle of Dragon's kitchen. Contrary to popular
belief, He *doesn't* eat virgins, which is amply demonstrated by the large
variety of foodstuffs found here on the shelves. There are numerous cans of
tomatoes, peas, corn etc., vines of garlic, a *Huge* array of small spice jars
along several shelves and a large combo refrigerator/freezer. A big oven and
stove is lurking in a corner. There is some proof here that Dragon is a less
than meticulous housekeeper... There are doors to the north and west.
~
89 8 0
D0
~
door~
1 -1 8913
D3
~
door~
1 -1 8918
S
#8916
The ballroom~
You are standing in the middle of a vast palisander floor. This is where
Dragon entertains large number of guests, but the cloth-covered chairs
standing forlornly in a corner suggests that this does not happen often.
There are doors in the south and west walls, while to the east there is a
short corridor to the greenhouse.
~
89 8 0
D1
~
door~
1 -1 8913
D2
~
door~
1 -1 8918
D3
~
~
0 -1 8917
S
#8917
The greenhouse~
This is Dragons' greenhouse. Green light filters in slantwise through the
plants, giving the room a subtropical ambience. It is not really hot in here,
though, rather a pleasantly warm temperature. The walls are all windows, except
the eastern one joining the greenhouse to the main building, but it is hard to
see out for all the greenery here. There is a set of easy-chairs and a glass
coffee table. To the south, there is a wide double door out to a sunlit
terrace.
~
89 520 0
D1
~
~
0 -1 8916
D2
~
door~
1 -1 8919
S
#8918
The dining hall~
This is Dragons' dining hall. There is a large long solid oak table,
seating at least 24, with heavy, wooden chairs to match. The oak panel walls
are filled with paintings. There are doors to the north and east, and to the
west there is a wide double door opening out onto the sunlit terrace.
~
89 8 0
D0
~
door~
1 -1 8916
D1
~
door~
1 -1 8915
D3
~
wide door~
1 -1 8919
E
painting paintings~
There are many, many beautiful paintings of famous dragons of history and
literature. There is a big one of Smaug, a group picture of Cuspidorian Toxic
Dragons, a rather fearsome picture of Norse Chaos incarnate, a grainy black-
and-white photograph of Vorgulremik the Steel Dragon, a romantic picture of
Dalvenjah the Mindijaran and Allan the man become dragon. There are three
empty frames labeled 'The Chimerical', 'The Mythical' and 'The Hypothetical',
A panoramic picture of Strabo flying between the worlds dominate one wall,
while a dragons-eye view of Pern (with dragons in the foreground, of course)
fills another. There even are a few rare medieval renditions of the great
beast of the Revelation. Over the head of the table hangs a rather modest
portrait of a silver Dragon, sparkling with blue lightening, looking amused.
~
S
#8919
The terrace~
You are standing on a sunlit terrace in front of Dragon's mansion. To the
west, there is a splendid view over the field down over the lake. To the north
is the greenhouse, its large windowpanes shimmering with weird and wonderful
colors, while a double door leads into the house proper to the east. It is
warm and calm here. There is a white-painted table with a parasol here,
together with a matched set of chairs.
~
89 12 0
D0
~
door~
1 -1 8917
D1
~
double door~
1 -1 8918
D3
~
~
0 -1 8908
S
#8999
The fog~
You are in a grey fog, falling, screaming in pain as you realize
that you are being torn to nothing, atom by atom, falling and falling
and falling ...
...
.
~
89 4 0
S
#0
#RESETS
M 0 8900 1 8905 the Hierophant
E 1 8910 99 5 wields a staff
E 1 8911 99 16 wears a robe
G 1 8919 99 pink herbs
G 1 8918 99 orange herbs
M 0 8901 1 8901 the female Hierophant
E 1 8910 99 5 wields a staff
E 1 8911 99 16 wears a robe
G 1 8913 99 blue herbs
G 1 8915 99 black herbs
M 0 8902 1 8902 the elder druid
E 1 8910 99 5 wields a staff
G 1 8914 99 purple herbs
G 1 8916 99 grey herbs
M 0 8903 1 8904 the elder druidess
E 1 8910 99 5 wields a staff
G 1 8919 99 pink herbs
G 1 8917 99 red herbs
M 0 8904 2 8905 doe
M 0 8905 2 8906 deer
M 0 8906 1 8905 stag
M 0 8907 4 8903 bunny
M 0 8907 4 8903 bunny
M 0 8908 9 8906 snake!
M 0 8909 1 8911 druid
G 1 8913 99 blue herbs
M 0 8909 2 8918 druid
G 1 8916 99 grey herbs
M 0 8910 1 8914 druidess
G 1 8914 99 purple herbs
M 0 8910 2 8917 druidess
G 1 8918 99 orange herbs
O 0 8901 2 8912 Closet
O 0 8901 2 8914 .-.
O 0 8902 2 8915 jar..
P 1 8903 1 8902 pepper
O 0 8902 2 8915 jar...
P 1 8904 1 8902 corn
O 0 8905 1 8915
D 0 8914 3 1 close door
D 0 8913 1 1
D 0 8912 3 1 .-.
D 0 8911 1 1
D 0 8911 0 1
D 0 8910 2 1
D 0 8910 0 1
D 0 8909 2 1
D 0 8913 2 1
D 0 8915 0 1
D 0 8913 3 1
D 0 8916 1 1
D 0 8918 0 1
D 0 8916 2 1
D 0 8918 1 1
D 0 8915 3 1
D 0 8918 3 1
D 0 8919 1 1
D 0 8917 2 1
D 0 8919 0 1
S
#SPECIALS
M 8900 spec_cast_cleric
M 8901 spec_cast_cleric
M 8902 spec_cast_cleric
M 8903 spec_cast_cleric
M 8908 spec_poison
M 8909 spec_cast_cleric
M 8910 spec_cast_cleric
S
#$

2502
area/haon.are Normal file

File diff suppressed because it is too large Load diff

1657
area/help.are Normal file

File diff suppressed because it is too large Load diff

5434
area/hitower.are Normal file

File diff suppressed because it is too large Load diff

1695
area/hood.are Normal file

File diff suppressed because it is too large Load diff

1709
area/juargan.are Normal file

File diff suppressed because it is too large Load diff

148
area/limbo.are Normal file
View file

@ -0,0 +1,148 @@
#AREA {None } Diku Limbo~
#MOBILES
#1
Puff~
Puff~
Puff the Fractal Dragon is here, contemplating a higher reality.
~
~
1 0 1000 S
26 1 -1 5d10+550 4d6+3
10000 155000
8 8 2
#0
#OBJECTS
#2
coin gold~
a gold coin~
One miserable gold coin.~
~
20 0 1
1 0 0 0
1 0 0
#3
coins gold~
%d gold coins~
A pile of gold coins.~
~
20 0 1
0 0 0 0
1 0 0
#10
corpse~
corpse of %s~
The corpse of %s is lying here.~
~
23 0 1
0 0 0 1
100 0 0
#11
corpse~
corpse of %s~
The corpse of %s is lying here.~
~
24 0 0
0 0 0 1
100 0 0
#12
head~
head of %s~
The severed head of %s is lying here.~
~
19 0 1
10 0 0 0
5 0 0
#13
heart~
heart of %s~
The torn-out heart of %s is lying here.~
~
19 0 1
16 0 0 0
2 0 0
#14
arm~
arm of %s~
The sliced-off arm of %s is lying here.~
~
19 0 1
20 0 0 0
5 0 0
#15
leg~
leg of %s~
The sliced-off leg of %s is lying here.~
~
19 0 1
20 0 0 0
5 0 0
#16
turd~
steaming turd~
The steaming turds of %s assail your nostrils.~
~
13 0 0
5 0 0 1
1 0 0
#20
mushroom~
a Magic Mushroom~
A delicious magic mushroom is here.
~
~
19 0 1
5 0 0 0
1 10 10
#21
ball light~
a bright ball of light~
A bright ball of light shimmers in the air.~
~
1 0 1
0 0 -1 0
1 0 0
#22
spring~
a magical spring~
A magical spring flows from the ground here.~
~
25 64 0
100000 100000 0 0
5000 10 100000
#0
#ROOMS
#1
The Void~
You are floating in nothing.
~
0 8 1
S
#2
Limbo~
You are floating in a formless void, detached from all sensation of physical
matter, surrounded by swirling glowing light, which fades into the relative
darkness around you without any trace of edges or shadow.
There is a "No Tipping" notice pinned to the darkness.
~
0 8 1
S
#0
#RESETS
M 0 1 1 2 Puff
S
#$

3837
area/mahntor.are Normal file

File diff suppressed because it is too large Load diff

762
area/marsh.are Normal file
View file

@ -0,0 +1,762 @@
#AREA {15 25} Generic Old Marsh~
#MOBILES
#8301
troll~
a swamp troll~
A swamp troll charges towards you.
~
This huge behemoth towers to a height of 15 feet. He sneers at you
as he approaches and raises two black taloned claws to strike you.
~
2|4|32|64 0 -600 S
16 5 1 5d20+200 4d4+8
10000 20000
8 5 1
#8302
troll~
a green troll~
A green troll attempts to get a hold on you.
~
This big troll towers several feet over you. He has a large spear
which he seems to ply with utmost prowess. He jabs his spear at you
and cackles with glee.
~
4|32|64 0 -400 S
14 7 3 3d20+150 2d4+6
8000 12000
8 8 1
#8303
ogre~
an ogre~
An ogre stands here getting ready to beat in your face.
~
This mean bastard looks like he could tear you limb from limb.
~
4|32|64 0 -500 S
20 1 0 1d20+250 5d5+8
10000 11000
8 8 1
#8304
thing~
the Swamp Thing~
the Swamp Thing shambles about here. It seems hungry.
~
The Swamp Thing has huge fists, which look like they could pound you flat.
~
4|32|64 0 -700 S
24 1 8 10d10+500 4d5+10
25000 60000
8 5 0
#8305
gnoll~
a gnoll~
There is a mean looking gnoll here.
~
The Gnoll seems annoyed at your presence.
~
4|64 8|32 -1000 S
30 0 -3 2d10+750 2d8+15
25000 100000
8 8 1
#8306
beast~
a huge hairy beast~
A huge hairy beast shambles towards you with death in his eyes.
~
This huge beast stands about 20 feet in height and has huge green clawed
appendages.
~
4|32|64 8|32 -450 S
21 0 0 21d21+210 2d4+15
10000 40000
8 8 1
#8307
beast~
a rather small beast~
A rather small beast cringes in terror as it notices you.
~
This rather small beast looks like you could take it out with a single
sword blow.
~
4|64|128 32768 0 S
3 18 9 3d10+40 1d20+1
500 200
8 8 1
#8308
will will-o-wisp~
the Will-O-Wisp~
A Will-O-Wisp darts hear and there, making fun of you.
~
This strange little creature seems very hard to keep your eyes on.
You stare as hard as you can at the glowing ball of floating light and
are just able to notice a small pair of glowing eyes.
~
4|64|128 32768 0 S
10 11 -5 5d5+100 3d3+3
3000 5000
8 8 0
#8309
snake anaconda~
the monstrous snake~
A monstrous snake slithers towards you, thinking 'breakfast'.
~
This 10 meter anaconda looks rather hungry.
~
4|32|64|128 32768|65536 -100 S
16 5 1 16d16+200 4d4+6
10000 26000
8 8 1
#8310
snake python~
a large snake~
A rather large python rests in a coil here.
~
It's the largest Amazon python you have ever seen.
~
4|32|64|128 32768|65536 -100 S
11 10 2 4d10+100 3d3+5
0 9000
8 8 2
#8312
hag~
the Marsh Hag~
A Marsh Hag is here.
~
Yech! She manages to make even Smurfette look attractive. That's ok,
because she thinks you stink too, and she's about to do something about it.
~
4|64 0 -200 S
9 12 3 2d10+300 3d5+10
1000 6000
8 8 2
#8313
slaad~
a Death Slaad~
A Death Slaad is standing here distraught. He seems lost.
~
This dark apparition stands a meager 13 feet in height. Even in the dim
swamp light, the blade of his scythe gleams.
~
4|64 40 -200 S
20 1 -2 5d20+300 5d5+15
14000 40000
8 8 1
#8314
wolf~
a marsh wolf~
A marsh wolf sniffs the ground has followed your scent.
~
This wolf looks plump. She probably ate a friend or two of yours who came
into the marsh.
~
4|32|64 0 -200 S
8 13 3 10d10+50 3d5+1
0 2000
8 8 2
#8318
mound shambling~
a shambling mound~
A heap of garbage shambles towards you.
~
This grotesque pile of plant matter fills you with utmost horror.
~
4|64 65536 -100 S
13 8 10 10d10+150 3d6+2
0 10000
8 8 0
#8319
shaman orc~
the orc shaman~
An orc shaman stands before you holding a staff and wearing robes.
~
This old orc has an array of bones stuck in his hair and strange symbols
painted on his face and hands.
~
110 40 -100 S
12 10 7 5d6+120 3d4+1
350 10000
8 8 1
#8320
giant~
a marsh giant~
A marsh giant stomps towards you.
~
This huge monster of a man has green gnarly teeth and a BIG stick.
~
110 40 -100 S
15 8 5 6d6+300 2d4+10
12000 18000
8 8 1
#8321
gargoyle~
a gargoyle~
A large gargoyle lands next to you, baring his fangs at you.
~
This creepy fellow looks like he could use you as a meal.
~
110 40 -100 S
12 4 0 4d5+200 4d4+4
2000 12000
8 8 0
#0
#OBJECTS
#8301
spear long~
a long spear~
A strange spear lies here.~
~
5 128|512 8193
0 3 5 2
10 20000 5000
A
19 3
A
2 2
#8302
horned helmet~
a dark horned helmet~
A wicked looking horned helmet lies here.~
~
9 128|512 17
6 0 0 0
5 15000 10000
E
horns horn~
These horns appear to be made of adamantite.~
A
19 1
A
3 -3
#8303
chain mail chainmail~
A suit of chainmail~
An old suit of chainmail lies here, corroded by the marsh.~
~
9 128|512 9
7 0 0 0
20 2000 2000
#8306
scythe~
A huge, wicked-looking scythe~
An evil, wicked-looking scythe lies in the shadows.~
~
5 128|512 8193
0 4 4 1
16 100000 20000
A
18 3
A
19 3
#8307
green potion~
A murky green potion~
A murky green potion lies here in the mud.~
~
10 3 1
43 15 0 0
1 1000 1000
E
potion~
It looks really disgusting and doesn't smell very nice either.~
#0
#ROOMS
#8301
Muddy Path~
This section of the path is slowly being drowned by the nearby swamp to the
south, which is creeping slowly inland. Several caved-in buildings sprawl
here, torn apart both by battle and the elements.
~
83 0 2
D0
The path looks drier here.
~
~
0 -1 6125
D2
A broken road leading southward into the marsh.
~
~
0 -1 8302
E
swamp~
The swamp to the south even reaches as far as this point ... it makes the
ground and air about you moist and fetid.
~
S
#8302
Swamp's Edge~
Briars and marsh plants stick to your boots and clothes, and clouds cover the
skies above the murky marsh, leaving the path before you dark and sinister.
You see some disturbances in the marsh, but after a few strangled screams,
the sounds stop.
~
83 0 5
D0
~
~
0 -1 8301
D1
To the east lies a series of bogs and shallows that look rather threatening.
~
~
0 -1 8303
D2
You notice a large hill rising out of the marsh to the south.
~
~
0 -1 8304
S
#8303
Marshy Forest~
This area is by no means a forest, but for those who dwell in these sparse
trees it is one. Occasionally you see a whole humanoid form floating face down
in the water, but mostly you only find pieces. You hear a loud bellow in the
distance. And feel fear creep into your heart.
~
83 1 5
D1
Eastward is the thick bog of ooze...
~
~
0 -1 8305
D3
Westward lies the remanents of a broken and shattered roadway being swallowed
by the marsh.
~
~
0 -1 8302
E
humanoid corpse~
He looks mangled and shredded. You see one large gash mark that looks
like it came from the claw of some huge beast.
~
E
pieces~
You see severed limbs and spongy intestines.
~
S
#8304
On a hill.~
You stand atop a hill on the northwestern side of the evil swamp. Dark
clouds whip around you and the wind raises its voice and assails you.
~
83 1 4
D0
To the north lies a damp broken roadway.
~
~
0 -1 8302
D1
A dark pool congeals to the east.
~
~
0 -1 8309
D2
A gloomy path leads down the hill into the swamp.
~
~
0 -1 8310
S
#8305
An Oozing Bog~
You stand in an oozing quagmire. A creaking beat fills the air,
accompanied by groans and soughing of the air. Several large winged
beasts flap over you and send chilling glares your way. You feel out
of place, and feel that the occupants of this realm will soon
have you for a feast.
~
83 1 5
D1
Eastward lies a horde of disgusting looking monsters.
~
~
0 -1 8306
D3
Westward lies a marshy area.
~
~
0 -1 8303
E
beasts~
You see a large creature, possibly a demon, flapping heavily above you.
~
S
#8306
An Oozing Bog~
The ground here is soft and oozing. You feel slimy water seeping into your
boots. Better stop and check for leeches when you get out of here.
~
83 1 5
D3
You see a large tree limb that looks easily moved.
~
limb~
1 -1 8305
E
limb~
The limb looks like it is attached to a trap door in the ground.
~
S
#8307
Swamp Thing's Lair~
A horrible swamp thing resides here. Mutilated corpses suffuse the air with
the overwhelming stench of putrid flesh.
~
83 1 6
D3
A pool of quick sand lies to the west.
~
~
0 -1 8308
E
corpses~
You notice a note on one of the corpses reading: 'Best ye forget the temple,
it is not for the likes of you...'
~
S
#8308
Pool of Quick Sand~
You stand by a large oozing pool of quick sand. Luckily only a complete
klutz could not avoid it. Dancing lights fly about you and one seems to
be taunting you towards the pool.
~
83 1 6
D1
The swamp thing's lair.
~
~
0 -1 8307
D2
A murky bog.
~
~
0 -1 8314
D3
A dark pool lies to the west.
~
~
0 -1 8309
E
lights ~
From the stories you have heard, you recognize them as will-o-wisps.
~
E
quicksand~
It looks deadly to the foolish.
~
S
#8309
A Dark Pool.~
You stand beside a large dark pond. The water boils not with heat, but with
motion, as if it is alive. A creaking beat pulses through the air, leaving
you with a cold sweat and fear in your heart.
~
83 1 6
D1
A large pool of quicksand lies to the east.
~
~
0 -1 8308
D2
You see a cloud of darkness to the south.
~
~
0 -1 8311
D3
A hill rises out of the swamp to the east.
~
~
0 -1 8304
E
pond~
It looks ALIVE ...
~
S
#8310
Gloomy Path Through the Marsh.~
To the north lies a hill, shrouded in dark clouds, and to the south lies
a huge patch of vegetation. You sense an evil presence and notice
a beast flying overhead to the south east, towards what looks to be a
huge fortress, half buried in the marsh.
~
83 1 6
D0
To the north a hill protrudes from the marshes.
~
~
0 -1 8304
D2
To the south a huge mass of vegetation seems to quiver with life.
~
~
0 -1 8312
E
clouds~
The clouds look dark and foreboding.
~
E
beast~
It looks to be a demon of some foul breed.
~
E
fortress~
It is surrounded by walls nearly 20 meters high. In a tall tower on the
northeast side, a window glows blue with magical energy.
~
E
vegetation~
It looks sentient.
~
S
#8311
Cloud of Darkness.~
As you travel through this cloud of darkness, a fear such as you have never
known before assails you.
~
83 1 6
D0
A dark pool lies to the north.
~
~
0 -1 8309
D2
An obelisk lies to the south.
~
~
0 -1 8313
S
#8312
Near Vegetation from Hell.~
You stand near some of the strangest plant life you have ever seen, a mixture
of tumescent vegetables, evil-smelling fruit trees, and malignant ferns.
~
83 1 6
D0
To the north is a gloomy path through the marsh.
~
~
0 -1 8310
D1
Eastward is a large, black stone monolith.
~
~
0 -1 8313
E
plant plants~
They look rather violent, and snap at you when you come near.
~
S
#8313
By the Monolith.~
You are standing near a monolith which protrudes some 20 feet from the
marsh into the air. Its black obsidian surface shines darkly in the
strange, almost unearthly light that enters through the clouds above.
~
83 1 5
D0
To the north is a cloud of darkest evil.
~
~
0 -1 8311
D1
Eastward lies a murky bog.
~
~
0 -1 8314
D3
Near Vegetation from Hell.
~
~
0 -1 8312
E
monolith~
This huge monolith resembles nothing you have ever seen before.
You have a strong feeling not to go within.
~
S
#8314
Murky Bog.~
A murky bog surrounds you. To the east a black monolith juts forth from the
ground. Far to the north lies a huge pool of quicksand. Snarls can be heard
echoing as if from a great distance.
~
83 1 5
D0
To the north lies a huge pool of quicksand.
~
~
0 -1 8308
D1
To the east the marsh turns into a small lake.
~
~
0 -1 8315
D3
Westward a large monolith awaits adventurers.
~
~
0 -1 8313
E
monolith~
This is a huge obsidian stone block stuck in the marsh.
~
S
#8315
Northern Lake Side.~
Floating on this boiling lake is not what you would consider an enjoyable
experience. Many a creature bumps the bottom of your boat, and glares
at you through unblinking eyes from the waters below. The southern
portion of the lake looks calm and serene compared to this wild place.
~
83 1 7
D2
The southern portion of the lake lies to the south.
~
~
0 -1 8316
D3
To the west lies a murky bog.
~
~
0 -1 8314
S
#8316
Southern Lake Side.~
You are floating on a calm section of blue crystal water. You feel much more
at ease then you were before in this area. Then a wave of fear passes over
you. You are not alone.
~
83 1 7
D0
Northern lake side.
~
~
0 -1 8315
D3
To the west is a beach where your boat can land.
~
~
0 -1 8317
E
north~
The way to the north seems to be impassable, due to the rough water and
strange wild life.
~
S
#8317
Beach~
You are on a sandy shore. Marsh life creeps across the surface. To the west
lies an evil fortress. You see figures walking along the battlements.
~
83 1 5
D1
To the east lies the southern portion of a small lake.
~
~
0 -1 8316
D3
The great gates.
~
~
0 -1 8318
E
fortress~
It is hewn of black stone and heavily fortified.
~
S
#8318
Before the Great Gates.~
You stand before the gates of a huge fortress. The drawbridge is up, the
gates closed, and the portcullis down. This place looks very dangerous,
and you decide not to continue onward.
~
83 1 3
D1
To the east is a marshy beach.
~
~
0 -1 8317
D2
~
~
1 -1 -1
S
#0
#RESETS
M 0 8301 2 8303 swamp troll
M 0 8301 2 8308 swamp troll
M 0 8302 12 8303 green troll
G 1 8307 20 give him the green potion
M 0 8302 2 8304 green troll
M 0 8302 2 8306 green troll
M 0 8303 2 8303 mean ogre
M 0 8303 2 8313 mean ogre
M 0 8303 2 8307 mean ogre
M 0 8304 1 8307 swamp thing
M 0 8305 2 8306 mean gnoll
E 1 8303 20 5 give him the chainmail
E 1 2200 20 16 give him the jagged spear
M 0 8306 2 8304 huge hairy beast
M 0 8306 2 8310 huge hairy beast
M 0 8307 2 8305 small beast
M 0 8307 2 8313 small beast
M 0 8308 1 8308 will o wisp
M 0 8309 2 8305 monstrous snake
M 0 8309 2 8311 monstrous snake
M 0 8310 2 8304 large snake
M 0 8310 2 8305 large snake
M 0 8312 2 8310 old hag
M 0 8312 2 8309 old hag
M 0 8313 1 8310 death slaad
E 1 8306 1 16 give him the wicked scythe
E 1 8302 5 6 give him the horned helmet
M 0 8314 8 8304 marsh wolf
M 0 8314 8 8305 marsh wolf
M 0 8314 8 8306 marsh wolf
M 0 8314 8 8307 marsh wolf
M 0 8314 8 8308 marsh wolf
M 0 8314 8 8309 marsh wolf
M 0 8318 3 8312 shambling mound
G 1 8307 20 give him the green potion
M 0 8318 3 8312 shambling mound
G 1 8307 20 give him the green potion
M 0 8321 2 8318 gargoyle
M 0 8321 2 8318 gargoyle
M 0 8320 2 8307 marsh giant
G 1 8301 10 give him the spear
M 0 8320 2 8309 marsh giant
G 1 8301 10 give him the spear
M 0 8320 2 8311 marsh giant
G 1 8301 10 give him the spear
M 0 8320 2 8313 marsh giant
G 1 8301 10 give him the spear
M 0 8320 2 8315 marsh giant
G 1 8301 10 give him the spear
E 1 8302 5 6 give him the horned helmet
S
#SPECIALS
M 8309 spec_poison
M 8310 spec_poison
M 8312 spec_thief
M 8313 spec_cast_undead
M 8319 spec_cast_cleric
S
#$

998
area/mega1.are Normal file
View file

@ -0,0 +1,998 @@
#AREA { 5 35} Glop Mega-City One ~
#HELPS
0 $~
#MOBILES
#8000
juve~
a juve~
A juve is standing here plotting mischief.
~
He is a tall, thin boy. He is looking for his gang mates. He and his
mates have cost city authorities many millions of creds a week in
vandalism repairs.
~
4 0 -400 S
5 0 0 0d0+0 0d0+0
0 0
0 0 1
#8001
punk~
a punk~
A punk is here plotting a crime wave.
~
This punk is from one of the rowdiest, scruffiest, and definitely most
fashionable of all gangs -- the Grunge Mongers.
~
4|64 0 -500 S
10 0 0 0d0+0 0d0+0
0 0
0 0 1
#8002
Futsie~
a Futsie~
A Futsie is here reciting Monty Python sketches.
~
A sad victim of Future Shock, this man is immensely dangerous and will
not be stopped by anyone who tries to deter him from revenge upon the
Justice Department.
~
2|32 8 0 S
17 0 0 0d0+0 0d0+0
0 0
0 0 1
#8003
Citi-Def Militiaman~
a Citi-Def Militiaman~
A Citi-Def Militiaman is here contemplating a Block War.
~
A member of a local Block's Citi-Def militia, this man is well-armed
and undersupervised.
~
4|64 512 0 S
16 0 0 0d0+0 0d0+0
0 0
0 0 1
#8004
dunk~
a dunk~
A dunk is here blending into the crowd.
~
He blends into the crowd as his hand travels into another citizen's pocket.
~
4|64|128 0 -150 S
10 0 0 0d0+0 0d0+0
0 0
0 0 1
#8005
tap~
a tap~
A tap is here eyeing your belongings.
~
A practitioner in Mega-City One's largest growth industry, mugging, is
looking you over for a possible business transaction.
~
4|64 0 -400 S
14 0 0 0d0+0 0d0+0
0 0
0 0 2
#8006
rookie judge~
a rookie judge~
A Rookie judge is on his first beat here.
~
A member of Mega-City One's Justice Department is here considering what
crimes you have committed. Being a rookie he will probably be easier on
you though.
~
64 8|32 300 S
20 0 0 0d0+0 0d0+0
0 0
0 0 1
#8007
Wallaby Gleep~
Wallaby Gleep~
Mr. Gleep is here wanting to know what you want.
~
Wallaby Gleep is a heavy-set man who gives you the impression that he is
unintelligent and unimaginative, but looks can be deceiving.
~
2|4 8|32|512 -600 S
22 0 0 0d0+0 0d0+0
0 0
0 0 1
#8008
Pinkerton Throt~
Pinkerton Throt~
Pinky Throt is here Wringing his hands.
~
He is a thin angular crook, pretty close to everyone's idea of Ebeneezer
Scrooge. Indeed, the only thing guaranteed to bring a spark to his dead
eyes is the mention of money.
~
2|4|32 8|32 -900 S
25 0 0 0d0+0 0d0+0
0 0
0 0 1
#8009
Ernie Ramirez~
Ernie Ramirez~
Ernie Ramirez is here collecting for the mob.
~
Ramirez is a dour man who knows that he's never going to get a better
deal out of life. He is content to run the bite fights for Throt and
Gleep.
~
2|4 0 -400 S
19 0 0 0d0+0 0d0+0
0 0
0 0 1
#8010
Judge Eckersely~
Judge Eckersely~
Judge Eckersely is here shaking down a Perp.
~
He is a dedicated, if somewhat pessimistic Judge. He is the Senior Judge
of the Downtown Quadrant.
~
64 8|32|128 300 S
30 0 0 0d0+0 0d0+0
0 0
0 0 1
#8011
Judge Sara Beddows~
Judge Beddows~
Judge Beddows is here calling Resyk.
~
Beddows is a clone from the same stock as the ex-Chief Judge McGruder.
She is fanatically dedicated to her job and has no ambitions other than
to enforce the LAW.
~
64 8|32 500 S
25 0 0 0d0+0 0d0+0
0 0
0 0 2
#8012
bite fighter~
a bite fighter~
A bite fighter is here sharpening his teeth.
~
A bite fighter is here with sharpened teeth and a bad attitude.
~
2|32 0 -400 S
20 0 0 0d0+0 0d0+0
0 0
0 0 1
#0
#OBJECTS
#8000
spit gun~
a spit gun~
There is a spit gun laying here.~
~
3 0 1|16384
37 10 10 501
2 0 0
E
spit gun~
A standard weapon in Mega-City One. It uses general
purpose ammunition.
~
#8001
knee pads~
a set of knee pads~
There are some knee pads laying here.~
~
9 0 1|32
0 0 0 0
3 0 0
E
knee pads~
It is a set of Grak Brothers knee pads. They are currently
popular with the juve and punk gangs.
~
#8002
stooky gland~
a stooky gland~
There is a stooky gland laying here.~
~
26 0 1
20 0 43 28
1 0 0
E
stooky gland~
Stooky glands are known for the restorative properties.
~
A
9 -1
#8003
lawgiver~
a lawgiver~
There is a lawgiver laying here.~
~
3 0 1|16384
37 10 10 502
2 0 0
E
lawgiver gun~
The standard weapon for the city's Judges. It uses general
high explosive ammunition.
~
#8004
safe~
the magnetically shielded safe~
A indestructible, immobile safe is here.~
~
15 2 0
1005 1|4|8 8005 0
1000 0 0
E
safe~
This safe looks like not even a Sov-Cit Nuke could open it.
You better find the code box.
~
#8005
code box~
a code box~
A code box of indeterminate use is here.~
~
18 2 1|16384
0 0 0 0
1 0 0
E
code box~
The box looks like some kind of access device.
~
#8006
bashball bat~
a bashball bat~
A bashball bat is laying here.~
~
5 0 1|8192
0 0 0 7
3 0 0
E
bashball bat~
This is the same type of bat used by the little spuggers
to play bashball.
~
#8007
vibroblade~
the Vibroblade~
The Vibroblade is here.~
~
5 1|2|32 1|8192
0 0 0 3
2 0 0
E
vibroblade~
Obviously of alien manufacture, this blade enhances fighting
and survival skills.
~
A
18 2
A
19 2
A
5 1
A
2 1
#8008
vacuum cleaner~
a Hoover vacuum cleaner~
A Hoover vacuum cleaner is here idling.~
~
5 2 1|8192
0 0 0 12
10 0 0
E
vacuum cleaner~
This vacuum looks well built and will last you many years of
cleaning pleasure.
~
#8009
knife~
a knife~
A knife is sitting here...contemplating life.~
~
5 0 1|8192
0 0 0 1
3 0 0
E
knife~
It is a knife. 'Nuff said. (Marvel joke).
~
#8010
wet noodle~
a wet noodle~
A wet noodle is laying here with clam sauce on it.~
~
5 0 1|4|8192
0 0 0 4
1 0 0
E
noodle~
It looks like a noodle freshly made at the Olive Garden.
~
A
3 1
#8011
judge club~
a Judge's club~
A Judge's club is resting here.~
~
5 0 1|8192
0 0 0 7
3 0 0
E
judge club~
It is a standard Justice Hall issue club. Many a Perp's
head has been bashed with this baby.
~
A
19 2
#8012
vault key~
a vault key~
A vault key is here.~
~
18 2 1|16384
0 0 0 0
1 0 0
E
vault key~
The key looks like it could be useful.
~
#8013
key card~
a key card~
A key card is laying here.~
~
18 0 1|16384
0 0 0 0
1 0 0
E
key card~
It looks like it fits a slot somewhere.
~
#0
#ROOMS
#8001
Entrance to Mega-City One~
A road begins here in the glowing sands. You follow it through a gate
in a Plasteen wall onto the Megway of Mega-City One.
~
80 0 1
D0
You see the glowing sand of the badlands.
~
~
0 0 5062
D2
The Megway continues in this direction.
~
~
0 0 8002
S
#8002
Mahmount Allesh Megway~
You are on one mile of over 13 and a half billion kilometers of
roadway in Mega-City One. The Megway continues north and south.
~
80 0 1
D0
The entrance to Mega-City One is in this direction.
~
~
0 0 8001
D2
There is an intersection ahead.
~
~
0 0 8003
S
#8003
Intersection of Junket Way and Megway~
The Megway intersects with Junket Way here. Junket Way is to the east,
the Megway continues north and south, and the Pustule Palace Cafe is
to the west.
~
80 0 1
D0
The Megway continues in this direction.
~
~
0 0 8002
D1
Junket way continues in this direction.
~
~
0 0 8010
D2
The Megway continues in this direction.
~
~
0 0 8004
D3
The Pustule Palace Cafe is in this direction.
~
~
0 0 8021
S
#8004
Mahmount Allesh Megway~
The traffic here is really congested due in part to the over 11 million
people driving Mo-Pads, the mobile homes which are constantly on the
move until their owners can find an apartment in one of the City-blocks.
The Megway continues north and south.
~
80 0 1
D0
An intersection lies in this direction.
~
~
0 0 8003
D2
The Megway continues in this direction.
~
~
0 0 8005
S
#8005
Mahmount Allesh Megway~
The Megway continues north and south. On the off-ramps here you see
many of the citizens of Mega-City One doing nothing. You see of
every hundred citizens, it can be guaranteed that 87 of them will
be totally unemployed, and that a further five will not work more
than ten hours a week. To the east there is a dark alley and to the
west is Rietzik's Shuggy Hall.
~
80 0 1
D0
The Megway continues in this direction.
~
~
0 0 8004
D1
A dark alley lies to the east.
~
~
0 0 8011
D2
A large plaza is in this direction.
~
~
0 0 8006
D3
A building is in this direction.
~
~
0 0 8022
S
#8006
Central Plaza~
You are at the Central Plaza of the downtown district. There are a couple
of juves Boingging (tm) in the air above you. Max Jaffa Boulevard goes
east, the Megway continues north and south, and Bazza's Home for the
Terminally Sarky is to the west.
~
80 0 1
D0
The Megway continues in this direction.
~
~
0 0 8005
D1
Max Jaffa Boulevard goes in this direction.
~
~
0 0 8012
D2
The Megway continues in this direction.
~
~
0 0 8007
D3
A home for Sarky people is to the west.
~
~
0 0 8023
S
#8007
Corner of Ed Hilldreth Memorial Parkway and Megway~
Another major intersection which is being negotiated by vehicles that
are bound to minimum speed limits. Many Slow Driving offenses are being
handed out by the Judges. The Megway goes north and south, a Parkway
goes east, and Nu Phisog Parlour is west.
~
80 0 1
D0
A plaza is to the north.
~
~
0 0 8006
D1
Ed Hilldreth Mem. Parkwy is to the east.
~
~
0 0 8013
D2
The Megway continues in this direction.
~
~
0 0 8008
D3
A City Block lies to the west.
~
~
0 0 8024
S
#8008
Mahmount Allesh Megway~
As you travel the Megway you notice many citizens participating in their
favorite hobbies such as spot welding and metalwork, scratch building
fashion Kneepads, giving blood, or just looking out the window. The
Megway continues north and south.
~
80 0 1
D0
The Megway continues in this direction.
~
~
0 0 8007
D2
The Megway continues in this direction.
~
~
0 0 8009
S
#8009
Mahmount Allesh Megway~
The Megway ends here. To the west is Ziggi Piggi's Home for the
Semi-Stiff, to the east and south are construction areas, and the
Megway goes north.
~
80 0 1
D0
The Megway is ahead.
~
~
0 0 8008
D1
There is construction this way.
~
~
0 0 8014
D2
There is construction ahead.
~
~
0 0 8020
D3
Ziggi Piggi's Home the Semi-Stiff is ahead.
~
~
0 0 8025
S
#8010
Junket Way~
Junket Way a small Skedway continues east and west.
~
80 0 1
D1
An intersection is ahead.
~
~
0 0 8015
D3
An intersection is ahead.
~
~
0 0 8003
S
#8011
Davies Alley~
You are in a very dark and seedy alley. This is just the right place for
a bite fight. Bite fighting is an illegal activity where both combatants
can only use their sharpened teeth as weapons.
~
80 1 1
D1
An intersection is ahead.
~
~
0 0 8017
D3
An intersection is ahead.
~
~
0 0 8005
S
#8012
Max Jaffa Boulevard~
Max Jaffa Boulevard continues east and west.
~
80 0 1
D1
An intersection is ahead.
~
~
0 0 8018
D3
A large plaza is to the west.
~
~
0 0 8006
S
#8013
Ed Hilldreth Memorial Parkway ~
The Parkway goes east and west.
~
80 0 1
D1
An intersection is ahead.
~
~
0 0 8019
D3
An intersection is ahead.
~
~
0 0 8007
S
#8014
Construction site of the Harold Finkelbaum Block.~
A Mega-City One City Block is being constructed at this site. A
typical block is from 100 to 1000 stories high with hundreds of
thousands inhabitants.
~
80 0 1
D3
An intersection is ahead.
~
~
0 0 8009
S
#8015
Corner of Junket Way and Threep Lane~
There is a second-hand kneepad stall is doing a brisk business with a
group of juves on their way to school. Junket Way goes west and Threep
Lane travels south.
~
80 0 1
D2
Threep Lane continues ahead.
~
~
0 0 8016
D3
Junket Way is ahead.
~
~
0 0 8010
S
#8016
Threep Lane~
Threep Lane continues north and south. There is a building to the east
with a sign next to the door.
~
80 0 1
D0
An intersection is ahead.
~
~
0 0 8015
D1
A door to the east bodes ill.
~
door~
1 0 8026
D2
Threep Lane continues south.
~
~
0 0 8017
E
sign~
Throt and Gleep's Megger Store est. 2107
~
S
#8017
Threep Lane~
Threep Lane continues north and south. There is a dark alley to the west.
~
80 0 1
D0
Threep Lane continues north.
~
~
0 0 8016
D2
An intersection is ahead.
~
~
0 0 8018
D3
A dark alley is west.
~
~
0 0 8011
S
#8018
Corner of Max Jaffa Blvd and Threep Way~
A proprietor of Uncle Sumpty's Ugly Emporium meanders by. Threep Lane
continues north and south while Max Jaffa Boulevard goes west.
~
80 0 1
D0
Threep Lane continues north.
~
~
0 0 8017
D2
Threep Lane continues south.
~
~
0 0 8019
D3
Max Jaffa Blvd continues west
~
~
0 0 8012
S
#8019
Corner of Ed Hilldreth Mem. Prkwy and Threep Lane~
Threep Lane goes north from here while Ed Hilldreth Memorial Parkway goes
west.
~
80 0 1
D0
Threep Lane continues north.
~
~
0 0 8018
D3
Ed Hilldreth continues west.
~
~
0 0 8013
S
#8020
Construction Site for the Brit-Cit One tunnel.~
Construction is under way for the Black Atlantic Tunnel to connect
Mega-City One and Brit-Cit One.
~
80 0 1
D0
An intersection lies north.
~
~
0 0 8009
S
#8021
Pustule Palace Cafe~
A scabrous hole. Run by Ernie Ramirez, an ex-perp, it is a meeting place
for the low-life in the area.
~
80 8 0
D1
An intersection lies east.
~
~
0 0 8003
S
#8022
Rietzik's Shuggy Hall~
A sleazy dive and the meeting place of a lot of perps. Shuggy is a
twenty-second Century version of pool, played on a hilly table, usually
with large side bets.
~
80 8 0
D1
An intersection lies east.
~
~
0 0 8005
S
#8023
Bazza's Home for the Terminally Sarky~
This is an experimental psychiatric home. Named after a 20th Century
vid-critic, the home attempts, by various methods, to readjust the
socially unacceptable attitudes of the inmates.
~
80 8 0
D1
A large plaza lies east.
~
~
0 0 8006
S
#8024
Nu Phisog Parlour~
Opened as a direct rival to the New You Face Parlour chain to offer quick
and cheap face-changing facilities to the general public. However,
since the closure of Sump's Ugly clinics, the craze for face-changing has
died down.
~
80 8 0
D1
An intersection lies east.
~
~
0 0 8007
S
#8025
Ziggi Piggi's Home for the Semi-Stiff~
The only suspended animation parlour in the area. It has a high turnover
rate. It is rumored that the patrons are being used in body sharking and
organ legging activities.
~
80 8 0
D1
An intersection lies east.
~
~
0 0 8009
S
#8026
Throt & Gleep's Megger Store~
This place promises to provide everything that the citizens don't need,
with the utmost discourtesy. Of course, something as crazy as this was
bound to succeed. There is a door to the north with a slot next to it.
There is also a sign next to the slot.
~
80 8 0
D0
~
door~
2 8013 8027
D3
~
door~
1 0 8016
E
sign~
To open insert card.
~
S
#8027
Stockroom of Throt & Gleep's Megger Store~
Many useless items stock the shelves of this stockroom. A door leads
south and large vault door is to the north.
~
80 8 0
D0
~
vault door~
2 8012 8028
D2
~
door~
2 8013 8026
E
vault door~
This vault seems impervious to breaking. There is a keyhole in the lock
however.
~
S
#8028
Throt & Gleep's Vault~
The vault is musty with a slight smell of ozone in the air.
~
80 8 0
D2
~
vault door~
2 8012 8027
S
#0
#RESETS
M 0 8000 5 8004 juve
E 0 8006 40 16 bashball bat
M 0 8000 5 8004 juve
E 0 8009 40 16 knife
M 0 8000 5 8006 juve
E 0 8009 40 16 knife
M 0 8000 5 8015 juve
E 0 8009 40 16 knife
E 0 8001 40 7 kneepad
*
M 0 8001 5 8006 punk
E 0 8009 40 16 knife
M 0 8001 5 8009 punk
E 0 8009 40 16 knife
E 0 8001 40 7 kneepad
M 0 8001 5 8011 punk
E 0 8006 40 16 bashball bat
*
M 0 8003 5 8013 militiaman
E 0 8001 40 7 kneepads
M 0 8003 5 8014 militiaman
G 0 8000 10 0 spit gun
*
M 0 8002 4 8023 futsie
E 0 8008 40 16 vacuum
M 0 8002 4 8024 futsie
E 0 8010 40 16 noodle
*
M 0 8004 5 8003 dunk
M 0 8004 5 8006 dunk
M 0 8004 5 8005 dunk
*
M 0 8005 5 8010 tap
E 0 8006 40 16 bashball bat
M 0 8005 5 8017 tap
E 0 8009 40 16 knife
M 0 8005 5 8019 tap
*
M 0 8006 5 8018 rookie
E 0 8011 40 16 club
M 0 8006 5 8012 rookie
E 0 8011 40 16 club
M 0 8006 5 8025 rookie
E 0 8011 40 16 club
*
M 0 8007 1 8027 Gleep
E 0 8009 40 16 knife
G 0 8012 10 0 key
*
M 0 8009 1 8021 Ernie
E 0 8006 40 16 bat
G 0 8002 10 0 gland
G 0 8013 5 0 key card
*
M 0 8010 1 8007 Eckersley
E 0 8011 40 16 club
G 0 8003 20 0 lawgiver
*
M 0 8011 1 8009 Beggers
E 0 8011 40 16 club
G 0 8003 20 0 lawgiver
*
M 0 8012 2 8011 bite fighter
M 0 8012 2 8011 bite fighter
*
O 0 8004 1 8028 safe
M 0 8008 1 8028 Throt
E 0 8009 40 16 knife
G 0 8005 10 0 box
P 0 8007 10 8004 vibroblade
*
D 0 8016 1 1
D 0 8026 3 1
D 0 8026 0 2
D 0 8027 2 2
D 0 8027 0 2
D 0 8028 2 2
S
#SHOPS
0
#SPECIALS
M 8003 spec_cast_judge
M 8006 spec_cast_judge
M 8010 spec_cast_judge
M 8011 spec_cast_judge
M 8004 spec_thief
S
#$

1078
area/midennir.are Normal file

File diff suppressed because it is too large Load diff

4107
area/midgaard.are Normal file

File diff suppressed because it is too large Load diff

2988
area/mirror.are Normal file

File diff suppressed because it is too large Load diff

693
area/mobfact.are Normal file
View file

@ -0,0 +1,693 @@
#AREA { 5 35} PinkF Mob Factory~
#HELPS
0 $~
#MOBILES
#9401
mutant fido dog~
The mutant beastly fido~
The mutant beastly fido is here, his eyes glowing green!
~
You see a mutant beastly fido, glaring at you with green eyes! You wonder if
this factory meets ASPCA guidlines....
~
481 8 -700 S
6 18 -3 3d6+20 2d4+1
5 2000
8 8 1
#9402
foreman floyd~
Foreman Floyd~
Foreman Floyd is here, making plans for the factory's future.
~
You see Foreman Floyd of the Mob factory -- a sterling example of what comes
of dedicated Mudding! Rewarded for his years of dedication as a monster
slayer, Floyd now creates the beasts for other adventurers to fight.
~
66 168 2 S
12 10 -4 2d100+100 2d7+2
1000 3500
6 8 1
#9403
cityguard guard head~
The Cityguard head~
The Cityguard head floats around aimlessly.
~
You see a Cityguard head floating around without a care in the world.
Obviously, this one got past quality control! Careful, those teeth look
sharp...
~
64 524288 0 S
9 12 0 3d15+30 2d6+2
0 2000
8 8 0
#9404
revolving drunk~
The revolving drunk~
The Revolving drunk is here, spinning in place.
~
You see and smell a drunk who looks much like other drunks...but he is spinning
in place! Someone should tell him that he is a REVOLTING drunk.
~
196 0 1 S
2 20 4 2d4+10 1d6+1
50 150
8 8 1
#9405
toxic slime~
The toxic slime~
A pool of toxic slime lies on the floor.
~
yick. Looks like someone had digestion problems! Either that, or the
hydraulic fluid is leaking again.
~
6 0 0 S
4 17 8 3d10+30 2d4+0
0 650
6 6 0
#9406
worker~
The factory worker~
A Mob Factory worker is standing here, looking bored.
~
The worker wears a bright orange pair of overalls, with the words "Mob
Factory" written in a bright purple starburst. Fashion plate, he's not.
~
192 0 100 S
3 18 6 4d20+5 1d4+1
50 325
8 8 1
#9407
worker~
The factory worker~
A Mob Factory worker is here, asleep in a chair.
~
If Floyd walks in, you can bet there'll be trouble. Guess she shouldn't have
worked the late shift!
~
130 0 150 S
3 18 6 4d20+5 1d4+1
75 300
4 4 2
#0
#OBJECTS
#0
#ROOMS
#9400
Entrance to the Mob Factory~
You find that you have entered a strange factory. This factory doesn't
make cars or computers or something - it makes mobs! The sound of
machinery can be heard in the background; the grinding gears drive you
crazy! To the north you see the storage area, to the south the
foreman's office, to the east the entrance hallway, and to the west the
eastern end of alley.
~
94 8 0
D0
~
~
0 0 9401
D1
~
~
0 0 9407
D2
~
~
0 0 9403
D3
~
~
0 0 3046
S
#9401
Mob Factory Storage Area~
This is where the raw materials from which mobs are manufactured are
stored. You see sacks of sawdust, cans of pink paint, a large box
containing wigs and a bottle mysteriously labelled "solution x". Exits
are more of storage to the east and north, and entrance to the mob
factory to the south.
~
94 8 0
D0
~
~
0 0 9402
D1
~
~
0 0 9406
D2
~
~
0 0 9400
S
#9402
Mob Factory Storage Area~
This is where the raw materials from which mobs are manufactured are
stored. You see sacks of sawdust, cans of pink paint, a large box
containing wigs and a bottle mysteriously labelled "solution X". Exits
are more of storage to the east and south.
~
94 8 0
D1
~
~
0 0 9405
D2
~
~
0 0 9401
S
#9403
Foreman's Office~
This is the ofice of the mob factory foreman. The room is sparsely
furnished with a metal desk, a couple of chairs, a shelf with helmets
of various sizes and a Sports Illustrated Swimsuit calendar on the west
wall. Exits lead north to the mob factory entrance and south to the
foreman's bathroom.
~
94 8 0
D0
~
~
0 0 9400
D2
~
~
0 0 9404
S
#9404
Foreman's Bathroom~
This is the place where the foreman makes frequent visits. The smell
here is very strong and reminds you of bovine excrement! There is a
shower to the back, and a urinal to the left. On the floor you can
see stains of a very suspicious nature. The only exit leads north to
the foreman's office.
~
94 8 0
D0
~
~
0 0 9403
S
#9405
Mob Factory Storage Area~
This is where the raw materials from which mobs are manufactured are
stored. You see sacks of sawdust, cans of pink paint, a large box
containing wigs and a bottle mysteriously labelled "solution X". Exits
are more of storage to the west and south, and an inspection room to
the east.
~
94 8 0
D1
~
~
0 0 9410
D2
~
~
0 0 9406
D3
~
~
0 0 9402
S
#9406
Mob Factory Storage Area~
This is where the raw materials from which mobs are manufactured are
stored. You see sacks of sawdust, cans of pink paint, a large box
containing wigs and a bottle mysteriously labelled "solution X". Exits
are more of storage to the west and north, an inspection room to the
east and the entrance hallway to the south.
~
94 8 0
D0
~
~
0 0 9405
D1
~
~
0 0 9411
D2
~
~
0 0 9407
D3
~
~
0 0 9401
S
#9407
Entrance Hallway to Mob Factoy~
You are standing in the entrance hallway of the mob factory. The sound
of machinery gets louder now, and you can hear people shouting in the
distance. Every once in a while you get creepy feeling that a pair of
eyes is observing you...... Exits are north to the storage area, east
to the entrance hallway, south to the cafeteria and west to the mob
factory entrance.
~
94 8 0
D0
~
~
0 0 9406
D1
~
~
0 0 9412
D2
~
~
0 0 9408
D3
~
~
0 0 9400
S
#9408
Mob Factory Cafeteria~
You find that you have entered the cafeteria of the mob factory. There
are many workers eating at the numerous tables placed around the room.
The food doesn't look too appetising, but the factory workers don't
seem to care. There are many places where food and drink have been
spilled on the ground. Exits are north to the entrance hallway and
south to the mob factory cafeteria.
~
94 8 0
D0
~
~
0 0 9407
D2
~
~
0 0 9409
S
#9409
Mob Factory Cafeteria~
You find that you have entered the cafeteria of the mob factory. There
are many workers eating at the numerous tables placed around the room.
The food doesn't look too appetising, but the factory workers don't
seem to care. There are many places where food and drink have been
spilled on the ground. The only exit is north to the mob factory
cafeteria.
~
94 8 0
D0
~
~
0 0 9408
S
#9410
Mob Factory Inspection Room~
You have entered the mob factory inspections room. This is where the
mobs manufactured on the assembly lines are inspected for defects. A
whole team of inspectors from the Midgaard Inspections Bureau is
standing around, trying to look busy. Exits are south to the mob
factory inspection room, east to the primary assembly line and west to
the storage area.
~
94 8 0
D1
~
~
0 0 9415
D2
~
~
0 0 9411
D3
~
~
0 0 9405
S
#9411
Mob Factory Inspection Room~
You have entered the mob factory inspections room. This is where the
mobs manufactured on the assembly lines are inspected for defects. A
whole team of inspectors from the Midgaard Inspections Bureau is
standing around, trying to look busy. Exits are south to the mob
factory inspection room, east to the primary assembly line and west to
the storage area.
~
94 8 0
D0
~
~
0 0 9410
D1
~
~
0 0 9416
D2
~
~
0 0 9412
D3
~
~
0 0 9406
S
#9412
Entrance Hallway to Mob Factoy~
You are standing in the entrance hallway of the mob factory. The sound
of machinery gets louder now, and you can hear people shouting in the
distance. Every once in a while you get creepy feeling that a pair of
eyes is observing you...... Exits are north to the inspection room,
east to the primary assembly line, south to the reject room and west
to the entrance hallway.
~
94 8 0
D0
~
~
0 0 9411
D1
~
~
0 0 9417
D2
~
~
0 0 9413
D3
~
~
0 0 9407
S
#9413
Mob Factory Reject Room~
This is the factory reject room. All the mobs that are manufactured
incorrectly or have some defect are placed here before subsequent
destruction. You shudder at the many deformed and grotesque shapes
present before you. Exits are south to the reject room and north to
the entrance hallway.
~
94 8 0
D0
~
~
0 0 9412
D2
~
~
0 0 9414
S
#9414
Mob Factory Reject Room~
This is the factory reject room. All the mobs that are manufactured
incorrectly or have some defect are placed here before subsequent
destruction. You shudder at the many deformed and grotesque shapes
present before you. The only exit is north to the reject room.
~
94 8 0
D0
~
~
0 0 9413
S
#9415
Primary Assembly Line~
This is the primary assembly line of the mob factory. Here, all the
mobs seen roaming around the city of Midgaard are manufactured from
raw materials. There is a big conveyor belt present which makes a lot
of noise! It seems that the workers are making drunks today. Exits are
east to the secondary assembly line, south to the primary assembly
line and west to the inspection room.
~
94 8 0
D1
~
~
0 0 9420
D2
~
~
0 0 9416
D3
~
~
0 0 9410
S
#9416
Primary Assembly Line~
This is the primary assembly line of the mob factory. Here, all the
mobs seen roaming around the city of Midgaard are manufactured from
raw materials. There is a big conveyor belt present which makes a lot
of noise! It seems that the workers are making drunks today. Exits are
east to the secondary assembly line, north and south to the primary
assembly line and west to the inspection room.
~
94 8 0
D0
~
~
0 0 9415
D1
~
~
0 0 9421
D2
~
~
0 0 9417
D3
~
~
0 0 9411
S
#9417
Primary Assembly Line~
This is the primary assembly line of the mob factory. Here, all the
mobs seen roaming around the city of Midgaard are manufactured from
raw materials. There is a big conveyor belt present which makes a lot
of noise! It seems that the workers are making drunks today. Exits are
east to the secondary assembly line, north and south to the primary
assembly line and west to the entrance hallway.
~
94 8 0
D0
~
~
0 0 9416
D1
~
~
0 0 9422
D2
~
~
0 0 9418
D3
~
~
0 0 9412
S
#9418
Primary Assembly Line~
This is the primary assembly line of the mob factory. Here, all the
mobs seen roaming around the city of Midgaard are manufactured from
raw materials. There is a big conveyor belt present which makes a lot
of noise! It seems that the workers are making drunks today. Exits are
east to the secondary assembly line, north and south to the primary
assembly line.
~
94 8 0
D0
~
~
0 0 9417
D1
~
~
0 0 9423
D2
~
~
0 0 9419
S
#9419
Primary Assembly Line~
This is the primary assembly line of the mob factory. Here, all the
mobs seen roaming around the city of Midgaard are manufactured from
raw materials. There is a big conveyor belt present which makes a lot
of noise! It seems that the workers are making drunks today. Exits are
east to the secondary assembly line and north to the primary
assembly line.
~
94 8 0
D0
~
~
0 0 9418
D1
~
~
0 0 9424
S
#9420
Secondary Assembly Line~
This is the secondary asembly line of the mob factory. You are
surprised to see cityguard heads come floating on the conveyor belt!
The very sight is sickening, but the workers seem to be quite
cheerful about their work. Exits are south to the secondary assembly
line and west to the primary assembly line.
~
94 8 0
D2
~
~
0 0 9421
D3
~
~
0 0 9415
S
#9421
Secondary Assembly Line~
This is the secondary asembly line of the mob factory. You are
surprised to see cityguard heads come floating on the conveyor belt!
The very sight is sickening, but the workers seem to be quite
cheerful about their work. Exits are north and south to the secondary
assembly line and west to the primary assembly line.
~
94 8 0
D0
~
~
0 0 9420
D2
~
~
0 0 9422
D3
~
~
0 0 9416
S
#9422
Secondary Assembly Line~
This is the secondary asembly line of the mob factory. You are
surprised to see cityguard heads come floating on the conveyor belt!
The very sight is sickening, but the workers seem to be quite
cheerful about their work. Exits are north and south to the secondary
assembly line and west to the primary assembly line.
~
94 8 0
D0
~
~
0 0 9421
D2
~
~
0 0 9423
D3
~
~
0 0 9417
S
#9423
Secondary Assembly Line~
This is the secondary asembly line of the mob factory. You are
surprised to see cityguard heads come floating on the conveyor belt!
The very sight is sickening, but the workers seem to be quite
cheerful about their work. Exits are north and south to the secondary
assembly line and west to the primary assembly line.
~
94 8 0
D0
~
~
0 0 9422
D2
~
~
0 0 9424
D3
~
~
0 0 9418
S
#9424
Secondary Assembly Line~
This is the secondary asembly line of the mob factory. You are
surprised to see cityguard heads come floating on the conveyor belt!
The very sight is sickening, but the workers seem to be quite
cheerful about their work. Exits are north to the secondary
assembly line and west to the primary assembly line.
~
94 8 0
D0
~
~
0 0 9423
D3
~
~
0 0 9419
S
#0
#RESETS
M 0 9405 7 9401 Toxic slime
M 0 9401 5 9402 Mutant Fido
M 0 9402 1 9403 Floyd
M 0 9405 7 9404 Toxic slime
M 0 9403 9 9406 Head
M 0 9405 7 9408 Toxic slimne
M 0 9401 5 9408 Mutant Fido
M 0 9405 7 9409 Toxic slime
M 0 9407 4 9410 Sleeping worker
M 0 9404 6 9410 drunk
M 0 9403 9 9410 head
M 0 9407 4 9411 Sleeping worker
M 0 9401 5 9411 Mutant Fido
M 0 9404 6 9413 drunk
M 0 9403 9 9414 head
M 0 9405 7 9415 Toxic Slime
M 0 9406 9 9415 worker
M 0 9406 9 9416 worker
M 0 9406 9 9417 worker
M 0 9406 9 9418 worker
M 0 9401 5 9418 mutant fido
M 0 9406 9 9419 worker
M 0 9406 9 9420 worker
M 0 9407 4 9420 sleeping worker
M 0 9405 7 9421 Toxic Slime
M 0 9403 9 9421 Head
M 0 9403 9 9422 Head
M 0 9406 9 9423 worker
M 0 9403 9 9423 Head
M 0 9403 9 9424 Head
M 0 9406 9 9424 worker
M 0 9405 7 9424 Toxic Slime
S
#SHOPS
0
#SPECIALS
S
#$

2706
area/moria.are Normal file

File diff suppressed because it is too large Load diff

202
area/ofcol.are Normal file
View file

@ -0,0 +1,202 @@
#AREA { All } Alfa Ofcol~
#MOBILES
#0
#OBJECTS
#0
#ROOMS
#5550
Village street~
You stand at the small village street in Ofcol.
From here you see small houses and only few people.
North of here the village street continues up to the small
square where some people are gathered as always.
~
51 0 1
D0
You look up the village street noticing nothing special at all.
~
~
0 -1 5551
D2
The wide road leads south here towards the T-crossing.
~
~
0 -1 314
S
#5551
Village street~
You are standing on the village street of Ofcol.
East from here is a small alley and north you enter the village
square. Towards the south you can leave Ofcol.
~
51 0 1
D0
The village square is as usual not overcrowded.
~
~
0 -1 5552
D1
The small alley looks relative peaceful.
~
~
0 -1 5553
D2
You see the village street eventually becoming the wide road.
~
~
0 -1 5550
S
#5552
Village square~
The village square is a place where inhabitants of Ofcol gather
to talk, trade and sell items and just have a good time.
You see a small shop to the west and the local inn to the north.
If you leave south you go to village street.
~
51 0 1
D0
You see a local inn called 'The Ofcol Local Inn'. Looks nice.
~
~
0 -1 5556
D2
You see the village street of Ofcol.
~
~
0 -1 5551
D3
A small shop with the sign 'Luxan's Mixed goods' hanging in front of it.
~
~
0 -1 5555
S
#5553
The small alley~
You are in a small, quiet alley. From here you see the village street
to the west and a small room lies to the south.
~
51 0 1
D1
You see a big intersection.
~
~
0 0 601
D2
It looks like the future site of a training room.
~
~
0 -1 5554
D3
You notice nothing but the village street.
~
~
0 -1 5551
S
#5554
The future training room~
This is the future site of a training room. The only exit is north
leading to the small alley.
~
51 8 1
D0
You are able to see the small alley, really not very interesting.
~
~
0 -1 5553
S
#5555
Luxan's mixed shop~
You are standing in a small shop, filled with all kinds of goods.
Here you might be able to find just the thing you're looking for.
The only exit is east to village square.
~
51 8 1
D1
The village square is as usual not overcrowded.
~
~
0 -1 5552
S
#5556
The Local Inn~
You are in the local inn, where the peaceful citizens of Ofcol
gather to have a drink or 5 if they have dry throats.
You can't help thinking that Ofcol is a dry city, when you see the
many people here.
The only exit is south to the village square.
~
51 8 1
D2
The village square is as usual not overcrowded.
~
~
0 -1 5552
S
#5577
Ravan's hideout~
This place is a small, cosy place where no one disturbs you all
the time. The room has little decoration except for some pictures
on the wall.
You notice that there are no exits from this room.
~
55 0 0
E
pictures picture decoration~
These pictures show the friend's and foe's of Ravan.
They are easy to separate, as most of the foe's have the letters
R.I.P. inscripted underneath them.
~
E
foe foes enemies~
There is only one picture yet... Dim.
It pictures him hanging from a gallow, north of the town.
It has the letters R.I.P. inscripted underneath.
~
E
friend friends~
The list include such prominent names as : God, Lottie, Kurgan,
Ezzard, Mike, Sprocket and Stormbringer.
~
S
#0
#RESETS
M 0 303 5 5556 citizen
M 0 303 5 5550 -
M 0 304 5 5553 citizen female
M 0 304 5 5552 -
*
E 1 3020 99 16
*
M 0 306 1 5555 Luxan the shopkeeper
G 1 304 100 wild flowers
G 1 3030 100 torch
*
M 0 308 1 5556 Inn-keeper passing out drinks
G 1 3000 100 Something to sell
G 1 3001 100 -
*
M 0 350 1 5577 Ravan's pet dragon
S
#SHOPS
306 1 10 11 19 0 120 60 0 23 ; Luxan
308 0 0 0 0 0 110 100 0 23 ; Ofcol Innkeeper
0
#$

3316
area/ofcol2.are Normal file

File diff suppressed because it is too large Load diff

1531
area/olympus.are Normal file

File diff suppressed because it is too large Load diff

1313
area/plains.are Normal file

File diff suppressed because it is too large Load diff

40
area/proto.are Normal file
View file

@ -0,0 +1,40 @@
#AREA { 5 35} Merc Prototype for New Area~
#HELPS
0 $~
#MOBILES
#0
#OBJECTS
#0
#ROOMS
#0
#RESETS
S
#SHOPS
0
#SPECIALS
S
#$

500
area/redferne.are Normal file
View file

@ -0,0 +1,500 @@
#AREA {20 30} Diku Redferne's Residence~
#MOBILES
#7900
grand knight paladin~
the Grand Knight of paladins~
The Grand Knight is standing here, waiting for someone to help.
~
The Knight is standing here, smiling at you. He is dressed all in
white, blue and silver. He looks VERY strong, as he stands here, ready to
help the innocent.
~
64 136 1000 S
29 -5 -9 20d10+700 2d6+14
0 100000
8 8 1
#0
#OBJECTS
#7909
treasure coins~
a huge treasure~
a huge treasure is lying here, looking very valuable.~
~
20 0 1
-100 0 0 0
0 0 0
E
treasure~
Looks like a LOT of coins. One of them has writing on it.
~
E
writing letters~
It reads: "Hi Conan. No more coins from here, pal. :) Signed, Redferne".
~
#7910
chest~
a wooden chest~
A wooden chest stands in the corner.~
~
15 0 1
100 15 7911 0
400 100 30000
E
chest~
It is a robust chest made from short, heavy planks that have been fastened
together with tenons. It is equipped with a simple brass lock.
~
#7911
key~
a small brass key~
A small brass key lies here.~
~
18 0 1
7910 0 0 0
1 10 4
E
key~
It is a small, simple brass key with no inscriptions or marks of any kind.
~
#0
#ROOMS
#7900
Outside Redferne's residence~
A huge cloud forms the plateau on which you are now standing. The wind here
is absolutely quiet and the sun is shining warmly upon you. From under the
cloud you can hear the faint sounds of Midgaard. Right before you to the
north lies the grand Mansion of Naris, the residence of the Greater God
Redferne.
~
79 516 0
D0
You see a HUGE arched gate leading into this magnificent building.
~
gate door huge arched~
2 -1 7901
D2
You see some pretty clouds!
~
~
0 0 9101
D5
You see a Huge Chain that anchors the Mansion of Naris to the ground.
~
~
0 -1 7918
S
#7901
The Southern end of the hall~
You are standing in a vast hall that is dimly lit, but wherefrom the
light comes, is a mystery. The walls seem to radiate warmth and give
the pleasant feeling of being welcome here. A large portrait is hanging
on one of the walls. A large wooden staircase leads up into the tower.
To the east there is a high passage away from the hall. This ends
shortly after by a tall oak door. The enormous hall extends further
north from here. To the south you can see a huge, and VERY heavy-
looking iron-wrought door. It looks like this is the only exit from
this magnificent old house. To the west you can see a large ashen door.
~
79 524 0
D0
The hallway continues that way. You can see more doorways under the
wooden staircase in that direction.
~
~
0 -1 7904
D1
You see there a tall oak door. It looks quite tightly closed to you.
On it little runes are chiselled into the wood.
~
oak tall east oakdoor talldoor eastdoor~
2 -1 7910
D2
Here you see a REAL door. It would be more proper to call this a
"GATE", rather than a "door". It's really HUGE! On it hangs a large
sign with very large letters spelling : "EMERGENCY EXIT".
~
gate~
2 -1 7900
D3
This looks like a "door" in the meaning of the word. The ashen wood
is painted in a peculiar yellow colour. Small letters are written
with black on it.
~
ashen ash door west yellow~
2 -1 7902
D4
You see the staircase extending upwards into the very high tower.
It ends in what seems like a large bedroom up there.
~
~
0 -1 7909
E
runes~
These runes are utterly strange to you, but you are in luck today: Under
the runes you can just make out a sentence in Common. It goes : " Stay out,
if you treasure your life. That is if you are mortal.".
~
E
letters~
They read "LIBRARY".
~
S
#7902
Redferne's Library~
This is truly a magnificent place! Books and scrolls lie together on every
shelf. A large globe, with the map of the Mud-world upon it, stands in the
dimly lit north-western corner of the room. Two large and comfortable-
looking leather arm-chairs adorn the center of the library together with
a huge oak desk. Dim light radiates from an enormous crystal chandelier
hanging down from the ceiling approximately 10 feet off the floor. To the
east there is a great old ashen door. A large glass window is set in the
west wall.
~
79 524 0
D1
You can see an old ashen door, painted in a peculiar yellow colour.
~
door ash ashen east~
2 -1 7901
E
globe world map~
You see a large world map stretch out on the enormous globe. It has towns
drawn in every spot available for such. In the middle of the map you can
spot a large town with the name 'MIDGAARD' written over it. The rest is
mountains, woods, plains and water.
~
E
midgaard town city~
You see a small speck with woods on the west from it, plains to the east
from it and mountains to the north from it. To the south from it you can
see a thin trail lead to a large castle. Finally you notice a rather large
river pour in from the east and go through Midgaard in the middle.
~
E
chairs leather arm-chairs~
These two chair are exactly alike one another. They look incredibly
comfortable. They're both made from old leather, and yet they seem so worn
that they can be nothing but a perfect place for a long needed rest.
~
E
window glass~
These windows are really BIG! They reach from about 20 inches above the
floor to approximately 10 inches under the ceiling. If you try and
"look out", you might see what might lie beyond these windows.
~
E
out outside beyond~
The clouds muster and form the ground on which this entire building is set.
Through the thinnest of the clouds you can just make out MIDGAARD with all
it's magnificent activity.
~
E
river~
You see a large and winding river cut through the landscape, starting at an
enormous inland lake, it seeps through Midgaard and finally ends up in the
Grand Sea on the West-coast of the land.
~
S
#7903
The Artifact room of Naris~
This is gloomy and dark room with only a faint light radiating from the
walls. A bunch of funny-looking items fill the center of the room. There are
no furniture here what-so-ever. The only way out seems to be west, through
the low steel door.
~
79 524 0
D3
You see only the back of a safe's steel door.
~
~
0 -1 -1
S
#7904
The Northern end of the hall~
You are standing in the northern end of the huge hall. This part is under
the grand wooden staircase so the light seems a little less bright here,
but this doesn't bother your sight at all. To the north lies the kitchen.
To the south lies the Southern end of the hall. To the east there is a huge
metal door. To the west there is a large aspenwood door.
~
79 524 0
D0
~
~
0 -1 7906
D1
You see a huge metal door. From it a foul stench emanates. The smell is the
most awful experience in your entire life. A thought seeps through this
terrible stench and into your mind : "Monsters", you feel BAD about opening
that door.
~
steel metal huge~
2 -1 7913
D2
The rest of the hall lies in that direction, and so does the exit.
~
~
0 -1 7901
D3
The door has "SITTING ROOM" written on it. It is made from Aspenwood and
is beautifully carven with small elves as main issue of sculpture.
~
aspen asp~
2 -1 7905
S
#7905
The Sitting room of Naris~
You are standing in the middle of a really comfortable place. The walls are
decorated with paintings of smiling Kings and Queens. The most attractive
picture is one of a Prince in shiny armour. By one of the walls there is an
old arm-chair. The only exit is through the aspenwood door to the east.
~
79 524 0
D1
The door seems to be a very HEAVY door, carved completely from the trunk of
an Aspen tree.
~
asp aspen door heavy~
2 -1 7904
E
chair arm-chair~
This is truly a wonderful relic of the past. In it is a large cushion.
~
S
#7906
The Kitchen of Naris~
This must be the place of food and drink. You can hear the faint noise of
rats feasting on meat and bread from somewhere undeterminable. The sound
makes you feel the agony of HUNGER. The only visible exit is south to the
Northern end of the hall. To the north there is a larder, and to the east
stands a fridge.
~
79 524 0
D0
It's dark in there, but the sounds from there are unmistakably from rats.
~
larder wooden cupboard~
2 -1 7907
D1
You can see the fridge from here. In it are drinks all over.
~
fridge~
2 -1 7908
D2
You can see the northern end of the hall.
~
~
0 -1 7904
S
#7907
The Larder~
You can see food all over. Among the heaps of food you notice HUGE rats
scuttering around, nibbling pieces off the heaps here and there.
~
79 524 0
D2
~
door wooden larder exit~
2 -1 7906
S
#7908
The Fridge~
This place is LOADED with drink, water and booze.
~
79 524 0
D3
~
door exit fridge~
2 -1 7906
S
#7909
On the stairs~
You can see up and down the stairway. It seems to take forever, either going
up OR down. It's just a seemingly insurmountable climb, either way. Up is the
bedroom of Redferne, and Down leads to the Southern end of the hall.
~
79 524 0
D4
~
~
0 -1 7911
D5
~
~
0 -1 7901
S
#7910
The Treasure room~
This place is gloomy. The only visible exit is west, through the oak door.
~
79 524 0
D1
~
safe steel~
0 -1 -1
D3
You see a tall oak door.
~
door oak tall~
2 -1 7901
S
#7911
Redferne's Bedroom~
This is a snugly set bedroom with all the necessities for a romantic evening.
A large fireplace adorns the east wall, and sizzling away is the wood that
is ablaze within. The bed is enormous, covering at least HALF of this great
room. This stretches at least 300 square feet, so can you imagine the BED?
A large staircase leads down to the hall. A couple of doors open up to a
broad balcony to the south.
~
79 524 0
D2
The sun seems to shine out there, warmly and comforting.
~
doors~
1 -1 7912
D5
~
~
0 -1 7909
S
#7912
The Balcony of Redferne's Residence~
You see a splendid of the most of this world. The valleys stretch as far as
the eye reaches to the south from here. Down below you can see the entrance
of this magnificent building. To the north are the doors to Redferne's Bedroom.
~
79 516 0
D0
You see the comfortable bedroom of Naris, the mansion of Redferne the Greater
God.
~
doors~
2 -1 7911
D5
You see the ground on which this castle is set. Funnily it seems to you that
it's no more than clouds.
~
~
0 -1 -1
S
#7913
The Monster Pen~
This looks like the cage in which a large carnivore is being kept. Judging by
the state the walls are in, this could very well be a large AGGRESSIVE animal.
This makes you pretty insecure, this stating your feeling about the place,
quite mildly.
~
79 8 0
D3
This looks like the only exit from here.
~
door cage metal pen~
2 -1 7904
S
#7914
On the Huge Chain~
This place has quite a good view over Midgaard. Your possibilities of movement
seems to extend only to up and down. Unless you want to let go of the secure
and seemingly unmoveable chain, then those are the directions you should take
from here.
~
79 4 5
D4
Up the way you see the chain disappearing into the clouds above.
~
~
0 -1 7916
D5
Down below you see the huge chain anchored to the ground in the Road Crossing.
~
~
0 -1 3120
S
#7916
On the Great Chain of Naris~
You are approximately on the middle of the treacherous Chain. One false step
and death will come and collect you quickly. The chain leads upwards and down.
No way are you going to descend now ... you've only just begun your climb.
Besides it could cost you your life. Look down and you'll see why.
~
79 4 5
D4
There seems to be only one way from here and that's up.
~
~
0 -1 7918
S
#7918
The Mighty Chain of Naris~
This place offers a splendid view of the WHOLE COUNTRY SIDE!!! A magnificent
light shines upon you and the way up through the clouds is opened. Up there
you can now see the Mansion of Naris, Residence of the Greater God Redferne.
The chain beneath you seems to evaporate in the mustering clouds that
surround you by now.
~
79 4 5
D4
You see the sunny top of the clouds. Beyond these, the Mansion towers before
your eyes. Beautiful!!
~
~
0 -1 7900
S
#0
#RESETS
D 0 7900 0 1 Close the Grand Gate to the Mansion of Redferne
D 0 7901 2 1 Close the same from the inside
D 0 7902 1 1 Close the Ashen door from the Library to the Hallway
D 0 7901 3 1 Close the Ashen door from the Hallway to the Library
D 0 7901 1 1 Close the Oak door to the Item Room from the Hallway
D 0 7910 3 1 Close the Oak from the Item Room to the Hallway
D 0 7904 1 1 Close the Steel door to the monster Pen
D 0 7913 3 1 Close the Steel door from the inside of the monster Pen
D 0 7911 2 1 Close the Balcony doors
D 0 7912 0 1 Close the Balcony doors from the outside
D 0 7904 3 1 Close the Elm door to the Sittingroom
D 0 7905 1 1 Close ---- || ---- from the inside
D 0 7906 1 1 Close the Larder
D 0 7908 3 1 Close the Larder from the inside
D 0 7906 0 1 Close the Fridge
D 0 7907 2 1 ------ || ------ from the inside
M 0 7900 1 7900 The Grand Knight of Paladins
E 1 7216 99 16 Equip sword on Knight
E 1 7217 99 5 Equip Breast-Plate on Knight
E 1 7218 99 7 Equip Leg-plates on Knight
E 1 7219 99 9 Equip Gloves on Knight
E 1 7220 99 6 Equip Helmet on Knight
E 1 7221 99 11 Equip Shield on Knight
E 1 7223 99 10 Equip arm guards on Knight
E 1 7222 99 8 Equip Heavy Boots on Knight
E 1 7224 99 12 Equip White Cloak on Knight
G 1 7911 99 Give key to the safe to the knight
O 0 6013 10 7908 The barrel with water
O 0 7910 1 7910 Load chest
P 1 7298 1 7910 Put Money in chest
P 1 7208 6 7910 Put the Light stick in the Chest
O 0 7909 10 7903 MONEY
S
#SPECIALS
M 7900 spec_cast_cleric
S
#$

2023
area/school.are Normal file

File diff suppressed because it is too large Load diff

4755
area/sewer.are Normal file

File diff suppressed because it is too large Load diff

1836
area/shire.are Normal file

File diff suppressed because it is too large Load diff

859
area/smurf.are Normal file
View file

@ -0,0 +1,859 @@
#AREA { 1 10} Generic Smurf Village~
#MOBILES
#101
smurf~
a smurf~
A smurf is singing and walking along.
~
A cute little blue smurf with a white hat and white boots. You have a sudden
urge to crush him.
~
192 0 100 S
1 19 8 10d2+2 1d2+1
20 200
8 8 1
#102
smurf~
a smurf~
A smurf is here, picking berries.
~
A small smurf is quietly picking berries. He seems to hardly notice you.
~
130 0 100 S
1 19 8 2d5+20 1d2+1
20 200
8 8 1
#103
brainy smurf~
Brainy Smurf~
Brainy Smurf is here, mumbling something to himself.
~
Brainy Smurf has on his usual glasses. Brainy Smurf isn't liked much by the
other smurfs. They fear his knowledge. Knowledge is power!
~
192 0 100 S
3 18 7 3d10+1 1d4+1
30 300
8 8 1
#104
handy smurf~
Handy Smurf~
Handy Smurf is building something here.
~
Handy is always building something. He never takes a break. Why don't you
give him a break, like all of his bones.
~
192 0 100 S
3 18 7 3d10+1 1d4+1
30 300
8 8 1
#105
sleepy smurf~
Sleepy Smurf~
Sleepy Smurf is sleep walking here.
~
Sleepy never gets enough sleep. You would think he goes to college. I wonder
if he has ever stayed up a whole night without sleeping.
~
192 0 100 S
3 18 7 3d10+1 1d4+1
30 300
8 8 1
#106
hefty smurf~
Hefty Smurf~
Hefty Smurf is lifting weights here.
~
Hefty is a total health nut. He lifts weights, eats right, and exercises all
the time. Won't do him much good when he's DEAD.
~
192 0 100 S
3 18 7 3d10+1 1d4+1
30 300
8 8 1
#107
grumpy smurf~
Grumpy Smurf~
Grumpy Smurf is here, swearing.
~
Grumpy has never been happy in his whole life. So why don't you just end it?
~
192 0 100 S
3 18 7 3d10+1 1d4+1
30 300
8 8 1
#108
jokey smurf~
Jokey Smurf~
Jokey Smurf is here, holding a present.
~
Jokey loves to give people presents. Too bad the present explodes when opened.
Oh well, to each his own.
~
192 0 100 S
3 18 7 3d10+1 1d4+1
30 300
8 8 1
#109
smurfette~
Smurfette~
Smurfette is here, looking beautiful.
~
Smurfette is the cutest little smurf you've ever seen. If only she were your
size. I wonder how much she charges the other smurfs.
~
192 0 100 S
3 18 7 3d10+1 1d4+1
30 300
8 8 2
#110
papa smurf~
Papa Smurf~
Papa Smurf is practicing magic here.
~
Yep, its Papa Smurf all right. Red hat and boots and the funny little white
beard. Papa Smurf treats his fellow smurfs with dignity and respect. That
is why Papa Smurf is so popular among the ladies.
~
192 0 100 S
10 10 0 10d10+50 2d2+12
50 4000
8 8 1
#111
gargamel~
Gargamel~
Gargamel is here, cursing out the smurfs.
~
Gargamel has never done anything right in his life. He has caught smurfs
before but always lets them escape. He brings true meaning to the word moron.
~
130 0 -100 S
10 10 0 10d10+50 2d2+12
50 4000
8 8 1
#112
azreal cat~
Azreal~
Azreal is here, licking himself.
~
Gargamel's worthless cat. He is just about as dumb as Gargamel. He should
just grab a smurf in his teeth and chew away.
~
130 0 -100 S
8 12 2 8d8+80 1d4+5
20 2000
8 8 1
#0
#OBJECTS
#100
bunch berries smurfberries~
A bunch of smurfberries~
A bunch of delicious looking smurfberries lie here.~
~
26 0 1
8 0 0 82
2 50 25
#101
glasses~
A pair of glasses~
An odd pair of glasses has been left here.~
~
9 1 17
1 0 0 0
2 500 250
A
4 1
#102
smurf hat~
a smurf hat~
A smurf hat has been left here.~
~
9 0 1|16
3 0 0 0
2 50 25
#103
axe small~
a small axe~
A small axe has been dropped here.~
~
5 0 8193
0 2 5 3
2 2000 1000
#104
necklace~
a small necklace~
A small necklace is lying on the ground.~
~
9 1 5
1 0 0 0
2 500 250
A
3 1
#105
pink potion~
a pink potion~
A pink potion is barely visible on the ground.~
~
10 0 1
6 1 14 -1
2 500 250
#106
wand~
a small wand~
A small wand lies on the ground.~
~
3 0 16385
5 1 1 5
2 500 250
#107
key~
a tiny key~
A tiny key is lying on the ground.~
~
18 0 1
2 0 0 0
2 50 25
#108
well~
a smurf well~
A small smurfy well is here.~
~
25 0 0
50 50 0 0
500 3000 1000
#109
key~
a small key~
A key to Gargamel's door lies here.~
~
18 0 1
2 0 0 0
2 50 25
#0
#ROOMS
#101
Dimly Lit Path~
This path is made of crushed granite with curious blue streaks in it.
The path continues north to a village, or south to the west gate.
~
1 0 3
D0
The path continues toward the village.
~
~
0 -1 102
D2
The path back toward the forest.
~
~
0 -1 3040
S
#102
Dimly Lit Path~
This section of the road is badly worn and frequently traversed. There is
faint singing to the north. The road back to the forest lies to the south.
~
1 4 3
D0
The path continues toward the village.
~
~
0 -1 103
D2
The dimly lit path.
~
~
0 -1 101
S
#103
Dimly Lit Path~
This section of the road is badly worn and frequently traversed. Singing is
getting stronger to the north. The road back to the forest lies to the south.
~
1 0 3
D0
The entrance to smurf village.
~
~
0 -1 104
D2
The dimly lit path.
~
~
0 -1 102
S
#104
Entrance to Smurf Village~
You stand at the entrance to a tiny village. You can see across the whole
village easily. Little blue creatures with white hats and boots and little
fluffy tails scamper about. They sing continuously. The singing is getting
on your nerves and you have the urge to squash them.
~
1 0 2
D0
Smurfy Road
~
~
0 -1 105
D2
Dimly Lit Path
~
~
0 -1 103
S
#105
Smurfy Road~
You are way too big to be using this road. But who cares. Who's gonna stop
you? These little blue smurfs? The singing is growing intense. Your ears
are starting to ring. Smurfy Road continues to the north, west, and east.
There is still time to turn back and go south.
~
1 0 1
D0
Smurfy Road
~
~
0 -1 106
D1
Smurfy Road
~
~
0 -1 110
D2
Entrance to smurf village
~
~
0 -1 104
D3
Smurfy Road
~
~
0 -1 111
S
#106
Smurfy Road~
You continue to travel down Smurfy Road. Isn't it just smurfy? Smurfy road
continues its smurfy path to the smurfy north, smurfy west, and smurfy south.
A smurfy home lies to the smurfy east.
~
1 0 1
D0
Smurfy Road
~
~
0 -1 107
D1
Smurfy Home
~
~
0 -1 120
D2
Smurfy Road
~
~
0 -1 105
D3
Smurfy Road
~
~
0 -1 112
S
#107
Smurfy Road~
Oh boy, another smurfy road! Smurfy Road goes north and south here. There
is a smurfy, mushroom home to the west. A beautiful smurfberry patch is to
the east.
~
1 0 1
D0
Smurfy Road
~
~
0 -1 108
D1
Smurfberry Patch
~
~
0 -1 116
D2
Smurfy Road
~
~
0 -1 106
D3
A Smurfy Home
~
~
0 -1 129
S
#108
Smurfy Road~
Smurfy Road continues to smurf here. It smurfs to the south and smurfs to
an end to the north. A smurfberry patch is to the east. A stone path lies
to the west.
~
1 0 1
D0
Smurfy Road
~
~
0 -1 109
D1
Smurfberry patch
~
~
0 -1 117
D2
Smurfy Road
~
~
0 -1 107
D3
A stone path
~
~
0 -1 113
S
#109
Smurfy Road~
A smurfy well lies here in the middle of Smurfy Road. A fence separates
the smurfs from harm to the north. A berry patch is to the east. Smurfy
Road continues to to the south and west.
~
1 0 1
D1
Smurfberry Patch
~
~
0 -1 118
D2
Smurfy Road
~
~
0 -1 108
D3
Smurfy Road
~
~
0 -1 114
E
smurfy well~
A small well is here. Just the right size if you're a smurf. But big
enough for you to get some water from. I'm sure the smurfs wont mind.
~
S
#110
Smurfy Road~
A corner of smurfy road is where you stand. A smurfy fence blocks passage
to the east or south. A smurfy home is to the north. Smurfy Road goes back
to the west.
~
1 0 1
D0
Smurfy Home
~
~
0 -1 119
D3
Smurfy Road
~
~
0 -1 105
S
#111
Smurfy Road~
Western corner of Smurfy Road. You can continue to smurf down the road
to the east and north. You can also smurf into a smurfy home to the south.
~
1 0 1
D0
Smurfy Road
~
~
0 -1 112
D1
Smurfy Road
~
~
0 -1 105
D2
Smurfy Home
~
~
0 -1 121
S
#112
Smurfy Road~
There's no place like smurf. There's no place like smurf. Sorry wrong
movie. A smurfy home is to the west. Papa Smurf's backyard is to the
north but you can't go there. Smurfy Road continues to the south and
east.
~
1 0 1
D1
Smurfy Road
~
~
0 -1 106
D2
Smurfy Road
~
~
0 -1 111
D3
Smurfy Home
~
~
0 -1 122
S
#113
Stone Path~
You are walking along a cute little stone path. To the south lies Papa
Smurf's house. A Smurfy house is to the west. Smurfy road is to the east.
Everything is so peaceful here. You could stay forever.
~
1 0 1
D1
Smurfy Road
~
~
0 -1 108
D2
Papa Smurf's House
~
door~
1 107 125
D3
Smurfy House
~
~
0 -1 123
S
#114
Smurfy Road~
Yet another part of Smurfy Road. Hey if you go west its the last
section of Smurfy Road. You can go back to the smurfy well to the east.
~
1 0 1
D1
Smurfy Road
~
~
0 -1 109
D3
Smurfy Road
~
~
0 -1 115
S
#115
Smurfy Road~
The last piece of Smurfy Road. You can go back to Smurfy Road to the east.
A nice, beautiful, smurfy, mushroom home is to the south. In the distance to
the north you can see Gargamel's Castle.
~
1 0 1
D0
Path to Gargamel's Castle
~
~
0 -1 126
D1
Smurfy Road
~
~
0 -1 114
D2
Smurfy Home
~
~
0 -1 124
S
#116
Smurfberry Patch~
Delicious smurfberries grow here. You could probably eat a year's worth of
smurfberries in one sitting. Smurfy Road is back to the west. Another
smurfberry patch is to the north.
~
1 0 1
D0
Smurfberry Patch
~
~
0 -1 117
D3
Smurfy Road
~
~
0 -1 107
S
#117
Smurfberry Patch~
Another patch of smurfberries is growing here. The smell is driving your
nostrils crazy. It almost, ALMOST, makes you forget all the singing going
on. Smurfy Road is to the west, while smurfberry patches are to the north
and south.
~
1 0 1
D0
Smurfberry Patch
~
~
0 -1 118
D2
Smurfberry Patch
~
~
0 -1 116
D3
Smurfy Road
~
~
0 -1 108
S
#118
Smurfberry Patch~
The northernmost of the smurfberry patches grows here. It looks just
as scrumptious as all the rest. Just take a few; they'll never know. Smurfy
Road is to the west. A smurfberry patch is to the south.
~
1 0 1
D2
Smurfberry Patch
~
~
0 -1 117
D3
Smurfy Road
~
~
0 -1 109
S
#119
Brainy Smurf's Home~
You rip the roof of the home to get a good look inside. You see
many smurfy books. The print is so small you couldn't even read it
with a magnifying glass. I wonder if Brainy Smurf minds if you
destroy his home? Smurfy Road is back to the south.
~
1 0 1
D2
Smurfy Road
~
~
0 -1 110
S
#120
Handy Smurf's Home~
This home was well built. Of course, until you rip it apart you big meany
you. Tools are all over the place. Too small for you to use. Smurfy Road is
back to the west.
~
1 0 1
D3
Smurfy Road
~
~
0 -1 106
S
#121
Hefty Smurf's Home~
Hefty is anything but wimpy. So is his house. It actually took you a
couple of minutes to destroy his house. Better watch out -- he might be
a little mad at you. Smurfy Road is back to the north.
~
1 0 1
D0
Smurfy Road
~
~
0 -1 111
S
#122
Sleepy Smurf's Home~
Be vewy vewy quiet. Sleepy Smurf is probably sleeping. You see so many
beds you can't even tell if he is here. Maybe you should quietly go back to
Smurfy Road to the east.
~
1 0 1
D1
Smurfy Road
~
~
0 -1 112
S
#123
Grumpy Smurf's Home~
This is Grumpy Smurf's home. He is pissed at you. Of course, he is pissed
at everyone. So don't take it bad. Maybe you'd better leave before he really
gets mad. Smurfy Road to the east is your only salvation.
~
1 0 1
D1
Smurfy Road
~
~
0 -1 113
S
#124
Jokey Smurf's Home~
You pull the top of his house and it explodes in your face. That Jokey
Smurf, what a kidder. You can hear his laughter as you wipe the ashes off
your face. You better get even. Smurfy Road is to the north.
~
1 0 1
D0
Smurfy Road
~
~
0 -1 115
S
#125
Papa Smurf's Home~
It's the home of the leader of the smurfs. Papa Smurf has a nicely decorated
home. He takes pride in his work. You could get to know him or just squash
him. If Papa Smurf is not here he is probably at Smurfette's putting the
moves on her. A stone path lies to the north.
~
1 0 1
D0
Stone Path
~
door~
1 107 113
S
#126
Path to Gargamel's Castle~
You are walking along a path to Gargamel's Castle to the North.
Smurfy Road lies to the south.
~
1 0 1
D0
Outside Gargamel's Castle
~
~
0 -1 127
D2
Smurfy Road
~
~
0 -1 115
S
#127
Outside Gargamel's Castle~
You are standing outside Gargamel's Castle. You can hear him screaming at
Azreal from inside. You can also him cursing out those wretched smurfs.
His Castle is to the north while Smurfy Road is to the south.
~
1 0 1
D0
Gargamel's Castle
~
door~
1 109 128
D2
Path to Gargamel's Castle
~
~
0 -1 126
S
#128
Gargamel's Castle~
This is Gargamel's Castle. His big black kettle is in the middle of the room.
Where else would he put it? The place has only one room.
~
1 0 1
D2
Outside Gargamel's Castle
~
door~
1 109 127
S
#129
Smurfette's House~
This house is conveniently next to Papa Smurfs. Makes it easier for Papa
Smurf to sneak over at night. I hope he uses protection. I would hate to
have little smurfs running around. The only exit is to the east.
~
1 0 1
D1
Smurfy Road
~
~
0 -1 107
S
#0
#RESETS
O 0 108 1 109
M 0 102 3 118 Berry picking Smurfs
G 1 100 10 give each smurfberries
M 0 102 3 117
G 1 100 10
M 0 102 3 116
G 1 100 10
*
M 0 101 3 105 Regular smurfs
M 0 101 3 110
G 1 102 10
M 0 101 3 111
M 0 101 3 112
G 1 102 10 give hats to some
M 0 101 3 107
M 0 101 3 108
G 1 102 10
M 0 101 3 109
M 0 101 3 104
G 1 102 10
*
M 0 103 1 119 Brainy Smurf
E 1 101 8 6
M 0 104 1 120 Handy Smurf
E 1 103 8 16
M 0 105 1 122 Sleepy Smurf
M 0 106 1 121 Hefty Smurf
E 1 103 8 16
M 0 107 1 123 Grumpy Smurf
M 0 108 1 124 Jokey Smurf
M 0 109 1 129 Smurfette
E 1 104 8 3
G 1 107 8
M 0 110 1 125 Papa Smurf
G 1 105 10
G 1 109 8
M 0 111 1 128 Gargamel
E 1 106 8 17
M 0 112 1 128 Azreal
S
#SPECIALS
M 101 spec_thief
M 102 spec_thief
M 103 spec_thief
M 104 spec_thief
M 105 spec_thief
M 106 spec_thief
M 107 spec_thief
M 108 spec_thief
M 109 spec_thief
M 110 spec_cast_mage
M 111 spec_cast_cleric
M 112 spec_poison
S
#$

2199
area/thalos.are Normal file

File diff suppressed because it is too large Load diff

350
area/trollden.are Normal file
View file

@ -0,0 +1,350 @@
#AREA {10 15} Merc Troll Den~
#MOBILES
#2800
guardian beast~
the guardian beast~
A guardian beast stares at you and snarls in rage.
~
Jet black fur covers this beast. You stare at his two huge red eyes. You can
count at least 50 teeth on this monster. You can't tell whether it is blood or
saliva dripping from the beast's jaw. The guardian beast snarls again.
~
2|4|32|64 8|32768|65536 -200 S
7 12 2 7d7+70 2d6+1
0 1550
8 8 1
#2801
young troll~
the young troll~
A young troll is sitting down, chewing on a bone.
~
He is a tall, wiry, furry humanoid.
Your eyes lock with his. He smiles, puts down his bone, and reaches for one
of yours!!
~
4|32|64 32768 -500 S
6 13 3 6d6+60 2d5+1
500 1000
6 8 1
#2802
medium troll~
the medium troll~
A troll is grooming his pet, a guardian beast.
~
He is a tall, lean, furry humanoid.
He is busy licking the ticks off of his beast.
His eyes dart toward you, as he realizes you are one third his size.
~
2|4|32|64 32768 -500 S
8 11 1 8d8+80 2d6+3
1500 3000
8 8 1
#2803
baby troll~
a baby troll~
A baby troll is playing Doctor with a cadaver.
~
He is a large, chubby, furry humanoid.
He is trying to stuff an arm in a hole in the wall.
He notices you and gargles "WANNA JOIN?".
~
2|4|32 32768 -100 S
5 14 4 5d5+50 2d4+1
250 700
6 8 1
#2804
giant troll~
the giant troll~
A giant troll is lying on a pile of carnage, pleasing his mistress.
~
He is a gigantic, muscular, furry humanoid.
He gasps as he notices your intrusion.
You gasp as you realize you have intruded upon his acts of passion!
~
2|4|32|64 32768 -1000 S
13 6 -4 13d13+130 3d6+4
3000 13000
5 8 1
#2805
large troll female~
the large female troll~
A large female troll is lying on the pile of carnage, blissfully writhing.
~
She is a huge, grotesque, furry humanoid.
She moans in passion but gasps as she notices you.
Her smiles turn into snarls as she screams at you!
~
2|4|32|64 32768 -800 S
11 8 -3 11d11+110 3d5+3
2500 8000
5 8 2
#2806
fat worm~
a fat worm~
A fat worm scurries around, looking for food.
~
It is thick and long. You can't find a head on this thing.
It moves quickly, from corpse to corpse.
~
4|32|128 32768|65536 0 S
3 13 3 3d3+30 2d4+0
0 350
8 8 0
#2807
roving beast~
the roving beast~
A roving beast is searching for prey.
~
Jet black fur covers this beast.
You stare at his two huge red eyes. You can count at least 50 teeth on this
beast. You can't tell whether it is blood or saliva dripping from the beast's
jaw. The roving beast snarls at you.
~
2|4|32|64 8|32768 -200 S
7 12 2 7d7+70 2d6+1
0 2250
8 8 1
#2808
medium troll~
the medium troll~
A troll is wandering around, attending to his duties.
~
He is a tall, lean, furry humanoid.
He notices you, and is satisfied to find what he is looking for.
He advances toward you.
~
4|32|64 32768 -500 S
8 11 1 8d8+80 2d6+3
1500 2750
8 8 1
#0
#OBJECTS
#2800
corpse cadaver~
the cadaver-toy~
A half eaten corpse is laying here~
~
15 0 1
30 0 0 0
50 0 0
#2801
pile rotting heap bed~
the heap of carnage~
There is a bed made of carnage here.~
~
15 0 0
30 0 0 0
999 0 0
#2802
trollskin troll skin~
the troll skin~
The filthy hide of a beast is laying here.~
~
9 0 1|1024
5 0 0 0
50 50 50
E
troll skin~
This is the skin from a huge (and dead) beast. It looks bad, smells bad,
and feels bad.
~
A
1 1
#2803
ring opal~
an opal ring~
A ring of black opal lies here gathering dust.~
~
9 64 1|2
3 0 0 0
1 1000 100
E
ring opal~
It is a full circle of opal, smooth and simple.
~
A
19 2
#2804
leather belt~
a leather belt~
An old leather belt is left on the floor.~
~
9 64 1|2048
6 0 0 0
5 100 20
E
leather belt~
This old, smelly belt looks like it is barely better than rotting cloth.
~
#2805
bone cracked~
a cracked bone~
A cracked piece of bone lies here.~
~
5 0 1|8192
0 3 3 7
3 3 50
E
bone~
This piece of bone looks sturdy enough to be used as a weapon, but you
wouldn't want to entrust your life to it.
~
A
19 -1
A
18 -1
#0
#ROOMS
#2801
Wastedump~
This room is filled with bone shards and fragments. Something (or things)
very big lives here. A small plaque is on the wall.
~
28 1|8 0
D2
You find the stench is stronger inside.
~
~
0 0 2803
D0
You reach civilization again.
~
~
0 0 6124
E
plaque~
This zone (trollden) is created by MERC for any MERC Mud.
copyright 1992
~
S
#2802
Troll's Larder~
This room has blood and grime all over the walls. You see maggots and other
insects crawling up them. The resident is definitely uncivilized. Half-eaten
and rotting body parts scatter the floor, each having its own colony of flies,
worms, and maggots.
~
28 1|8 0
D1
You welcome the fresh breeze coming from the east, but wrinkle your nose when
the stench bears down on you once more.
~
~
0 0 2803
E
Half-eaten body rotting corpse~
YUCK! You find worms crawling in and out this poor unfortunate former human.
~
S
#2803
Troll's Living Room~
This small cave opens to the north, south, east, and west. You are
overcome by the stench and consider turning around.
~
28 1|8 0
D0
There is a trail of bone shards and fragments leading north.
~
~
0 0 2801
D1
Good God! You spy corpses all over the floor in there. It looks like a
virtual graveyard in there.
~
~
0 0 2804
D2
Whoa! You reel back from the stench. You believe you have found the source
of this bad smell.
~
~
0 0 2805
D3
You puke as you watch worms crawl between this room and the room west of here
as they bore new holes into a corpse laying on the far wall of the west room.
~
~
0 0 2802
S
#2804
The Playpen~
The walls are covered with blood (and body parts!?!?). Plastered on the far
wall you see what looks like a human arm. A half-eaten body lies here with
its chest ripped out. The predator seems disinterested in it.
~
29 1|8 0
D3
You welcome the fresh breeze coming from the west, but wrinkle your nose when
the stench bears down on you once more.
~
~
0 0 2803
E
arm rotting~
This reminds you of what a baby would do to its formula during dinnertime,
plastering it on the wall.
~
S
#2805
Troll's Bedroom~
Obviously something REALLY big lives here. The stench is quite unbearable.
There are piles and piles of rotten and half-eaten body parts of animals,
orcs, (and humans?) strewn across the floor. There is a larger, more
prominent pile of rotten parts over in a corner. It seems to have been
flattened by something.
~
28 1|4|8 5
D0
You welcome the fresh breeze coming from the north, but wrinkle your nose when
the stench bears down on you once more.
~
~
0 0 2803
S
#0
#RESETS
M 0 2800 2 2801 guardian beast in wastedump
O 0 2805 10 2801 bone in wastedump
*
M 0 2801 2 2802 young troll in larder
M 0 2801 2 2802 young troll in larder
M 0 2802 1 2803 medium troll in living room
O 0 2800 10 2804 corpse in playpen
P 0 2804 40 2800 put belt in corpse
*
M 0 2800 2 2803 guardian beast in living room
M 0 2803 4 2804 baby troll in playpen
M 0 2803 4 2804 baby troll in playpen
M 0 2803 4 2804 baby troll in playpen
M 0 2803 4 2804 baby troll in playpen
M 0 2804 1 2805 giant troll in bedroom
E 1 2802 40 12 equip the skin on the giant troll
*
M 0 2805 1 2805 female troll in bedroom
O 0 2801 10 2805 pile/bed in bedroom
P 0 2803 40 2801 put opal ring in pile/bed
*
M 0 2806 20 2803 worm in living room
M 0 2806 20 2803 worm in living room
M 0 2806 20 2802 worm in larder
M 0 2806 20 2802 worm in larder
M 0 2806 20 2804 worm in playpen
M 0 2807 1 2802 roving beast in larder
M 0 2808 1 2803 wandering troll in living room
S
#$

2261
area/valley.are Normal file

File diff suppressed because it is too large Load diff

1676
area/wyvern.are Normal file

File diff suppressed because it is too large Load diff

133
doc/act.txt Normal file
View file

@ -0,0 +1,133 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== The function 'send_to_char'
The central output functions are 'send_to_char' and 'act'. Of the two,
'send_to_char' is much simpler, faster, and less powerful.
The interface for send_to_char is:
void send_to_char( const char *txt, CHAR_DATA *ch )
The string 'txt' is sent to the character 'ch'. That's all there is to it.
=== The function 'act'
The function 'act' is much hairier. The following section is a precise
reference guide. If you don't already have some notion of what 'act' format
strings look like, then you should read some code which uses 'act' (such as
some of the spell functions in magic.c) to get a concrete introduction to this
function.
void act( const char *str, CHAR_DATA *ch,
const void *arg1, const void *arg2, int type )
const char *str;
This is a format string, with formatting specifications introduced
by '$' (just as 'printf' introduces its formatting sequences with '%').
Typically this is a complete sentence with a subject and an object.
CHAR_DATA *ch;
This is the subject of the sentence.
const void *arg1;
This is the object of the sentence. This may be either an object or
possibly a text string.
const void *arg2;
This is the target of the sentence, as well as possibly the object of
the sentence. This may be either a victim, an object, or possibly a
text string.
int type;
This is the 'to' type of the sentence. Values are:
TO_CHAR Send only to 'ch'.
TO_VICT Send only to 'arg2' (and then only if arg2 != ch).
TO_ROOM Send to all chars in room except 'ch'.
TO_NOTVICT Send to all chars in room except 'ch' and 'vict'.
In every case, only characters in the same room as 'ch' are considered.
Each awake character in the same room as 'ch' is considered for output. (Thus
'ch' must always be a legitimate character whose location is not NOWHERE). If
the target character meets the 'type' requirements, then the formatting string
'str' is used to construct an output string, with '$' sequences substituted
using values from 'ch', 'arg1', and 'arg2'.
In the substitution of '$' sequences, attention is paid to visibility by
calling 'can_see' and 'can_see_obj' as needed.
The first character of the output string is always capitalized.
=== The '$' sequences
Here are all the '$' sequences supported by 'act':
$t
Result is the 'arg1' argument interpreted as a string.
$T
Result is the 'arg2' argument interpreted as a string.
$n
Result is the name of 'ch'. If 'ch' is not visible to the target
character, result is the string 'someone'.
$N
Result is the name of 'arg2' (considered as a victim). If 'arg2' is
not visible to the target character, result is the string 'someone'.
$e
Result is 'he', 'she', or 'it', depending on the sex of 'ch'.
$E
Result is 'he', 'she', or 'it', depending on the sex of 'arg2'
(considered as a victim).
$m
Result is 'him', 'her', or 'it', depending on the sex of 'ch'.
$M
Result is 'him', 'her', or 'it', depending on the sex of 'arg2'
(considered as a victim).
$s
Result is 'his', 'her', or 'its', depending on the sex of 'ch'.
$S
Result is 'his', 'her', or 'its', depending on the sex of 'arg2'
(considered as a victim).
$p
Result is the short description of 'arg1' (considered as an object).
If 'arg1' is invisible to the target character, result is the string
'something'.
$P
Result is the short description of 'arg2' (considered as an object).
If 'arg2' is invisible to the target character, result is the string
'something'.
$d
Result is the first word in 'arg2', considered as a string. If 'arg2'
is NULL, result is the string 'door'. This is meant for extracting the
name from a door's keyword list, but may be used in general for other
keyword lists.

935
doc/area.txt Normal file
View file

@ -0,0 +1,935 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Acknowledgement
This document contains information from 'database.doc', 'dbsup.doc', and
'values.doc', part of the original Diku mud release and copyrighted by the
Diku folks. See their 'license.doc'.
=== Overview of Areas
An area is one piece of the world. Each area is defined in a separate file.
All of our area files have the extension '.are', but you can call your area
files anything you want.
Because each area is defined in one file, it is easy to incorporate new areas
into Merc, or to send Merc areas to others for use.
All of our areas may be freely distributed, as long as the internal notices
(such as those on plaques, signs, graffiti, or tombstones) are kept. If you
write new areas, and would like to contribute them back to Merc, just e-mail to
one of the addresses above. As you can see from typing 'areas' in the game, we
credit the original authors whenever we can find them.
Although the format of Merc areas is (mostly) compatible with other Diku muds,
Merc ignores many of the fields in the area files, generating its own values
based on mobile and object levels. We adopted this policy in order to maintain
balance between areas originally written by many different authors.
=== Sections of an Area
An area file contains the following sections:
#AREA
#HELPS
#MOBILES
#OBJECTS
#ROOMS
#RESETS
#SHOPS
#SPECIALS
#$
An area is a collection of sections starting with #AREA until the next #AREA.
All of our area files (except 'help.are') contain just one #AREA section, which
is at the top of the file.
The file 'proto.are' contains a prototype for developing new area files.
Each of the sections contains its own format. For #MOBILES, #OBJECTS, #ROOMS,
and #RESETS, this format is upward compatible with the original Diku formats
for tinyworld.mob, tinyworld.obj, tinyworld.wld, and tinyworld.zon,
respectively. The #HELPS, #SHOPS, and #SPECIALS sections have new formats.
=== Memory Usage
In order to simplify the code, the Merc server has a fixed maximum size on
strings in the area database. This size is defined at the beginning of 'db.c'
'db.c' with a '#define' statement. As distributed, this size is:
#define MAX_STRING 1048576
This size is 10% larger than needed for the areas we distribute. Thus, you
can add about 4 more areas without touching the server at all. The server
will tell you when the string table overflows, and you can simply increase the
maximum limit and recompile. The immortal 'memory' command will show you
memory usage from within the game.
There is no other limit on area sizes or memory usage.
We decided to use a fixed size because it simplifies our job. It also allows
significant performance improvements: compare our load time and memory usage
versus other Diku muds with the same quantity of areas.
=== Data Types
All of the data in an area file (even the section headers) consists of a series
of values. Each value has a specific type. The server parses the file by
reading in data values one at a time according to the types it expects.
Blank characters (spaces, tabs, new lines, carriage returns) at the beginning
of a data value are always ignored (this includes strings). Thus, you can
format the area files whatever way suits your taste and your needs.
The individual types are: 'letter', 'word', 'string', 'number', and 'to_eol'.
A 'letter' is a single non-blank character.
A 'word' is a sequence of non-blank characters terminated by a blank.
A 'string' is a seqence of non-tilde characters terminated by a tilde. A tilde
is this character: '~'. Thus, strings may contain blanks, and may be multiple
lines long. There is no limit on the length of an individual string; however,
all strings go into a common memory pool whose size is fixed when the server is
compiled.
A 'number' is a decimal number with an optional leading '-' or '+'. The '|'
character may be used in any number: '1|64|1048576' has the value 1048641. The
individual values separated by '|' are added together, so '5|6' is 11, not 7.
The components need not be powers of 2. This feature is extremely useful for
defining bit vectors, such as the ACT_* and AFF_* bits for mobiles, but is not
restricted to bit vectors: any number may use the '|' construction.
A 'to_eol' is all the characters from the current position to the end of the
current input line. It is used for parsing comments at the ends of lines.
In the syntax description below, <value:type> indicates a value to be read of
the indicated type. A backslash '\' indicates that the file format itself has
only one line, but several lines are used in this description to fit within
80 columns.
Braces '{ ... }' are used to enclose elements. They are NOT literal parts of
the file format, but a way of indicating that the enclosed elements may be
repeated zero or more times. Braces at the same level of indentation indicate
that the parallel elements may be present in any order.
All other characters in the syntax description are literal characters.
The file 'merc.h' lists the meanings of most of the flags and values. The
section useful to area builders is set off by big comments; you can't miss it.
The file 'const.c' contains the spell list with slot numbers, and the file
'special.c' contains the list of special procedures.
Mobiles, objects, and rooms are identified by vnum (virtual number). The range
of vnum's is 1 to 32767. Vnum's must be unique (for that particular kind of
vnum). Vnums do not have to be in increasing order.
Typically an area uses the same range of vnum's for mobile vnum's, object
vnum's, and room vnum's, starting with a multiple of 100. This facilitates
adding the area into an existing set of areas.
=== The #AREA section
The syntax of this section is:
#AREA <area-name:string>
The 'area-name' can be any string. The 'areas' command provides a list of
areas, so it's worth while to follow the standard Merc format for this string:
#AREA { 5 35} Merc Prototype for New Area~
The first two numbers are recommended level range. The name is the name of the
original author of the area. The last phrase is the name of the area.
=== The #HELPS section
The syntax of this section is:
#HELPS
{
<level:number> <keywords:string>
<help-text:string>
}
0 $~
The 'level' number is the minimum character level needed to read this section.
This allows for immortal-only help text.
The 'keywords' are a set of keywords for this help text.
The 'help-text' is the help text itself.
Normally when a player uses 'help', both the keywords and the help-text are
shown. If the 'level' is negative, however, the keywords are suppressed. This
allows the help file mechanism to be used for certain other commands, such as
the initial 'greetings' text.
If a 'help-text' begins with a leading '.', the leading '.' is stripped off.
This provides for an escape mechanism from the usual leading-blank stripping of
strings, so that picturesque greeting screens may be used.
=== The #MOBILES section
The syntax of this section is:
#MOBILES
{
#<vnum:number>
<keywords:string>
<short-description:string>
<long-description:string>
<description:string>
<act-flags:number> <affected-flags:number> <alignment:number> S
<level:number> <hitroll:number> <armor:number> \
<hitnodice:number> d <hitsizedice:number> + <hitplus:number> \
<damnodice:number> d <damsizedice:number> + <damroll:number>
<gold:number> <exp:number>
<position:number> <position:number> <sex:number>
}
#0
The 'vnum' is the virtual number of the mobile.
The 'keywords' are words which can be used in commands to identify the mobile.
The 'short-description' is the description used by the 'act' function and other
functions to identify the mobile.
The 'long-description' is the description used when a character walks in the
room and the mobile is visible.
The 'description' is the longest description. It is used when a character
explicitly looks at the mobile.
The 'act-flags' define how the mobile acts, and the 'affected-flags' define
more attributes of the mobile.
The 'alignment' of the mobile ranges from -1000 to +1000. Keep in mind that
certain spells ('protection' and 'dispel evil') give characters fighting evil
monsters an advantage, and that experience earned is influenced by alignment.
The literal letter 'S' must be present after the alignment. In the original
Diku mob format, 'S' stands for simple. Merc supports only simple mobs, so the
'S' is redundant. It is retained not only for compatibility with the Diku
format, but also because it helps the server report errors more accurately.
The 'level' is typically a number from 1 to 35, although there is no upper
limit.
The 'hitroll', 'armor', 'hitnodice, 'hitsizedice', 'hitplus', 'damnodice',
'damsizedice', 'damroll', 'gold', 'exp', 'position', and 'position' fields are
present for compatibility with original Diku mud, but their values are ignored.
Merc generates these values internally based on the level of the mobile.
The 'sex' value may be 0 for neutral, 1 for male, and 2 for female.
=== The #OBJECTS section
The syntax of this section is:
#OBJECTS
{
#<vnum:number>
<keywords:string>
<short-description:string>
<long-description:string>
<action-description:string>
<item-type:number> <extra-flags:number> <wear-flags:number>
<value-0:number> <value-1:number> <value-2:number> <value-3:number>
<weight:number> <cost:number> <cost-per-day:number>
{
E
<keyword:string>
<description:string>
}
{
A
<apply-type:number> <apply-value:number>
}
}
#0
The 'vnum' is the virtual number of the object.
The 'keywords' are words which can be used in commands to identify the object.
The 'short-description' is the description used by the 'act' function and other
functions to identify the object. The first character of the short-description
should be lower case, because this description is used in the middle of
sentences.
The 'long-description' is the description used when a character walks in the
room and the object is visible.
The 'action-description' is not used.
The 'item-type' is the type of the item (weapon, armor, potion, et cetera).
The 'extra-flags' describe more attributes of the object. The 'wear-flags'
describe whether the item can be picked up, and if so, what bodily locations
can wear it.
The interpretation of the four 'value' numbers depends upon the type of the
object. Interpretations are given below.
The 'weight' of the object is just that.
'Cost' and 'cost-per-day' are ignored. 'Cost' is generated internally based on
the level of the object. Because Merc has no rent, 'cost-per-day' is
completely ignored.
The optional 'E' sections and 'A' sections come after the main data.
An 'E' section ('extra description') contains a keyword-list and a string
associated with those keywords. This description string is used when a
character looks at a word on the keyword list.
An 'A' section ('apply') contains an apply-type and an apply-value. When a
character uses this object as equipment (holds, wields, or wears it), then
the value of 'apply-value' is added to the character attribute identified by
'apply-type'. Not all 'apply-types' are implemented; you have to read the
function 'affect_modify' in handler.c to see exactly which ones are.
An object may have an unlimited number of 'E' and 'A' sections.
=== The #ROOMS section
The syntax of this section is:
#ROOMS
{
#<vnum:number>
<name:string>
<description:string>
<area:number> <room-flags:number> <sector-type:number>
{
D <door:number>
<description:string>
<keywords:string>
<locks:number> <key:number> <to_room:number>
}
{
E
<keywords:string>
<description:string>
}
S
}
#0
The 'vnum' is the virtual number of the room.
The 'name' is the name of the room.
The 'description' is the long multi-line description of the room.
The 'area' is obsolete and unused. Rooms belong to whatever area was most
recently defined with #AREA.
The 'room-flags' describe more attributes of the room.
The 'sector-type' identifies the type of terrain. This affects movement cost
through the room. Certain sector types (air and boat) require special
capabilities to enter.
Unlike mobiles and objects, rooms don't have any keywords associated with them.
One may not manipulate a room in the same way one manipulates a mobile or
object.
The optional 'D' sections and 'E' sections come after the main data. A 'D'
section contains a 'door' in the range from 0 to 5:
0 north
1 east
2 south
3 west
4 up
5 down
A 'D' command also contains a 'description' for that direction, and 'keywords'
for manipulating the door. 'Doors' include not just real door, but any kind of
exit from the room. The 'locks' value is 0 for an unhindered exit, 1 for a
door, and 2 for a pick-proof door. The 'key' value is the vnum of an object
which locks and unlocks the door. Lastly, 'to_room' is the vnum of the room to
which this door leads.
You must specify two 'D' sections, one for each side of the door. If you
specify just one then you'll get a one-way exit.
An 'E' section (extended description) contains a 'keywords' string and a
'description' string. As you might guess, looking at one of the words in
'keywords' yields the 'description' string.
The 'S' at the end marks the end of the room. It is not optional.
=== The #RESETS section
The syntax of this section is:
#RESETS
{
* <comment:to_eol>
}
{
M <:number> <mob-vnum:number> <limit:number> <room-vnum:number> \
<comment:to_eol>
}
{
O <:number> <obj-vnum:number> <:number> <room-vnum:number> \
<comment:to_eol>
}
{
P <:number> <obj-vnum:number> <:number> <obj-vnum:number> \
<comment:to_eol>
}
{
G <:number> <obj-vnum:number> <:number> \
<comment:to_eol>
}
{
E <:number> <obj-vnum:number> <:number> <wear_loc:number> \
<comment:to_eol>
}
{
D <:number> <room-vnum:number> <door:number> <state:number> \
<comment:to_eol>
}
{
R <:number> <room-vnum:number> <last-door:number> \
<comment:to_eol>
}
S
To reset an area, the server executes each command in the list of reset
commands once. Each area is reset once when the server loads, and again
periodically as it ages. An area is reset if it is at least 3 area-minutes old
and is empty of players, or if it is 15 area-minutes old. At the 14
area-minute mark, each (awake) player in the area is warned of the impending
reset. These values are coded into the function 'reset_area' in 'db.c'.
An 'area-minute' varies between 30 and 90 seconds of real time, with an
average of 60 seconds. The variation defeats area timekeepers.
The 'resets' section contains a series of single lines. The backslashes and
line splitting above are for readability; they are not part of the file format.
Because of the end-of-line comments, this section is not as free-format as
other sections.
The reset commands are:
* comment
M read a mobile
O read an object
P put object in object
G give object to mobile
E equip object to mobile
D set state of door
R randomize room exits
S stop (end of list)
The '*' lines contain comments. The 'S' line is the last line of the section.
Every other command contains four numbers (three for the 'G' command). The
first number is ignored. The next three (or two) numbers are interpreted as
follows:
For the 'M' command, the second number is the vnum of a mobile to load. The
third number is the limit of how many of this mobile may be present in the
world. The fourth number is the vnum of the room where the mobile is loaded.
For the 'O', 'P', 'G', and 'E' commands, the second number is the vnum of an
object to load. The third number is ignored.
For the 'O' command, the fourth number is the vnum of the room where the object
is loaded. The object is not loaded if the target room already contains any
objects with this vnum. The object is also not loaded if any players are
present in the area.
For the 'P' command, the fourth number is the vnum of a container object where
the object will be loaded. The actual container used is the most recently
loaded object with the right vnum; for best results, there should be only one
such container in the world. The object is not loaded if no container object
exists, or if someone is carrying it, or if it already contains one of the
to-be-loaded object.
For the 'G' command, there is no fourth number. If the most recent 'M' command
succeeded (e.g. the mobile limit wasn't exceeded), the object is given to that
mobile. If the most recent 'M' command failed (due to hitting mobile limit),
then the object is not loaded.
For the 'E' command, the fourth number is an equipment location. If the most
recent 'M' command succeeded, that mobile is equipped with the object. If the
most recent 'M' command failed, then the object is not loaded.
All objects have a level limit, which is computed by inheritance from the most
recently read 'M' command (whether it succeeded or not) in 'area_update' in
'db.c'. As distributed, an object's level equals the mobile level minus 2,
clipped to the range 0 to 35.
For the 'D' command, the second number is the vnum of a room. The third number
is a door number from 0 to 5. The fourth number indicates how to set the door:
0 for open and unlocked; 1 for closed and unlocked; 2 for closed and locked.
Room exits must be coherent: if room 1 has an exit to room 2, and room 2 has an
exit in the reverse direction, that exit must go back to room 1. This doesn't
prevent one-way exits; room 2 doesn't HAVE to have an exit in the reverse
direction.
For the 'R' command, the second number is the vnum of a room. The third number
is a door number. When this command, the doors from 0 to the indicated door
number are shuffled. The room will still have the same exits leading to the
same other rooms as before, but the directions will be different. Thus, a door
number of 4 makes a two-dimensional maze room; a door number of 6 makes a
three-dimensional maze room.
Use of both the 'D' and 'R' commands on the same room will yield unpredicatable
results.
Any line (except an 'S' line) may have a comment at the end.
=== The #SHOPS section
The syntax of this section is:
#SHOPS
{
<keeper:number> \
<trade-0:number> <trade-1:number> <trade-2:number> \
<trade-3:number> <trade-4:number> \
<profit-buy:number> <profit-sell:number> \
<open-hour:number> <close-hour:number> \
<comment:to_eol>
}
0
Like the #RESETS section, the #SHOPS section has one command per line.
The 'keeper' is the vnum of the mobile who is the shopkeeper. All mobiles
with that vnum will be shopkeepers.
The 'trade-0' through 'trade-5' numbers are item types which the shopkeeper
will buy. Unused slots should have a '0' in them; for instance, a shopkeeper
who doesn't buy anything would have five zeroes.
The 'profit-buy' number is a markup for players buying the item, in percentage
points. 100 is nominal price; 150 is 50% markup, and so on. The 'profit-sell'
number is a markdown for players selling the item, in percentage points.
100 is nominal price; 75 is a 25% markdown, and so on. The buying markup
should be at least 100, and the selling markdown should be at most 100.
The 'open-hour' and 'close-hour' numbers define the hours when the shopkeeper
will do business. For a 24-hour shop, these numbers would be 0 and 23.
Everything beyond 'close-hour' to the end of the line is taken to be a comment.
Note that there is no room number for a shop. Just load the shopkeeper mobile
into the room of your choice, and make it a sentinel. Or, for a roving
shopkeeper, just make it non-sentinel.
The objects a shopkeeper sells are exactly those loaded by 'G' reset commands
for that shopkeeper. These items replenish automatically. If a player sells
an object to a shopkeeper, the shopkeeper will keep it for resale if he, she,
or it doesn't already have an identical object. These items do not replenish.
=== The #SPECIALS section
The syntax of this section is:
#SPECIALS
{
* <comment_to_eol>
}
{
M <mob-vnum:number> <spec-fun:word> <comment:to_eol>
}
S
Like the #RESETS section, the #SPECIALS section has one command per line.
This section defines special functions (spec-fun's) for mobiles. A spec-fun
is a C function which gives additional behavior to all mobiles with a given
vnum, such as the peripatetic mayor or the beholder casting spells in combat.
See 'special.c' for a list of available spec-fun's.
The 'M' command assigns 'spec-fun' to all mobiles of with virtual number
'mob-vnum'. All spec-fun's are assigned by name. An 'M' line may have a
comment at the end.
Every three seconds, the server function 'mobile_update' examines every mobile
in the game. If the mobile has an associated spec-fun, then 'mobile_update'
calls that spec-fun with a single parameter, the 'ch' pointer for that mob.
The spec-fun returns TRUE if the mobile did something, or FALSE if it did not.
If the spec-fun returns TRUE, then further activity by that mobile is
suppressed.
To add a new special function:
(1) Add a DECLARE_SPEC_FUN line to the top of 'special.c'.
(2) Add a line for translating the ascii name of the function into a function
pointer to the function 'spec_lookup' in 'special.c'.
(3) Write the spec-fun and add it to 'special.c'. Note that Merc special
functions take a single parameter, rather than the three parameters of
Diku. If you have an Ansi C compiler, you're protected against accidental
mismatches.
(4) Assign the spec-fun by writing an appropriate line into the #SPECIALS
section in an area file. Any number of mobs may have the same spec-fun.
=== The #$ section
The syntax of this section is:
#$
This section marks the end of an area file. If you concatenate several area
files into one, remember to delete the terminating '#$' from all but the last
file. Conversely, if you split area files, remember to terminate each new file
with a '#$'.
=== Meaning of Value Numbers by Item Type
In the values below, 'sn' is a spell, indexed by slot number. A zero or
negative sn means 'no spell'.
01 ITEM_LIGHT
value[0] unused
value[1] unused
value[2] hours of light available, 0 is dead, -1 is infinite
value[3] unused
02 ITEM_SCROLL
value[0] level
value[1] sn 1
value[2] sn 2
value[3] sn 3
03 ITEM_WAND
value[0] level
value[1] max charges
value[2] current charges
value[3] sn
04 ITEM_STAFF
value[0] level
value[1] max charges
value[2] current charges
value[3] sn
05 ITEM_WEAPON
value[0] unused
value[1] unused
value[2] unused
value[3] weapon type:
01 slice
02 stab
03 slash
04 whip
05 claw
06 blast
07 pound
08 crush
09 grep
10 bite
11 pierce
12 suction
08 ITEM_TREASURE
value[0] unused
value[1] unused
value[2] unused
value[3] unused
09 ITEM_ARMOR
value[0] unused
value[1] unused
value[2] unused
value[3] unused
10 ITEM_POTION
value[0] level
value[1] sn 1
value[2] sn 2
value[3] sn 3
12 ITEM_FURNITURE
value[0] unused
value[1] unused
value[2] unused
value[3] unused
13 ITEM_TRASH
value[0] unused
value[1] unused
value[2] unused
value[3] unused
15 ITEM_CONTAINER
value[0] weight capacity
value[1] flags: 1 closeable, 2 pickproof, 4 closed, 8 locked
value[2] key vnum
value[3] unused
17 ITEM_DRINK_CON
value[0] capacity
value[1] current quantity
value[2] liquid number (see 'liq_table' in const.c)
value[3] if non-zero, drink is poisoned
18 ITEM_KEY
value[0] unused
value[1] unused
value[2] unused
value[3] unused
19 ITEM_FOOD
value[0] hours of food value
value[1] unused
value[2] unused
value[3] if non-zero, food is poisoned
20 ITEM_MONEY
value[0] value in gold pieces
value[1] unused
value[2] unused
value[3] unused
22 ITEM_BOAT
value[0] unused
value[1] unused
value[2] unused
value[3] unused
23 ITEM_CORPSE_NPC
value[0] unused
value[1] unused
value[2] unused
value[3] unused
24 ITEM_CORPSE_PC
value[0] unused
value[1] unused
value[2] unused
value[3] unused
25 ITEM_FOUNTAIN
value[0] unused
value[1] unused
value[2] unused
value[3] unused
26 ITEM_PILL
value[0] level
value[1] sn 1
value[2] sn 2
value[3] sn 3
=== Slot Numbers
These slot numbers are used in magical objects to indicate spells. Save files
do not use slot numbers; they use names instead.
0 NULL
70 acid blast
1 armor
3 bless
4 blindness
5 burning hands
6 call lightning
63 cause critical
62 cause light
64 cause serious
82 change sex
7 charm person
8 chill touch
10 colour spray
57 continual light
11 control weather
12 create food
80 create spring
13 create water
14 cure blindness
15 cure critical
16 cure light
43 cure poison
61 cure serious
17 curse
18 detect evil
44 detect hidden
19 detect invis
20 detect magic
21 detect poison
22 dispel evil
59 dispel magic
23 earthquake
24 enchant weapon
25 energy drain
72 faerie fire
73 faerie fog
26 fireball
65 flamestrike
56 fly
83 gate
39 giant strength
27 harm
28 heal
53 identify
77 infravision
29 invis
58 know alignment
30 lightning bolt
31 locate object
32 magic missile
69 mass invis
74 pass door
33 poison
34 protection
81 refresh
35 remove curse
36 sanctuary
67 shield
37 shocking grasp
38 sleep
66 stone skin
40 summon
2 teleport
41 ventriloquate
68 weaken
42 word of recall
200 acid breath
201 fire breath
202 frost breath
203 gas breath
204 lightning breath
=== Booting and Testing Areas
When the Merc server starts, it reads a file named 'area.lst' in the current
directory. This file contains a list of all the area files to read in. To add
or delete areas, simply edit area.lst.
The server reads all of the area files into memory once at load time and then
closes them. Thus you can edit area files while the server is running.
Changes will take effect the next time the server boots. Because the server is
completely memory-based, zone resets are fast, too. (And paradoxically, moving
to a memory-based system allowed certain memory optimizations to be made,
cutting memory usage by 50% from Merc 1.0).
You can test areas by running Merc in a different directory with a different
'area.lst' file with new areas dropped into it. Setting up an appropriate
directory structure is an exercise for the student. (You DID say you're
running a mud because you wanted to learn more about system administration,
right?) Hint: you can run a program in another directory just by invoking its
full name: '../src/merc', for example.
The server reports syntax errors, including the area file name and a line
number. Take the line number with a grain of salt; some kinds of errors cause
the server to run on for quite a few lines before ultimately detecting the
error.
The server also reports semantic errors, such as references to non-existent
mobiles, objects, or rooms.
Error recovery is simply not possible without far more sophisticated input
parsing than we're willing to write. (Hey, feel free to write your own.)
Thus the server exits after reporting any error. Merc takes only a few seconds
to load, however, so it's quite practical to use the whole server as a syntax
checker.
=== Compressing the Area Files
It is possible to run Merc with a single combined, compressed area file.
Here's how to do this on a Unix system:
(1) In 'area.lst', remove the last line (the '$' line).
(2) Execute the command:
cat `cat area.lst` | compress > all_area.Z
(3) Edit 'area.lst' again. Insert a '-' at the beginning of every line.
Do not put any spaces between the '-' and the file name. Put the last
'$' line back at the end of the file.
(4) Edit 'startup'. Change the line:
../src/merc $port >&! $logfile
to:
zcat all_area.Z | ../src/merc $port >&! $logfile
(5) Test the changes so far. Merc should start up normally, although it
may take a few seconds longer to zcat everything.
Now you can remove all the original *.are files.
Notice that all of the compression and decompression takes place outside of the
Merc server. Thus, you can substitute any archiving program of your choice, as
long as it can write its output to standard output.
You can recover the original areas simply by running 'uncompress all_area.Z'
and dissecting them out of all_area.
From the server's point of view, when an area file name starts with '-', it
simply reads standard input for the area, terminating at '#$' as usual (but
without closing standard input). Diagnostic messages are given with the full
name (e.g. '-arachnos.are'), but the line number will be reported as zero.
You can freely mix areas from standard input with ordinary area files. Thus,
you could compress all the Merc standard zones into a file such as merc_area.Z,
prefixing them with '-' in 'area.lst'. Then you could add your own areas
anywhere in the file (beginning, middle, end, wherever your areas need to go),
and omit the '-' on the lines for your areas.
The server will take a little longer to load with compressed area files,
because 'zcat' needs time to run. This is offset by a reduction in time spent
opening disk files. After loading, the server has all of the area database in
memory and never rereads the files. Thus, there is zero performance impact
on server operation after loading.

122
doc/class.txt Normal file
View file

@ -0,0 +1,122 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Classes
The central organizing table for classes is class_table, which is an array of
type 'struct class_type' (defined in 'merc.h') and is defined in 'const.c'.
Mobs have class 0, and players have classes 0 through MAX_CLASS-1.
The fields of class_table are:
char * who_name;
This three-letter name is used for the 'who' listing. It's also used
for the list of classes shown to new characters for selecting a class,
and for matching the player's input in selecting a class.
sh_int attr_prime;
This attribute is initialized to 16 for new chars of this class. It
costs only three practices to train one's prime attribute, versus five
practices for any other attribute. In addition, characters may
increase their prime attribute (only) over 18 by using magic items.
sh_int weapon;
This object (vnum) is given to new characters of this class for their
first weapon.
sh_int guild;
This room (vnum) is off limits to characters of other classes.
sh_int skill_adept;
This is the maximum level to which a character of this class may train
a skill or spell.
sh_int thac0_00; /* Thac0 for level 0 */
sh_int thac0_32; /* Thac0 for level 32 */
These are thac0's (To Hit Armor Class 0) for a level 0 character and a
level 32 character of this class. Thac0 for any particular level is
computed by linear interpolation.
sh_int hp_min; /* Min hp gained on leveling */
sh_int hp_max; /* Max hp gained on leveling */
bool fMana; /* Class gains mana on level */
The fields hp_min and hp_max are the minimum and maximum hit points
gained on advancing a level (in addition to the constitution bonus).
If fMana is true, than the class gains mana when leveling.
=== Other class-specific tables
(1) In const.c, skill_table contains the level needed for each class to use a
particular skill or spell. If the class cannot use that skill or spell,
the level needed is set to 37, so that immortals (angels and above) can use
it. This table is indexed first by sn (skill/spell number) and then by
class.
(2) In const.c, title_table contains the titles, indexed by class, then by
level, then by sex. There are two titles for each class at each level.
(3) In act_comm.c, pose_table contains the pose messages, indexed first by
level, and then by class. There are two messages for each class at each
level, up to a certain maximum (where we got tired of writing messages).
=== Adding a new class
Here's how to add a new class:
(1) Increment 'MAX_CLASS' in 'merc.h'
(2) Add a new entry to 'class_table' in 'const.c'.
(3) Add sn level numbers to 'skill_table' in 'const.c' for the new class. Set
the level to 37 for all skills or spells which the class is unable to use.
(4) Add an entire new block of titles to 'title_table' in 'const.c'.
(5) Add new lines to 'pose_table' in act_comm.c. You need two lines at each
level for that class. To keep the 'pose' messages from looking like
'emote' messages, avoid putting the name of the character (the '$n'
construct) at the beginning of the line.
=== Immortal Levels
Here are the immortal levels:
36 Hero This is the highest level ordinary players can reach by
accumulating experience points. Heros and heroines can
participate in 'immtalk' and read notes addressed to
'immortal'. They no longer receive experience points.
37 Angel Immortals at this level can observe most aspects of the game,
but have very few active commands. One command they do have
is 'switch' so that they can help run quests.
38 Deity Immortals at this level have all the commands needed to affect
game elements within the game, such as 'mload', 'mset',
'oload', and 'oset'.
39 Supreme Immortals at this level have site and connection level
commands, such as 'reboot' and 'shutdown'. In fact, this level
has access to all immortal commands except 'advance'.
40 God Immortals at this level have 'advance'.

115
doc/command.txt Normal file
View file

@ -0,0 +1,115 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Commands
The central organizing table for skills and spells is cmd_table, an array
of type 'struct cmd_type', and is defined in 'interp.c'.
The fields of cmd_table are:
char * name;
The name of the command. Command lookup is by partial matching on the
name; the first match (which also meets level restrictions) is used.
DO_FUN * do_fun;
The function for this command. A 'do_fun' takes two arguments: the
character who is issuing the command and the rest of the argument
string after the command name.
sh_int position;
The minimum position for using this command.
sh_int level;
The minimum level for using this command. This is usually used for
restricting certain commands to immortals.
sh_int log;
The type of logging to perform. LOG_NORMAL commands are logged just
when the player is logged. LOG_ALWAYS commands are always logged.
LOG_NEVER commands are never logged, even if the player is logged.
=== How to Add a Command
(1) Add a line for the command in 'cmd_table' in 'interp.c'.
(2) Add a 'DECLARE_DO_FUN' line for the command function to 'merc.h'.
(3) Write the function and put it into an appropriate 'act_*.c' file.
(4) Write a help section for the function. See 'help.are' for the format of
help entries. We suggest you start your own file of customized help rather
than adding into 'help.are'. This will make it easier for you to upgrade
to future releases of Merc (which will have upgraded 'help.are' files).
Merc supports as many help files as you want.
That's ALL there is to it!
=== Social Commands
Social commands add to the atmosphere of the game. The social commands are
contained in 'social_table' in 'interp.c'. The fields of this table are:
char * name;
The name of the social command.
char * char_no_arg;
The message sent to the character when no argument is given.
char * others_no_arg;
The message sent to others when no argument is given.
char * char_found;
The message sent to the character when a victim is found.
char * others_found;
The message sent to others when a victim is found.
char * vict_found;
The message sent to the victim when a victim is found.
char * char_auto;
The message sent to the character when the victim IS the character.
char * others_auto;
The message sent to others when the victim IS the character.
All of these messages are 'act' messages and may use any '$' sequences (the
'act' function is documented in 'act.txt'). If the command is not found in the
regular command table, the function 'check_social' looks in 'social_table' for
a match. This is the last stop before rejecting the command.
Socials without arguments, such as 'hop', may have NULL for the strings sent
when arguments are present.
=== How to Add a Social Command
(1) Write a new section into 'social_table' in 'interp.c' with the eight
messages in it. The sections need not be alphabetized.
That's ALL there is to it.

183
doc/contrib.txt Normal file
View file

@ -0,0 +1,183 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Disclaimer
If your name isn't in here, and you think it should be; or if your name IS
in here and you prefer a different name or anonymity; then just e-mail us
and we'll fix it in the next release.
=== Contribution Policy
We welcome contributions to Merc.
You can send us areas, spells, skills, bug reports, bug fixes, code, ideas,
comments on our documentation, interesting stories, or anything else, to any of
our addresses above.
We particularly would like to get copies of 'bugs.txt', 'ideas.txt', and
'typos.txt' from any site running a Merc mud.
If we use your contribution, we will credit you for it in this file and in the
source files. The 'areas' command lists authors within the game, and 'help
merc' credits major contributions as well.
Merc is devoted to open release. Once we accept a contribution, it will
become available to the entire mud community. Also, once we accept a
contribution and integrate it into Merc, we will not remove it later if you
change your mind.
We usually rework code contributions into our own style, just as we've reworked
100% of our released code into a consistent style.
You are welcome to use any element of Merc in your own mud, as long as you
follow the terms in 'license.doc' and 'license.txt'. If you take things from
Merc we'd appreciate e-mail from you.
=== Mailing List
Thanks to Zrin for administering the Merc mailing list. You can join the list
by sending e-mail to merc-request@kpc.com.
=== The First Contributions
Merc Mud is based on Diku Mud, with Copper and Alfa enhancements.
When we first started, Impy of Fajita Mud answered a lot of our newbie-coder
questions.
Frag, Tin, Razor, Jordan, Tre, and Matrix play-tested early Merc code.
The Free Software Foundation and DJ Delorie wrote our development tools, and
distribute them for free, with source. You can ftp them from prep.ai.mit.edu
and grape.ecs.clarkson.edu.
=== New Area Contributions
Vamplestat reworked and extended Miden'nir.
Nirrad contributed the Fire Newt area.
Tyrst contributed Wyvern Tower.
Doctor contributed Galaxy.
Raff contributed Dwarven Catacombs, Dangerous Neighborhood, and Elemental
Canyon.
PinkF contributed the Mob Factory.
Chris Boggs made the Keep of Mahn-Tor available for public distribution,
and gave us permission to use it in Merc.
Aod and Cauchy of Generic Mud gave us permission to use Smurf Village, Gnome
Village, Dwarven Day Care Center, Old Marsh, Draconia, and Olympus.
John Brothers of Silly Mud gave us permission to use Silly areas. Although we
haven't taken any yet, we appreciate having 2 megabytes of areas to draw on!
Glop contributed Mega-City One (from the Judge Dredd comic books).
=== Code and Idea Contributions
Zrin contributed an 'auto-exit' function.
Alander contributed the 'stats over 18 from magic items', as well as the
new 'who', 'visible', 'commands' commands and some shop code. We first
saw a donation pit on Alander's 'Rivers of Mud'.
Grodyn contributed the 'configure' command.
Diavolo contributed the gruesome 'death_cry' function.
Many other imps and players gave us hundreds of suggestions, some of which are
now realized. Thanks to you all!
Aod and Cauchy of Generic gave us permission to use Generic code.
John Brothers of Silly gave us permission to use Silly code. Although we
haven't used any Silly code yet, we appreciate having it available.
Onethumb, Baka, and Penn of the Drool Co. sent us a long list of ideas,
which we've included here as 'drool.txt'.
=== Porting Contributions
Hind and Quin (not the original Quinn of Diku, another Quin) helped on the
Ultrix port.
Vic contributed the Linux port and 386/BSD ports.
Diavolo contributed the RS/6000 port, including helping to track down a code
generation bug in the AIX compiler.
Alander helped on the NeXT port.
Shephane Haechler and Frederic Benedetto contributed the Hp/UX port, which is
one of the more painful machines we've encounterd.
Alan Drew contributed the Mips Risc/OS port.
Trienne contributed the makefile changes for Solaris 2.1.
Oleg contributed the Macintosh port.
Jdpierce contributed the Interactive Systems changes.
=== Bug Reports and Bug Fixes
Mud Lite, Vego Mud, Final Mud, Rivers of Mud, Ruhr Mud, Chase Mud, and
Mystic Realms sent us their 'bugs.txt', 'ideas.txt', and 'typos.txt' files.
These were VERY helpful and we ask that all Merc-based muds e-mail us these
files from time to time.
While porting Merc to Linux, Vic isolated some mystifying memory management
problems in the base code.
Abaddon proofread our comm.c and reported several bugs and weak spots.
Of course, any remaining problems are ours, not his.
Kalgen reported bugs in the 2.0 Alpha release.
Lincoln Myers found an array-read overrun in 'do_pose' in 2.0 Beta.
Grodyn of Mystic Realms sent us several high-quality logs, core dump stack
traces, and bug reports for 2.0 Beta. Many other people, including Loki,
also sent us good beta bug reports.
Morgenes found and fixed the nasty 'aligned object drop corruption'
in equip_char.
Rivit play-tested the post-2.0-Beta version.
Alander of Rivers of Mud has published *many* bug fixes and changes for
2.0 on the Merc list, which we've picked up.
Tony Chamberlain published a correct, recursive implementation of
get_obj_number.
Tuan Doan pointed out a bug in 'check_parry' and 'check_dodge',
as well as some other rough edges.
Alex found the right fix for the act() problems with channels,
the 'rstat' problem with room exits, and some other bugs.

118
doc/drool.txt Normal file
View file

@ -0,0 +1,118 @@
[Note from Furey: the following ideas were e-mailed to us by the Drool
Company. We don't have time to do anything with them ... but if you do,
feel free! Just please acknowledge the source. Thanks Droolers!]
Merc 2.0 ideas- from Onethumb(Sith), Baka, and Penn
the original DROOL CO!
Thief ideas:
-* small chance to critical hit when backstabbing...(insta-kill)
restrict crit hit to monsters equal or lower level than thief
Warrior ides:
-* ability to wield two weapons at a time...
-* make bash better...
-* anti-magic zones...
-* warcry: self-bless effect...
-* specialize in certain weapons...(this might be hard to code)
Cleric ideas:
-* more spells-
true seeing- sees secret doors and hidden thieves
group heal- heals everyone in the room
-* spend pracs on a multple attack (dual)...
-* should NOT get more xp than other char classes..(even Penn agrees)
Magic-User:
-* more spells, more spells, more spells-
find familiar- extra mana, hp...if it stays alive..
fireball- make it into an area affect spell...
power word kill- VERY high level- insta-kill monsters
of levels below the caster-possibly 5 or more levels
below
chain lightning- lightning hits more than one opponent (or
friend)...
wish- ... NOT!
conjuer elemental- make this this WORK!
prismatic sphere- high-level (28th, mabye)-- offers protection
from breath, ect..
polymorph- change shape into a lower level monster's...keep
hp's and AC...could couse problems with other players
meteor swarm- area affect- high-level...
General ideas:
make all Drool Co. members GODS!--- NOT!
-* Guilds would be cool- special abilities (Paladins, Necromancers)
-* restrict groups to alignment(good cannot group with evil)...
-* Martial Arts- cost more for Mages, Clerics than for Warriors and
Thieves...
-* MORE MOBS!, MORE AREAS!, MORE MAGIC ITEMS!
- better range of mobs for 13-18 level players...
- better range of mods for 27+ level players...
- a new city would be cool...
- better items to hold, intead of the diploma...
(+AC, +HP, +mana...)
- spiked shield- does extra dmg...
- more mana stuff...
- hirable mercanaries who will follow you and carry stuff...
- castles(room) for players at high levels- players can recall
to it and store items temporarily...
castles cause chars to heal and regain mana
at double the normal rate...
- races....multi-class for non-humans...level restrict...
- random abitlies...cant see stats till 15th level
- verify feature for new players- auto e-mail and reply to prevent multi playing...
- AUTO-REBOOT! - seperate program for the mud..
so the mud is never down for more then a couple of
hours...
- Make money worth something!- make quality items for sale
at really high prices... possibly the char could
buy a castle instead of leveling to get it...(50 mil?)
- IF there is the castle purchace option- chars must own a castle before they can become immort...
- gossip and auction chanels are good...
- get rid of recall...buy scrolls or recall items(more than
one recall)...
- WE NEED A BETTER BAR!
screwdrivers, magaritas, vodka sours, lemonballs
AAAAAAAHHHH!
- no-trip...players can either prac a no-trip skill or get
a no-trip item(ring of free action)...
- class restricted eq....
- allow players to rename thier own eq...
you could do a lot with this...
make the eq exclusive to the player
once he renames it--(this would cost
money-the armorer or weaponsmith could
do it)...
- setmin and setmout (for chars)- set what other players
see when the char walks in or out...this
could also be done for money(small amount)
I think that's all.....we might come up with a few more later...
The WhooPIe Drool Co.!
Onethumb-...Sith
Baka-...Orrik
Penn-...Ender
Merry X-mas!....well....
later
onethumb!

358
doc/hacker.txt Normal file
View file

@ -0,0 +1,358 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== 'I'm running a Mud so I can learn C programming!'
Yeah, right.
The purpose of this document is to record some of our knowledge, experience and
philosophy. No matter what your level, we hope that this document will help
you become a better software engineer.
Remember that engineering is work, and NO document will substitute for your
own thinking, learning and experimentation.
=== How to Learn in the First Place
(1) Play with something.
(2) Read the documentation on it.
(3) Play with it some more.
(4) Read documentation again.
(5) Play with it some more.
(6) Read documentation again.
(7) Play with it some more.
(8) Read documentation again.
(9) Get the idea?
The idea is that your mind can accept only so much 'new data' in a single
session. Playing with something doesn't introduce very much new data, but it
does transform data in your head from the 'new' category to the 'familiar'
category. Reading documentation doesn't make anything 'familiar', but it
refills your 'new' hopper.
Most people, if they even read documentation in the first place, never return
to it. They come to a certain minimum level of proficiency and then never
learn any more. But modern operating systems, languages, networks, and even
applications simply cannot be learned in a single session. You have to work
through the two-step learning cycle MANY times to master it.
=== The Environment
Computer: the big or little box that you're using to run Merc. Computers come
from a _manufacturer_ and have a _model_ name. Here is a list of common
manufacturers and models that you're likely to encounter:
Manufacturer Model
------------ -----
Sun Sun-2
Sun Sun-3
Sun Sun-4
DEC Vax 5000
DEC Vax 5900
IBM RS/6000
NeXT NextCube
Sequent Symmetry
Sequent Balance
As far as hardware goes, Merc will run on any 32-bit hardware.
Operating system: the lowest level program running on your computer. Most
common computers run Unix or some variant of it, such as SunOS, Ultrix,
AIX, Mach, or Dynix. Notice that many of these variants end in 'IX'.
The two major 'families' of Unix are Berkeley Unix (developed at the
illustrious University of California, Berkeley) and System 5 Unix
(developed by Bell Laboratories, the progenitors of Unix).
The most common non-Unix operating system is VMS (a proprietary operating
system from DEC for their VAX computers). In the personal computer world,
you'll find MS-DOS, OS/2 for IBM PC's and compatibles, and MacOS for Apple
Macintosh'es.
GET THIS STRAIGHT: 'VAX' IS NOT AN OPERATING SYSTEM. It's the name of a
family of computers from DEC. There are plenty of Vax'es running VMS, and
there are even more Vax'es running Berkeley Unix or Ultrix. The Vax'es
running Unix have a lot more in common with other machines running
Unix than they have with Vax'es running VMS.
As far as operating systems go, Merc will run on Unix or Unix variants with
TCP/IP networking compatible with Berkeley Unix. It will also run, in
single-user mode only, on MS-DOS. With a reasonable amount of work, Merc
can be ported to any operating system that provides TCP service for telnet
connections.
Languages: Merc is written in C. ANSI (the American National Standards
Institute) has a specification for the C language, and Merc is written in
Ansi Standard C.
The most popular compiler for Ansi Standard C is the Gnu 'gcc' compiler
produced by the Free Software Foundation. It's available by anonymous
ftp from prep.ai.mit.edu. Merc compiles just fine with Gcc 1.38, so
you can probably use 1.42 and skip the much larger 2.X versions.
You don't have to use gcc. IBM RS/6000's running the AIX operating system
come with an Ansi C compiler already. So do NeXT machines (the standard
'cc' on NeXT happens to be the Gnu C compiler). Any Ansi compiler will
work.
Unfortunately, there are still many machines out there without an Ansi
standard C compiler. (Sun is the worst offender in this regard). You
can attempt to compile Merc with a non-Ansi (traditional) C compiler by
using the 'mktrad' script. See trad.txt for details.
If you don't know what the manufacturer and model of your computer is, as well
as its operating system, and whether the C compiler is Ansi or non-Ansi, then
you need to find out.
=== Basic Unix Tools
'man' -- gives you online manual pages
'grep' -- stands for 'global regular expression print'
'vi'
'emacs'
'jove' -- use whatever editor floats your boat
but learn the hell out of it
you should know EVERY command in your editor
'ctags' -- makes 'tags' for your editor
allows you to goto functions by name in any source file
'>'
'>>'
'<'
'|' -- input and output redirection
get someone to show you, or dig it out of 'man csh'
These are the basic day-in day-out development tools. Developing without
knowing how to use ALL of these well is like driving a car without knowing how
to change gears.
=== Debugging: Theory
Debugging is a science. You formulate a hypothesis, make predictions based on
the hypothesis, run the program and provide it experimental input, observe its
behavior, and confirm or refute the hypothesis.
A good hypothesis is one which makes surprising predictions which then come
true; predictions that other hypotheses don't make.
The first step in debugging is not to write bugs in the first place. This
sounds obvious, but sadly, is all too often ignored.
If you build a program, and you get ANY errors or ANY warnings, you should fix
them before continuing. C was designed so that many buggy ways of writing code
are legal, but will draw warnings from a suitably smart compiler (such as 'gcc'
with the '-Wall' flag enabled). It takes only minutes to check your warnings
and to fix the code that generates them, but it takes hours to find bugs
otherwise.
'Desk checking' (proof reading) is almost a lost art in 1993. Too bad. You
should desk check your code before even compiling it, and desk-check it again
periodically to keep it fresh in mind and find new errors. If you have someone
in your group whose ONLY job it is to desk-check other people's code, that
person will find and fix more bugs than everyone else combined.
One can desk-check several hundred lines of code per hour. A top-flight
software engineer will write, roughly, 99% accurate code on the first pass,
which still means one bug per hundred lines. And you are not top flight.
So ... you will find several bugs per hour by desk checking. This is a very
rapid bug fixing technique. Compare that to all the hours you spend screwing
around with broken programs trying to find ONE bug at a time.
The next technique beyond desk-checking is the time-honored technique of
inserting 'print' statements into the code, and then watching the logged
values. Within Merc code, you can call 'printf' or 'fprintf' to dump
interesting values at interesting times. Where and when to dump these values
is an art, which you will learn only with practice.
If you don't already know how to redirect output in your operating system, now
is the time to learn. On Unix, type the command 'man csh', and read the part
about the '>' operator. You should also learn the difference between
'standard output' (e.g. output from 'printf') and 'error output' (e.g. output
from 'fprintf').
Ultimately, you cannot fix a program unless you understand how it's operating
in the first place. Powerful debugging tools will help you collect data, but
they can't interpret it, and they can't fix the underlying problems. Only you
can do that.
When you find a bug ... your first impulse will be to change the code, kill the
manifestation of the bug, and declare it fixed. Not so fast! The bug you
observe is often just the symptom of a deeper bug. You should keep pursuing
the bug, all the way down. You should grok the bug and cherish it in fullness
before causing its discorporation.
Also, when finding a bug, ask yourself two questions: 'what design and
programming habits led to the introduction of the bug in the first place?'
And: 'what habits would systematically prevent the introduction of bugs like
this?'
=== Debugging: Tools
When a Unix process accesses an invalid memory location, or (more rarely)
executes an illegal instruction, or (even more rarely) something else goes
wrong, the Unix operating system takes control. The process is incapable of
further execution and must be killed. Before killing the process, however, the
operating system does something for you: it opens a file named 'core' and
writes the entire data space of the process into it.
Thus, 'dumping core' is not a cause of problems, or even an effect of problems.
It's something the operating system does to help you find fatal problems which
have rendered your process unable to continue.
One reads a 'core' file with a debugger. The two most popular debuggers on
Unix are 'adb' and 'gdb', although occasionally one finds 'dbx'. Typically
one starts a debugger like this: 'adb merc' or 'gdb merc core'.
The first thing, and often the only thing, you need to do inside the debugger
is take a stack trace. In 'adb', the command for this is '$c'. In gdb,
the command is 'backtrace'. The stack trace will tell you what function your
program was in when it crashed, and what functions were calling it. The
debugger will also list the arguments to these functions. Interpreting these
arguments, and using more advanced debugger features, requires a fair amount of
knowledge about assembly language programming.
If you have access to a program named 'Purify' ... learn how to use it.
=== Profiling
Here is how to profile a program:
(1) Remove all the .o files and the 'merc' executable:
rm *.o 'merc'
(2) Edit your makefile, and change the PROF= line:
PROF = -p
(3) Remake merc:
make
(4) Run merc as usual. Shutdown the game with shutdown when you have run long
enough to get a good profiling base. If you crash the game, or kill the
process externally, you won't get profiling information.
(5) Run the 'prof' command:
prof merc > prof.out
(6) Read prof.out. Run 'man prof' to understand the format of the output.
For advanced profiling, you can use 'PROF = -pg' in step (2), and use the
'gprof' command in step 5. The 'gprof' form of profiling gives you a report
which lists exactly how many times any function calls any other function. This
information is valuable for debugging as well as performance analysis.
Availability of 'prof' and 'gprof' varies from system to system. Almost every
Unix system has 'prof'. Only some systems have 'gprof'.
=== Schedule versus Features versus Quality
Now for a few words on project management.
Sooner or later, almost any project faces a trade-off between schedule,
features, and quality. Consider a student writing a term paper on the last
night. He has three unpalatable choices: he can turn it in late (miss the
schedule). He can turn in a shorter paper that doesn't cover everything
(reduce the features). Or he can churn out gibberish (lower the quality).
Similarly in a software project, one often has a choice between making the
release date, or dropping features, or shipping everything on time and
hoping that it works (it usually doesn't).
The most important thing to realize about this decision is that it IS a
decision. One can't get out of it by hoping that some miracle will occur.
If you don't react consciously, then external circumstances will drive the
decision.
Ok, so suppose you are faced with the trade-off and go for a schedule slip.
Don't take a small slip ... take a big impressive slip. If you say
'I'll just fix this one problem and finish ASAP', then likely you will
wish you had taken just a little more time later. If you say 'I think I
need another day, so I'll slip by a week', then it's much more likely
that what you'll have at the end of the week will do the job. It's better
to slip a large block of time once then to slip day-by-day or hour-by-hour
repeatedly.
If you go for dropping features, again, carve off a big hunk. Don't be
timid and pretend that you're going to do that work 'if you just get a
little spare time.' That feature of your project is GONE, exploit the
lessened requirements for all the savings you can!
I can't offer much advise on how to reduce quality, because that's always
my last choice for what to drop on a project.
=== Sleeping
Simple and obvious, but true ... engineering takes an alert mind.
It's very easy, very seductive, to throw a lot of consecutive hours at a
problem. One can get into a 'flow' state where one's mind becomes filled
with the problem, and the work just pours out, hour after hour. Many
writers report that they watch a story take place, and just transcribe
what they see, pounding out page after page of text. Many software
engineers have experienced a similar feeling, where the code appears
to arise spontaneously as they watch themselves type.
I believe most real work gets done in this state.
My experience, however, is that the 'flow' period can end subtly and
gradually. Without ever noticing a change, I notice that new work isn't
flowing out of my hands anymore, that I'm spending lots of time fixing
up mistakes I made just a few moments ago. Instead of ideas flashing
confidently through my mind, doubts and questions arise.
At this point there is a temptation to throw some more hours at the problem.
'I'm here, and I was getting a lot of work done, why don't I just stay all
night until I figure this out?' This is a trap! Don't do it!
Instead, I suggest: go home, eat, shower, sleep, put yourself back together
again. Resume the next day. While you sleep, your mind will work on the
problem anyways, and you'll probably wake up with new ideas. You'll get
more done between 10:00 am and 2:00 pm the next day, then if you stayed up
between midnight and 10:00 am.
There is a problem with this strategy: remotivating yourself in the morning.
If the project is one of your choice, that's usually not a problem. If it's
something you have to do but don't enjoy, you have to balance the remotivation
problem versus the very low productivity of working without sleep.
=== Books for Serious Programmers
Out of all the thousands of books out there, three stand out:
Kernighan and Plaugher, _The Elements of Programming Style_.
Kernighan and Ritchie, _The C Programming Language_.
Brooks, _The Mythical Man Month_

103
doc/license.doc Normal file
View file

@ -0,0 +1,103 @@
/* ************************************************************************
* Copyright (C) 1990, 1991 *
* All Rights Reserved *
************************************************************************* */
DikuMud License
Program & Concept created by
Sebastian Hammer
Prss. Maries Alle 15, 1
1908 Frb. C.
DENMARK
(email quinn@freja.diku.dk)
Michael Seifert
Nr. Soeg. 37C, 1, doer 3
1370 Copenhagen K.
DENMARK
(email seifert@freja.diku.dk)
Hans Henrik St{rfeldt
Langs} 19
3500 V{rl|se
DENMARK
(email bombman@freja.diku.dk)
Tom Madsen
R|de Mellemvej 94B, 64
2300 Copenhagen S.
DENMARK
(email noop@freja.diku.dk)
Katja Nyboe
Kildeg}rdsvej 2
2900 Hellerup
31 62 82 84
DENMARK
(email katz@freja.diku.dk)
This document contains the rules by which you can use, alter or publish
parts of DikuMud. DikuMud has been created by the above five listed persons
in their spare time, at DIKU (Computer Science Instutute at Copenhagen
University). You are legally bound to follow the rules described in this
document.
Rules:
!! DikuMud is NOT Public Domain, shareware, careware or the like !!
You may under no circumstances make profit on *ANY* part of DikuMud in
any possible way. You may under no circumstances charge money for
distributing any part of dikumud - this includes the usual $5 charge
for "sending the disk" or "just for the disk" etc.
By breaking these rules you violate the agreement between us and the
University, and hence will be sued.
You may not remove any copyright notices from any of the documents or
sources given to you.
This license must *always* be included "as is" if you copy or give
away any part of DikuMud (which is to be done as described in this
document).
If you publish *any* part of dikumud, we as creators must appear in the
article, and the article must be clearly copyrighted subject to this
license. Before publishing you must first send us a message, by
snail-mail or e-mail, and inform us what, where and when you are
publishing (remember to include your address, name etc.)
If you wish to setup a version of DikuMud on any computer system, you
must send us a message , by snail-mail or e-mail, and inform us where
and when you are running the game. (remember to include
your address, name etc.)
Any running version of DikuMud must include our names in the login
sequence. Furthermore the "credits" command shall always cointain
our name, addresses, and a notice which states we have created DikuMud.
You are allowed to alter DikuMud, source and documentation as long as
you do not violate any of the above stated rules.
Regards,
The DikuMud Group
Note:
We hope you will enjoy DikuMud, and encourage you to send us any reports
on bugs (when you find 'it'). Remember that we are all using our spare
time to write and improve DikuMud, bugs, etc. - and changes will take their
time. We have so far put extremely many programming hours into this project.
If you make any major improvements on DikuMud we would be happy to
hear from you. As you will naturally honor the above rules, you will receive
new updates and improvements made to the game.

46
doc/license.txt Normal file
View file

@ -0,0 +1,46 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Copyright and License Terms
Diku Mud is copyright (C) 1990, 1991 by Sebastian Hammer, Michael Seifert,
Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. Their license agreement
is in the file 'license.doc'.
Merc Diku Mud is a derivative of the original Diku Mud and is subject to their
copyright and license agreement. Merc Diku Mud contains substantial
enhancements to Diku Mud. These enhancements are copyright 1992, 1993 by
Michael Chastain, Michael Quan, and Mitchell Tse.
In order to use Merc you must follow the Diku license and our license. The
exact terms of the Diku license are in the file 'license.doc'. A summary of
these terms is:
-- No resale or operation for profit.
-- Original author's names must appear in login sequence.
-- The 'credits' command must report original authors.
-- You must notify the Diku creators that you are operating a Diku mud.
Our license terms are:
-- Copyrights must remain in original source.
-- 'Help merc' must report our help text, as shipped.
Notice that our license terms don't include keeping our names in the login
sequence. If you want to keep a line in there referring to Merc, or referring
to us by name (Furey, Hatchet, and Kahn), we'd appreciate that, but we don't
require it. But you must keep the original Diku authors in the login sequence.
If you do not follow these license terms, we will ask you to comply. If that
doesn't work, then we will talk to your system administrators (not about your
running a mud, but on the grounds that you're using our copyrighted software
without permission).
These are very generous terms for any software. If you don't want to accept
them, feel free to run some other software, or write your own.

137
doc/memory.txt Normal file
View file

@ -0,0 +1,137 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Memory Management Overview
Merc contains the following memory regions: run file memory; stack; string
space; and permanent space. The approximate sizes of these regions are:
Run file memory 300 k
Stack 20 k
String space 1020 k
Permanent space 1020 k
TOTAL 2360 k
=== Run File Memory
The merc executable file has about 256k of code, 8k of initialized data, and
32k of uninitialized data. This was measured on a Sun 4 running SunOS 4.1.3
with gcc version 2.3.3.
This size is small compared to the total size, and there is little you can do
to change it.
=== Stack
We have never measured stack usage, but estimate it's somewhere between 10k and
30k. Merc has a wide, shallow calling tree. The largest consumers of stack
memory are local buffers of size MAX_STRING_LENGTH.
If you port Merc to a machine with 64k or less of stack, you should instrument
your object code with stack-usage measurements. Most compilers for machines in
this range have an option to do this.
=== String Space and fread_string()
At boot time, the function fread_string() is used to read in ~-delimited
strings from area files. These strings are stored into string space. After
all of the area files are read in, string space is read-only for the duration
of the program.
String space is allocated once on bootup and is not expandable. As
distributed, Merc 2.1 uses 1024k of string space. You can lower or raise
this number by editing the value of 'MAX_STRING' in 'db.c'.
Duplicate strings are stored only once into string space; hashing is used to
achieve this. The hash code for a string is simply its length. Each string in
string space is prefaced with a backpointer to the previous string with the
same hash code. (Aliasing through a union is needed to read and write these
pointers, because they can start at any byte boundary, and thus are
misaligned).
When fread_string() reads a new string, it creates the string at the end of
string space. It then finds the first hash pointer for that length and follows
the thread of hash pointers, looking for an already existing string with the
same contents. Strings in the hash chain are checked newest-first, which
benefits from the usual construction of area files, where duplicates are
usually duplicates of something seen recently.
If fread_string() finds that the new string is a duplicate, it simply discards
the new string and returns a pointer to the existing string. If the string is
new, it leaves it at the end of string space, fills in the new hash pointers,
and returns the new string.
After area-file loading is over, fread_string is also used to read player
files. In this case, new strings are not appended to string space, but instead
are simply handed to str_dup(). Thus the amount of string space used is fixed
at area-file loading time.
The functions str_dup() and free_string() take advantage of string space. If a
string being duplicated is in string space, str_dup() simply returns the same
pointer. If a string being freed is in string space, free_string() simply does
nothing. This strategy not only saves megabytes of memory through string
re-use, but also saves processor time as well.
Thus a cheap method is needed for deciding whether a given string is in string
space. This is one reason why strings are stored in one contiguous region of
size MAX_STRING. (The hash chains, however, would still work with
noncontiguous allocation).
Collecting all strings into one region has another advantage: locality of
reference. Most strings are unused most of the time. Because they are not
interspersed with other dynamically allocated memory, a virtual memory
operating system can page out almost all of the string space without affecting
performance.
After boot time the unused end of string space is wasted. This amounts to
about 160k in Merc 2.1. On a VM system this space is unused space is paged
out quickly, so it doesn't hurt to leave it alone. However, you can recover
this space easily by lowering MAX_STRING. If perchance you set MAX_STRING too
low you will get a boot-time error, but never any operational errors.
If you add a lot of areas you may need to increase MAX_STRING. Again, Merc
will tell you when you've run out.
=== Permanent space
This space holds everything else: all of the area file non-string data; all of
the created mobiles and objects; descriptor and player character structures;
you name it.
This space is dynamically allocated from calloc() in large blocks, which are
carved up and handed out as needed by alloc_perm(). As distributed, Merc 2.1
uses about 1024k of permanent space.
Unlike string space, permanent space grows on demand; alloc_perm() calloc's and
carves up as many blocks as needed as the game runs.
You can adjust the block size by changing MAX_PERM_BLOCK in 'db.c'. Adjustment
will have only a minor effect on space and time usage. If you port Merc to a
new system with a 64k or 32k limit on calloc() size, you could simply change
MAX_PERM_BLOCK to the largest calloc'able block on your system.
Merc never calls free() to return memory. Instead, memory is recycled for
future use. This has two advantages: it's faster to recycle a block than to
call free(), and it's faster to allocate a block from a free list than to
allocate one from calloc() or alloc_perm(). Most of the structure types have
their own free lists: char_free, obj_free, affect_free, et cetera.
Variable-sized blocks don't fit the per-structure-type free-list model. The
functions alloc_mem() and free_mem() manage blocks of arbitrary size. They
actually work by maintaining fixed-size lists for just a few supported sizes
and rounding requests up to a supported size. This is extremely fast; because
there are so few variable-sized blocks, the space penalty is inconsequential.

260
doc/new.txt Normal file
View file

@ -0,0 +1,260 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== What's new in 2.1
2.1 is a maintenance release, and contains mainly bug fixes and
contributions after 2.0.
Affects in player files are stored with skill/spell names now, rather
than sn's. Old 2.0 player files with numbers are accepted and work
fine as long as 'skill_table' in const.c doesn't change.
The 'list' command takes an optional argument.
Several small problems, and one memory corruption, related to voided
characters have been fixed.
'Check_parry' and 'check_dodge' now use the victim's level
rather than attacker's level for base percentage. (Oops!)
The 'oload' command takes an optional level number.
Container object numbers work now.
Saving while fighting now works properly.
Pets and charmed creatures no longer scavenge.
Immortals have no carry limit or weight limit.
The 'compare' command has a one-argument form now.
The channel code is modular now, but not table-driven yet. Some of the
channel flags have changed, so players will need to reconfigure their
channels. Channels no longer pass user input as format strings to 'act'.
The mysterious port-binding bug is fixed.
Merc no longer uses the host system random generator, using its own instead
(the Mitchell-Moore algorithm from Knuth Volume 2).
NPC's no longer steal from immortals.
The anti-corpse-looting code now simply prohibits looting corpses of people in
your group, rather than giving a flag. Similarly, killing charmed creatures is
simply prohibited rather than flagged (although murdering them is allowed).
Players were getting flagged too easily by accident.
The telnet GA option is now configurable, and the default is off.
There is a donation pit at the altar.
No-exit rooms are automatically given the no-mob attribute.
Eq level randomization is a little more random.
There is a new 'socials' command, analogous to 'commands' and 'wizhelp'.
Corpse sacrificing no longer gives experience points, not even 1.
Non-prime attributes may raise as high as 20 with magical aid. The 18
training limit is still in effect.
Fleeing and recalling don't cost as many xp.
=== What was new in 2.0
Many of the changes from 2.0 Beta to 2.0 were contributed by our beta testers.
See 'contrib.txt' for acknowledgements.
Several new platforms are supported.
The 'startup' script now works on many more Unix systems.
Containers are back.
Memory management has been redone (again). Almost all of the static limits
from 1.0 and 2.0 Beta are gone, with neglible performance loss; memory use is
slightly less than 2.0 Beta.
New and improved mortal commands: 'commands' to list all commands; 'configure'
to configure 'brief', 'compact', the 'auto' stuff, et cetera; a new 'who'
command with lots of options.
New and improved immortal commands: 'slookup' to find sn's and slot numbers;
'trust' to give the effect of advancement without changing level;
'transfer' now takes a destination room; 'ban' now matches sites by suffix
(so you can 'ban foo.edu'); 'log all' has been added; 'snoop' now prevents
snoop-looping; 'oset' can set extended descriptions; 'mset' can set a mobile's
spec_fun.
Bug fixes: auto-dropping aligned items had a nasty linked-list bug; 'pose'
was fixed; 'force all' was rewritten.
Several new areas have been added.
Ascii save files are in effect. Equipment and container contents are saved in
the right place. Objects which have been oset will keep their new values.
This includes description strings and extra descriptions, so you can look cool
in your Ray-Ban's without restringing them every time you log in.
Object lists are (optionally) displayed with item counts now.
Players may loot only their own corpses or their own groups' corpses. Other
corpse looting is punished with a PLR_THIEF flag.
=== What was new in 2.0 Beta
The 'lib' directory is gone. Most of the *.txt files have been moved into
'help.are' as 'help' entries.
The 'doc' directory is much larger. All the files have been rewritten (with
the exception of 'license.doc').
The help file 'help.are' has been rewritten. It is now complete and correct.
Merc now uses a different area file system: one area, one file. Each area is
stored in a separate file. The list of areas to read on bootup is stored in
the file 'area.lst' in the directory where the server boots. The server reads
in all area files once on bootup and never touches them again.
The server now generates mobile and object statistics on its own, ignoring the
values in the files. Statistics are subject to random variation.
We have a dozen new areas.
The server has very good error checking on areas. Most diagnostics are
accompanied by area file name and line number. The server does exit after
finding just one error, but Merc loads areas so fast (4 seconds on a Sun-4)
that you can easily use the whole server as a syntax checker.
All code has been re-written. The entire code base is about 6000 lines smaller
than the 1.0 release, and runs in about half the memory as 1.0.
The external declarations have been re-organized to improve portability. The
files merc.h and comm.c have OS-specific declaration sections for suitable
external declarations, and comm.c has several OS-dependent sections. Outside
of these files all of the code is machine-independent.
Many new Unix-based operating systems are supported, and a single-user MS-DOS
version is supported as well.
The code for classes has been consolidated into tables in const.c, making it
much easier to add new classes. See 'class.txt'.
The skill / spell code has been rewritten. The entire cast_* layer has been
removed. The miserable SPELLO declarations have been replaced by more
extensive declarations of skills and spells in 'const.c'. In particular, the
slot number in #OBJECT area is no longer equal to the internal index number of
a skill or spell, so adding new skills and spells is an order of magnitude
easier. See 'skill.txt'.
The horrible 'board.c' code has been sent to /dev/null. In its place we have a
new 'notes' facility.
Player files are now in Ascii form. You can read them, grep them, edit them,
move them to other machines, do whatever you want with them. Some fields (in
particular, class, skill, and spell names) have been separated further from
internal constants, making it easier to add new classes, skills, and spells
without upsetting existing player files.
Auto-save is implemented. One player is saved each tick (whomever has the
most time since previously saving). Thus with 20 players online, each player
will be saved once every ten minutes.
Many immortal commands are now logged automatically.
All unimplemented spells have been removed. In particular, several of the
partially implemented 1.0 spells were taken from an undocumented 'magic.c' we
found on ucbvax.berkeley.edu. These spells were originally written by Dan
Brumleve and we apologize to him for the past infringement. All of this code
is gone from Merc now.
The main menu ('press 1 to enter the game') has been removed. There are two
new game commands, 'password' and 'description', to accomplish the same effect.
The 'password' command is protected against logging and snooping.
Tick times and area update times are now random (with an average time set
by PULSE_TICK and PULSE_AREA respectively).
Players no longer gain experience from pkilling.
Players may no longer log in with the same name as mobiles in the game.
The new 'areas' command lists all areas available. The 'memory' immortal
command shows memory usage. There are many new and upgraded immortal commands,
and all of them have on-line help now.
The new 'respond' command allows players to hold up their end of the
conversation with invisible or switched immortals.
The 'tell' command may no longer be used to talk to mobiles outside of the
room.
The 'pick' command is now limited. Mobs will guard a lock against picking by
low level thieves.
The 'steal' command is now limited. One may not steal from a PC nor from a mob
more than 5 levels above one's level.
Several commands have been removed, including 'ask', 'info', 'pour', 'whisper',
and 'tick'.
The group code has been redesigned, eliminating several bugs in the process.
Mobiles now will join in fights, especially when other mobiles of the same
type are fighting. Players also automatically auto-assist other players in
their group.
There is a pet shop. Many bugs related to 'charm' have been fixed.
Several nasty memory allocation bugs were fixed. These didn't show up on SunOS
or Ultrix, but crashed Linux, NextOS, and many other OS's. Thanks to Vic for
debugging help.
The bug where getting killed with an 'armor' spell on left one's AC at 120
(instead of 100) has been fixed.
The server emits a telnet GA sequence at the end of the prompt.
The 'prompt' command disables or enables the prompt. Handy for immortals who
don't need the prompt, but it's primarily there to reduce output for blind
mudders using speech synthesizers to read their output. Thanks to
davros@ccwf.cc.utexas.edu for suggesting this feature.
The 'time' command now reports system time, so players in any time zone can
know when your morning shutdown occurs. It also reports bootup time, so you
can see how reliable your Merc is.
There are no more bags. Item carrying limits are in effect.
The recall command has been tweaked. It works perfectly outside of combat. In
combat, it has a less-than-perfect chance of working, and it costs xp to try it
(more than for flee). The spell 'word of recall' now just calls the recall
command.
The 'flee' command now reports xp lost. When a character flees, all characters
fighting it will stop fighting, not just one. This also fixes the mysterious
'Extract_char: NULL' bugs.
Link dead characters in combat are dealt with more harshly, to discourage
intentional link killing as a way out of combat.
The 'harm' spell is limited to 100 points of damage.
The 'summon' spell is now limited. One may not summon a person out of combat,
and one may not summon a mob to a different zone.
Characters may not practice until level 3. They are encouraged to train
instead.

101
doc/pfile.txt Normal file
View file

@ -0,0 +1,101 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Player File Format
Player files are ascii files.
A player file contains a player section followed by one or more object
sections. Each section contains several lines. Each line contains a
keyword followed by a value.
An old Internet dictum says 'be conservative in what you send and liberal
in what you accept'. Thus Merc writes player files in a fixed order, but
accepts flexible ordering, partial files, et cetera.
There are two section types: #PLAYER and #OBJECT. The #PLAYER section
defines player values. Each #OBJECT section defines one object. A third
section type, #MOB, is partially implemented and may be implemented in a
future release.
Merc writes one #PLAYER section per file, but will read multiple sections.
If the same value is specified twice the later value generally overrides
earlier values; some lines, such as the 'Affect line', just append more
affects. If a value is not specified, some default value is used.
Players are saved with their equipment on. Thus, the values in the #PLAYER
section reflect current equipment applies, including 'Hitroll', 'Damroll',
'Armor', and 'AttrMod', as well as hit points, mana, move, and others.
Thus, great care is needed when adding or deleting objects which a player
is currently wearing.
A #OBJECT section contains all the object values, including the object's
current wear location. Objects which have been 'oset' retain all of their
values. Again, editing an object which is currently being worn requires
care; the corresponding #PLAYER state must also be changed to match.
Each #OBJECT has a nesting level. Objects in inventory or equipment list have
nesting level 0. Objects inside a container in inventory or equipment list
have nesting level 1. Objects inside a level-1 object are level 2, et cetera.
Objects deeper than nesting level 100 are quietly discarded. This nesting
level is used to reconstruct container contents when loading objects. Thus,
if you delete a container from a file, its objects are likely to be loaded
inside the previous object; and if that's not a container, the player will be
unable to get them out of the object. To avoid this problem, reset the
nesting level of each contained object to 0.
Objects are stored in the file in reverse inventory-order list. This is not
pretty, but it allows the use of standard 'obj_to_obj' and 'obj_to_char' calls
to construct the object lists.
You may add new fields to players and objects. Because of the line-oriented
ascii format, changing a structure size in 'merc.h' will never invalidate a
player file. Naturally, you must ensure that when an old file which does
not contain a line for a new field is read in, the new field is set to some
reasonable default value. E.g., if you add a 'home town' name for players,
then initialize it to 'Midgaard' before reading in the player file, so that
old players get the 'Midgaard' value, and new players get whatever value is
on that line of their file.
Similarly if you delete a field from the player or object structure, you
must leave the parsing line for it in 'fread_char' or 'fread_obj'; simply
assign it into a dummy variable. This allows your old player files to
continue loading.
=== How to Add a New Char Field
(1) Add the field to the appropriate structure in 'merc.h'.
(2) Initialize the field in 'create_char' or 'clear_char' in 'db.c'.
(3) Initialize the field in 'load_char_obj' in 'save.c' if needed.
Make sure that old players which do not have the field are
initialized to a reasonable value.
(4) Add lines to write out the field in 'fwrite_char' in 'save.c'.
(5) Add lines to read in the field in 'fread_char' in 'save.c'.
=== How to Add a New Object Field
(1) Add the field to the appropriate structure in 'merc.h'.
(2) Initialize the field in 'create_object' in 'db.c'.
(3) Initialize the field in 'fread_obj' in 'save.c' if needed.
Make sure that objects which do not have the field are
initialized to a reasonable value.
(4) Add lines to write out the field in 'fwrite_obj' in 'save.c'.
(5) Add lines to read in the field in 'fread_obj' in 'save.c'.

130
doc/port.txt Normal file
View file

@ -0,0 +1,130 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Platforms
We have ported Merc directly to these platforms:
Apollo ??? Domain/OS
Dec 5000 Ultrix
Dec 5900 Ultrix
Intel 386 MsDos
Sequent 386 Dynix
Sun Sun-3 SunOS 4.1.2
Sun Sun-4 SunOS 4.1.2
Users have contributed ports to the following platforms, and we have folded
their changes into the base code. See 'contrib.txt' for acknowledgments.
Apple 68030 Macintosh
Dec uVax Ultrix
HP 9000 Hp/UX
Intel 386 386 BSD
Intel 486 Linux
Intel 486 Interactive Systems Unix
IBM RS/6000 Aix
Mips R4000 Risc/OS 5.XX
NeXT 68030 Mach
Sun Sun-4 Solaris 2.1
We are simply unable to test Merc on every platform. Typically a user tries
a new platform, gets a file full of warnings, and mails us the warnings.
We fix the base code; on the next release we ask that users mail us the
new warnings (usually we never hear from the user again).
=== Requirements
The hardware requirements are essentially: two megabytes of memory; five
megabytes of disk space; any 32-bit processor; 50 kilobits per second network
bandwidth. Processor speed is not important.
The software requirements are essentially: a C compiler (Ansi C preferred,
but Merc can be made to work with a K&R compiler via 'mktrad'); a Unix or
Unix-like operating system; BSD-compatible TCP/IP networking.
For machines which don't have Ansi C compilers, we supply the 'mktrad' script
to convert Merc source into traditional C. See 'trad.txt' for details.
Merc uses 32-bit integers and is casual about the distinction between 'int' and
'long'. (It is possible to clean up the code to run with 16-bit integers, but
the demand is nonexistent, and we don't have any 16-bit C compilers with which
to test.) If you are running on a personal computer, make sure your C compiler
is giving you 32-bit integers and not running in 16-bit mode.
Area files, player files, the note file, and the bugs/ideas/typo files are all
in Ascii format, so that they may be freely moved from one machine type to
another.
=== MsDos Single-User Version
Merc runs in single-user mode (console only) on MsDos and Macintosh computers.
The MsDos version is built with DJ Delorie's 'djgpp' port of the Gnu C Compiler
and requires a 386 with 4 megabytes of memory. You can ftp 'djgpp' from
grape.ecs.clarkson.edu.
A prebuilt executable, 'Merc.exe', is distributed with the release.
As the 'djgpp' documentation states: if you aren't already comfortable
programming in C, this isn't the compiler with which to learn. Caveat Hacker.
The commands to build and run Merc on MsDos are:
gcc -O -Wall -c *.c
gcc -O -o merc *.o
go32 merc
=== Macintosh Single-User Version
The Macintosh changes were contributed by Oleg. It is built with Think-C
5.0.4 and requires 4 megabytes of system memory. You have to define the
symbol 'macintosh' (if not already defined).
Following is an edited version from Oleg's notes for porting 2.0c, after
taking out everything that we folded into 2.1. BTW Oleg, you did a
thorough and meticulous job on this port, and we hope we didn't make
any mistakes in deriving this section from your notes.
**** My notes are preceeded by 4 asteristics
**** Hardware - Macintosh Powerbook 180, 120 Meg Hard Drive, 8 Meg Ram
**** Software - Symantec C++ version 6.0, System Software 7.1
**** Added "#define macintosh" to project header (Da !!!!)
**** Changed Project Type memory partition to 2,500 K
**** Changed Project Type to include Far Code and Far Data
**** Change compiler to 4 byte integers
**** created application instead of running from development environment
**** Redistributed all files in project to produce 32K segments
**** Add unix library for write and close to project
**** moved unixio.c and unixmisc.c for the unix library to the project file
**** Add MacTraps to project file
**** Add ANSI library to project file
**** Recompile ANSI library.
**** Recompile all *.c files.
**** moved application to area folder
=== Performance
All this measured on a Sun 4 with SunOS 4.1.2.
Boot time: 4.3 CPU seconds.
Memory: 2.2 megabytes SZ size.
CPU usage: 30 CPU seconds per hour + 1-2 CPU seconds per player.
Disk space: 2.6 megabytes plus 8K per player file.
IP packets: about 10 per second with 20 people logged in.

106
doc/security.txt Normal file
View file

@ -0,0 +1,106 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Security Features
The 'log' command logs any character; it's meant for test characters as well as
trouble-making players. Many immortal commands are logged automatically; this
is done by setting the LOG_ALWAYS attribute in interp.c. LOG_NEVER is also
available for commands which are never logged (specifically 'password').
'Log all' logs ALL commands executed by the server.
The 'deny' command can be used to set a character's PLR_DENY bit. This bit
cannot be reset from within the server (and the player can't log on anyways to
get it reset). In order to un-deny a player, edit their save file, and
subtract the value of PLR_DENY (1048576) from their 'AffectedBy' bits.
You can also 'deny' a player off-line by editing his or her player file and
adding in the PLR_DENY bit (1048576) to their 'AffectedBy' bits.
The 'ban' command can be used to ban sites or domains.
The 'startup' script automatically saves log files in the the directory ../log
(i.e. a 'log' directory which is a sibling of the current directory). You
should check your log files from time to time.
The 'snoop' command can be used multiple times to snoop multiple characters at
once.
Immortals with 'invis' set can freely goto rooms, walk around, and follow
characters without being noticed.
The server is protected against input spamming.
=== Game Balance Features
There are level limits on grouping.
Objects have level restrictions on their use.
There are limits on saved items. Keys and potions do not save. Items which
are higher level than the character are not saved. This protects against
storage characters.
If you do need to confiscate equipment, just fire up your favorite editor and
edit the player files.
Many commands, such as 'backstab', 'pick lock', and 'steal', have wait states
and level limits on them. This protects against low-level thieves plundering
the game.
There are very few ways to leave combat. Breaking link will invoke attempts
to auto-recall, but with a low chance of success. 'Summon' may not be used
on a character in combat. 'Recall' has less chance of succeeding than fleeing.
In summary, the best way out of combat is fleeing.
Offensive spells start combat -- no free attempts at 'sleep', 'dispel magic',
or other such spells. Offensive spells may not be cast on other players.
Players no longer gain experience from pkilling.
The 'summon' spell will not summon a character into a different area.
The 'tell' command will not 'tell' to mobiles which are not in the room.
The 'tick' interval, as well as other game intervals such as the zone reset
interval, have random variation.
Aggressive mobiles check for aggression on every game pulse. Thus it is not
possible to 'run past' aggressive mobiles.
It is not possible to leave the game without an auto-save being done (e.g.
by breaking link). The game auto-saves players on death, and it auto-saves
players periodically (one player each tick).
The 'R' reset command may be used to scramble room exits on area reset, so that
players have to map a maze each time they enter.
Players may loot only their own corpses or their own groups' corpses. Other
corpse looting is punished with a PLR_THIEF flag.
=== Integrity Features
Merc compiles with no errors and no warnings, with 'gcc -Wall', on a large
number of platforms. If the server crashes, and you've changed the code at
all, it's likely to be YOUR code that's the problem.
The server detects and reports most area-file errors that crash other muds,
often including the area file name and line number. The server refuses to run
with bad files. Thus if you import areas, and they're dirty, you'll have to
clean them before you can use them.
If you are running on a computer that supports the 'malloc_debug' library
function, such as a Sun 4, you can turn on malloc debugging in comm.c. Merc
is parsimonious of dynamically allocated memory, so that after area loading,
very little memory allocation is done. Thus you can 'malloc_debug' without
noticeable effect on performance.

36
doc/sites.txt Normal file
View file

@ -0,0 +1,36 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Merc-Based Sites
The following muds are based on Merc code. The implementors of these muds
add their own changes and features, so don't expect all these muds to look
alike. Most of them look VERY different!
To the imps who run these muds ... thanks for sharing your computers with
us all!
If you would like to be added to (or removed from) to this list, just e-mail
Furey, Hatchet, or Kahn.
Merc 1:
Hidden Worlds cns.cscns.com 4000
The Land nora.gih.no 4000
Medievia bigboy.cis.temple.edu 4000
Mud Lite haas.berkeley.edu 4000
Mystic Realms dikumud.sju.edu 4000
Realms of Wind ccsun44.csie.nctu.edu.tw 4000
Rivers of Mud cie-2.uoregon.edu 9000
Merc 2:
Cataclysm wagner.musicnet.ua.edu. 4000
Fourth Realm marble.bu.edu 4000
Legend of Winds ccsun44.csie.nctu.edu.tw 4040
Rivers of Mud 2 cie-2.uoregon.edu 4000
Wisney World levant.cs.ohiou.edu 5000

254
doc/skill.txt Normal file
View file

@ -0,0 +1,254 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Skills and Spells
The central organizing table for skills and spells is skill_table, an array
of type 'struct skill_type' (merc.h), and is defined in const.c. Skills
include spells as a special case. Indexes into this table are 'skill numbers'
or 'spell numbers', abbreviated 'sn'. An 'sn' is a purely internal value, and
can vary over time as skills and spells are added. This way, the skill table
can be expanded conveniently.
The 'practice' command and player saving/loading are completely table-driven
from skill_table. Skills and spells may be freely added or deleted without
changing these functions.
The fields of skill_table are:
char * name;
The name is used for practising the skill or spell and by the 'cast'
command. Mobiles which cast spells also often invoke the spell by
name. Save files contain this name.
sh_int skill_level[MAX_CLASS];
This array is indexed by character class, GET_CLASS(ch). It contains
the minimum level which each class needs in order to practice the skill
or spell. If a given class cannot use this skill or spell, the level
is set to 37, so that all immortals can use all skills and spells.
Mobiles ignore this table; generally their skill percentages are a
simple function of level.
SPELL_FUN * spell_fun;
This is the function which implements the spell. Spell functions
take four arguments: an 'sn', a level, a caster, and a pointer to a
target victim or object. This field is unused for skills.
sh_int target;
This identifies the targets of the spell. The legal values are:
TAR_IGNORE Spell chooses its own targets.
TAR_CHAR_OFFENSIVE Spell is offensive (starts combat).
TAR_CHAR_DEFENSIVE Spell is defensive (any char is legal).
TAR_CHAR_SELF Spell is personal-effect only.
TAR_OBJ_INV Spell is used on an object.
PC's may not cast TAR_CHAR_OFFENSIVE spells on other PC's. These
spells also cause the victim to attack the caster.
This field is unused for skills.
sh_int minimum_position;
This is the minimum position needed to cast the spell. It is always
either POSITION_FIGHTING or POSITION_STANDING. This field is unused
for skills.
sh_int slot;
This is the slot number, which indexes the spell from magical objects
in #OBJECTS sections of area files (but not save files, which use the
ascii name). Once assigned, a slot number can never be changed.
Skills do not have slot numbers.
sh_int min_mana;
This is the minimum mana required to cast this spell by a sufficiently
high level spell caster. A lower level spell caster will need more
mana than the minimum; see 'do_cast' in 'magic.c' for the algorithm.
This field is unused for skills.
sh_int beats;
This is the delay time, in pulses, imposed on the user of a spell or
caster of a spell. One pulse is 0.25 second (this is derived from
PULSE_PER_SECOND in merc.h).
sh_int * pgsn;
This is the address of a gsn (global skill/spell number) associated
with this skill or spell. Almost all skills have gsn's; a few spells
do.
char * noun_damage;
This is a noun or noun phrase containing the damage message for skills
or spells that perform damage.
char * msg_off;
This is the message sent to the character when the skill or spell wears
off.
=== Examples
{
"fireball", { 15, 37, 37, 37 },
spell_fireball, TAR_CHAR_OFFENSIVE, POS_FIGHTING,
NULL, SLOT(26), 15, 12,
"fireball", "!Fireball!"
},
This is a fifteenth level magic-user spell. The slot number is 26. It
costs 15 mana, and imposes 12 pulses (3 seconds) of delay time on the
caster. It's an offensive spell, and can be used either fighting or
standing. There is no gsn. The damage message will say 'fireball',
and the wear-off message has a strange form to indicate errors because
this spell is instantaneous.
{
"armor", { 5, 1, 37, 37 },
spell_armor, TAR_CHAR_DEFENSIVE, POS_STANDING,
NULL, SLOT( 1), 5, 12,
"", "You feel less protected."
},
This is a fifth level magic-user or first level cleric spell. It can
be cast on any char without starting a fight. It has no damage message
but does have a wear-off message.
{
"gas breath", { 35, 37, 37, 37 },
spell_gas_breath, TAR_IGNORE, POS_FIGHTING,
NULL, SLOT(203), 0, 4,
"blast of gas", "!Gas Breath!"
},
This is one of the dragon-breath spells. It is accessible only to
35th level magic users. The spell selects its own targets (TAR_IGNORE)
rather than using the common spell-driver target selection code.
{
"pick lock", { 37, 37, 1, 37 },
spell_null, TAR_IGNORE, POS_STANDING,
&gsn_pick_lock, SLOT( 0), 0, 12,
"", "!Pick!"
},
This is a first-level thief skill. Many of the fields are unused.
This skill has a gsn, so that do_pick_lock does not have to call
'skill_lookup' to find the sn.
=== Indexing skill_table
'skill_table' is indexed by an 'sn' or 'gsn'. The function 'skill_lookup'
takes a string and returns the appropriate sn, or -1 if the name is not found.
Some skills, such as 'second attack', are referenced very frequently. For
these skills, a global variable such as 'gsn_second_attack' is initialized to
the sn of this skill. Most of the fighter and thief skills have gsn's; only a
few spells need gsn's.
Gsn's are initialized at boot time in boot_db, which follows the 'pgsn' field
in skill_table. This takes slightly more time and space than using '#define'
to define them as constants, but is much more error-proof.
Magic items (potions, scrolls, pills, wands, and staves) have charges of
magical spells. These spells are referenced by 'slot number' in area files.
(Slot numbers are also used in the save files). The function 'slot_lookup'
converts slot numbers to skill numbers.
The range of slot numbers is 0 to 32767. There is no need to assign them
consecutively. In the future, slot numbers may disappear completely, and
area files may reference spells directly by name instead of by slot number.
[For those familiar with original Diku code ... slot numbers are simply the
original Diku spell numbers.]
=== The spell driver
The spell driver level is the first half of 'magic.c'. It consists of
'do_cast' for the 'cast' command and 'obj_cast_spell' which is called from
'do_brandish', 'do_eat', 'do_quaff', 'do_recite', and 'do_zap'.
The spell driver takes care of level checking, position checking, target
selection, target validation (such as preventing PC's from casting offensive
spells on other PC's), staff area effect (just multi-target selection), mana
costs, wait states, and starting combat for offensive spells. All of these
things are table-driven by 'skill_table'.
The spell function itself takes care of calling functions like 'damage' and
'affect_to_char'. Read the existing ones to see what is needed for a new one.
Some spells, such as 'earthquake', 'locate object' or 'summon', perform their
own target selection. These spells are target type TAR_IGNORE. Within the
spell function, the variable 'target_name' is available (set by the spell
driver).
=== Adding a new spell
(1) Find a free slot number. Make sure it's not already used in 'const.c'.
Merc reserves slot numbers below 500 for future expansion. We promise we
won't use numbers 500 or above in future Merc releases. Thus if you number
your spells 500 or above, you will have an easier time upgrading to future
releases of the Merc base code.
(2) Choose appropriate values for the other 'skill_table' fields, and write
your new paragraph into 'const.c'. Order is immaterial.
(3) Add the 'spell_*' function declaration to the 'DECLARE_SPELL_FUN' section
of 'merc.h'.
(4) Drop the code for the spell function into 'magic.c'.
(5) If your spell needs 'AFF_*' bits, create new 'AFF_* bits' in 'merc.h'.
(6) You may need to increase 'MAX_SKILL' in 'merc.h'.
=== Adding a new skill
For skills, only some of the fields are relevant: 'name', 'skill_level',
'beats', 'pgsn', 'noun_damage', and 'msg_off' are used; 'slot', 'min_mana',
'spell_fun', 'target', and 'minimum_position' are not used.
Skills are either automatic (such as 'parry') or manual (such as 'rescue').
Many automatic skills are referenced in 'fight.c'; look at 'multi_hit' for
examples of the use of 'gsn_second_attack' and 'gsn_third_attack'.
An explicit skill such as 'rescue' has its associated command 'do_rescue'.
This command is defined and called in the normal way in interp.c. Within
'do_rescue', 'gsn_rescue' is used to find fields such as 'beats'.
To add a new skill:
(1) Choose appropriate values for the 'skill_table' fields, and write your new
paragraph into 'const.c'. Order is immaterial.
(2) You'll probably need a 'gsn'. Declare it in 'merc.h' and 'db.c'. Drop its
address into the 'pgsn' field of the paragraph in 'const.c'.
(3) If the skill is automatic, just use 'ch->pcdata->learned[gsn_new_skill]'
in your code. If your skill is manual, you need to write an appropriate
command function for it.
(4) You may need to increase 'MAX_SKILL' in 'merc.h'.

95
doc/sky.txt Normal file
View file

@ -0,0 +1,95 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Blue Sky
It's blue sky time! These are features we'd like to have in Merc. We haven't
designed them, haven't coded them, haven't scheduled them. They won't be in
Merc 2.0 and may never be in Merc.
If you code any of these features please send us a copy.
=== Symbolic Names in Numeric Fields.
We'd like 'fread_number' to understand words such as AFF_SANCTUARY and
translate them into the appropriate numbers.
=== New Comm Drivers
Right now comm.c understands only Berkeley Unix networking. We'd like comm
drivers for the following operating systems:
System V Unix
VMS
OS/2 (single user)
FOSSIL (for dialup Merc on bbs's)
=== Randomization on Area Loading
We'd like to see items loaded with random spells, placed on random mobs, so
that players have to explore more instead of just having a '#blue' macro that
goes to the queen spider and kills her for a blue potion.
=== Mobs Using Magical Items
'Watch, out Jim! That orc has a wand of fireballs!'
'The queen spider quaffs the blue potion.'
'The queen spider looks healthier.'
=== An Arena
A room flag where players can attack players without getting a killer flag, can
cast offensive spells at players, and death carries no xp or eq loss. Wanna
try out a beholder without getting killed? Just pay enough money and you can
have one loaded in the arena!
=== Area Logging
So you can tell if everyone's going to the same area over and over and make the
area harder.
=== Merc-to-Merc Portals
The save files are Ascii -- just shoot it over a server-to-server connection.
=== Protection Against Multi-Playing
RFC 1413 is a good protocol but no one implements it. :(
=== Built-in Client
We'd like to incorporate EVERYTHING in Tintin 3 into the server (except for
multiple sessions -- but even multiple sessions would be good for the MS-DOS
single-player version). People use clients anyways. Why not make it easy on
them, and give everyone the same advantage.
=== 'Retire' Command
For those 36th level players who keep hanging around!

81
doc/trad.txt Normal file
View file

@ -0,0 +1,81 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Compiling with traditional C
Merc is written in Ansi Standard C and uses several features not found in
traditional C compilers:
-- the 'const' attribute
-- function prototypes with argument types
-- new-style function definitions with argument types embedded
These features are too useful to just discard out of hand. On the other hand,
with some clever hacking (which we have graciously done for you), it is
possible to accommodate the deficiencies of some old non-ansi C compilers.
=== How to tell if you have traditional C or Ansi C
If your C Compiler is 'gcc', then it is Ansi C, and you don't need to know
anything about traditional C.
If you are on a Sun workstation and your compiler is Sun's 'cc', you have
traditional C.
If you get dozens of errors at compile time on 'merc.h' function declarations
with 'DO_FUN' and 'SPELL_FUN', you probably have a traditional C compiler.
Note that 'traditional C' refers to just about anything that's pre-Ansi C.
We've tested Merc 2.0 with 'mktrad' on several machines, but that's no
guarantee it will work on yours. You can do everything in this document and
STILL be unable to compile, link, or execute. Well, you said you were getting
a mud to 'learn about programming' ...
=== How to compile with traditional C
(1) Start with a clean copy of the release in an experimental directory. Step
(3) of this procedure will *irreversibly* change the source.
(2) Select the 'traditional C' makefile.
cp makefile.tra makefile
This makefile uses the command 'cc -c -O -DTRADITIONAL' to compile and the
command 'cc -O -o merc' to link. If you need different command lines, edit
the file. The file 'merc.h' checks the 'TRADITIONAL' symbol.
(3) Run 'mktrad'.
csh mktrad >& mktrad.out
'Mktrad' will invoke the 'ed' editor on *.c and rewrite all of the function
definition lines from Ansi C style to Traditional C style. After running
'mktrad', you cannot recover the original files. Also, if you run 'mktrad'
a second time on the same files, you will probably ruin them.
The file 'mktrad.out' will be about 80k long. You can ignore this
file if everything works.
If your system doesn't have 'ed', try changing mktrad to invoke 'ex'
instead. If you have neither 'ed' nor 'ex', you're on your own.
(4) Run 'make' as usual:
make -k >&! make.out
(5) If all goes well, then the one-time conversion has succeeded. You can now
develop the code as you like, and compile normally. NEVER run mktrad again
or you'll hose your source!
(6) If things go wrong and you need help, e-mail us. We'll need 'mktrad.out'
and 'make.out' files, as well as the model of your computer.

34
doc/vnum.txt Normal file
View file

@ -0,0 +1,34 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
[This file was originally written by Neal Haggard for Merc 2.0 Beta.
But we reformatted it to fit on one screen. -- Furey]
=== Vnum Assignments
00 limbo.are 20 catacomb.are 40 moria.are 60 haon.are 80 mega1.are
01 smurf.are 21 hood.are 41 moria.are 61 haon.are 81 -
02 - 22 draconia.are 42 - 62 - 82 -
03 plains.are 23 mahntor.are 43 - 63 arachnos.are 83 marsh.are
04 - 24 - 44 - 64 - 84 -
05 - 25 - 45 - 65 dwarven.are 85 -
06 ofcol2.are 26 - 46 - 66 daycare.are 86 dream.are
07 - 27 - 47 juargan.are 67 - 87 -
08 - 28 trollden.are 48 - 68 - 88 -
09 olympus.are 29 firenewt.are 49 - 69 - 89 grove.are
10 air.are 30 midgaard.are 50 eastern.are 70 sewer.are 90 -
11 shire.are 31 midgaard.are 51 drow.are 71 sewer.are 91 dylan.are
12 hitower.are 32 midgaard.are 52 thalos.are 72 sewer.are 92 canyon.are
13 hitower.are 33 midgaard.are 53 mirror.are 73 sewer.are 93 galaxy.are
14 hitower.are 34 chapel.are 54 - 74 sewer.are 94 mobfact.are
15 gnome.are 35 midennir.are 55 ofcol.are 75 - 95 -
16 wyvern.are 36 grave.are 56 - 76 - 96 -
17 wyvern.are 37 school.are 57 - 77 - 97 -
18 - 38 - 58 - 78 valley.are 98 -
19 - 39 moria.are 59 - 79 redferne.are 99 -

12
log/README Normal file
View file

@ -0,0 +1,12 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Log Directory
This directory keeps all your game log files.

14
player/README Normal file
View file

@ -0,0 +1,14 @@
Merc Release 2.1
Sunday 01 August 1993
Furey mec@shell.portal.com
Hatchet hatchet@uclink.berkeley.edu
Kahn michael@uclink.berkeley.edu
=== Player Directory
This directory keeps all your player files. Player files are straight ascii
files, one player per file. You can grep them, edit them, rename them, move
them to other computer systems, whatever you want.

15
src/Makefile Normal file
View file

@ -0,0 +1,15 @@
CC = gcc
PROF =
NOCRYPT =
C_FLAGS = -O -Wall $(PROF) $(NOCRYPT)
L_FLAGS = -O -lcrypt $(PROF)
O_FILES = act_comm.o act_info.o act_move.o act_obj.o act_wiz.o comm.o const.o \
db.o fight.o handler.o interp.o magic.o save.o special.o update.o
merc: $(O_FILES)
rm -f merc
$(CC) $(L_FLAGS) -o merc $(O_FILES)
.c.o: merc.h
$(CC) -c $(C_FLAGS) $<

BIN
src/Merc.exe Normal file

Binary file not shown.

1435
src/act_comm.c Normal file

File diff suppressed because it is too large Load diff

2035
src/act_info.c Normal file

File diff suppressed because it is too large Load diff

1000
src/act_move.c Normal file

File diff suppressed because it is too large Load diff

2063
src/act_obj.c Normal file

File diff suppressed because it is too large Load diff

2622
src/act_wiz.c Normal file

File diff suppressed because it is too large Load diff

1771
src/comm.c Normal file

File diff suppressed because it is too large Load diff

1103
src/const.c Normal file

File diff suppressed because it is too large Load diff

2542
src/db.c Normal file

File diff suppressed because it is too large Load diff

1560
src/fight.c Normal file

File diff suppressed because it is too large Load diff

1560
src/handler.c Normal file

File diff suppressed because it is too large Load diff

1611
src/interp.c Normal file

File diff suppressed because it is too large Load diff

2264
src/magic.c Normal file

File diff suppressed because it is too large Load diff

BIN
src/merc Executable file

Binary file not shown.

1755
src/merc.h Normal file

File diff suppressed because it is too large Load diff

899
src/save.c Normal file
View file

@ -0,0 +1,899 @@
/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "merc.h"
#if !defined(macintosh)
extern int _filbuf args( (FILE *) );
#endif
/*
* Array of containers read for proper re-nesting of objects.
*/
#define MAX_NEST 100
static OBJ_DATA * rgObjNest [MAX_NEST];
/*
* Local functions.
*/
void fwrite_char args( ( CHAR_DATA *ch, FILE *fp ) );
void fwrite_obj args( ( CHAR_DATA *ch, OBJ_DATA *obj,
FILE *fp, int iNest ) );
void fread_char args( ( CHAR_DATA *ch, FILE *fp ) );
void fread_obj args( ( CHAR_DATA *ch, FILE *fp ) );
/*
* Save a character and inventory.
* Would be cool to save NPC's too for quest purposes,
* some of the infrastructure is provided.
*/
void save_char_obj( CHAR_DATA *ch )
{
char strsave[MAX_INPUT_LENGTH];
FILE *fp;
if ( IS_NPC(ch) || ch->level < 2 )
return;
if ( ch->desc != NULL && ch->desc->original != NULL )
ch = ch->desc->original;
ch->save_time = current_time;
fclose( fpReserve );
sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( ch->name ) );
if ( ( fp = fopen( strsave, "w" ) ) == NULL )
{
bug( "Save_char_obj: fopen", 0 );
perror( strsave );
}
else
{
fwrite_char( ch, fp );
if ( ch->carrying != NULL )
fwrite_obj( ch, ch->carrying, fp, 0 );
fprintf( fp, "#END\n" );
}
fclose( fp );
fpReserve = fopen( NULL_FILE, "r" );
return;
}
/*
* Write the char.
*/
void fwrite_char( CHAR_DATA *ch, FILE *fp )
{
AFFECT_DATA *paf;
int sn;
fprintf( fp, "#%s\n", IS_NPC(ch) ? "MOB" : "PLAYER" );
fprintf( fp, "Name %s~\n", ch->name );
fprintf( fp, "ShortDescr %s~\n", ch->short_descr );
fprintf( fp, "LongDescr %s~\n", ch->long_descr );
fprintf( fp, "Description %s~\n", ch->description );
fprintf( fp, "Sex %d\n", ch->sex );
fprintf( fp, "Class %d\n", ch->class );
fprintf( fp, "Race %d\n", ch->race );
fprintf( fp, "Level %d\n", ch->level );
fprintf( fp, "Trust %d\n", ch->trust );
fprintf( fp, "Played %d\n",
ch->played + (int) (current_time - ch->logon) );
fprintf( fp, "Room %d\n",
( ch->in_room == get_room_index( ROOM_VNUM_LIMBO )
&& ch->was_in_room != NULL )
? ch->was_in_room->vnum
: ch->in_room->vnum );
fprintf( fp, "HpManaMove %d %d %d %d %d %d\n",
ch->hit, ch->max_hit, ch->mana, ch->max_mana, ch->move, ch->max_move );
fprintf( fp, "Gold %d\n", ch->gold );
fprintf( fp, "Exp %d\n", ch->exp );
fprintf( fp, "Act %d\n", ch->act );
fprintf( fp, "AffectedBy %d\n", ch->affected_by );
/* Bug fix from Alander */
fprintf( fp, "Position %d\n",
ch->position == POS_FIGHTING ? POS_STANDING : ch->position );
fprintf( fp, "Practice %d\n", ch->practice );
fprintf( fp, "SavingThrow %d\n", ch->saving_throw );
fprintf( fp, "Alignment %d\n", ch->alignment );
fprintf( fp, "Hitroll %d\n", ch->hitroll );
fprintf( fp, "Damroll %d\n", ch->damroll );
fprintf( fp, "Armor %d\n", ch->armor );
fprintf( fp, "Wimpy %d\n", ch->wimpy );
fprintf( fp, "Deaf %d\n", ch->deaf );
if ( IS_NPC(ch) )
{
fprintf( fp, "Vnum %d\n", ch->pIndexData->vnum );
}
else
{
fprintf( fp, "Password %s~\n", ch->pcdata->pwd );
fprintf( fp, "Bamfin %s~\n", ch->pcdata->bamfin );
fprintf( fp, "Bamfout %s~\n", ch->pcdata->bamfout );
fprintf( fp, "Title %s~\n", ch->pcdata->title );
fprintf( fp, "AttrPerm %d %d %d %d %d\n",
ch->pcdata->perm_str,
ch->pcdata->perm_int,
ch->pcdata->perm_wis,
ch->pcdata->perm_dex,
ch->pcdata->perm_con );
fprintf( fp, "AttrMod %d %d %d %d %d\n",
ch->pcdata->mod_str,
ch->pcdata->mod_int,
ch->pcdata->mod_wis,
ch->pcdata->mod_dex,
ch->pcdata->mod_con );
fprintf( fp, "Condition %d %d %d\n",
ch->pcdata->condition[0],
ch->pcdata->condition[1],
ch->pcdata->condition[2] );
for ( sn = 0; sn < MAX_SKILL; sn++ )
{
if ( skill_table[sn].name != NULL && ch->pcdata->learned[sn] > 0 )
{
fprintf( fp, "Skill %d '%s'\n",
ch->pcdata->learned[sn], skill_table[sn].name );
}
}
}
for ( paf = ch->affected; paf != NULL; paf = paf->next )
{
/* Thx Alander */
if ( paf->type < 0 || paf->type >= MAX_SKILL )
continue;
fprintf( fp, "AffectData '%s' %3d %3d %3d %10d\n",
skill_table[paf->type].name,
paf->duration,
paf->modifier,
paf->location,
paf->bitvector
);
}
fprintf( fp, "End\n\n" );
return;
}
/*
* Write an object and its contents.
*/
void fwrite_obj( CHAR_DATA *ch, OBJ_DATA *obj, FILE *fp, int iNest )
{
EXTRA_DESCR_DATA *ed;
AFFECT_DATA *paf;
/*
* Slick recursion to write lists backwards,
* so loading them will load in forwards order.
*/
if ( obj->next_content != NULL )
fwrite_obj( ch, obj->next_content, fp, iNest );
/*
* Castrate storage characters.
*/
if ( ch->level < obj->level
|| obj->item_type == ITEM_KEY
|| obj->item_type == ITEM_POTION )
return;
fprintf( fp, "#OBJECT\n" );
fprintf( fp, "Nest %d\n", iNest );
fprintf( fp, "Name %s~\n", obj->name );
fprintf( fp, "ShortDescr %s~\n", obj->short_descr );
fprintf( fp, "Description %s~\n", obj->description );
fprintf( fp, "Vnum %d\n", obj->pIndexData->vnum );
fprintf( fp, "ExtraFlags %d\n", obj->extra_flags );
fprintf( fp, "WearFlags %d\n", obj->wear_flags );
fprintf( fp, "WearLoc %d\n", obj->wear_loc );
fprintf( fp, "ItemType %d\n", obj->item_type );
fprintf( fp, "Weight %d\n", obj->weight );
fprintf( fp, "Level %d\n", obj->level );
fprintf( fp, "Timer %d\n", obj->timer );
fprintf( fp, "Cost %d\n", obj->cost );
fprintf( fp, "Values %d %d %d %d\n",
obj->value[0], obj->value[1], obj->value[2], obj->value[3] );
switch ( obj->item_type )
{
case ITEM_POTION:
case ITEM_SCROLL:
if ( obj->value[1] > 0 )
{
fprintf( fp, "Spell 1 '%s'\n",
skill_table[obj->value[1]].name );
}
if ( obj->value[2] > 0 )
{
fprintf( fp, "Spell 2 '%s'\n",
skill_table[obj->value[2]].name );
}
if ( obj->value[3] > 0 )
{
fprintf( fp, "Spell 3 '%s'\n",
skill_table[obj->value[3]].name );
}
break;
case ITEM_PILL:
case ITEM_STAFF:
case ITEM_WAND:
if ( obj->value[3] > 0 )
{
fprintf( fp, "Spell 3 '%s'\n",
skill_table[obj->value[3]].name );
}
break;
}
for ( paf = obj->affected; paf != NULL; paf = paf->next )
{
if ( paf->type < 0 || paf->type >= MAX_SKILL )
continue;
fprintf( fp, "AffectData '%s' %d %d %d %d\n",
skill_table[paf->type].name,
paf->duration,
paf->modifier,
paf->location,
paf->bitvector
);
}
for ( ed = obj->extra_descr; ed != NULL; ed = ed->next )
{
fprintf( fp, "ExtraDescr %s~ %s~\n",
ed->keyword, ed->description );
}
fprintf( fp, "End\n\n" );
if ( obj->contains != NULL )
fwrite_obj( ch, obj->contains, fp, iNest + 1 );
return;
}
/*
* Load a char and inventory into a new ch structure.
*/
bool load_char_obj( DESCRIPTOR_DATA *d, char *name )
{
static PC_DATA pcdata_zero;
char strsave[MAX_INPUT_LENGTH];
CHAR_DATA *ch;
FILE *fp;
bool found;
if ( char_free == NULL )
{
ch = alloc_perm( sizeof(*ch) );
}
else
{
ch = char_free;
char_free = char_free->next;
}
clear_char( ch );
if ( pcdata_free == NULL )
{
ch->pcdata = alloc_perm( sizeof(*ch->pcdata) );
}
else
{
ch->pcdata = pcdata_free;
pcdata_free = pcdata_free->next;
}
*ch->pcdata = pcdata_zero;
d->character = ch;
ch->desc = d;
ch->name = str_dup( name );
ch->act = PLR_BLANK
| PLR_COMBINE
| PLR_PROMPT;
ch->pcdata->pwd = str_dup( "" );
ch->pcdata->bamfin = str_dup( "" );
ch->pcdata->bamfout = str_dup( "" );
ch->pcdata->title = str_dup( "" );
ch->pcdata->perm_str = 13;
ch->pcdata->perm_int = 13;
ch->pcdata->perm_wis = 13;
ch->pcdata->perm_dex = 13;
ch->pcdata->perm_con = 13;
ch->pcdata->condition[COND_THIRST] = 48;
ch->pcdata->condition[COND_FULL] = 48;
found = FALSE;
fclose( fpReserve );
sprintf( strsave, "%s%s", PLAYER_DIR, capitalize( name ) );
if ( ( fp = fopen( strsave, "r" ) ) != NULL )
{
int iNest;
for ( iNest = 0; iNest < MAX_NEST; iNest++ )
rgObjNest[iNest] = NULL;
found = TRUE;
for ( ; ; )
{
char letter;
char *word;
letter = fread_letter( fp );
if ( letter == '*' )
{
fread_to_eol( fp );
continue;
}
if ( letter != '#' )
{
bug( "Load_char_obj: # not found.", 0 );
break;
}
word = fread_word( fp );
if ( !str_cmp( word, "PLAYER" ) ) fread_char ( ch, fp );
else if ( !str_cmp( word, "OBJECT" ) ) fread_obj ( ch, fp );
else if ( !str_cmp( word, "END" ) ) break;
else
{
bug( "Load_char_obj: bad section.", 0 );
break;
}
}
fclose( fp );
}
fpReserve = fopen( NULL_FILE, "r" );
return found;
}
/*
* Read in a char.
*/
#if defined(KEY)
#undef KEY
#endif
#define KEY( literal, field, value ) \
if ( !str_cmp( word, literal ) ) \
{ \
field = value; \
fMatch = TRUE; \
break; \
}
void fread_char( CHAR_DATA *ch, FILE *fp )
{
char buf[MAX_STRING_LENGTH];
char *word;
bool fMatch;
for ( ; ; )
{
word = feof( fp ) ? "End" : fread_word( fp );
fMatch = FALSE;
switch ( UPPER(word[0]) )
{
case '*':
fMatch = TRUE;
fread_to_eol( fp );
break;
case 'A':
KEY( "Act", ch->act, fread_number( fp ) );
KEY( "AffectedBy", ch->affected_by, fread_number( fp ) );
KEY( "Alignment", ch->alignment, fread_number( fp ) );
KEY( "Armor", ch->armor, fread_number( fp ) );
if ( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) )
{
AFFECT_DATA *paf;
if ( affect_free == NULL )
{
paf = alloc_perm( sizeof(*paf) );
}
else
{
paf = affect_free;
affect_free = affect_free->next;
}
if ( !str_cmp( word, "Affect" ) )
{
/* Obsolete 2.0 form. */
paf->type = fread_number( fp );
}
else
{
int sn;
sn = skill_lookup( fread_word( fp ) );
if ( sn < 0 )
bug( "Fread_char: unknown skill.", 0 );
else
paf->type = sn;
}
paf->duration = fread_number( fp );
paf->modifier = fread_number( fp );
paf->location = fread_number( fp );
paf->bitvector = fread_number( fp );
paf->next = ch->affected;
ch->affected = paf;
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "AttrMod" ) )
{
ch->pcdata->mod_str = fread_number( fp );
ch->pcdata->mod_int = fread_number( fp );
ch->pcdata->mod_wis = fread_number( fp );
ch->pcdata->mod_dex = fread_number( fp );
ch->pcdata->mod_con = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "AttrPerm" ) )
{
ch->pcdata->perm_str = fread_number( fp );
ch->pcdata->perm_int = fread_number( fp );
ch->pcdata->perm_wis = fread_number( fp );
ch->pcdata->perm_dex = fread_number( fp );
ch->pcdata->perm_con = fread_number( fp );
fMatch = TRUE;
break;
}
break;
case 'B':
KEY( "Bamfin", ch->pcdata->bamfin, fread_string( fp ) );
KEY( "Bamfout", ch->pcdata->bamfout, fread_string( fp ) );
break;
case 'C':
KEY( "Class", ch->class, fread_number( fp ) );
if ( !str_cmp( word, "Condition" ) )
{
ch->pcdata->condition[0] = fread_number( fp );
ch->pcdata->condition[1] = fread_number( fp );
ch->pcdata->condition[2] = fread_number( fp );
fMatch = TRUE;
break;
}
break;
case 'D':
KEY( "Damroll", ch->damroll, fread_number( fp ) );
KEY( "Deaf", ch->deaf, fread_number( fp ) );
KEY( "Description", ch->description, fread_string( fp ) );
break;
case 'E':
if ( !str_cmp( word, "End" ) )
return;
KEY( "Exp", ch->exp, fread_number( fp ) );
break;
case 'G':
KEY( "Gold", ch->gold, fread_number( fp ) );
break;
case 'H':
KEY( "Hitroll", ch->hitroll, fread_number( fp ) );
if ( !str_cmp( word, "HpManaMove" ) )
{
ch->hit = fread_number( fp );
ch->max_hit = fread_number( fp );
ch->mana = fread_number( fp );
ch->max_mana = fread_number( fp );
ch->move = fread_number( fp );
ch->max_move = fread_number( fp );
fMatch = TRUE;
break;
}
break;
case 'L':
KEY( "Level", ch->level, fread_number( fp ) );
KEY( "LongDescr", ch->long_descr, fread_string( fp ) );
break;
case 'N':
if ( !str_cmp( word, "Name" ) )
{
/*
* Name already set externally.
*/
fread_to_eol( fp );
fMatch = TRUE;
break;
}
break;
case 'P':
KEY( "Password", ch->pcdata->pwd, fread_string( fp ) );
KEY( "Played", ch->played, fread_number( fp ) );
KEY( "Position", ch->position, fread_number( fp ) );
KEY( "Practice", ch->practice, fread_number( fp ) );
break;
case 'R':
KEY( "Race", ch->race, fread_number( fp ) );
if ( !str_cmp( word, "Room" ) )
{
ch->in_room = get_room_index( fread_number( fp ) );
if ( ch->in_room == NULL )
ch->in_room = get_room_index( ROOM_VNUM_LIMBO );
fMatch = TRUE;
break;
}
break;
case 'S':
KEY( "SavingThrow", ch->saving_throw, fread_number( fp ) );
KEY( "Sex", ch->sex, fread_number( fp ) );
KEY( "ShortDescr", ch->short_descr, fread_string( fp ) );
if ( !str_cmp( word, "Skill" ) )
{
int sn;
int value;
value = fread_number( fp );
sn = skill_lookup( fread_word( fp ) );
if ( sn < 0 )
bug( "Fread_char: unknown skill.", 0 );
else
ch->pcdata->learned[sn] = value;
fMatch = TRUE;
}
break;
case 'T':
KEY( "Trust", ch->trust, fread_number( fp ) );
if ( !str_cmp( word, "Title" ) )
{
ch->pcdata->title = fread_string( fp );
if ( isalpha(ch->pcdata->title[0])
|| isdigit(ch->pcdata->title[0]) )
{
sprintf( buf, " %s", ch->pcdata->title );
free_string( ch->pcdata->title );
ch->pcdata->title = str_dup( buf );
}
fMatch = TRUE;
break;
}
break;
case 'V':
if ( !str_cmp( word, "Vnum" ) )
{
ch->pIndexData = get_mob_index( fread_number( fp ) );
fMatch = TRUE;
break;
}
break;
case 'W':
KEY( "Wimpy", ch->wimpy, fread_number( fp ) );
break;
}
if ( !fMatch )
{
bug( "Fread_char: no match.", 0 );
fread_to_eol( fp );
}
}
}
void fread_obj( CHAR_DATA *ch, FILE *fp )
{
static OBJ_DATA obj_zero;
OBJ_DATA *obj;
char *word;
int iNest;
bool fMatch;
bool fNest;
bool fVnum;
if ( obj_free == NULL )
{
obj = alloc_perm( sizeof(*obj) );
}
else
{
obj = obj_free;
obj_free = obj_free->next;
}
*obj = obj_zero;
obj->name = str_dup( "" );
obj->short_descr = str_dup( "" );
obj->description = str_dup( "" );
fNest = FALSE;
fVnum = TRUE;
iNest = 0;
for ( ; ; )
{
word = feof( fp ) ? "End" : fread_word( fp );
fMatch = FALSE;
switch ( UPPER(word[0]) )
{
case '*':
fMatch = TRUE;
fread_to_eol( fp );
break;
case 'A':
if ( !str_cmp( word, "Affect" ) || !str_cmp( word, "AffectData" ) )
{
AFFECT_DATA *paf;
if ( affect_free == NULL )
{
paf = alloc_perm( sizeof(*paf) );
}
else
{
paf = affect_free;
affect_free = affect_free->next;
}
if ( !str_cmp( word, "Affect" ) )
{
/* Obsolete 2.0 form. */
paf->type = fread_number( fp );
}
else
{
int sn;
sn = skill_lookup( fread_word( fp ) );
if ( sn < 0 )
bug( "Fread_obj: unknown skill.", 0 );
else
paf->type = sn;
}
paf->type = fread_number( fp );
paf->duration = fread_number( fp );
paf->modifier = fread_number( fp );
paf->location = fread_number( fp );
paf->bitvector = fread_number( fp );
paf->next = obj->affected;
obj->affected = paf;
fMatch = TRUE;
break;
}
break;
case 'C':
KEY( "Cost", obj->cost, fread_number( fp ) );
break;
case 'D':
KEY( "Description", obj->description, fread_string( fp ) );
break;
case 'E':
KEY( "ExtraFlags", obj->extra_flags, fread_number( fp ) );
if ( !str_cmp( word, "ExtraDescr" ) )
{
EXTRA_DESCR_DATA *ed;
if ( extra_descr_free == NULL )
{
ed = alloc_perm( sizeof(*ed) );
}
else
{
ed = extra_descr_free;
extra_descr_free = extra_descr_free->next;
}
ed->keyword = fread_string( fp );
ed->description = fread_string( fp );
ed->next = obj->extra_descr;
obj->extra_descr = ed;
fMatch = TRUE;
}
if ( !str_cmp( word, "End" ) )
{
if ( !fNest || !fVnum )
{
bug( "Fread_obj: incomplete object.", 0 );
free_string( obj->name );
free_string( obj->description );
free_string( obj->short_descr );
obj->next = obj_free;
obj_free = obj;
return;
}
else
{
obj->next = object_list;
object_list = obj;
obj->pIndexData->count++;
if ( iNest == 0 || rgObjNest[iNest] == NULL )
obj_to_char( obj, ch );
else
obj_to_obj( obj, rgObjNest[iNest-1] );
return;
}
}
break;
case 'I':
KEY( "ItemType", obj->item_type, fread_number( fp ) );
break;
case 'L':
KEY( "Level", obj->level, fread_number( fp ) );
break;
case 'N':
KEY( "Name", obj->name, fread_string( fp ) );
if ( !str_cmp( word, "Nest" ) )
{
iNest = fread_number( fp );
if ( iNest < 0 || iNest >= MAX_NEST )
{
bug( "Fread_obj: bad nest %d.", iNest );
}
else
{
rgObjNest[iNest] = obj;
fNest = TRUE;
}
fMatch = TRUE;
}
break;
case 'S':
KEY( "ShortDescr", obj->short_descr, fread_string( fp ) );
if ( !str_cmp( word, "Spell" ) )
{
int iValue;
int sn;
iValue = fread_number( fp );
sn = skill_lookup( fread_word( fp ) );
if ( iValue < 0 || iValue > 3 )
{
bug( "Fread_obj: bad iValue %d.", iValue );
}
else if ( sn < 0 )
{
bug( "Fread_obj: unknown skill.", 0 );
}
else
{
obj->value[iValue] = sn;
}
fMatch = TRUE;
break;
}
break;
case 'T':
KEY( "Timer", obj->timer, fread_number( fp ) );
break;
case 'V':
if ( !str_cmp( word, "Values" ) )
{
obj->value[0] = fread_number( fp );
obj->value[1] = fread_number( fp );
obj->value[2] = fread_number( fp );
obj->value[3] = fread_number( fp );
fMatch = TRUE;
break;
}
if ( !str_cmp( word, "Vnum" ) )
{
int vnum;
vnum = fread_number( fp );
if ( ( obj->pIndexData = get_obj_index( vnum ) ) == NULL )
bug( "Fread_obj: bad vnum %d.", vnum );
else
fVnum = TRUE;
fMatch = TRUE;
break;
}
break;
case 'W':
KEY( "WearFlags", obj->wear_flags, fread_number( fp ) );
KEY( "WearLoc", obj->wear_loc, fread_number( fp ) );
KEY( "Weight", obj->weight, fread_number( fp ) );
break;
}
if ( !fMatch )
{
bug( "Fread_obj: no match.", 0 );
fread_to_eol( fp );
}
}
}

736
src/special.c Normal file
View file

@ -0,0 +1,736 @@
/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "merc.h"
/*
* The following special functions are available for mobiles.
*/
DECLARE_SPEC_FUN( spec_breath_any );
DECLARE_SPEC_FUN( spec_breath_acid );
DECLARE_SPEC_FUN( spec_breath_fire );
DECLARE_SPEC_FUN( spec_breath_frost );
DECLARE_SPEC_FUN( spec_breath_gas );
DECLARE_SPEC_FUN( spec_breath_lightning );
DECLARE_SPEC_FUN( spec_cast_adept );
DECLARE_SPEC_FUN( spec_cast_cleric );
DECLARE_SPEC_FUN( spec_cast_judge );
DECLARE_SPEC_FUN( spec_cast_mage );
DECLARE_SPEC_FUN( spec_cast_undead );
DECLARE_SPEC_FUN( spec_executioner );
DECLARE_SPEC_FUN( spec_fido );
DECLARE_SPEC_FUN( spec_guard );
DECLARE_SPEC_FUN( spec_janitor );
DECLARE_SPEC_FUN( spec_mayor );
DECLARE_SPEC_FUN( spec_poison );
DECLARE_SPEC_FUN( spec_thief );
/*
* Given a name, return the appropriate spec fun.
*/
SPEC_FUN *spec_lookup( const char *name )
{
if ( !str_cmp( name, "spec_breath_any" ) ) return spec_breath_any;
if ( !str_cmp( name, "spec_breath_acid" ) ) return spec_breath_acid;
if ( !str_cmp( name, "spec_breath_fire" ) ) return spec_breath_fire;
if ( !str_cmp( name, "spec_breath_frost" ) ) return spec_breath_frost;
if ( !str_cmp( name, "spec_breath_gas" ) ) return spec_breath_gas;
if ( !str_cmp( name, "spec_breath_lightning" ) ) return
spec_breath_lightning;
if ( !str_cmp( name, "spec_cast_adept" ) ) return spec_cast_adept;
if ( !str_cmp( name, "spec_cast_cleric" ) ) return spec_cast_cleric;
if ( !str_cmp( name, "spec_cast_judge" ) ) return spec_cast_judge;
if ( !str_cmp( name, "spec_cast_mage" ) ) return spec_cast_mage;
if ( !str_cmp( name, "spec_cast_undead" ) ) return spec_cast_undead;
if ( !str_cmp( name, "spec_executioner" ) ) return spec_executioner;
if ( !str_cmp( name, "spec_fido" ) ) return spec_fido;
if ( !str_cmp( name, "spec_guard" ) ) return spec_guard;
if ( !str_cmp( name, "spec_janitor" ) ) return spec_janitor;
if ( !str_cmp( name, "spec_mayor" ) ) return spec_mayor;
if ( !str_cmp( name, "spec_poison" ) ) return spec_poison;
if ( !str_cmp( name, "spec_thief" ) ) return spec_thief;
return 0;
}
/*
* Core procedure for dragons.
*/
bool dragon( CHAR_DATA *ch, char *spell_name )
{
CHAR_DATA *victim;
CHAR_DATA *v_next;
int sn;
if ( ch->position != POS_FIGHTING )
return FALSE;
for ( victim = ch->in_room->people; victim != NULL; victim = v_next )
{
v_next = victim->next_in_room;
if ( victim->fighting == ch && number_bits( 2 ) == 0 )
break;
}
if ( victim == NULL )
return FALSE;
if ( ( sn = skill_lookup( spell_name ) ) < 0 )
return FALSE;
(*skill_table[sn].spell_fun) ( sn, ch->level, ch, victim );
return TRUE;
}
/*
* Special procedures for mobiles.
*/
bool spec_breath_any( CHAR_DATA *ch )
{
if ( ch->position != POS_FIGHTING )
return FALSE;
switch ( number_bits( 3 ) )
{
case 0: return spec_breath_fire ( ch );
case 1:
case 2: return spec_breath_lightning ( ch );
case 3: return spec_breath_gas ( ch );
case 4: return spec_breath_acid ( ch );
case 5:
case 6:
case 7: return spec_breath_frost ( ch );
}
return FALSE;
}
bool spec_breath_acid( CHAR_DATA *ch )
{
return dragon( ch, "acid breath" );
}
bool spec_breath_fire( CHAR_DATA *ch )
{
return dragon( ch, "fire breath" );
}
bool spec_breath_frost( CHAR_DATA *ch )
{
return dragon( ch, "frost breath" );
}
bool spec_breath_gas( CHAR_DATA *ch )
{
int sn;
if ( ch->position != POS_FIGHTING )
return FALSE;
if ( ( sn = skill_lookup( "gas breath" ) ) < 0 )
return FALSE;
(*skill_table[sn].spell_fun) ( sn, ch->level, ch, NULL );
return TRUE;
}
bool spec_breath_lightning( CHAR_DATA *ch )
{
return dragon( ch, "lightning breath" );
}
bool spec_cast_adept( CHAR_DATA *ch )
{
CHAR_DATA *victim;
CHAR_DATA *v_next;
if ( !IS_AWAKE(ch) )
return FALSE;
for ( victim = ch->in_room->people; victim != NULL; victim = v_next )
{
v_next = victim->next_in_room;
if ( victim != ch && can_see( ch, victim ) && number_bits( 1 ) == 0 )
break;
}
if ( victim == NULL )
return FALSE;
switch ( number_bits( 3 ) )
{
case 0:
act( "$n utters the word 'tehctah'.", ch, NULL, NULL, TO_ROOM );
spell_armor( skill_lookup( "armor" ), ch->level, ch, victim );
return TRUE;
case 1:
act( "$n utters the word 'nhak'.", ch, NULL, NULL, TO_ROOM );
spell_bless( skill_lookup( "bless" ), ch->level, ch, victim );
return TRUE;
case 2:
act( "$n utters the word 'yeruf'.", ch, NULL, NULL, TO_ROOM );
spell_cure_blindness( skill_lookup( "cure blindness" ),
ch->level, ch, victim );
return TRUE;
case 3:
act( "$n utters the word 'garf'.", ch, NULL, NULL, TO_ROOM );
spell_cure_light( skill_lookup( "cure light" ),
ch->level, ch, victim );
return TRUE;
case 4:
act( "$n utters the words 'rozar'.", ch, NULL, NULL, TO_ROOM );
spell_cure_poison( skill_lookup( "cure poison" ),
ch->level, ch, victim );
return TRUE;
case 5:
act( "$n utters the words 'nadroj'.", ch, NULL, NULL, TO_ROOM );
spell_refresh( skill_lookup( "refresh" ), ch->level, ch, victim );
return TRUE;
}
return FALSE;
}
bool spec_cast_cleric( CHAR_DATA *ch )
{
CHAR_DATA *victim;
CHAR_DATA *v_next;
char *spell;
int sn;
if ( ch->position != POS_FIGHTING )
return FALSE;
for ( victim = ch->in_room->people; victim != NULL; victim = v_next )
{
v_next = victim->next_in_room;
if ( victim->fighting == ch && number_bits( 2 ) == 0 )
break;
}
if ( victim == NULL )
return FALSE;
for ( ;; )
{
int min_level;
switch ( number_bits( 4 ) )
{
case 0: min_level = 0; spell = "blindness"; break;
case 1: min_level = 3; spell = "cause serious"; break;
case 2: min_level = 7; spell = "earthquake"; break;
case 3: min_level = 9; spell = "cause critical"; break;
case 4: min_level = 10; spell = "dispel evil"; break;
case 5: min_level = 12; spell = "curse"; break;
case 6: min_level = 12; spell = "change sex"; break;
case 7: min_level = 13; spell = "flamestrike"; break;
case 8:
case 9:
case 10: min_level = 15; spell = "harm"; break;
default: min_level = 16; spell = "dispel magic"; break;
}
if ( ch->level >= min_level )
break;
}
if ( ( sn = skill_lookup( spell ) ) < 0 )
return FALSE;
(*skill_table[sn].spell_fun) ( sn, ch->level, ch, victim );
return TRUE;
}
bool spec_cast_judge( CHAR_DATA *ch )
{
CHAR_DATA *victim;
CHAR_DATA *v_next;
char *spell;
int sn;
if ( ch->position != POS_FIGHTING )
return FALSE;
for ( victim = ch->in_room->people; victim != NULL; victim = v_next )
{
v_next = victim->next_in_room;
if ( victim->fighting == ch && number_bits( 2 ) == 0 )
break;
}
if ( victim == NULL )
return FALSE;
spell = "high explosive";
if ( ( sn = skill_lookup( spell ) ) < 0 )
return FALSE;
(*skill_table[sn].spell_fun) ( sn, ch->level, ch, victim );
return TRUE;
}
bool spec_cast_mage( CHAR_DATA *ch )
{
CHAR_DATA *victim;
CHAR_DATA *v_next;
char *spell;
int sn;
if ( ch->position != POS_FIGHTING )
return FALSE;
for ( victim = ch->in_room->people; victim != NULL; victim = v_next )
{
v_next = victim->next_in_room;
if ( victim->fighting == ch && number_bits( 2 ) == 0 )
break;
}
if ( victim == NULL )
return FALSE;
for ( ;; )
{
int min_level;
switch ( number_bits( 4 ) )
{
case 0: min_level = 0; spell = "blindness"; break;
case 1: min_level = 3; spell = "chill touch"; break;
case 2: min_level = 7; spell = "weaken"; break;
case 3: min_level = 8; spell = "teleport"; break;
case 4: min_level = 11; spell = "colour spray"; break;
case 5: min_level = 12; spell = "change sex"; break;
case 6: min_level = 13; spell = "energy drain"; break;
case 7:
case 8:
case 9: min_level = 15; spell = "fireball"; break;
default: min_level = 20; spell = "acid blast"; break;
}
if ( ch->level >= min_level )
break;
}
if ( ( sn = skill_lookup( spell ) ) < 0 )
return FALSE;
(*skill_table[sn].spell_fun) ( sn, ch->level, ch, victim );
return TRUE;
}
bool spec_cast_undead( CHAR_DATA *ch )
{
CHAR_DATA *victim;
CHAR_DATA *v_next;
char *spell;
int sn;
if ( ch->position != POS_FIGHTING )
return FALSE;
for ( victim = ch->in_room->people; victim != NULL; victim = v_next )
{
v_next = victim->next_in_room;
if ( victim->fighting == ch && number_bits( 2 ) == 0 )
break;
}
if ( victim == NULL )
return FALSE;
for ( ;; )
{
int min_level;
switch ( number_bits( 4 ) )
{
case 0: min_level = 0; spell = "curse"; break;
case 1: min_level = 3; spell = "weaken"; break;
case 2: min_level = 6; spell = "chill touch"; break;
case 3: min_level = 9; spell = "blindness"; break;
case 4: min_level = 12; spell = "poison"; break;
case 5: min_level = 15; spell = "energy drain"; break;
case 6: min_level = 18; spell = "harm"; break;
case 7: min_level = 21; spell = "teleport"; break;
default: min_level = 24; spell = "gate"; break;
}
if ( ch->level >= min_level )
break;
}
if ( ( sn = skill_lookup( spell ) ) < 0 )
return FALSE;
(*skill_table[sn].spell_fun) ( sn, ch->level, ch, victim );
return TRUE;
}
bool spec_executioner( CHAR_DATA *ch )
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *v_next;
char *crime;
if ( !IS_AWAKE(ch) || ch->fighting != NULL )
return FALSE;
crime = "";
for ( victim = ch->in_room->people; victim != NULL; victim = v_next )
{
v_next = victim->next_in_room;
if ( !IS_NPC(victim) && IS_SET(victim->act, PLR_KILLER) )
{ crime = "KILLER"; break; }
if ( !IS_NPC(victim) && IS_SET(victim->act, PLR_THIEF) )
{ crime = "THIEF"; break; }
}
if ( victim == NULL )
return FALSE;
sprintf( buf, "%s is a %s! PROTECT THE INNOCENT! MORE BLOOOOD!!!",
victim->name, crime );
do_shout( ch, buf );
multi_hit( ch, victim, TYPE_UNDEFINED );
char_to_room( create_mobile( get_mob_index(MOB_VNUM_CITYGUARD) ),
ch->in_room );
char_to_room( create_mobile( get_mob_index(MOB_VNUM_CITYGUARD) ),
ch->in_room );
return TRUE;
}
bool spec_fido( CHAR_DATA *ch )
{
OBJ_DATA *corpse;
OBJ_DATA *c_next;
OBJ_DATA *obj;
OBJ_DATA *obj_next;
if ( !IS_AWAKE(ch) )
return FALSE;
for ( corpse = ch->in_room->contents; corpse != NULL; corpse = c_next )
{
c_next = corpse->next_content;
if ( corpse->item_type != ITEM_CORPSE_NPC )
continue;
act( "$n savagely devours a corpse.", ch, NULL, NULL, TO_ROOM );
for ( obj = corpse->contains; obj; obj = obj_next )
{
obj_next = obj->next_content;
obj_from_obj( obj );
obj_to_room( obj, ch->in_room );
}
extract_obj( corpse );
return TRUE;
}
return FALSE;
}
bool spec_guard( CHAR_DATA *ch )
{
char buf[MAX_STRING_LENGTH];
CHAR_DATA *victim;
CHAR_DATA *v_next;
CHAR_DATA *ech;
char *crime;
int max_evil;
if ( !IS_AWAKE(ch) || ch->fighting != NULL )
return FALSE;
max_evil = 300;
ech = NULL;
crime = "";
for ( victim = ch->in_room->people; victim != NULL; victim = v_next )
{
v_next = victim->next_in_room;
if ( !IS_NPC(victim) && IS_SET(victim->act, PLR_KILLER) )
{ crime = "KILLER"; break; }
if ( !IS_NPC(victim) && IS_SET(victim->act, PLR_THIEF) )
{ crime = "THIEF"; break; }
if ( victim->fighting != NULL
&& victim->fighting != ch
&& victim->alignment < max_evil )
{
max_evil = victim->alignment;
ech = victim;
}
}
if ( victim != NULL )
{
sprintf( buf, "%s is a %s! PROTECT THE INNOCENT!! BANZAI!!",
victim->name, crime );
do_shout( ch, buf );
multi_hit( ch, victim, TYPE_UNDEFINED );
return TRUE;
}
if ( ech != NULL )
{
act( "$n screams 'PROTECT THE INNOCENT!! BANZAI!!",
ch, NULL, NULL, TO_ROOM );
multi_hit( ch, ech, TYPE_UNDEFINED );
return TRUE;
}
return FALSE;
}
bool spec_janitor( CHAR_DATA *ch )
{
OBJ_DATA *trash;
OBJ_DATA *trash_next;
if ( !IS_AWAKE(ch) )
return FALSE;
for ( trash = ch->in_room->contents; trash != NULL; trash = trash_next )
{
trash_next = trash->next_content;
if ( !IS_SET( trash->wear_flags, ITEM_TAKE ) )
continue;
if ( trash->item_type == ITEM_DRINK_CON
|| trash->item_type == ITEM_TRASH
|| trash->cost < 10 )
{
act( "$n picks up some trash.", ch, NULL, NULL, TO_ROOM );
obj_from_room( trash );
obj_to_char( trash, ch );
return TRUE;
}
}
return FALSE;
}
bool spec_mayor( CHAR_DATA *ch )
{
static const char open_path[] =
"W3a3003b33000c111d0d111Oe333333Oe22c222112212111a1S.";
static const char close_path[] =
"W3a3003b33000c111d0d111CE333333CE22c222112212111a1S.";
static const char *path;
static int pos;
static bool move;
if ( !move )
{
if ( time_info.hour == 6 )
{
path = open_path;
move = TRUE;
pos = 0;
}
if ( time_info.hour == 20 )
{
path = close_path;
move = TRUE;
pos = 0;
}
}
if ( ch->fighting != NULL )
return spec_cast_cleric( ch );
if ( !move || ch->position < POS_SLEEPING )
return FALSE;
switch ( path[pos] )
{
case '0':
case '1':
case '2':
case '3':
move_char( ch, path[pos] - '0' );
break;
case 'W':
ch->position = POS_STANDING;
act( "$n awakens and groans loudly.", ch, NULL, NULL, TO_ROOM );
break;
case 'S':
ch->position = POS_SLEEPING;
act( "$n lies down and falls asleep.", ch, NULL, NULL, TO_ROOM );
break;
case 'a':
act( "$n says 'Hello Honey!'", ch, NULL, NULL, TO_ROOM );
break;
case 'b':
act( "$n says 'What a view! I must do something about that dump!'",
ch, NULL, NULL, TO_ROOM );
break;
case 'c':
act( "$n says 'Vandals! Youngsters have no respect for anything!'",
ch, NULL, NULL, TO_ROOM );
break;
case 'd':
act( "$n says 'Good day, citizens!'", ch, NULL, NULL, TO_ROOM );
break;
case 'e':
act( "$n says 'I hereby declare the city of Midgaard open!'",
ch, NULL, NULL, TO_ROOM );
break;
case 'E':
act( "$n says 'I hereby declare the city of Midgaard closed!'",
ch, NULL, NULL, TO_ROOM );
break;
case 'O':
do_unlock( ch, "gate" );
do_open( ch, "gate" );
break;
case 'C':
do_close( ch, "gate" );
do_lock( ch, "gate" );
break;
case '.' :
move = FALSE;
break;
}
pos++;
return FALSE;
}
bool spec_poison( CHAR_DATA *ch )
{
CHAR_DATA *victim;
if ( ch->position != POS_FIGHTING
|| ( victim = ch->fighting ) == NULL
|| number_percent( ) > 2 * ch->level )
return FALSE;
act( "You bite $N!", ch, NULL, victim, TO_CHAR );
act( "$n bites $N!", ch, NULL, victim, TO_NOTVICT );
act( "$n bites you!", ch, NULL, victim, TO_VICT );
spell_poison( gsn_poison, ch->level, ch, victim );
return TRUE;
}
bool spec_thief( CHAR_DATA *ch )
{
CHAR_DATA *victim;
CHAR_DATA *v_next;
int gold;
if ( ch->position != POS_STANDING )
return FALSE;
for ( victim = ch->in_room->people; victim != NULL; victim = v_next )
{
v_next = victim->next_in_room;
if ( IS_NPC(victim)
|| victim->level >= LEVEL_IMMORTAL
|| number_bits( 2 ) != 0
|| !can_see( ch, victim ) ) /* Thx Glop */
continue;
if ( IS_AWAKE(victim) && number_range( 0, ch->level ) == 0 )
{
act( "You discover $n's hands in your wallet!",
ch, NULL, victim, TO_VICT );
act( "$N discovers $n's hands in $S wallet!",
ch, NULL, victim, TO_NOTVICT );
return TRUE;
}
else
{
gold = victim->gold * number_range( 1, 20 ) / 100;
ch->gold += 7 * gold / 8;
victim->gold -= gold;
return TRUE;
}
}
return FALSE;
}

42
src/startup Executable file
View file

@ -0,0 +1,42 @@
#! /bin/csh -f
# Written by Furey.
# With additions from Tony.
# Set the port number.
set port = 4000
if ( "$1" != "" ) set port="$1"
# Change to area directory.
cd ../area
# Set limits.
nohup
nice
limit stack 1024k
if ( -e shutdown.txt ) rm -f shutdown.txt
while ( 1 )
# If you want to have logs in a different directory,
# change the 'set logfile' line to reflect the directory name.
set index = 1000
while ( 1 )
set logfile = ../log/$index.log
if ( ! -e $logfile ) break
@ index++
end
# Run merc.
../src/merc $port >&! $logfile
# Delete this out if no adb.
if ( -e core ) then
echo '$c' | adb ../src/merc
endif
# Restart, giving old connections a chance to die.
if ( -e shutdown.txt ) then
rm -f shutdown.txt
exit 0
endif
sleep 15
end

822
src/update.c Normal file
View file

@ -0,0 +1,822 @@
/***************************************************************************
* Original Diku Mud copyright (C) 1990, 1991 by Sebastian Hammer, *
* Michael Seifert, Hans Henrik St{rfeldt, Tom Madsen, and Katja Nyboe. *
* *
* Merc Diku Mud improvments copyright (C) 1992, 1993 by Michael *
* Chastain, Michael Quan, and Mitchell Tse. *
* *
* In order to use any part of this Merc Diku Mud, you must comply with *
* both the original Diku license in 'license.doc' as well the Merc *
* license in 'license.txt'. In particular, you may not remove either of *
* these copyright notices. *
* *
* Much time and thought has gone into this software and you are *
* benefitting. We hope that you share your changes too. What goes *
* around, comes around. *
***************************************************************************/
#if defined(macintosh)
#include <types.h>
#else
#include <sys/types.h>
#endif
#include <stdio.h>
#include <string.h>
#include <time.h>
#include "merc.h"
/*
* Local functions.
*/
int hit_gain args( ( CHAR_DATA *ch ) );
int mana_gain args( ( CHAR_DATA *ch ) );
int move_gain args( ( CHAR_DATA *ch ) );
void mobile_update args( ( void ) );
void weather_update args( ( void ) );
void char_update args( ( void ) );
void obj_update args( ( void ) );
void aggr_update args( ( void ) );
/*
* Advancement stuff.
*/
void advance_level( CHAR_DATA *ch )
{
char buf[MAX_STRING_LENGTH];
int add_hp;
int add_mana;
int add_move;
int add_prac;
sprintf( buf, "the %s",
title_table [ch->class] [ch->level] [ch->sex == SEX_FEMALE ? 1 : 0] );
set_title( ch, buf );
add_hp = con_app[get_curr_con(ch)].hitp + number_range(
class_table[ch->class].hp_min,
class_table[ch->class].hp_max );
add_mana = class_table[ch->class].fMana
? number_range(2, (2*get_curr_int(ch)+get_curr_wis(ch))/8)
: 0;
add_move = number_range( 5, (get_curr_con(ch)+get_curr_dex(ch))/4 );
add_prac = wis_app[get_curr_wis(ch)].practice;
add_hp = UMAX( 1, add_hp );
add_mana = UMAX( 0, add_mana );
add_move = UMAX( 10, add_move );
ch->max_hit += add_hp;
ch->max_mana += add_mana;
ch->max_move += add_move;
ch->practice += add_prac;
if ( !IS_NPC(ch) )
REMOVE_BIT( ch->act, PLR_BOUGHT_PET );
sprintf( buf,
"Your gain is: %d/%d hp, %d/%d m, %d/%d mv %d/%d prac.\n\r",
add_hp, ch->max_hit,
add_mana, ch->max_mana,
add_move, ch->max_move,
add_prac, ch->practice
);
send_to_char( buf, ch );
return;
}
void gain_exp( CHAR_DATA *ch, int gain )
{
if ( IS_NPC(ch) || ch->level >= LEVEL_HERO )
return;
ch->exp = UMAX( 1000, ch->exp + gain );
while ( ch->level < LEVEL_HERO && ch->exp >= 1000 * (ch->level+1) )
{
send_to_char( "You raise a level!! ", ch );
ch->level += 1;
advance_level( ch );
}
return;
}
/*
* Regeneration stuff.
*/
int hit_gain( CHAR_DATA *ch )
{
int gain;
if ( IS_NPC(ch) )
{
gain = ch->level * 3 / 2;
}
else
{
gain = UMIN( 5, ch->level );
switch ( ch->position )
{
case POS_SLEEPING: gain += get_curr_con(ch); break;
case POS_RESTING: gain += get_curr_con(ch) / 2; break;
}
if ( ch->pcdata->condition[COND_FULL] == 0 )
gain /= 2;
if ( ch->pcdata->condition[COND_THIRST] == 0 )
gain /= 2;
}
if ( IS_AFFECTED(ch, AFF_POISON) )
gain /= 4;
return UMIN(gain, ch->max_hit - ch->hit);
}
int mana_gain( CHAR_DATA *ch )
{
int gain;
if ( IS_NPC(ch) )
{
gain = ch->level;
}
else
{
gain = UMIN( 5, ch->level / 2 );
switch ( ch->position )
{
case POS_SLEEPING: gain += get_curr_int(ch) * 2; break;
case POS_RESTING: gain += get_curr_int(ch); break;
}
if ( ch->pcdata->condition[COND_FULL] == 0 )
gain /= 2;
if ( ch->pcdata->condition[COND_THIRST] == 0 )
gain /= 2;
}
if ( IS_AFFECTED( ch, AFF_POISON ) )
gain /= 4;
return UMIN(gain, ch->max_mana - ch->mana);
}
int move_gain( CHAR_DATA *ch )
{
int gain;
if ( IS_NPC(ch) )
{
gain = ch->level;
}
else
{
gain = UMAX( 15, 2 * ch->level );
switch ( ch->position )
{
case POS_SLEEPING: gain += get_curr_dex(ch); break;
case POS_RESTING: gain += get_curr_dex(ch) / 2; break;
}
if ( ch->pcdata->condition[COND_FULL] == 0 )
gain /= 2;
if ( ch->pcdata->condition[COND_THIRST] == 0 )
gain /= 2;
}
if ( IS_AFFECTED(ch, AFF_POISON) )
gain /= 4;
return UMIN(gain, ch->max_move - ch->move);
}
void gain_condition( CHAR_DATA *ch, int iCond, int value )
{
int condition;
if ( value == 0 || IS_NPC(ch) || ch->level >= LEVEL_HERO )
return;
condition = ch->pcdata->condition[iCond];
ch->pcdata->condition[iCond] = URANGE( 0, condition + value, 48 );
if ( ch->pcdata->condition[iCond] == 0 )
{
switch ( iCond )
{
case COND_FULL:
send_to_char( "You are hungry.\n\r", ch );
break;
case COND_THIRST:
send_to_char( "You are thirsty.\n\r", ch );
break;
case COND_DRUNK:
if ( condition != 0 )
send_to_char( "You are sober.\n\r", ch );
break;
}
}
return;
}
/*
* Mob autonomous action.
* This function takes 25% to 35% of ALL Merc cpu time.
* -- Furey
*/
void mobile_update( void )
{
CHAR_DATA *ch;
CHAR_DATA *ch_next;
EXIT_DATA *pexit;
int door;
/* Examine all mobs. */
for ( ch = char_list; ch != NULL; ch = ch_next )
{
ch_next = ch->next;
if ( !IS_NPC(ch) || ch->in_room == NULL || IS_AFFECTED(ch, AFF_CHARM) )
continue;
/* Examine call for special procedure */
if ( ch->spec_fun != 0 )
{
if ( (*ch->spec_fun) ( ch ) )
continue;
}
/* That's all for sleeping / busy monster */
if ( ch->position != POS_STANDING )
continue;
/* Scavenge */
if ( IS_SET(ch->act, ACT_SCAVENGER)
&& ch->in_room->contents != NULL
&& number_bits( 2 ) == 0 )
{
OBJ_DATA *obj;
OBJ_DATA *obj_best;
int max;
max = 1;
obj_best = 0;
for ( obj = ch->in_room->contents; obj; obj = obj->next_content )
{
if ( CAN_WEAR(obj, ITEM_TAKE) && obj->cost > max )
{
obj_best = obj;
max = obj->cost;
}
}
if ( obj_best )
{
obj_from_room( obj_best );
obj_to_char( obj_best, ch );
act( "$n gets $p.", ch, obj_best, NULL, TO_ROOM );
}
}
/* Wander */
if ( !IS_SET(ch->act, ACT_SENTINEL)
&& ( door = number_bits( 5 ) ) <= 5
&& ( pexit = ch->in_room->exit[door] ) != NULL
&& pexit->to_room != NULL
&& !IS_SET(pexit->exit_info, EX_CLOSED)
&& !IS_SET(pexit->to_room->room_flags, ROOM_NO_MOB)
&& ( !IS_SET(ch->act, ACT_STAY_AREA)
|| pexit->to_room->area == ch->in_room->area ) )
{
move_char( ch, door );
}
/* Flee */
if ( ch->hit < ch->max_hit / 2
&& ( door = number_bits( 3 ) ) <= 5
&& ( pexit = ch->in_room->exit[door] ) != NULL
&& pexit->to_room != NULL
&& !IS_SET(pexit->exit_info, EX_CLOSED)
&& !IS_SET(pexit->to_room->room_flags, ROOM_NO_MOB) )
{
CHAR_DATA *rch;
bool found;
found = FALSE;
for ( rch = pexit->to_room->people;
rch != NULL;
rch = rch->next_in_room )
{
if ( !IS_NPC(rch) )
{
found = TRUE;
break;
}
}
if ( !found )
move_char( ch, door );
}
}
return;
}
/*
* Update the weather.
*/
void weather_update( void )
{
char buf[MAX_STRING_LENGTH];
DESCRIPTOR_DATA *d;
int diff;
buf[0] = '\0';
switch ( ++time_info.hour )
{
case 5:
weather_info.sunlight = SUN_LIGHT;
strcat( buf, "The day has begun.\n\r" );
break;
case 6:
weather_info.sunlight = SUN_RISE;
strcat( buf, "The sun rises in the east.\n\r" );
break;
case 19:
weather_info.sunlight = SUN_SET;
strcat( buf, "The sun slowly disappears in the west.\n\r" );
break;
case 20:
weather_info.sunlight = SUN_DARK;
strcat( buf, "The night has begun.\n\r" );
break;
case 24:
time_info.hour = 0;
time_info.day++;
break;
}
if ( time_info.day >= 35 )
{
time_info.day = 0;
time_info.month++;
}
if ( time_info.month >= 17 )
{
time_info.month = 0;
time_info.year++;
}
/*
* Weather change.
*/
if ( time_info.month >= 9 && time_info.month <= 16 )
diff = weather_info.mmhg > 985 ? -2 : 2;
else
diff = weather_info.mmhg > 1015 ? -2 : 2;
weather_info.change += diff * dice(1, 4) + dice(2, 6) - dice(2, 6);
weather_info.change = UMAX(weather_info.change, -12);
weather_info.change = UMIN(weather_info.change, 12);
weather_info.mmhg += weather_info.change;
weather_info.mmhg = UMAX(weather_info.mmhg, 960);
weather_info.mmhg = UMIN(weather_info.mmhg, 1040);
switch ( weather_info.sky )
{
default:
bug( "Weather_update: bad sky %d.", weather_info.sky );
weather_info.sky = SKY_CLOUDLESS;
break;
case SKY_CLOUDLESS:
if ( weather_info.mmhg < 990
|| ( weather_info.mmhg < 1010 && number_bits( 2 ) == 0 ) )
{
strcat( buf, "The sky is getting cloudy.\n\r" );
weather_info.sky = SKY_CLOUDY;
}
break;
case SKY_CLOUDY:
if ( weather_info.mmhg < 970
|| ( weather_info.mmhg < 990 && number_bits( 2 ) == 0 ) )
{
strcat( buf, "It starts to rain.\n\r" );
weather_info.sky = SKY_RAINING;
}
if ( weather_info.mmhg > 1030 && number_bits( 2 ) == 0 )
{
strcat( buf, "The clouds disappear.\n\r" );
weather_info.sky = SKY_CLOUDLESS;
}
break;
case SKY_RAINING:
if ( weather_info.mmhg < 970 && number_bits( 2 ) == 0 )
{
strcat( buf, "Lightning flashes in the sky.\n\r" );
weather_info.sky = SKY_LIGHTNING;
}
if ( weather_info.mmhg > 1030
|| ( weather_info.mmhg > 1010 && number_bits( 2 ) == 0 ) )
{
strcat( buf, "The rain stopped.\n\r" );
weather_info.sky = SKY_CLOUDY;
}
break;
case SKY_LIGHTNING:
if ( weather_info.mmhg > 1010
|| ( weather_info.mmhg > 990 && number_bits( 2 ) == 0 ) )
{
strcat( buf, "The lightning has stopped.\n\r" );
weather_info.sky = SKY_RAINING;
break;
}
break;
}
if ( buf[0] != '\0' )
{
for ( d = descriptor_list; d != NULL; d = d->next )
{
if ( d->connected == CON_PLAYING
&& IS_OUTSIDE(d->character)
&& IS_AWAKE(d->character) )
send_to_char( buf, d->character );
}
}
return;
}
/*
* Update all chars, including mobs.
* This function is performance sensitive.
*/
void char_update( void )
{
CHAR_DATA *ch;
CHAR_DATA *ch_next;
CHAR_DATA *ch_save;
CHAR_DATA *ch_quit;
time_t save_time;
save_time = current_time;
ch_save = NULL;
ch_quit = NULL;
for ( ch = char_list; ch != NULL; ch = ch_next )
{
AFFECT_DATA *paf;
AFFECT_DATA *paf_next;
ch_next = ch->next;
/*
* Find dude with oldest save time.
*/
if ( !IS_NPC(ch)
&& ( ch->desc == NULL || ch->desc->connected == CON_PLAYING )
&& ch->level >= 2
&& ch->save_time < save_time )
{
ch_save = ch;
save_time = ch->save_time;
}
if ( ch->position >= POS_STUNNED )
{
if ( ch->hit < ch->max_hit )
ch->hit += hit_gain(ch);
if ( ch->mana < ch->max_mana )
ch->mana += mana_gain(ch);
if ( ch->move < ch->max_move )
ch->move += move_gain(ch);
}
if ( ch->position == POS_STUNNED )
update_pos( ch );
if ( !IS_NPC(ch) && ch->level < LEVEL_IMMORTAL )
{
OBJ_DATA *obj;
if ( ( obj = get_eq_char( ch, WEAR_LIGHT ) ) != NULL
&& obj->item_type == ITEM_LIGHT
&& obj->value[2] > 0 )
{
if ( --obj->value[2] == 0 && ch->in_room != NULL )
{
--ch->in_room->light;
act( "$p goes out.", ch, obj, NULL, TO_ROOM );
act( "$p goes out.", ch, obj, NULL, TO_CHAR );
extract_obj( obj );
}
}
if ( ++ch->timer >= 12 )
{
if ( ch->was_in_room == NULL && ch->in_room != NULL )
{
ch->was_in_room = ch->in_room;
if ( ch->fighting != NULL )
stop_fighting( ch, TRUE );
act( "$n disappears into the void.",
ch, NULL, NULL, TO_ROOM );
send_to_char( "You disappear into the void.\n\r", ch );
save_char_obj( ch );
char_from_room( ch );
char_to_room( ch, get_room_index( ROOM_VNUM_LIMBO ) );
}
}
if ( ch->timer > 30 )
ch_quit = ch;
gain_condition( ch, COND_DRUNK, -1 );
gain_condition( ch, COND_FULL, -1 );
gain_condition( ch, COND_THIRST, -1 );
}
for ( paf = ch->affected; paf != NULL; paf = paf_next )
{
paf_next = paf->next;
if ( paf->duration > 0 )
paf->duration--;
else if ( paf->duration < 0 )
;
else
{
if ( paf_next == NULL
|| paf_next->type != paf->type
|| paf_next->duration > 0 )
{
if ( paf->type > 0 && skill_table[paf->type].msg_off )
{
send_to_char( skill_table[paf->type].msg_off, ch );
send_to_char( "\n\r", ch );
}
}
affect_remove( ch, paf );
}
}
/*
* Careful with the damages here,
* MUST NOT refer to ch after damage taken,
* as it may be lethal damage (on NPC).
*/
if ( IS_AFFECTED(ch, AFF_POISON) )
{
act( "$n shivers and suffers.", ch, NULL, NULL, TO_ROOM );
send_to_char( "You shiver and suffer.\n\r", ch );
damage( ch, ch, 2, gsn_poison );
}
else if ( ch->position == POS_INCAP )
{
damage( ch, ch, 1, TYPE_UNDEFINED );
}
else if ( ch->position == POS_MORTAL )
{
damage( ch, ch, 2, TYPE_UNDEFINED );
}
}
/*
* Autosave and autoquit.
* Check that these chars still exist.
*/
if ( ch_save != NULL || ch_quit != NULL )
{
for ( ch = char_list; ch != NULL; ch = ch_next )
{
ch_next = ch->next;
if ( ch == ch_save )
save_char_obj( ch );
if ( ch == ch_quit )
do_quit( ch, "" );
}
}
return;
}
/*
* Update all objs.
* This function is performance sensitive.
*/
void obj_update( void )
{
OBJ_DATA *obj;
OBJ_DATA *obj_next;
for ( obj = object_list; obj != NULL; obj = obj_next )
{
CHAR_DATA *rch;
char *message;
obj_next = obj->next;
if ( obj->timer <= 0 || --obj->timer > 0 )
continue;
switch ( obj->item_type )
{
default: message = "$p vanishes."; break;
case ITEM_FOUNTAIN: message = "$p dries up."; break;
case ITEM_CORPSE_NPC: message = "$p decays into dust."; break;
case ITEM_CORPSE_PC: message = "$p decays into dust."; break;
case ITEM_FOOD: message = "$p decomposes."; break;
}
if ( obj->carried_by != NULL )
{
act( message, obj->carried_by, obj, NULL, TO_CHAR );
}
else if ( obj->in_room != NULL
&& ( rch = obj->in_room->people ) != NULL )
{
act( message, rch, obj, NULL, TO_ROOM );
act( message, rch, obj, NULL, TO_CHAR );
}
extract_obj( obj );
}
return;
}
/*
* Aggress.
*
* for each mortal PC
* for each mob in room
* aggress on some random PC
*
* This function takes 25% to 35% of ALL Merc cpu time.
* Unfortunately, checking on each PC move is too tricky,
* because we don't the mob to just attack the first PC
* who leads the party into the room.
*
* -- Furey
*/
void aggr_update( void )
{
CHAR_DATA *wch;
CHAR_DATA *wch_next;
CHAR_DATA *ch;
CHAR_DATA *ch_next;
CHAR_DATA *vch;
CHAR_DATA *vch_next;
CHAR_DATA *victim;
for ( wch = char_list; wch != NULL; wch = wch_next )
{
wch_next = wch->next;
if ( IS_NPC(wch)
|| wch->level >= LEVEL_IMMORTAL
|| wch->in_room == NULL )
continue;
for ( ch = wch->in_room->people; ch != NULL; ch = ch_next )
{
int count;
ch_next = ch->next_in_room;
if ( !IS_NPC(ch)
|| !IS_SET(ch->act, ACT_AGGRESSIVE)
|| ch->fighting != NULL
|| IS_AFFECTED(ch, AFF_CHARM)
|| !IS_AWAKE(ch)
|| ( IS_SET(ch->act, ACT_WIMPY) && IS_AWAKE(wch) )
|| !can_see( ch, wch ) )
continue;
/*
* Ok we have a 'wch' player character and a 'ch' npc aggressor.
* Now make the aggressor fight a RANDOM pc victim in the room,
* giving each 'vch' an equal chance of selection.
*/
count = 0;
victim = NULL;
for ( vch = wch->in_room->people; vch != NULL; vch = vch_next )
{
vch_next = vch->next_in_room;
if ( !IS_NPC(vch)
&& vch->level < LEVEL_IMMORTAL
&& ( !IS_SET(ch->act, ACT_WIMPY) || !IS_AWAKE(vch) )
&& can_see( ch, vch ) )
{
if ( number_range( 0, count ) == 0 )
victim = vch;
count++;
}
}
if ( victim == NULL )
{
bug( "Aggr_update: null victim.", count );
continue;
}
multi_hit( ch, victim, TYPE_UNDEFINED );
}
}
return;
}
/*
* Handle all kinds of updates.
* Called once per pulse from game loop.
* Random times to defeat tick-timing clients and players.
*/
void update_handler( void )
{
static int pulse_area;
static int pulse_mobile;
static int pulse_violence;
static int pulse_point;
if ( --pulse_area <= 0 )
{
pulse_area = number_range( PULSE_AREA / 2, 3 * PULSE_AREA / 2 );
area_update ( );
}
if ( --pulse_mobile <= 0 )
{
pulse_mobile = PULSE_MOBILE;
mobile_update ( );
}
if ( --pulse_violence <= 0 )
{
pulse_violence = PULSE_VIOLENCE;
violence_update ( );
}
if ( --pulse_point <= 0 )
{
pulse_point = number_range( PULSE_TICK / 2, 3 * PULSE_TICK / 2 );
weather_update ( );
char_update ( );
obj_update ( );
}
aggr_update( );
tail_chain( );
return;
}