mirror of
https://github.com/alexmchale/merc-mud
synced 2026-08-12 12:26:04 -04:00
Initial commit of Merc 2.1
This commit is contained in:
commit
358bed4591
88 changed files with 106967 additions and 0 deletions
153
README
Normal file
153
README
Normal 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
1217
area/air.are
Normal file
File diff suppressed because it is too large
Load diff
1259
area/arachnos.are
Normal file
1259
area/arachnos.are
Normal file
File diff suppressed because it is too large
Load diff
45
area/area.lst
Normal file
45
area/area.lst
Normal 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
2015
area/canyon.are
Normal file
File diff suppressed because it is too large
Load diff
1731
area/catacomb.are
Normal file
1731
area/catacomb.are
Normal file
File diff suppressed because it is too large
Load diff
1952
area/chapel.are
Normal file
1952
area/chapel.are
Normal file
File diff suppressed because it is too large
Load diff
597
area/daycare.are
Normal file
597
area/daycare.are
Normal 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
1557
area/draconia.are
Normal file
File diff suppressed because it is too large
Load diff
1355
area/dream.are
Normal file
1355
area/dream.are
Normal file
File diff suppressed because it is too large
Load diff
1218
area/drow.are
Normal file
1218
area/drow.are
Normal file
File diff suppressed because it is too large
Load diff
1302
area/dwarven.are
Normal file
1302
area/dwarven.are
Normal file
File diff suppressed because it is too large
Load diff
1798
area/dylan.are
Normal file
1798
area/dylan.are
Normal file
File diff suppressed because it is too large
Load diff
1438
area/eastern.are
Normal file
1438
area/eastern.are
Normal file
File diff suppressed because it is too large
Load diff
996
area/firenewt.are
Normal file
996
area/firenewt.are
Normal 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
1915
area/galaxy.are
Normal file
File diff suppressed because it is too large
Load diff
2229
area/gnome.are
Normal file
2229
area/gnome.are
Normal file
File diff suppressed because it is too large
Load diff
921
area/grave.are
Normal file
921
area/grave.are
Normal 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
886
area/grove.are
Normal 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
2502
area/haon.are
Normal file
File diff suppressed because it is too large
Load diff
1657
area/help.are
Normal file
1657
area/help.are
Normal file
File diff suppressed because it is too large
Load diff
5434
area/hitower.are
Normal file
5434
area/hitower.are
Normal file
File diff suppressed because it is too large
Load diff
1695
area/hood.are
Normal file
1695
area/hood.are
Normal file
File diff suppressed because it is too large
Load diff
1709
area/juargan.are
Normal file
1709
area/juargan.are
Normal file
File diff suppressed because it is too large
Load diff
148
area/limbo.are
Normal file
148
area/limbo.are
Normal 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
3837
area/mahntor.are
Normal file
File diff suppressed because it is too large
Load diff
762
area/marsh.are
Normal file
762
area/marsh.are
Normal 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
998
area/mega1.are
Normal 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
1078
area/midennir.are
Normal file
File diff suppressed because it is too large
Load diff
4107
area/midgaard.are
Normal file
4107
area/midgaard.are
Normal file
File diff suppressed because it is too large
Load diff
2988
area/mirror.are
Normal file
2988
area/mirror.are
Normal file
File diff suppressed because it is too large
Load diff
693
area/mobfact.are
Normal file
693
area/mobfact.are
Normal 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
2706
area/moria.are
Normal file
File diff suppressed because it is too large
Load diff
202
area/ofcol.are
Normal file
202
area/ofcol.are
Normal 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
3316
area/ofcol2.are
Normal file
File diff suppressed because it is too large
Load diff
1531
area/olympus.are
Normal file
1531
area/olympus.are
Normal file
File diff suppressed because it is too large
Load diff
1313
area/plains.are
Normal file
1313
area/plains.are
Normal file
File diff suppressed because it is too large
Load diff
40
area/proto.are
Normal file
40
area/proto.are
Normal 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
500
area/redferne.are
Normal 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
2023
area/school.are
Normal file
File diff suppressed because it is too large
Load diff
4755
area/sewer.are
Normal file
4755
area/sewer.are
Normal file
File diff suppressed because it is too large
Load diff
1836
area/shire.are
Normal file
1836
area/shire.are
Normal file
File diff suppressed because it is too large
Load diff
859
area/smurf.are
Normal file
859
area/smurf.are
Normal 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
2199
area/thalos.are
Normal file
File diff suppressed because it is too large
Load diff
350
area/trollden.are
Normal file
350
area/trollden.are
Normal 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
2261
area/valley.are
Normal file
File diff suppressed because it is too large
Load diff
1676
area/wyvern.are
Normal file
1676
area/wyvern.are
Normal file
File diff suppressed because it is too large
Load diff
133
doc/act.txt
Normal file
133
doc/act.txt
Normal 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
935
doc/area.txt
Normal 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
122
doc/class.txt
Normal 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
115
doc/command.txt
Normal 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
183
doc/contrib.txt
Normal 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
118
doc/drool.txt
Normal 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
358
doc/hacker.txt
Normal 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
103
doc/license.doc
Normal 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
46
doc/license.txt
Normal 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
137
doc/memory.txt
Normal 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
260
doc/new.txt
Normal 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
101
doc/pfile.txt
Normal 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
130
doc/port.txt
Normal 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
106
doc/security.txt
Normal 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
36
doc/sites.txt
Normal 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
254
doc/skill.txt
Normal 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
95
doc/sky.txt
Normal 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
81
doc/trad.txt
Normal 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
34
doc/vnum.txt
Normal 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
12
log/README
Normal 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
14
player/README
Normal 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
15
src/Makefile
Normal 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
BIN
src/Merc.exe
Normal file
Binary file not shown.
1435
src/act_comm.c
Normal file
1435
src/act_comm.c
Normal file
File diff suppressed because it is too large
Load diff
2035
src/act_info.c
Normal file
2035
src/act_info.c
Normal file
File diff suppressed because it is too large
Load diff
1000
src/act_move.c
Normal file
1000
src/act_move.c
Normal file
File diff suppressed because it is too large
Load diff
2063
src/act_obj.c
Normal file
2063
src/act_obj.c
Normal file
File diff suppressed because it is too large
Load diff
2622
src/act_wiz.c
Normal file
2622
src/act_wiz.c
Normal file
File diff suppressed because it is too large
Load diff
1771
src/comm.c
Normal file
1771
src/comm.c
Normal file
File diff suppressed because it is too large
Load diff
1103
src/const.c
Normal file
1103
src/const.c
Normal file
File diff suppressed because it is too large
Load diff
1560
src/fight.c
Normal file
1560
src/fight.c
Normal file
File diff suppressed because it is too large
Load diff
1560
src/handler.c
Normal file
1560
src/handler.c
Normal file
File diff suppressed because it is too large
Load diff
1611
src/interp.c
Normal file
1611
src/interp.c
Normal file
File diff suppressed because it is too large
Load diff
2264
src/magic.c
Normal file
2264
src/magic.c
Normal file
File diff suppressed because it is too large
Load diff
BIN
src/merc
Executable file
BIN
src/merc
Executable file
Binary file not shown.
1755
src/merc.h
Normal file
1755
src/merc.h
Normal file
File diff suppressed because it is too large
Load diff
899
src/save.c
Normal file
899
src/save.c
Normal 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
736
src/special.c
Normal 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
42
src/startup
Executable 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
822
src/update.c
Normal 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;
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue