Dead Souls Admin FAQ

Written by Cratylus @ Dead Souls, October 2005
Updated 28 December 2006

Note: commands are displayed in boldface, like this: ls -a

What's this FAQ about?


The point of this document is to orient a new admin in
Dead Souls 2. Starting a MUD with a lib that is completely new to
you can be confusing and discouraging. Hopefully this FAQ will
make the experience less difficult.


0 How do I start?

1 Is there a MUD somewhere running Dead Souls I can log into?

2 I like Dead Souls and I want to use it, but I don't want to run a mud.

3 I want to invite my friends to help me code. How do I promote
them to creator status?

4 What about intermud? How do I talk on that?

5 I talk on intermud but nobody replies. What's up with that?

6 How did you know my mud started up?

7 I heard there's an I3 router included in Dead Souls.

8 What's this about a manual on Frontiers?

9 How do I add limbs to a race?

10 How do I add a race?

11 How do I make my friend an admin?

12 I don't like how the who command output looks! You should change it.

13 Can you please make the FAQ easier to read? It's too long and complicated.

14 Most of the file headers have only Descartes's name on them.
Did you really develop this lib or did he?

15 How can I change the colors of the channel messages?

16 How do I know what other muds use Dead Souls?

17 I was hanging out in the Arch room and the loudspeaker went off. WTF?

18 I want to test the intermud channel but I don't want to spam the ds line.

19 What's this "Network room"?

20 The web server and FTP server don't work

21 I tried to log in to the FTP server but I can't!

22 I can't do anything with FTP. It just hangs there.

23 The web server gives me a 404 but I know the directory is there.

24 I'm using an external FTP server, but the files I transfer
become read only!

25 I moved a command from one directory to another. How do I
get the new location recognized?

26 The mudtime is all wrong!

27 The time of day is all wrong!

28 What happened to the roommaker and thingmaker?

29 I keep getting 'Connection to address server (localhost 9999) refused.'

30 Can I charge players a fee for playing on my mud?

31 Can people donate money to me for the mud?

32 I found a bug. For real. Can you please fix it?

33 Where would I edit to change how long someone can be idle
before they get disconnected?

34 How do I permit all users who log in to become
creators automatically?

35 How do I limit the use of intermud channels?

36 How do I get off intermud completely?

37 How do I change the start room for the mud?

38 I don't like having newbies get special treatment.

39 I don't want players to be able to pick non-human races.

40 I want everyone to speak the same language.

41 I made a change to /lib/player.c and updated it, but I'm not
seeing a difference in my character.

42 How do I change the items new players receive?

43 Hey, there's no <foo> class! What's up with that?

44 Where can I get a Dead Souls mud hosted?

45 Your LIB_MXLPLX system is all screwy. I changed it and it
works. Wanna see?

46 How are files organized in Dead Souls?

47 What are sefuns and efuns?

48 Whew! Ok now I know where stuff is. What's next?

49 Oh, man, you're kidding! Those are, like, books! Can't I
just start making stuff?

50 Everything is su-u-u-u-p-e-e-r-r-r s-s-l-o-o-o-o-w-w-w

51 Dude! One of my creators just kicked me off my own mud!

52 Is Dead Souls secure?

53 I sent you my code a week ago. Is it in or out?

54 Did you finish the bfd() sefun modification I asked you for last night?

55 QUEEG_D is a horrendous mess. It's inefficient and frankly offensive.

56 You implemented my code but didn't give me credit.

57 Intermud mail doesn't work

58 The admintool menus let you pick options that aren't visible

59 What does locking the mud do, exactly?

60 The race help output is inadequate for role-playing. How do I change it?

61 I need to know what features to expect in the next release so
I don't waste time duplicating effort

62 You need a development roadmap and task tracking

63 How do I update a sefun without rebooting the mud?

64 My new sefun updates but I can't seem to use it.

65 What's the point of the apostrophe-stripping for args in lib/command.c?

66 How does one achieve 'high mortal' or 'ambassador' positions?

67 I would like XYZ and PDQ to happen every time the mud boots

68 I can't login! I keep getting: "It seems some work is being done
right now, try later."

69 I had a really great idea that revolutionizes ds and you refuse
to include it. I am forking ds development and making my dream come true.

70 What do the version numbers mean?

71 The Dead Souls router is down. How do I switch back to *gjs?

72 I'm going to totally revamp <insert highly complex system here>.
Will that be difficult?


73 I've hired an area coder to make a new domain. I want her
to be able to use QCS in /domains/MistyDragonShireMysts.


74 How does player voting work?

75 What are "estates"?

76 What are "events"?

77 Where does user monitor data go?

78 How would you set a race to be selectable by new players?

79 Where is emote data kept?

80 What are .h and .o files? Where are they kept?

81 But my friend forgot his password! I *have* to edit his playerfile!

82 How do I change my mud's name?

83 Help! I locked myself out!

84 What are the privileges associated with the groups in groups.cfg?


85 Why does the documentation refer to LIB_ARMOUR and armour_types.h?

86 Where are read/write restrictions kept?

87 I need to test day/night descriptions, but I can't wait around all day.

88 How can I change the default prompt? Can I make it dynamic?

89 What is "unguarded"?

90 Is intermud communication secure?

91 What should I not do?

92 Is DS2 in any way suited to create a non-english mud from/with it?

93 I keep losing my intermud connection, and sometimes I'm half connected


94 I heard I can run my old TMI-2/Nightmare 3/Skylib/Lima code on Dead Souls. Is that true?

95 Why is the version of Dead Souls 2 on Sourceforge different from the one on dead-souls.net?

96 Good heavens! All I wanted to do was change combat, and it is so complicated!

97 Editing in Windows is fine and call_out()'s are great. Your advice sucks!

98 I keep hearing that Dead Souls can do this or that, but I'm trying and can't.

99 You appear to have a FAQ for everything!

100 If I XYZ, will that work?

102 Hey you skipped question 101!

103
You are not taking my bug report very seriously.

104
Dude. Just answer my question. It's just one question, ffs.

105 Is it possible to upgrade to alpha without killing everything I've done?

106 How do I start an area?

107 I don't want to use a cookie-cutter codebase

108 How do I make my new area the default domain where new people to arrive?

109 I heard passive mode on the FTP server works now.

110 I boot the mud but nothing happens...the startup headers
come up but nothing preloads and I get no error messages. What's
going on?


111 How do I add a default alias?



How do I start?

The first thing to do is follow the installation FAQ
to get Dead Souls installed. Then log in, and start reading
the administrator's guide, by typing these commands:

read index in guide

read chapter 1 in guide

read chapter 2 in guide

etc.

You should also become familiar with the Creator FAQ, in
particular the section on getting questions answered.


Is there a MUD somewhere running Dead Souls I can log into?

As a convenience to the curious, I have set up a "demo" mud
at rugose.com, port 6666. To connect, either click on
this link with your browser, or open a terminal window
(or for windows users, Start -> Run ) and
type: telnet
rugose.com 6666 , or use the java applet
at this page: http://dead-souls.net/javaclient/demo.html

When you log in, the system will ask you whether you'd
like to be a player or creator. You'll want to choose "creator"
so that you can examine code, try out the QCS, etc.

Please note that in the regular, non-demo version of the
mud, people are NOT automatically given that choice.

On the regular non-demo version of the mud, Only
the admin (basically, the first person to log on to the new mud)
gets automatic creatorship by default.

After logging in, you will be transported
to your workroom. Some useful commands:

look
look at me
look at chest
open chest
look in chest
get tricorder from chest
read index in handbook
read chapter 1 in handbook
who
stat
wiz
create new npc generic
look at board
read 1 on board
home


I like Dead Souls and I want to use it, but I don't want to run a mud.

Being a mud admin is very different from being just a coder
or builder, and many people just don't feel like dealing with
the hassle of running a mud.
There are a few Dead Souls muds out there that could
use help from you. Telnet to the Dead Souls development mud
and type: mudlist -m Dead to see a list of Dead Souls muds
that might be hiring.
You can also just code on the Dead Souls development
mud. You're welcome to create as you please, and if your
building gets to the point where you'd like it included in
the lib, let me know and I'll inspect it for approval.

Please note that anything you code on the Dead Souls
development mud becomes property of Dead Souls mudlib
distribution, meaning you can't prevent me from
using it. So if you want to prevent your code from
being used that way, don't code on my mud.

Please also note that the above may not be true.
A physically signed agreement may be necessary for it to
be legally so. I leave that paragraph there because I
feel it is consistent with the spirit I'm trying to
convey here. If you contribute, please do so fully. A
moral commitment is the idea here, not an anally
legalistic one.

As adults we'll work it out. I have no
interest in publishing anything without people's
permission.


I want to invite my friends to help me code. How do I
promote them to creator status?

encre dude

To demote them:

decre dude


What about intermud? How do I talk on that?

The intermud3 (or i3) network is available
to you, and you are probably already connected to it. Type
mudlist to see a list of other muds on the network.

By default, the "Dead Souls intermud channel" is
enabled for creators. Type: ds blah blah
and other Dead Souls muds on the i3 network will see
your message like this:

You@YourMud <ds> blah blah

Please note that intercre is where you ask coding
and technical questions only. Random chatting is not
tolerated on that channel. Newbie questions that are
Dead Souls specific or that obviously have answers in
Dead Souls documentation may meet a hostile reception on
intercre.

Conversely, dchat is mostly chat.

Note: If you decide to add the intergossip channel to
yourself or your creators, be aware that conversations
there tend sometimes not to be PG-rated. You can
also find yourself baited into a flamebattle if
you're not careful. I protect newbies as I can, but
it helps if you can prevent yourself from being baited.
Really I'd suggest you avoid the intergossip channel
entirely.

The lpuni channel is a mix of chat and official LPUniversity
business. The LPUniversity project appears to be dead as of
this writing though (21 Nov 06), so the channel's existence is likely
to be a matter of historical, and not practical, relevance.

The ds channel is for Dead Souls-related conversation. Sometimes
the topic drifts, but "random chat" should be avoided
there. Use dchat for off-topic chat. If you don't already
hace dchat enabled, type: call me->AddChannel("dchat")


I talk on intermud but nobody replies. What's up with that?

If you haven't changed your MUD's name from the
stock default (ie if your mud name is DeadSoulsWin
or DeadSoulsNew) then your mud may be conflicting with
someone else's new mud that is already connected to
intermud. Change your mud's name and see if this helps.

Another possible cause is network problems.
I3 uses a hub topology. All muds communicating on intermud
connect to the router to do so. If that router is down all
i3 communication stops, until it comes back up. To check
network status, ping Frontiers or Dead Souls. If the
ping command gets no answer, i3 is probably down, or
your connection to it has been interrupted. Your mud will
be aware of this and retry to connect to i3 every
fifteen minutes or so.

There's also the possibility that nobody who wants to
chat is listening.

It's also possible that the Dead Souls I3 router has
changed address or port. Visit this page to get the
latest connection info:

Dead Souls I3 Router Page


Under some unusual circumstances, the router might
be misbehaving. If that happens, post a question on
the lpmuds intermud topic: http://lpmuds.net/forum/

Please make sure you post on the Intermud topic.

It may also be that you have been earmuffed by
other people, because you've annoyed them. You
can avoid this by becoming familiar with the
proper way to find answers.


How did you know my mud started up?

The same way your mud knows that i3 is up or
down. A while ago I noticed that i3 can be very
unreliable, and sometimes when it goes down and
comes back up, people's muds don't refresh their
connection, and they can be off intermud for days
without realizing it.

I implemented a "keepalive" system which
uses the intermud "auth" packets as pings. Every
five minutes or so, your mud tries to ping Frontiers,
Dead Souls, and itself. If it gets a reply from at
least one, then it's happy. If neither reply, then your
mud alerts the Arch room that intermud is down, and it
will reload the intermud daemon every 15 minutes
in an attempt to reconnect. Once i3 is back up and
you are reconnected, you go back to pinging.

This means that Frontiers and Dead Souls
get a bunch of pings all the time. When a mud we've
never heard of before pings us, we get a message
about it, and so we know a new mud is online.

If this makes you feel like Big Brother
is watching you, you can edit "PINGING_MUDS" in
/secure/include/config.h to have the name of
your own mud only, so you just ping yourself.

You can also DISABLE_INTERMUD in that
same file.

Dont' edit that file with a default Windows
editor.
Back up the file before you edit it. Reboot
the mud after making the changes. If it won't reboot,
you probably munged the format and need to restore
the original.


I heard there's an I3 router included in Dead Souls.

Please see the router page for details.


What's this about a manual on Frontiers?

It's no longer relevant. All the docs
we were making available on Frontiers are now included
in Dead Souls, starting from version 1.9r9.

In your workroom is a chest. Open the
chest and the new Dead Souls Creators Manual is
inside. The text files are in /doc/manual .


How do I add limbs to a race?

Edit /secure/cfg/races/<race> and make the changes
you want. Then use removerace to remove the race from the
races daemon, then add re-add the race with addrace .


How do I add a race?

Copy a race in
/secure/cfg/races/ and edit it.
For example:

cp
/secure/cfg/races/bear /secure/cfg/races/wampa

Edit the wampa file to reflect what you think a
wampa is like. If you want new players to be able
to select wampa as their race, make sure the file
has this line in it:

PLAYER_RACE 1

Make especially sure to change the lines RACE and
LANGUAGE. When you're done editing, type:

addrace wampa


For details:
help addrace

Note that the race file PLAYER_RACE line overrides
the options used in the addrace command.

NOTE: It is possible to remove all races. However, please
read the following discussion to get an idea of the issues
involved:

[2006.11.20-18.08] Ohm@ashdev <dead_souls> Hey, if the removeraces command will screw up something, will removing the races manually from admintool have the same effect?
[2006.11.20-18.08] Cratylus@Dead Souls Demo <dead_souls> ok let's take this one step at a time
[2006.11.20-18.09] Cratylus@Dead Souls Demo <dead_souls> removeraces will erase the list of races held in the races daemon
[2006.11.20-18.09] Cratylus@Dead Souls Demo <dead_souls> what this means is that when you try to clone a bear, you will get a big pukey error message
[2006.11.20-18.10] Cratylus@Dead Souls Demo <dead_souls> because bears aren't a race any more, so the npc you try to clone will error out
[2006.11.20-18.10] Cratylus@Dead Souls Demo <dead_souls> i consider that "broken" behavior, because i dont like it
[2006.11.20-18.10] Cratylus@Dead Souls Demo <dead_souls> but you'll only see it if you try to load npc's, aka mobs
[Ed note: removing all races will also screw your players]
[2006.11.20-18.11] Ohm@ashdev <dead_souls> what if I want to get rid of all those races, and all of those mobs?
[2006.11.20-18.11] Cratylus@Dead Souls Demo <dead_souls> right
[2006.11.20-18.11] Cratylus@Dead Souls Demo <dead_souls> before i answer your question
[2006.11.20-18.12] Cratylus@Dead Souls Demo <dead_souls> do you plan to have dogs n cats n deer n stuff?
[2006.11.20-18.12] Ohm@ashdev <dead_souls> No. I'm want to completely write all my mobs from scratch, because they're based on a very specific virtual world.
[2006.11.20-18.12] Cratylus@Dead Souls Demo <dead_souls> ok
[2006.11.20-18.13] Cratylus@Dead Souls Demo <dead_souls> what you want to do is not complicated
[2006.11.20-18.13] Cratylus@Dead Souls Demo <dead_souls> so i hope yer not getting that vibe
[2006.11.20-18.13] Cratylus@Dead Souls Demo <dead_souls> the reason i'm cautioning you against it is
[2006.11.20-18.14] Cratylus@Dead Souls Demo <dead_souls> that removing all races basically makes lots of rooms not work anymore, because they contain npc's that require races to exist
[2006.11.20-18.14] Syphon@WorldWideResistance <dead_souls> eep, That's a bit of editing
[2006.11.20-18.14] Cratylus@Dead Souls Demo <dead_souls> and disabling sample areas isn't something i recommend to someone who's starting out
[2006.11.20-18.15] Ohm@ashdev <dead_souls> right, that's what I'm trying to figure out. How can I get rid of the mobs, and other spots that require them so it will run right.
[2006.11.20-18.15] Syphon@WorldWideResistance <dead_souls> Can't he just dest npc in all the rooms ?
[2006.11.20-18.15] Cratylus@Dead Souls Demo <dead_souls> ok
[2006.11.20-18.15] Ohm@ashdev <dead_souls> I'm newish to ds, but I've worked with plenty of other muds, and I figured I can reference to the backups if I need help.
[2006.11.20-18.15] Syphon@WorldWideResistance <dead_souls> How many rooms are there
[2006.11.20-18.15] Cratylus@Dead Souls Demo <dead_souls> desting an npc doesnt permanently remove it from the room
[2006.11.20-18.15] Syphon@WorldWideResistance <dead_souls> ah
[2006.11.20-18.15] Cratylus@Dead Souls Demo <dead_souls> to permanently remove an npc
[2006.11.20-18.16] Cratylus@Dead Souls Demo <dead_souls> walk into the room it's in
[2006.11.20-18.16] Cratylus@Dead Souls Demo <dead_souls> and then: delete <npc>
[2006.11.20-18.16] Syphon@WorldWideResistance <dead_souls> nod
[2006.11.20-18.16] Cratylus@Dead Souls Demo <dead_souls> where <npc> is the name of the npc
[2006.11.20-18.16] <dead_souls> Zeus@Ancient Rome deletes Cratylus...wait that won't work :P
[2006.11.20-18.16] <dead_souls> Zeus@Ancient Rome watches the delete backfire and melts into a pile of goo
[2006.11.20-18.16] Ohm@ashdev <dead_souls> yea, but that's not exactly practical in my situation... I want to get rid of ALL npcs in ALL rooms.
[2006.11.20-18.17] Cratylus@Dead Souls Demo <dead_souls> ok
[2006.11.20-18.18] Ohm@ashdev <dead_souls> wait, this doesn't make sense... the only npc I see in the source files is fighter.c
[2006.11.20-18.19] Cratylus@Dead Souls Demo <dead_souls> here's what i think then
[2006.11.20-18.19] Cratylus@Dead Souls Demo <dead_souls> if the sampel areas are incompatible with your vision, then just don't use them
[2006.11.20-18.20] Cratylus@Dead Souls Demo <dead_souls> not trying to be difficult, but if it's a lot of trouble to back-port to them, you're probably better off concentrating on your original areas
[2006.11.20-18.20] Ohm@ashdev <dead_souls> when you first load the server, what areas are loaded, and from where?
[2006.11.20-18.21] Cratylus@Dead Souls Demo <dead_souls> the mud expects /domains/default to exist for some stuff like the default death room and such
[2006.11.20-18.21] Cratylus@Dead Souls Demo <dead_souls> but by editing /secure/include/rooms.h you can just substitute your own rooms for these system functions
[2006.11.20-18.21] Ohm@ashdev <dead_souls> Ohhhhhhhhh! Okay. I see now.
[2006.11.20-18.22] Kriton@Dead Souls Arena <dead_souls> send_messages needs a man page :P
[2006.11.20-18.22] Ohm@ashdev <dead_souls> So you're saying the npcs listed in domains/default/npc/ are required because rooms listed in rooms.h try and load some of those npcs.
[2006.11.20-18.23] Cratylus@Dead Souls Demo <dead_souls> not quite
[2006.11.20-18.23] Cratylus@Dead Souls Demo <dead_souls> hang on crazy 2 yr old
[2006.11.20-18.28] Cratylus@Dead Souls Demo <dead_souls> ok
[2006.11.20-18.28] Cratylus@Dead Souls Demo <dead_souls> in /secure/include/rooms.h you can see that special rooms are specified
[2006.11.20-18.29] Cratylus@Dead Souls Demo <dead_souls> the start room, the death room, etc
[2006.11.20-18.29] Ohm@ashdev <dead_souls> right
[2006.11.20-18.29] Cratylus@Dead Souls Demo <dead_souls> the mud needs these to exist, or your users will be helpless
[2006.11.20-18.29] Cratylus@Dead Souls Demo <dead_souls> ok
[2006.11.20-18.29] Cratylus@Dead Souls Demo <dead_souls> my point is, you dont need to use the ones that are there
[2006.11.20-18.29] Cratylus@Dead Souls Demo <dead_souls> make your own, and then put the filenames in the rooms.h file
[2006.11.20-18.30] Cratylus@Dead Souls Demo <dead_souls> nobody who plays your mud ever needs to see a single stock room
[2006.11.20-18.30] Cratylus@Dead Souls Demo <dead_souls> they can just exist like an appendix, unused, unneeded
[2006.11.20-18.30] Ohm@ashdev <dead_souls> ok
[2006.11.20-18.30] Cratylus@Dead Souls Demo <dead_souls> eventually, once they have no usefulness, deleted
[2006.11.20-18.31] Cratylus@Dead Souls Demo <dead_souls> but for now, i think they *are* useful to you
[2006.11.20-18.31] Cratylus@Dead Souls Demo <dead_souls> as examples
[2006.11.20-18.31] Cratylus@Dead Souls Demo <dead_souls> which is why i caution you against just deleting lots of stuff before you get the hang of how i all works
[2006.11.20-18.32] Ohm@ashdev <dead_souls> ok, that makes sense
[2006.11.20-18.32] Ohm@ashdev <dead_souls> I really just needed to know what I had to do to remove all stock rooms from player view


How do I make my friend an admin?

Use the groups menu in admintool, and select
"Modify a group". Select the ASSIST or SECURE group,
and enter the names of all the members it should have. If
I wanted to make xyzzy an assistant admin, I would
make him a creator, then I would edit the
ASSIST group and make the contents look like this:

cratylus:xyzzy

Xyzzy then needs to log out and log back in.


I don't like how the who command output looks! You should change it.

Believe it or not, I actually get requests like this. I also
get stuff like "the inventory list should be chronological in
order of acquisition." Maybe that's a good idea, but it's
your mud, not mine. Make it so for yourself.

If there is something broken about the lib itself, such as
an insta-death bug or a command that crashes the mud, I am
happy and eager to hear about it, so I can implement the fix
in the next lib release. If a normal action causes a runtime
error or abnormal behavior, I need to know that. Also typoes, null
error messages, etc...in short, tell me what's broken.
However, if the problem you're having is that the lib,
by design, behaves in a way not to your liking, this isn't something
I'm likely to "fix" for you. For example, if you want a "who"
command with a cooler look, that's up to you to make. You're
the one coding a mud, so you need to take it upon yourself to
understand the code and modify it to suit your tastes.
Similarly, "orcs are too strong!" or "advancing levels
should increase your eyesight" are issues you need to deal
with on your own, using the coding skills learned from reading the
Creator's Manual.


Can you please make the FAQ easier to read? It's too long and complicated.

No.


Most of the file headers have only Descartes's name on them. Did
you really develop this lib or did he?

Both. The lib he released in 1997 was his, and so almost every
file on it had his name. I've been working on it since, but
I am very lazy about headers. I work on lots of files at the
same time, and authorship attribution tends to rank very low
on my priority list. Therefore, even though a great majority
of the files in the lib have been either heavily modified or
created by me, my name is on very few.

I haven't bothered to go back and revise headers either,
because, honestly, what a pain in the butt that would be. I'm
satisfied knowing there's little doubt who has made the many
changes on the lib.


How can I change the colors of the channel messages?

The colors are specified in /secure/daemon/chat.c

You will need to replace the color specification in more
than one spot in that file.


How do I know what other muds use Dead Souls?


mudlist -m Dead

See the creator's FAQ for more intermud command info.


I was hanging out in the Arch room and the loudspeaker went off. WTF?

Your mud receives all sorts of network requests from the
intermud network, such are remote who (asking who is logged on),
remote finger (info on users), locate (trying to find a user
somewhere on i3), etc. Whenever your mud receives such a request,
it used to be announced in the Arch room. If that is still happening,
you are probably not running a current version of the lib.

The current behavior is that network messages are
announced in the network room (below the arch room) and router
messages are announced in the router room (south of the
network room).

Note that these messages are normal,
and do not represent an attempt to undermine your security.


I want to test the intermud channel but I don't want to spam the ds line.

Type: ds_test test

The ds_test channel is specifically for communication
testing so that ds can remain spam free.


What's this "Network room"?

There is a room below the Arch room called the network room.
It is intended to facilitate troubleshooting of network
and intermud problems. Unless you're intimately familiar
with Dead Souls network code, I suggest avoiding this
room, as it is very messy and very noisy.


The web server and FTP server don't work

To enable them at mud boot time, uncomment the "inet" line in
/secure/cfg/preload.cfg

To enable it temporarily, type: update /secure/daemon/inet

These servers do not use the standard ports. The internet standard
http port is 80 and for ftp it is 21. Your mud ftp and web servers
do not use these.
Instead, the network port for your web server is 5 less
than your mud's port, and the ftp port is 1 less.
This means that if your mud is reached by telnetting
to port 6666, your ftp server will be at 6665 and your web server
will be at 6661.

Please note that the web and ftp server are not supported. They work,
but whatever security risk they pose is entirely on you.


I tried to log in to the FTP server but I can't!

Make sure you use your mud name and mud password, not the
username and password of the computer you are on.


I can't do anything with FTP. It just hangs there.

FTP is a funny sort of protocol. If you don't have a direct
connection to an FTP server (for example, you are behind a
firewall), you have to use PASV (or passive) mode. Unfortunately,
at this time, PASV is not implemented in the mud FTP server.

*UPDATE: As of Dead Souls 2.1a19 there is a passive-mode
compliant ftp server included in the lib. See this link
for more information.


The web server gives me a 404 but I know the directory is there.

Like the FTP server, the web server is a very simple program.
It does not do directory listings at all. If you request
a directory, and it can't find an "index.html" file, it
just errors out.

It will also barf if a file you try to serve is
unusually large.

Let me make this point one final, excruciatingly clear time:
If you need a webserver, use apache. The mud www server is available
as a convenience, not as a production-quality standards-compliant
intarweb server.


I'm using an external FTP server, but the files I transfer
become read only!

You need to make sure that the FTP server you use
runs as the same user as the mud driver does, otherwise
you'll have permissions conflicts.


I moved a command from one directory to another. How do I get the new location recognized?

First, run update on the command in question.
then:
If it's not a verb: update /daemon/command
If it's a verb: update /daemon/verbs


The mudtime is all wrong!

The mudtime command tells you what time it is in the game, not what time
it is in the real world. This mud time, or game time, passes much more
quickly than normal, real-world time, so you may see a few sunrises and
sunsets in the game while playing. Hopefully you are sufficiently
well-adjusted that this will not occur in real life.


The time of day is all wrong!

If you used admintool to change your timezone and the time of day is still
wrong, you may be using an OS with timekeeping that Dead Souls doesn't
understand. You may be using a UNIX operating system that is set for
GMT offsets, rather than local time.

If this is so, figure out how many hours off you are, and
enter that value into the EXTRA_TIME_OFFSET parameter in /secure/include/config.h
If you're running a version of Dead Souls higher than 2.1.1, you
should also make sure LOCAL_TIME in /secure/include/config.h is set to 0.

Also make sure to change your timezone during daylight saving
changes. For example, EDT to EST, and vice versa.


What happened to the roommaker and thingmaker?

They produced code that was often incompatible with QCS. They are no
longer supported.


I keep getting 'Connection to address server (localhost 9999) refused.'

This is a harmless error. Dead Souls uses a program called addr_server to
try to resolve hostnames. However, hostname resolution is not important
to running the mud, so it's not automatically configured. If you run
addr_server with a specific port as an argument, and edit mudos.cfg to
point to that port for the addr_server, then reboot the mud, then you
will probably have hostname resolution in your mud.

However, not all OS'es handle name resolution the same, so this may not
work, even if you do everything exactly right. Either way, it doesn't
affect the mud.


Can I charge players a fee for playing on my mud?

NO.

Dead Souls uses MudOS, and MudOS has a license that specifically
and strictly forbids its use in a commercial way. I don't care how
you use the lib, but if you use it with MudOS, you need to comply
with MudOS licensing. If you were to port Dead Souls to some other
driver that allows commercial use, then you'd be all set.

Can people donate money to me for the mud?

Yes.

So long as there is no quid-pro-quo, or anything
about the transaction that is legally regarded as "commercial",
receiving money from people for the purpose of running the
mud is ok. However, I am not a lawyer, so read the MudOS
license yourself.

You should not try to bend the rules. For
example, public television channels often give trinkets to
donors as a token of their appreciation. If someone donates
money to you for your mud and they get a "thank you gift",
this is a quid-pro-quo, or "something for something", and
it's not right.

This is a MudOS thing, not a Dead Souls thing.
If you can't abide by MudOS licensing, just port Dead
Souls to some driver that lets you do commercial stuff.
Then please tell me how you did it, so I can pass on the
leetness to others.


I found a bug. For real. Can you please fix it?

Email me: <put my name here>@comcast.net

Please include a detailed description of the bug, and the exact
error text and commands that produced it. A log file or
screencap would be helpful.


Where would I edit to change how long someone can be idle before they get disconnected?

1) Modify IDLE_TIMEOUT in /secure/include/config.h
Don't do this with a Windows editor.

2) update /secure/daemon/master

3) update -r /lib/player

Instead of the updates you can reboot the mud.

Users of Dead Souls versions above 2.1a15 can type (for example):

mudconfig maxidle 14400

To make players get logged off after four hours. Setting the
number to 0 makes it so there is no idling timeout enforced.

Note that logged-in players need to log off and log back on for
this change to take effect.


How do I permit all users who log in to become creators automatically?

1) Set AUTO_WIZ
in /secure/include/config.h to 1
Don't do this with a Windows editor.

2) update /secure/daemon/master

3) update /secure/lib/connect

Instead of the updates you can reboot the mud.

Users of Dead Souls versions above 2.1a15 can just type:
mudconfig autowiz on


How do I limit the use of intermud channels?

1) Set RESTRICTED_INTERMUD in /secure/include/config.h to 1
Don't do this with a Windows editor.

2) Add the players who are allowed to use intermud channels to
the intermud group using admintool.

3) update /secure/daemon/master

4) update /daemon/services/*

5) update /daemon/services

6) update /daemon/intermud

7) update /secure/daemon/chat

Instead of these updates, you could just reboot the mud.

Users of Dead Souls versions above 2.1a15 can just type:
mudconfig intermud restrict

They can also use groupmod to add/remove users to the
intermud group:
groupmod -a intermud joebob
groupmod -r intermud jimbob


How do I get off intermud completely?

1) Set DISABLE_INTERMUD in /secure/include/config.h to 1
Don't do this with a Windows editor.

2) update /secure/daemon/master

3) update /daemon/intermud

Users of Dead Souls versions above 2.1a15 can just type:
mudconfig intermud disable


How do I change the start room for the mud?

1) change ROOM_START in /secure/include/rooms.h
Don't do this with a Windows editor.

2) reboot the mud

Users of Dead Souls versions above 2.1a15 can just type (for example):
mudconfig startroom /domains/MystyDragonClouds/room/cloud_nine
If you use mudconfig for this, a reboot isn't necessary, but it'll
ensure all objects in the mud use the new start room.


I don't like having newbies get special treatment.

1) Set MAX_NEWBIE_LEVEL in /secure/include/config.h to 0
Don't do this with a Windows editor.

2) reboot the mud

Users of Dead Souls versions above 2.1a15 can just type:
mudconfig newbielevel 0
then:
update -r /lib/player


I don't want players to be able to pick non-human races.

1) Set HUMANS_ONLY in
/secure/include/config.h to 1
Don't do this with a Windows editor.

2) reboot the mud

* Note that this will not affect players who are
already non-human.

Users of Dead Souls versions above 2.1a15 can just type:
mudconfig justhumans 1


I want everyone to speak the same language.

1) Set ENGLISH_ONLY in /secure/include/config.h to 1
Don't do this with a Windows editor.

2) reboot the mud

Users of Dead Souls versions above 2.1a15 can type:
mudconfig justenglish 1


* Note that this may not affect players who already
are not native English speakers. To change them,
type:

call players_name_here->SetNativeLanguage("English")



I made a change to /lib/player.c and updated it, but I'm
not seeing a difference in my character.


If an object (you) is loaded into memory, it contains
the features and functions of its file and inherited files
at the time it was loaded.

Changing those files and updating them doesn't do
anything to an object that is already loaded using the
old code.

In a case like this, what you want to do is
recursively update the file of the object in question,
then reload the object.

Let's say you modified /lib/npc.c so that
npc's sit down by default. Say you want the fighter in
your test room to possess this new functionality.

If you type: reload -r fighter

then the fighter's file is recursively updated,
the current version of the fighter is whisked away, and
a new version of the fighter is created, incorporating
the new auto-sit feature.

If the change in question is to lib/player.c
or some other file inherited by you, you would
type:

update -r /lib/creator

But you are still using that same old body as
before, so you'll need to quit and log back in to
get a new body using the new code.


How do I change the items new players receive?

Look in /lib/player.c for the function that gives
new players jeans and a t-shirt. Modify this
function to suit you. Make absolutely sure that
the objects you put there actually clone
correctly.

Remember to bk /lib/player before editing this file,
because if you screw it, then log off without
restoring a working copy, you will be sad.


Hey, there's no <foo> class! What's up with that?

True, there is no samurai class, and in fact, as of
this writing there is no cleric, acrobat, frombotzer,
or basketweaver.

The reason for this is that the Dead Souls
mudlib distribution isn't intended to be 100% ready for
players to show up and start doing quests.

What quests there are, what races, classes,
areas, objects, rooms, and NPC's you find in the
distribution are examples. If you open your mud
to players and what you've got is the Orcslayer and
newbie mansion quests, you might as well just close down.
In fact, please do.

Dead Souls is a starting point for a mud.
I have no way of knowing if you're going to have
mermen in an aquatic-theme mud. I have no clue
whether your space aliens will have 8 tentacles or
16 (they like base2, dontcha know).

So, no, there's no <foo>, because the
responsibility for making the mud in your creative
vision is yours, not mine. My job is to give you
a lib with enough working examples and enough
documentation so that you can code your own
basketweaving bugblatter beasts.



Where can I get a Dead Souls mud hosted?

That's a heck of a good question. There are many mud hosting services
out there. I hear good things about MudDomain, but that isn't specific
to Dead Souls. A good host will have a high level of service, shell
and file transfer access, etc, for which you obviously will need
to pay money.

I'm told that the free mud hosting at ISUnlimited is adequate.

There used to be another free mud hosting service I
was aware of, and that's FrostMud. It was basically a guy and a Linux
server with room on it for muds. However, there's some sort
of problem he has and it's going away.

Update: He wrote me an email saying he's back, so perhaps you
can still use his service.

There's no such thing as a free lunch. If you want
a reliably solid, well supported, feature-rich platform for your
mud, quit being a cheapskate and cough up the $9/mo. That's
like, what, three espressos a month. Nobody is too hard up to
host commercially, unless you're on the street.

I've heard good things about the commercial service
from Arthmoor and Genesis.

Wolfpaw also is an excellent commercial host: stable and reliable.
One of my test muds is hosted there, and this is the uptime report,
as of 25 December 2006:

Dead Souls Arena has been up for 11w 6d 7h 28m 34s.

However, Wolfpaw has become rather tired of dealing with
newbie mud admins, so unless you're a hardcore do-it-yourselfer
who just needs a big data pipe and nothing else, you may be
better off with other hosting.

If you have a DSL or cable modem, and your computer is
up all the time, you can just use that, too. Your IP may be
dynamic, making it tough for people to find you, but there are
dynamic-dns services out there that help keep your ip
tied to a specific name.

If you're really hard up you can email me and beg for
me to host you for free, but you'll get no fancy schmutz like a
web page or shell access. And if your mud gets on my nerves
(being inactive for a long time is enough to do that) I'll just
wipe it. Possibly without even warning you. It's not that I'm
a jerk or I like being mean. I just don't have a lot of time
for nonsense.


Your LIB_MXLPLX system is all screwy. I changed it and it works. Wanna see?

Hell yes. I'm not just in this for my health. I want
more people coding in LPC so I can look at the fresh ideas and
new perspectives of other people (read: swipe code).

Send me an invitation to your mud by email or <ds>. I'd
love to look at your work.

If it is code you are willing to donate to Dead Souls, I
will gladly accept its submission, also by email. There's no
guarantee it will make it into any future release, but it just might.

Please be aware that by doing so, you signal you claim no
copyright to the code, allowing me to publish it and
preventing you from ever revoking my right to distribute it.


Naturally there are interpretations of copyright law
that suggest the above paragraph is not correct in one way
or another, but my point is clear: if you're going to try to
do such a thing, don't bother submitting it.


You also represent that no third party has copyright to
the code, and hold me harmless in any subsequent
dispute between you and any other third party.

If you want to email me code but wish to retain
copyright, please state so clearly in the body of your email. I
will honor that request
(and it's the law so I don't really
have a choice). Just be aware I will not put code into Dead
Souls that anyone other than me has copyright to. I can't
afford the risk of someone deciding I can't distribute
code that DS may eventually rely on.

Naturally there are interpretations of copyright law
that suggest the above paragraph is not correct in one way
or another, but my point is clear: if you're going to try to
do such a thing, don't bother submitting it.


Also, I don't want to hear from anyone about my
use of legal terms of art. I know damn well it's more complicated
than I make it sound. My phrasing is sufficient to make
the legal practical transaction of ideas possible here.

Naturally there are interpretations of copyright law
that suggest the above paragraph is not correct in one way
or another, but my point is clear: if you're going to try to
do such a thing, don't bother submitting it.


Oh wait that paragraph is ok. Sorry, I've been having
people's opinions on intellectual property inflicted on me
again, and it makes my copy and paste finger twitchy.

The point I'm making should be clear. If it isn't,
please consult applicable laws, etc.


How are files organized in Dead Souls?

cd / and ls to view the top level directory. The
list may be largely meaningless to you, so let's review it here:

cfg/

General configuration files for timezone and such.

cmds/

Main location of commands that don't require special access
privileges. Commands are different from verbs in that they tend
not to manipulate your environment, but rather deal with
the player's relationship to the system and/or files.

daemon/

Daemons are files that provide access to data files in an
organized way. For example, adding an occupational class
(like, say, assassin) to the game needs to be done in a
precise way in order for it not to break things. By sending
the data to the daemon first, you can be sure that the
new system configuration is entered properly. Daemons also
provide a means to access data, like "how much is silver
worth compared to gold", that is uniform across the mud, and
prevents accidental overwrites of data files by multiple
editors.

doc/

General documentation.

domains/

This is where MUD game areas go when they are complete
and ready for general play by the public. Once here, only
admins have write access to the files.

estates/

Where player-owned objects and rooms are kept.


ftp/

The base for the MUD ftpd. Using the ftpd is probably dangerous
in terms of your system security, and I discourage it, but if
you are determined to have mud ftp access for your creators,
this is one way. See /secure/lib/net for the actual server. It
may or may not work. I won't support it.

include/

Include files provide a set of constants for your files. For
example, if you include <damage_types.h>, you can specify in
the code for your chainmail that it protects against
the damage type "BLADE" at a certain level.

lib/

This is the heart of the Dead Souls lib. This is the location
of the files that your objects, be they swords, shoes, or
handguns, will use as their configuration base.

log/

Log files.


news/

Announcements are made here. For example, in /news/creator
you can post a notice that you have added a teleportation
spell, and when your creators log on, they will see the message.

obj/

Contains some important templates, especially some for the QCS.

open/

Legacy directory. Kept for compatibility. Historically this
directory has served as a place where creators can put code
for others to freely modify.

realms/

This is where creator home directories are.

save/

Files that describe properties of the MUD's systems live
here. The number of limbs that a bat has, for example,
is in races.o. In classes.o you'll find the skill ranges
for fighters. Do not edit these files. They must be
modified by daemons only, or you risk corrupting them.

secure/

This directory will be described in a separate section below.

shadows/

Shadows are a controversial feature of LPC. This directory
is designed for shadow objects, but they should be very
rarely, if ever used. Basically shadow objects are objects
that attach themselves to another object, intercepting
function calls. For obvious reasons this is a security
risk, so unless you really really know what you're doing,
avoid them. Shadows not in this directory will not load.

spells/

Pretty self explanatory. The spells daemon looks for spells here.
Spells not in this directory will not be available.

std/

Provided for backward-compatibility with older lib
files. Not needed if you aren't porting from an older
or different lib (such as TMI-2 or LPUniversity).


tmp/

A directory anyone can write to. Generally for swapping
data between objects, systems, or people. Note: files
here can't be loaded into memory with the update command,
for security reasons. If you need to put something in
a world-writable place but need it to be loadable, use
/open instead.

verbs/

A controversial topic. Verbs are a kind of command. For
example, go and sit and open are verbs. Specifically, verbs
are commands that interact with the user's environment. The
idea is that throw my first red rock at the green goblin
should work, and should work the same everywhere on the
MUD. Verbs are a source of debate among some people, because
to folks accustomed to add_action commands, verbs seem
excessively complex. Verbs not in this directory will
not load.

www/

Like the ftp directory, but for the MUD webserver.


Ok now let's take a quick look at the /secure directory: ls /secure
As you can see, /secure seems to have many of the same directories
that the root filesystem has.
The reason a /secure directory is needed is that
there are files that should not be readable by everyone, and
there are files that must be writable only by a few. The MUD security
system uses the /secure directory as a means to control access to
such files.
For example, the average creator has no business
accessing the player data files of other creators or players. Therefore
/secure/save/creators and /secure/save/players is offlimits to them.

A directory without a counterpart in / is /secure/sefun. This
is where simulated external functions reside.


What are sefuns and efuns?

First let me explain that the driver has built-in
functions that are available to the mud. For example,
type eval return find_player("cratylus") , but replace my name
with yours. Your player object pointer will be found and returned
to you (more or less. strictly speaking it's more complicated).
The driver provides this function. Because it is "external"
to the mudlib, that is, it's in the driver and not the lib,
it is called an external function, or more commonly, "efun". The
idea is that certain actions you ask the mud to perform are
so common that they are made available MUD-wide.

Efuns are ridiculously useful and powerful, and because
they are in the driver as compiled code, very fast. A near-complete
set of efun documentation is available in /doc/efun.

However, the driver does not contain every possible
MUD-wide function you might want. For example, there is a
tell_object() efun, which lets you send a message to an object
such as a player. The syntax is something like this:

tell_object(find_player("cratylus"),"Hi.");

Which doesn't look like much, but believe me, this
kind of stuff adds up. I wanted to make this simpler, so I
used what is called a sefun, or a simulated efun. It is
a function that is available lib-wide, but it isn't in
the driver. Instead it is provided by the lib itself (the
master daemon, specifically). By adding the appropriate code
in /secure/sefun/ I have now made available a tell_player() sefun,
which works like this:

tell_player("cratylus","Hi.")

This simplification of code will become more obviously
useful to you as you get more coding under your belt. Most
sefuns are documented in /doc/sefun.



Whew! Ok now I know where stuff is. What's next?

You probably want to examine how objects are written.
Type goto /domains/town/room/road and wander around town
a bit. If you want to see the code for something, for example,
the beggar, about beggar should do it, provided the beggar is
in the room.

To see the filenames of the objects around you,
type scan here, or scan me to scan your own inventory.

If you've never coded before, this is the hard part.
To understand what you're looking at when you run commands like
more /domains/town/weap/orcslayer.c you need to get comfortable
with LPC.

The brute force way of doing this is copying stuff
and then changing the descriptions, thus making new stuff.
This will work, but you'll waste time looking for examples of
exactly what you want to do..and you may not find them.
Instead, learning LPC will let you create whatever
you want, without relying on templates.

This means that now you must read the LPC Basic
manual, then the LPC Intermediate manual. As admin, your
creators will expect you to know what's in there.

On your person or in the chest in your workroom is
the Creators Manual. Read both the Players Handbook and
the Creators Manual from cover to cover.

It's also important to read the Administrator's
Guidebook.


Oh, man, you're kidding! Those are, like, books! Can't I
just start making stuff?

Well...ok. But you need to go through the docs
soon, ok? In the meantime, read the QCS chapters in the
Creators Manual to get you quick-started in the creation
process. Remember you need to be holding your Creator
Staff in order to access the QCS commands.

Start with chapter 31, like this:

read chapter 31 in my manual


Everything is su-u-u-u-p-e-e-r-r-r s-s-l-o-o-o-o-w-w-w

First, make sure you are using the latest available version of
Dead Souls (check here). Older versions of Dead Souls
are known to have nasty memory leaks.

Next, see if you have runaway objects. An object can be coded
to do really unpleasant stuff like replicate itself over and
over until it brings the mud to its knees. Find out how many
objects are loaded by typing: eval return sizeof(objects())

If the count is in the thousands, and only a few people are
logged on, you may have a runaway. Most often this involves
NPC's doing stuff you didn't expect. Reset all loaded rooms
with the following command (you may need to enter it more
than once):

reload every room

perhaps followed by a:

flushobs

If the lag clears up, you found the culprit. If not, see if
the callouts list is clogged with the command: callouts

If all else fails, reboot the mud and ask for help on the ds line.

Please note that the rage virus (especially if unleashed
in the menagerie) is notorious for redlining the mud. Having
hundreds of NPC's all engaging in simultaneous combat
while infecting each other with a rapidly spreading hostility
virus can be expected to impact overall performance. So please try
to avoid the rage virus unless you are specifically stress testing
your system.


Dude! One of my creators just kicked me off my own mud!

One of the virtues of LPC is that it is flexible and powerful.
One of the drawbacks of LPC is that it is flexible and powerful.

It is not possible to make an LP mud that is
immune to abuse from creators. You just can't. The MudOS
function set is just too complex and sophisticated to eliminate
every possibility of abuse.

You will therefore *always* be vulnerable to things
like people coding objects that crash the mud on purpose (I
won't detail how that can be done, but anyone with intermediate
LPC skill can do it, and utter newbies can even do it with
a stupid enough mistake), finding a way to dest admins, or
continually updating recursively the /lib filesystem. A
jackass will always find a way to expose you to her jackassery.

This means that you need to know who is coding on your
mud and what they are doing. Your job as an admin is to
immediately deal with coders who pose a discipline problem.
If they fool you once, shame on them. If they fool you
twice..the..they...they shouldn't fool you twice is what I'm
saying.

This does not mean that Dead Souls is somehow
impossible to secure. You can easily prevent unauthorized
access to lib data. See the next section for how this works.

What you can't prevent is some dude off the internet
you just met and made a creator from wreaking havoc on your
mud and creating a nuisance of himself. You have to know who
these people are and you have to have a level of trust and
confidence in them, otherwise you need to use the decre
command.


Is Dead Souls secure?

The short answer is no, nothing I know of is "secure" in the
sense that you don't need to continually pay attention to it.

Just like any other Internet program you use, Dead Souls
is not an obvious security risk, so long as it is not used carelessly.
And, obviously, games of any kind, including Dead Souls, should never
be installed on any mission-critical, national security, public
safety, or health care server.

Dead Souls security involves two separate spheres:

1) The binary executable and the system that runs it.

2) The mudlib and the code that you use and create.

The first sphere is probably most important. Presumably
you plan to run a mud on a computer that does other things too,
and you want to keep those things separate from your mud. The
most important thing to do is to avoid running Dead Souls as a
privileged user.

In the case of Windows, this means that the
program should not be run by Administrator or anyone in the
Administrator group.

For unix users, this means that the driver should not run
under uid 0 (root).

The reason for this precaution is that if some genius
hacker manages to exploit some unknown weakness in the program,
it is better that the process they hack doesn't have full admin
privileges to the box.

This caution has little to do with Dead Souls specifically.
It is a warning I'd give to anyone planning to run any kind of network
server. You should take your own security seriously, and
if you do not understand your own security situation, you need to take
a step back and ask yourself if running a mud at all is a good idea.

Sphere 2 is lib security. In older muds, file and directory
privileges were handled by attributes on the files. If a file's
user id (UID) matched a user's UID, then that user had full access
to it. Such systems often had complex systems that evaluated
effective UID (EUID) based on the file's attributes, its parent
directory, the user's ID, possibly group id, etc. This is an
entirely valid security model, but because of its complexity,
it tended to be exploited easily and often. If you don't
stay 100% on top of such a system (just like any OS), there's
no way to be sure you won't rooted.

With stack security, privilege management is much, much
easier. A file's privilege is based solely on its location. If
a user doesn't have read access to /foo/bar/ then she can't read
or modify /foo/bar/file.c. If someone with privs to that location
copies the file to somewhere else, then the privs of that new location
are in force on the file.
The "stack" part of stack security comes from the mud
evaluating the privileges of all the objects involved in the
access request. If you're unprivileged and you manage to get a
privileged object to make the access request for you, the access
will fail, because you are unprivileged, and you are still part
of the function call stack (i.e., the list of instructions that
form a chain between the command and the intended event).

Granular (more detailed) modification of user privileges
can be done by changing files in /secure/cfg to grant
users and groups specific privileges. Also see
the grant command, as well as domainadmin.

Security bugs usually aren't about the security model itself
being weak, but rather careless code (generally from me). If
you find such a bug, please let me know right away so I
can fix it. You will receive credit for the discovery on the
hotfix page.


I sent you my code a week ago. Is it in or out?

How long it takes me to review code submissions has nothing
to do with what I think of you, your skills, or your
code. It takes me a long time because Dead Souls isn't
actually my job, and is not a physical member of my
family, so it has to wait its turn sometimes, for my attention.
Sometimes I will get to someone else's code sooner even
though I received yours first. What can I say. Sometimes
I feel like dealing with a particular thing at a particular
time.


Did you finish the bfd() sefun modification I asked you for last night?

I'm on the ds line a lot, and generally accommodate people's
requests right away if I have time. This makes it seem
sometimes like I can turn orders around in minutes or
hours, like a short-order cook.
This is an illusion. I do this sometimes
for requests that strike my fancy or that are so simple
they are not inconvenient, or maybe because I happen to
be bored at that moment. But my sometimes doing this
doesn't mean folks should expect some sort of prompt
turnaround on special requests.
In general, I am not sitting at my desk waiting
for code orders. I'm doing something else. If I get to
your request right away, then good for you. If I don't,
then I'll get to it when I get to it.


The queeg daemon is a horrendous mess. It's inefficient and frankly offensive.

I'm not an especially gifted programmer. In fact, I view
myself rather as a Pakled from the Star Trek series. I
look for things that make the code go. I look for things
that make the code strong. Sometimes, because I am not
a trained or professional programmer, things are done
in a way that shock the conscience of more sophisticated
practitioners.
If you find such code (and I do hope it is rare),
bringing to my attention that it has been implemented in a
wretched way doesn't help me. I know that. I wrote it. If
you want to help, send me an email with the fixed code.

You implemented my code but didn't give me credit.

Whoops. Send me an email telling me where I goofed and I'll fix it.


Intermud mail doesn't work

No it doesn't. It's actually a pretty complicated system to
implement, so get used to just local mud mail for now. It
is definitely planned for the future, though.


The admintool menus let you pick options that aren't visible

I can't decide whether this is a feature or a bug. I'm
leaning toward "laziness".


What does locking the mud do, exactly?

When the mud is locked, only members of the authorized
groups are permitted to log in. By default, these
groups are SECURE, ASSIST, ELDER, and TEST. Anyone
who is not a member of these groups, whether they are
a creator or a player, is prevented from logging in.

To lock the mud, use the admintool command, option a.
To add people to groups, use the admintool command, option v.


The race help output is inadequate for role-playing. How do I change it?

By default, help human will output various characteristics
of the human race, as known to the race daemon. If you
want instead to provide your own help data on the history and
lore of humans, simply create a file called /doc/help/races/human
and put your information in it. That information will then
be what is displayed when requesting help on that race.


I need to know what features to expect in the next release so I don't
waste time duplicating effort

Visit http://dead-souls.net/RELEASE_NOTES for information on
the latest releases and what they contain. The topmost
version is usually not yet available for download, and
is listed so that folks know what's coming in the
next release. If this is so the version name will have
"(unreleased)" next to it.

As of 2.0r19, the dsversion command is available to
allow you to query that site from the mud itself.

To see what I'm working on, log onto the demo mud
and type: finger cratylus


You need a development roadmap and task tracking

No, I don't. If I had developers and teams and
such things, then I'd use all the fancy project
management stuff available on Sourceforge.
But I don't want to manage developers,
I want to lib code. If you want to help develop
the lib, then that's really great. Follow the instructions
from the previous question and look at my plan file
for something that looks interesting and that
doesn't have an asterisk. Tell me you'd like
to take that project, and I'll mark it as yours.
That's it. Send it to me when yer done.
If I get tired of waiting I'll tell you
I'm going to do it myself, like I was planning
all along, and you'll be relieved of that expectation.
Setting up some kind of sophisticated
collaboration tool to get 3 pieces of code from
2 people, and me having to be on people's backs
for results and stuff...this is not what I
signed up for and I'm not doing it.


How do I update a sefun without rebooting the mud?

To have your new nit_pick() sefun take effect in the
running mud, you might do something like this:

update /secure/sefun/nit_pick.c

update /secure/sefun/sefun.c


My new sefun updates but I can't seem to use it.

Make sure the sefun is prototyped in /secure/sefun/sefun.h

If the sefun is in a new file you created, make sure
that /secure/sefun/sefun.c inherits that file.


What's the point of the apostrophe-stripping for args in lib/command.c?

It was cheap workaround for a parser problem. Dead Souls 2.1 and
above no longer implement this, as the driver issue has been
corrected.


How does one achieve 'high mortal' or 'ambassador' positions?

Those are legacy positions from v1/Pre v1 Dead Souls. They are
basically groups, managed by an arch with admintool, which
can be granted privileges not normally enjoyed by mortals.
In the current implementation of Dead Souls, those
positions are vestigial. You can implement them on your
own mud however you please.


I would like XYZ and PDQ to happen every time the mud boots

The most common way to have this happen is to add
your daemon (and typically that's what you'll
want to start at boot) to /secure/cfg/preload.cfg .
This will ensure that it gets loaded
before the mud accepts any connections. It has the
added advantage of being included in the list of daemons
that the mud periodically checks and restarts if they
have died.

If it isn't a daemon, but rather some
specific function you want to happen at boot, simply
add the relevant code to /secure/daemon/autoexec.c


I can't login! I keep getting: "It seems some work is being
done right now, try later."

This is very bad. What this means is that some
files that are needed in order to load your player
object cannot be loaded. It can be any of a very large
number of files, which is the problem. Usually this
happens if you've been, for example, messing around
with player.c, then broke it, and rebooted the mud. Now
since player.c can't be loaded, you're locked out.
It could be any of the files loaded by your
player object, or other daemon files needed by your
login. The only way to narrow down the possible list of
files you corrupted is by examining the output of the
console (the window where you type the command line
to start the mud) and reviewing log/runtime and
log/catch for clues.
Once you've found the culprit, either fix it,
or replace it with the original version from the
Dead Souls distribution package.


I had a really great idea that revolutionizes ds and you
refuse to include it. I am forking ds development and
making my dream come true.

Ok then, have fun. All I ask is that you give your
project a name that isn't going to confuse people
as to which lib is which. Confusing your user base
isn't a good way to get started on such an enterprise.
Send us a post card once in a while.


What do the version numbers mean?

2.0r16 means "Major version 2, minor version 0, release number 16".
Releases happen pretty frequently, to add functionality and fix bugs
from the previous release. When the basic functionality of a minor
version is as bug free as reasonably possible, a new minor version
change happens.
Major version number changes are very rare and represent a
vast difference from the old major version. Versions 1 and 2 of
Dead Souls are so different as to be largely incompatible with each
other's code.

As of this writing, 2.1.1 is released, and it is the fulfillment
of the promise that there was in version 1.1.

The focus of development is now in adding major systems and functionality
that 1.1 was hoped to have, but never did.


The Dead Souls router is down. How do I switch back to *gjs?

Use the switchrouter command to change between
routers. The new default I3 router for Dead Souls muds is called
*yatmim. So far it's been dramatically more reliable than
the old intermud.org router, which is known as *gjs.
The advantage to *yatmim is that it is dependable
and the bulk of the Dead Souls community (a vital resource for
DS-specific technical support) uses that router.
The advantage to *gjs is that many more muds are
connected to it, and you can have more opportunity for random
chatting and gossiping. Also, the intercre channel on *gjs
is an excellent resource for general technical questions.
For more information on switching between routers, type:

help switchrouter

If the *yatmim router goes down for more than a
few minutes, make sure to check the router page to see if
the IP address or port have changed.

There's also a good chance that what has happened
is your mud's IP address has changed, and *yatmim interprets
your connection from a different IP as an impostor. Eventually
this will clear. You may have to wait up to 24 hours.


I'm going to totally revamp <insert highly complex system here>.
Will that be difficult?

This is, surprisingly, a fairly common question.
Basically, the answer is:

"If you have to ask, then the answer is yes."

It's not an impossible task to, say, rewrite
combat to be just like the combat you're used to on LeetFooMud.
It's totally doable, and not *all* that difficult for
an experienced coder.

But if you're new to LPC, you need to concentrate
on getting the basics down before you put that cart in
front of that horse. Let me phrase it like this:

"If there's any part of the Creator's Manual you don't
know and understand, you aren't ready to do lib coding yet."

If you are at 100% grok with the manual, then
please read chapter 8 of the Admin's Guide to get started
on serious lib work.


I've hired an area coder to make a new domain. I want her
to be able to use QCS in /domains/MistyDragonShireMysts

The default behavior of QCS is to try to figure out
what directory makes most sense to write in. It assumes
that it's only going to write into areas you have write
permission to. Since your new coder doesn't have write
access to /domains/
MistyDragonShireMysts, QCS instead will
write to the next most logical place: her home area directory.

This is true even if you use the grant command
to enhance her access. QCS's authentication mechanism is
entirely separate from the grant/access system, which works
fine for non-QCS editing.

To make your new domain, use the domaincreate command:

domaincreate MistyDragonShireMysts

To enable your new coder to use QCS in that domain,
use the domainadmin command to manage the admins of that
domain. A domain may have more than one admin at the same time.

For more information on domainadmin, type:
help domainadmin

For more details on where QCS puts things, be sure
to read this Creator FAQ section.


How does player voting work?

The voting system enables players to nominate and
vote for class leaders. A Fighter can nominate and vote for
his Fighter leader, Mages can vote for a Mage leader, etc.
The nomination period usually lasts about a week, then
nomination closes and voting begins. Voting ends when
an arch enters the voting room (it's in Town Hall) and
issues the appropriate command. See the voting room printed
material for instructions.
When the voting is ended, the winner becomes
council member. The high council is composed of
representatives (the leaders) of the classes. What kinds
of authority the council should have is entirely up to
you and your mud. No default powers are enabled, you'll
need to code your own sets of privileges and responsibilities
for your councilors.
Because creators have no business meddling in the
affairs of mortals, they cannot vote, regardless of their
class affiliation.


What are "estates"?

Any references to estates in Dead Souls code or
documentation are artifacts of pre-1.1 Nightmare code.
Estates in the Nightmare lib were player-owned areas,
which were granted to players of specific rank, status,
etc who could afford to buy the rights to them.
Estate support in Dead Souls is planned for post 2.1.


What are "events"?

Some things should happen regularly. Perhaps
log rotation, or backing up some .o files. The events
daemon, or EVENTS_D handles this. To add or remove
events use the add_event() sefun. For example, to add the
log rotation event, I issued this command:

eval return add_event("/secure/daemon/log","/secure/daemon/log","RotateLogs",({ }),7200,1)

Which said: "Every two hours, call the RotateLogs function in the log daemon."

To see what events have been scheduled, type:
events

To remove an event from the events schedule, find its
next runtime, and use it as an argument to the remove_event() sefun,
like this:

events

The following events are pending:
1145159511 RotateLogs Sun Apr 16 03:51:51 2006 EDT

eval return remove_event(
1145159511)


Where does user monitor data go?

When you monitor someone, or if you enable
GLOBAL_MONITOR, monitor data is logged into /secure/log/adm.


How would you set a race to be selectable by new players?


See: http://dead-souls.net/ds-admin-faq.html#10



Where is emote data kept? Can I edit it by hand?

Emote data is saved in /save/soul.o

You must never, ever, edit an .o file. Period. It
is possible to do it without corrupting data, but I do
not condone it, I don't recommend it, and if you fux your
mud because you did it anyway, I won't support it.

If you edit an .o file, and now things don't
work, it is your own fault. If you didn't back things up
before editing system files, there's nothing anyone can
do to retroactively save your data.


What are .h and .o files? Where are they kept?

Files with the extension of .h are called header
files. They have code or variables that are helpful when
creating some things, so that an armor object uses
armor_types.h to load some useful information without having
to hard code it every time you make a piece of armor.
These global header files are most typically found in
/include or /secure/include , although local header files
that are specific to a particular directory (such as
header files for lib objects) are commonly found in an
./include subdirectory of the given directory.

Files with an .o extension are object persistence
files. They contain data, not code. There are some things
that happen in the lib that should persist across
reboots, such as races, classes, economy, etc. You could
just hard code this stuff, but what if you need to make
changes? What if your economy needs to be flexible to
accommodate inflation? What if you want to be able to
add or remove emotes on the fly?
Persistence files allow you to save data which
is subject to manipulation, but which needs to be available
in case the mud restarts.

Because .o files tend to contain information
that is structured and formatted in a very specific way,
they should never be edited by hand. They are intended to
be loaded and saved by objects like daemons. Monkeying
around with the contents of an .o file is an excellent
way to damage your mud.
Another reason to avoid it is that even if you
make a valid change, it's liable to be overwritten unless
you fully understand the daemon that uses that file.


But my friend forgot his password! I *have* to edit his playerfile!

Use the command: resetpasswd


How do I change my mud's name?

1) type: admintool

2) select the "Driver" menu option

3) select the "change the MUD's name" option

4) answer yes to rebooting


Help! I locked myself out!

For UNIX administrators, it is natural to create an
admin character for special admin tasks, and then use
a regular character for routine stuff.
There's nothing wrong with that, but if you
lock the mud, you'll need to have your regular character
be in either the ELDER or TEST groups in order to log
in. For more information on modifying groups: help admintool


What are the privileges associated with the groups in groups.cfg?

SECURE gives you 100% admin privs to the mud.

ASSIST allows reading to almost all files in /secure, but
doesn't provide write access to those files. Assist admins
do report as archp() == 1, so access to writes based on
that pointer should be carefully managed. Assist admins
can also read the contents of player directories. See
/secure/cg/groups/read.cfg and write.cfg for more detail.

ELDER is just a nice thing to have show up in the who list.

TEST lets the lib know you are a test character.

All members of the above four groups are permitted to log in when
the mud is locked.

INTERMUD lets the member use intermud, if RESTRICTED_INTERMUD
is enabled.

Any additional special groups or privileges you'll have to code yourself.


Why does the documentation refer to LIB_ARMOUR and armour_types.h?

The LPC documentation in the Creator's Manual was written by
Descartes. I have been reluctant to make any changes to it,
because first, it isn't mine, and second, deviations from the
current lib are very small.

In this particular case, you evidently have noted that
the lib uses American spelling for "armor". The original Dead
Souls distribution, version 1, and the Nightmare lib used the
British spelling of "armour".
Aside from finding it unnecessary and affected, I
felt it was distracting and potentially confusing for coders,
because it was the only word in the lib spelled this way. There
were no instances of "colour" or "honour", etc. Rather than
make things uniform by Britishizing them, I made them uniform
by Americanizing them.
To this day I don't know the reason for that original
spelling. It may be that Descartes intended to make a
distinction between, say, an armoury that sells things you
wear, and an armory that sells things you wield.
If I remember to, I'll ask him next time we talk.


Where are read/write restrictions kept?

The global perms are listed in /secure/cfg/read.cfg
and /secure/cfg/write.cfg . However, additional permissions
may be available to a user based on the access privileges
defined in a given adm/ subdirectory. See help grant for
more details on that system.

The permissions logic goes something like this:

uid/euid/guid:
1) These absolutely do not work in Dead Souls. It is not a supported security model.

read.cfg:
1) If a file/directory is not in this file, anyone can read it.
2) If a file/directory is in this file, only the specified groups/prople can read it.

write.cfg:
1) If a file/directory is not in this file, only admins can write to it.
2) If a file/directory is in this file, admins + the groups/people specified can write to it.

grant command:
1) A creator may use "grant" to give read and/or write access to files under her control.

default:
1) Objects in the /secure dir can arbitrarily limit access to their data if coded to do so.
2) Anything not explained by the above rules is a security policy defined in /secure/daemon/master.c



I need to test day/night descriptions, but I can't wait around all day.

Type: help ticktock


How can I change the default prompt? Can I make it dynamic?

The default prompt is defines in /secure/include/config.h .
It is static. Eventually a revamp of the command shell will permit
dynamic prompts (listing, for example, health status, or current
working directory) but for now that is not available.


What is "unguarded"?

Unguarded is the mechanism used to obviate the stack
security model. Under some tightly controlled circumstances, it
may be desirable to have an object access privileged data, even though
an unprivileged object is in the command stack.

When the unguarded() sefun is called, the object containing
the sefun overrides the security permissions on any other object
in the stack, allowing, for example, an unprivileged object
to read from your home directory.

See man unguarded for syntax and usage, and examine
files like /secure/obj/snooper.c for examples. Use with EXTREME caution.


Is intermud communication secure?

Not in the slightest. Here's how it works:

1) Whoever is running the router has 100% access to every bit
of communication that happens across that intermud network. All
messages are plaintext, and although I personally can promise
I don't read "private" messages, there is no way for you to
be sure I'm not lying.

2) All muds connected to an i3 router can hear anything that
is said on public channels.

3) Any admin on any mud has 100% access to the i3 packet data
that comes in and out, meaning they can listen to "private" tells
between someone on that mud and someone on another mud.

4) Nobody on any client mud is able to "sniff" or "snoop" data from
tells between other muds. If Alice@AlphaMud and Bob@BravoMud are
having a heated "tell" discussion, Carol@CharlieMud can't listen in,
even if she's an admin on her mud. However, Dave@DeltaMud is
the admin on the i3 router mud, and he can "hear" everything.

5) Local channels (cre, admin, newbie, etc) do not get broadcast
to the i3 router. There is one exception to this. Dead Souls 2.0r22
had a bug that did just this thing. This bug is not
seen in earlier versions, and later versions have been fixed to
prevent this. However, any local admin has full access to any
local channel.

6) Since this is all plaintext, anyone at all along the
network stream (you ISP, their ISP, etc) can listen in,
whether at the intermud point, or at the point where you
or your message target telnetted into their mud.


Therefore: do not tell secrets across intermud.



What should I not do?

There aren't too many "don'ts", but they tend to
be important, so try to follow these guidelines:

- Don't mess with /realms/template/ unless you know exactly
what you're doing. Breaking anything there will hose up
new creators. The same goes for /secure/sefun/make_workroom.c

- Don't let just anyone off the street become Creator. You
need to know and trust your builders.

- Don't let a week go by without a full backup of your mud.

- Don't use color codes in your mud name. It makes people on
intermud cranky.


Is DS2 in any way suited to create a non-English mud from/with it?
 
First the yes: There is at least one mud that I know of that uses Dead
Souls that is in Russian. I think they might have had some trouble using
the Cyrillic alphabet, but I think they overcame it.

For a while there was a Dead Souls mud in Korean. I don't
know the name of it, because I never understood anything they said.
As far as I know, they are not running today.

There's very little about the lib that is incompatible with a different
language. You can use typical ascii characters, meaning you can
use accents, and so on. You room descriptions and messages can be
in most languages you want that you can express in ascii, and (apparently)
even some that you can't.

Now the no: The biggest obstacle to making Dead Souls international
is the parser. The "natural language parser" is in the driver, not the lib, and
it is optimized for English. English is an "analytic" language, so that
word order dictates the meaning of a sentence. With German, a "synthetic"
language, word order is less important than the pre/in/suffix inflection
and pronoun/noun declination. This kind of sophistication is completely
beyond what the MudOS parser is designed to do.
This means that a Dead Souls mud in German would have a hard time
being 100% grammatically correct in its parsing system.

However...

If you're willing to make compromises with grammar, it can be done to
a certain extent. For example, If you make "mein", "meiner", "meine", "meines", "meinen",
and "meinem" all applicable to all possessive situations, then it can work fine.
To a grammar purist this is a horrible thing to do, but it is available as an option,
if you're willing to do some rewriting of the mudlib.

German and Russian are statistical outliers, though. Many European
languages lack noun cases, and for them, using Dead Souls would be much
easier, in terms of the parser. You still have to deal with agglutination,
though, such as single-word intransitives or reflexives.

So, the summary answer is:

* Yes, you can use Dead Souls with non-English languages for
descriptions and messages.

* Depending on the language, you will have to make grammar compromises
if you intend to use the MudOS parser for command processing.

* To convert properly Dead Souls to another language is a non-trivial task that
involves reworking the master object, various command/verb system objects, and
possibly the MudOS parser to a degree. It *is* possible, but it's definitely not
a project for the faint of heart.

* You can avoid this by not using the MudOS parser, and using the
old-style command system, which depends on add_actions and command
files to accomplish the job of parsing. This also requires some substantial
lib coding. It is more code you'd have to write, but it would be
less advanced and complicated than refitting the natural language parser.

* I enjoy the study of languages and grammar, so I'd be delighted to help
you if you decided to take on that project. However, my role would be
of a "helper". I cannot take on the burden of doing the majority of the
grunt work code for someone else's project.

* I wish I could tell you "Yes, and it's easy." The answer though, is "Yes, but it's hard."


I keep losing my intermud connection, and sometimes I'm half connected

This happens most frequently when using a wireless connection.
Intermud is apparently not at all tolerant of the casual manner in which
many wireless connections work, and as a result your intermud
connectivity will likely suffer. Perhaps this is old-school of me,
but I think it's reasonable to suggest that you run your mud on
a land-line network connection.

Another source of this problem is if you're running off of
a home broadband connection. Some of these DSL or cable modems change
IP addresses very frequently, and your connection is interrupted during
those changes. If your connection is abruptly terminated and you come
back with a different IP, the intermud router may not handle this
gracefully. Perhaps this is old-school of me, but I think it's
reasonable to suggest that you run your mud on a static IP.

Finally, I have seen some home firewall/router devices that
have an unconscionably short timeout for idle connections. There is
usually enough intermud traffic that your conenction will receive a
packet within fifteen minutes, but if your timeout interval appears to be
shorter than that, you can tweak your intermud ping interval by
changing this line in /secure/daemon/ping.c then updating the file:

call_out( (: eventPing :), 900);

to this:

call_out( (: eventPing :), 240);


That will shorten your intermud ping interval to 4 minutes,
which should keep most such aggressive timeouts from happening.


I heard I can run my old TMI-2/Nightmare 3/Skylib/Lima code on Dead Souls. Is that true?

Yes and no. Please read this announcement for the details.



Why is the version of Dead Souls 2 on Sourceforge different from the one on dead-souls.net?

It's a licensing thing. Sourceforge insists on only having Open Source
stuff on their site, so the version of Dead Souls you can download there is Open Source.

However, I have stopped developing the Open Source version of DS2. The latest
versions are not Open Source. You can always get the true, up to date, newest version
from this URL: http://dead-souls.net/code/dead_souls.zip

The GPL licensed version I'm leaving on Sourceforge works, but is older
and contains many bugs. If you're planning on forking DS development, use the GPL
one from Sourceforge
.

If all you're looking to do is run a mud, use the latest version from the
Dead Souls site.
Mud admins don't need to worry about licensing issues. Only
those looking to distribute
or fork DS should be concerned with the licensing.

For people who don't like running proprietary code, and don't trust me
to honor the GPL license, you have now a THIRD option, which is using
the public domain version of DS2 known as Dead Souls II. For more
details, please see this page: http://dead-souls.net/ds-II-faq.html .

Short answer: If you don't care what license you use, then you should
use the most featured and most current stable version, which is:
http://dead-souls.net/code/dead_souls.zip


Good heavens! All I wanted to do was change combat, and it is so complicated!

This is somewhat related to question 72, "Will changing XYZ be hard?". Some
folks have super-specific ideas about how their mudlib should look, and, for example,
want nothing to do with magic, or limbs, or have a problem with combat, etc.
I think you'll find Dead Souls 2 can be molded into whatever you want.

However, I would suggest the if you're going to be spending more than
50% of your time ripping things out of this lib, it might be that this
lib doesn't actually suit you. You might be happier with TMI-2,
for example, or Lima, or LPUni.

If you're going to stick with DS2, though, then it's time for a re-assessment.
You're looking to modify big, complex systems in a codebase that's not
that familiar to you. The amazing thing is how far you've gotten
in so short a time, that you're up for haxing at the combat system. But
I'd like to make sure your expectations are set correctly: you are messing
with complex systems fundamental to the operation of the mud. Of
course it'll be hard, until you're at a higher level of proficiency.

So yes, changing big things is big work. You might want to stop
and think about whether this really is the lib for you, if you're
spending most of your time pulling stuff out. Or you might want to
slow down and work on modifying simpler objects and systems before
starting to chew on player object inheritables.

Just a thought.


Editing in Windows is fine and call_out()'s are great. Your advice sucks!

    Astute or adventurous readers may have noticed that some of my
statements on the faq are only true up to a point. For example, if you
have a proper editor, and know what you're doing, there's nothing
inherently wrong with editing an .o file.

    Similarly, a call_out() here or there isn't wrong, and in fact is
the only way to do certain things elegantly (or at all).

    The reason for the stern warnings is that these, and other subjects,
involve judgment calls that a novice is not in a position to make. Are
you 100% sure that windows editor won't add dos formatting? Can you
be certain that your call_out won't bring the mud to its knees?

    Expert coders and admins can determine their risk level based on
experience. Until newcomers gain that experience, I try to dissuade
them from risky behavior, because getting tripped up in the starting
gate is no way to win a race.


I keep hearing that Dead Souls can do this or that, but I'm trying and can't.

    It may be that you downloaded the older, GPL version of
Dead Souls. The latest, non-GPL version may have the feature
you're looking for.

    When I refer to the latest version, I mean the latest
stable release. Cutting-edge "alpha" versions can be downloaded,
which include the absolute latest stuff I've been working on.
It may be that the feature you're talking about is only available
on the alpha version, and hasn't been included in a stable
release yet.

    You can download the alpha and run it, but you do so at your
own risk. Alpha versions have that name for a reason: they aren't
fully tested and are likely to have bugs.

    Alpha versions are numbered differently from stable releases.
For example, Dead Souls 2.1 alpha 8 is roughly equivalent to
(unreleased) Dead Souls 2.1 release 41. This is because the
alpha version changes less frequently than the "internal"
release.


You appear to have a FAQ for everything!

    I'm not kidding when I call these FAQ's. These questions
really do get asked frequently.

    When you start using Dead Souls, when you ask a question
on the DS line, you will more often than not get a FAQ url
from me. This is normal, and is meant to encourage you to
review the docs on your own.

    If you find that most of your questions
have FAQ's for answers, you should seriously consider changing
the way you're going about things. When you're not sure
about something, check the FAQ's first. That's what
they're there for.

    Eventually, if all your questions are answered by
existing documentation, you might find that you get fewer
and fewer responses from people, as they start tuning
you out
. Remember that most people refer to the docs: 
the help and manual files, command help messages,
as well as the admin, creator, debugging, and general
faqs. There's also the in-game player's handbook, creator's
manual
, and admin guide, as well as web based examples
and tutorials. There is also a Dead Souls support forum
which is searchable.

    There is a ton of documentation for DS, and most people
consult it regularly. If you keep asking questions that
are explicitly answered in docs, you may find yourself
in the awkward position of not having anyone listening
to you when you ask for something *not* documented.

    This doesn't mean "Don't bother us with your newbieness".

    It means "First RTFM. If it's not in there, ask like
someone who has tried to find the answer, not like a lazy
person who wants to be tutored
."

    A very detailed explanation of the reason for this
is at http://www.catb.org/~esr/faqs/smart-questions.html
(NOTE: The people that run that page have nothing to do
with Dead Souls. Do not try to ask them Dead Souls questions).

I strongly urge you to read that entire document. If you've
never read it before, it will help you both on DS channels
and pretty much anywhere else where experts are available
for questions. I promise there will be benefit from
reading it.


If I XYZ, will that work?

Try it and see. One of the drawbacks to having exhaustive
documentation is that folks can get the impression there's
an example of every test case. As with any coding (programming)
environment, you'll need to put in a lot of trial and
error to learn. If it doesn't work, and it's not documented,
go to the Dead Souls forum, tell us what you did, where you
looked, and what you expected.


Hey you skipped question 101!

Yeah I goofed the numbers and now people are using #101 for
something else. Oh well.


You are not taking my bug report very seriously.

On the contrary. I am fanatically dedicated to making and keeping
Dead Souls the very best LP lib out there. As you spend more time
getting acquainted with the DS community and how things work,
you will see that I am deadly serious about bugs and they
usually get addressed quickly, if they prevent functionality.
At a minimum, legitimate bugs end up on my .plan (which you
can see by logging on to the demo mud and typing: finger cratylus).

I know DS2 has bugs. I'm not under the illusion it's perfect,
or that I'm a coding god.

However, I *do* get a lot of reports, and I have to prioritize
them. DS2 doesn't put food on the table for my family,
or keep the rain off our heads, so you'll need to keep in mind
that, as special and wonderful a person as you are, your
coding confusion is sadly not my personal emergency.

Whether it's a critical security flaw or a typo in a
file's header, I can promise you I *will* address your problem,
unless another member of the community gets to it first. You
may have to just be patient.

Another reason you may feel I'm not addressing your problem
is that you may not actually have a problem. Specifically,
if you are a new admin, and something doesn't work the way
you think it should, I advise you not to immediately
regard it as a bug. It may well *be* a bug, but assuming it
is so is not helpful. Consider the following scenarios:

Scenario 1a:
Noobulator@LeetFooMUD <ds> BUG!! I can't see what's in my toy chest!!1!
Cratylus@Dead Souls Demo <ds> k. thx.

Scenario 1b:
Noobulator@LeetFooMUD <ds> I type "l chest" but I can't see what's in there.
Cratylus@Dead Souls Demo <ds> try: look in chest

Another common source of "bug reports" is what can charitably
be called operator error. For example:

Scenario 2:
Noobulator@LeetFooMUD <ds> lol the schoolhouse is broken lol
Cratylus@Dead Souls Demo <ds> works for me
Noobulator@LeetFooMUD <ds> well, it's bugged. I get a million errors when I enter
Cratylus@Dead Souls Demo <ds> i can't reproduce the problem on my test muds.

Ususally in such a scenario, it turns out that the person
was *sure* they didn't change anything...and later remember
they just took out this one line they didn't like from the
code. Or perhaps they removed the "dwarf" race, and so the
schoolhouse can't load because it has a dwarf npc in it. Or
maybe they....etc etc etc.

If you report a bug, and you get something like this from me:

"I can't reproduce your problem."

It means I tried to get the same results, and couldn't.
You can interpret that as meaning that you've either
caused the problem yourself, or haven't given me
enough information to be able to test what you're
talking about.

If you don't elaborate further, and you don't post your code and
error messages on the forum, then I'll assume you're going
to track down your coding mistake on your own.

This doesn't mean I don't like you, or that I think you're
a loser, or that I don't care about bugs. It means I can't do
anything useful with the information you've given me. If
you can provide me with enough information so that I
can reproduce your problem, then I can work on fixing it.
Otherwise, what can I do?

I would also ask you to be as open-minded as you would
like me to be. It isn't easy for me to be nice and polite...
I've actually a rather abrasive personality by default. If
I don't know you and I'm being polite to you, the chances are
that I'm really making an effort. The chances that you're
asking me something I've never heard, or reporting something
I'm unaware of, are small, if you are a new admin. If my
response is not to your liking (for example "check the Creator FAQ",
or "read the Player's Handbook"), getting hostile and defensive
with me won't help anything. Given how long I've been working
on this code, it's very likely that I've given you
extremely good advice, out of a genuine desire to have you succeed.
If you react in an adversarial manner, you may wind up
missing the technical usefulness of what I've said, and
discourage me from responding promptly to you in the future.

And if it happens that I *am* wrong, which occurs frequently
enough, then simply following my instructions and explaining to
me how they didn't work is a perfect way of showing me my mistake.


Dude. Just answer my question. It's just one question, ffs.

If there's one thing that fills me with dread it's the
prospect of having to RTFM for software I'm totally clueless
about. Technical people often are terrible docwriters, and it
can be a real challenge to tease out the information you need.

In fact, sometimes it's necessary to understand what's in a
manual before you can read it, because of the level of complexity.

So I sympathize with you. Looking at a pile of documentation
99% of which you don't understand is daunting, and I truly
appreciate that fact, because I've been there.

So I totally grok when you say "Look, please just tell me how
to eventNarfle the garthak(). Ok?" I feel it, man. I get you.

What I want you to understand is that when I tell you to RTFM,
I'm *not* giving you the brush-off because I like it. I'm
doing it because to you it's one little question. To me, it's
Creator FAQ #X, which I've answered 24 times before, and for
which I sat down and wrote out an excruciatingly detailed
explanation.

Take a look at this FAQ, and the others. There are literally
hundreds of entries, all of them written by me, in a way as
clear as I could make it. Take a look at the dozens of chapters
in the Admin Guide, Player's Handbook, and Creator's Manual.
That stuff didn't write itself.

I didn't go through the laborious process of all that doc
work so that I could then do it over again every time someone
doesn't feel like doing a text search on the FAQ for eventNarfle.

I'm not saying I'm too good to waste my time on you. I'm saying
I *HAVE* spent the time, I *did* make the effort, and I need
you to make just a little effort of your own as well.


Is it possible to upgrade to alpha without killing everything I've done?

Probably.

I have been asked whether people can upgrade from the stable
release to the alpha release, and my answer usually is something
along those lines. "I imagine so."

And if asked how, I'll typically say something like "very carefully."

The reason is that I do not encourage people to "upgrade" to
an alpha version. Alpha is by definition a rough draft, lightly
tested in new functionality, and unstable in the sense that
new alphas come out often.

I do not put out alpha patches, and I do not make it easy to move
from a stable release to an alpha release. This is because if I
did make it easy, most people would do it, even beginners. This
would be problematic, because if they then run into an alpha bug,
they have to hear this from me:

"Well, yeah. Alpha has some bugs. I'll get to that one eventually."

And then people would get all gripey, or push me to fix it,
etc, and I wouldn't like that. The point of the stable release
is that it's stable. The point of alpha is that it's a testing
version of new stuff. If you want to go alpha, that's fine with
me, but you'll need to be experienced enough to do it on your own.

I actually do want people to run alpha so that I can get
bugreports. But I don't want people running their main production
muds in alpha, because I will not be making commitments about
when bugfixes happen. I also don't want total newbies using
alpha, because I don't want to set them up for disappointment
when I don't treat their bugreport with extreme dispatch.

So yes...it's a bit elitist of me, but for good reason. If you're
unsure about being able to safely upgrade to alpha from your
stable release...then don't.

If you do it and screw up, restore from backup. You did back up
first, right?


How do I start an area?

In Dead Souls, a set of related objects, creatures, and rooms that
add up to the creative vision of a builder is called a "domain".
It's the same thing as what other codebases refer to as an "area".
The terms are used interchangeably in the DS community.

Dead Souls domains are comprised of a bunch of LPC files that live
in a specific directory. If the domain is to be called UlTiMaTe DBZ PWNAGE
then that directory (aka "folder") might be called /domains/dragonballz .

To create that domain, you can use the domaincreate command, like so:

domaincreate dragonballz

This will generate some standard directories and a start room for
the domain. At that point you can assign a domain admin with the
domainadmin command. For more info:

help domaincreate
help domainadmin


I don't want to use a cookie-cutter codebase

So, this one time, these guys were checking out Dead Souls, and
one of them was seriously evaluating it, and his buddy was basically
coming up with reasons why some other lib was better...no matter
what. For example, the doubter guy was like "feh we don't want
a medieval mud", to which I replied "check out the firearms
code", and the reply was "lol, we have our own". You know, a
total no win sort of deal.

And then the doubter guy said something that got me thinking.
Among his objections was one that I didn't quite understand.

"We don't want a cookie-cutter lib," he said.

Now, the lib he was advocating was no more or less cookie cutter
than DS, in my opinion, so it's not like I was dazzled by the
argument, so much as I was confused by the premise. Just what
the heck does "cookie cutter" mean?

Cookie cutter as a bad thing:

I think what people sometimes mean is that they don't want a mud
that looks like every other mud. Why bother logging into
LeetDikuHeavilyModifiedMud When DikuHighlyLeetCustomizedMud is
exactly the same, except the race and skill names are different?

Similarly, there are a few dozen new Dead Souls muds out there.
They all mostly look the same...why not choose something that
isn't like Everyone Else?

Cookie cutter as a good thing:

I would suggest that there are some things for which "cookie
cutter" as a pejorative term is of limited impact. For example,
operating systems and air conditioners. There are things that,
when acquired, aren't acquired for their uniqueness. They are
acquired for their suitability to a specific application.

In this sense, cookie cutter basically means widely adopted, and
from the standpoint of someone just trying to get a specific job
done, it is an advantage that there is wide adoption of what
you're working on.

Where Dead Souls fits in:

* A codebase distribution is, necessarily, cookie cutter. It's
a set of frameworks, presumably standardized during development,
that are the same for everyone when they first get it. From
this perspective, anything that you didn't 100% code yourself is
cookie cutter when you download it.

* If you download a codebase and then just run it with no modifications,
then the problem in "originality" isn't the codebase, it's you.

* Dead Souls includes a large (perhaps overlarge) amount of
rooms, creatures, objects, armor, and weapons in the stock distribution.
When you download and run it, you basically have a working mud with
quests and pubs and whatnot.

YOU ARE NOT SUPPOSED TO USE THAT STUFF AS YOUR MUD

Those are examples. They are sample areas. If your mud uses the sample
areas, they should be one or more of the following

A) Temporary, while you're learning the lib
B) A joke
C) Not the areas new players see

If you make no changes to the sample areas and present them to new
players as a mud, then yes, you have a cookie cutter mud, and you
really might as well just shut down, because only your friends will
log on to play, and not for very long.

I think that the problem is that people see this large amount of
example material and think that they have to use it in their mud. If it
were so, then that would be sad and would doom every Dead Souls mud to be
exactly like every other.

Instead, your mud can have a Roman Empire theme, with no hint of
the stock areas in sight when a player logs in. Just the robe and
sandals they wear and the classical city they must explore. That's
actually been done, by a mud called, aptly enough, Ancient Rome.

Nothing prevents you from having your new players launched into
space the moment they log in, or find themselves suiting up for
a dive into Kaminoan oceans. It's a mud *codebase*, not a mud.

Make it your own.


How do I make my new area the default domain where new people to arrive?

1) Back everything up.


2) In your new domain, make sure that the room/ directory contains (working) rooms
with the following names:

void.c
death.c
freezer.c
pod.c
wiz_hall.c

See the rooms in /domains/default/room to see what these rooms do and how they work.


3) Edit this file: /secure/include/rooms.h

Change this:

#define ROOM_START       "/domains/campus/room/start"

To point to your new domain's start room. For example,

#define ROOM_START       "/domains/dragonballz/room/leet_start_room"


4) Edit this file:
/secure/include/dirs.h

Change this:

#define DIR_STANDARD_DOMAIN     DOMAINS_DIRS "/default"

To this:

#define DIR_STANDARD_DOMAIN     DOMAINS_DIRS "/dragonballz"

Or whatever your new main area is.


5) reboot (In theory you can do this without rebooting, but the instructions would be longer)


6) If this fails, restore from the backup you made in step 1,
and ask for help either on the ds line or on the forum.


I heard passive mode on the FTP server works now

If you are using Dead Souls 2.1 Alpha 19 and above, then yes,
passive mode FTP works now. There are some very important
things to keep in mind.

1) Dead Souls now comes with two ftp servers. The original
is known to the inet system as ftp. The new, passive-mode
server is known to the inet system as hftp. To enable hftp,
run the following mudconfig commands:

mudconfig inet enable

mudconfig hftp enable

2) The default port for the hftp server is 6 less than your
mud's telnet port. So if your mud runs on port 6666, then
the hftp server will be on port 6660. This can be changed
by editing /secure/include/network.h

3) The mud must know its correct external ip address. You
must set this in the config.h file, preferably with the mudconfig
command, like so:

mudconfig hostip 111.222.333.444

Where "111.222.333.444" would be the actual ip address that
the external machines will be trying to connect to. If
you do not know what this address is, leave the default
of "127.0.0.1" in the config file. This will let the ftp server
know it needs to try to figure out the address based on information
it gets from the intermud router.

If it cannot gather this information, or you don't specify
a valid external ip address, then the passive-mode
ftp server will not be able to handle incoming connections
properly.

4) Passive ftp support requires the use of an additional
range of ports. The default range of ports reserved by hftp
starts at -65 from your mud port, to -11 from your mud port.
This means that if your mud is running on port 6666, then
ports 6601 to 6655 are reserved for your passive mode transactions.
If there is a port conflict with another program, you'll
have problems. You can change the port range by editing
/secure/include/network.h

5) Once it's been correctly configured and started, you
should be able to use passive mode for ftp transfers
even if your ftp client computer is behind a firewall.

If the mud computer itself is behind a firewall, you will
need to make sure that the range of ports discussed
in the above section are being properly forwarded to
the mud computer. If the mud is behind a router, for
example, you may need to configure that router to
forward ports 6601 to 6655 to the mud computer.

6) If all has gone well, then you can ftp to the mud's
hftp port, begin a passive session, and while away
the hours uploading and downloading to your heart's
content. On a command line ftp client, that might look
something like this:

myhost: /tmp/foo $ ls -l
total 32
drwxr-xr-x   2 myuser     other        117 Dec 26 18:34 ./
drwxrwxrwt   7 myuser     sys         1361 Dec 26 18:33 ../
myhost: /tmp/foo $ ftp mymud.com 6660
Connected to mymud.com.
220- Dead Souls FTP server ready.
220-                          FTPD news
220-                          /news/ftpd
220-
220 Please login with your creator name or anonymous.
Name (mymud.com:myuser): myguy
331 Password required for myguy.
Password:
230 User myguy logged in.
Remote system type is UNIX.
ftp> passive
Passive mode on.
ftp> bin
200 Type set to I.
ftp> dir
227 Entering Passive Mode (1,2,3,4,30,32)
150 Opening ASCII mode data connection for file list.
drwxrwxr-x   1  dead_sou dead_sou       0 Dec 26 18:33 .
drwxrwxr-x   1  dead_sou dead_sou       0 Dec 26 18:33 ..
-rw-rw-r--   1  dead_sou dead_sou      28 Dec 26 18:33 .plan
-rw-rw-r--   1  dead_sou dead_sou      21 Dec 26 18:33 .profile
drwxrwxr-x   1  dead_sou dead_sou       0 Dec 26 18:33 adm
drwxrwxr-x   1  dead_sou dead_sou       0 Dec 26 18:33 area
drwxrwxr-x   1  dead_sou dead_sou       0 Dec 26 18:33 bak
drwxrwxr-x   1  dead_sou dead_sou       0 Dec 26 18:33 cmds
-rw-rw-r--   1  dead_sou dead_sou     361 Dec 26 18:33 customdefs.h
drwxrwxr-x   1  dead_sou dead_sou       0 Dec 26 18:33 log
drwxrwxr-x   1  dead_sou dead_sou       0 Dec 26 18:33 tmp
-rw-rw-r--   1  dead_sou dead_sou    3087 Dec 26 18:33 workroom.bak
-rw-rw-r--   1  dead_sou dead_sou    3087 Dec 26 18:33 workroom.c
226 Transfer complete.
811 bytes received in 0.0097 seconds (81.68 Kbytes/s)
ftp> get workroom.c
227 Entering Passive Mode (1,2,3,4,30,32)
150 Opening binary mode data connection for /realms/myguy/workroom.c (3087 bytes).
226 Transfer complete.
local: workroom.c remote: workroom.c
3087 bytes received in 0.031 seconds (96.91 Kbytes/s)
ftp> bye
221 Goodbye.
myhost: /tmp/foo $ ls -l
total 48
drwxr-xr-x   2 myuser     other        184 Dec 26 18:35 ./
drwxrwxrwt   7 myuser     sys         1361 Dec 26 18:33 ../
-rw-r--r--   1 myuser     other       3087 Dec 26 18:35 workroom.c


The sharp-eyed among you will no doubt have noticed that
binary mode ("bin") is being used. This is because ASCII
mode transfers don't work too reliably, and fail more
often than not.

7) hftp has NOT been tested for security or reliability.
If it doesn't work, you're free to let me know, but do
not expect me to fix it. If someone hacks into your mud using
rcp, http, ftp, or hftp, and ruins your life, this is not
my problem. These servers are provided to you as a convenience,
not as standards-compliant, production-quality internet
software. Proceed with extreme care and make regular backups
a top priority. If in doubt, do the following:

mudconfig inet disable

8) If you find hftp helpful and useful, please thank Duuk @ Haven
for being kind enough to let me filch it from his mud, Haven.
If you *don't* like it, please withhold comment until you have
a patch to submit to fix a shortcoming.

9) Known issues:

* If you see this:
"netin: Connection reset by peer" it means
you're trying to use ASCII mode. Remember to use binary mode.

* Anonymous FTP doesn't work yet.


I boot the mud but nothing happens...the startup headers
come up but nothing preloads and I get no error messages. What's
going on?

This can happen if your internet connection goes down, and
you're using name resolution. For example, if you are trying to
use 1.2.3.4 7777 as your address server, and your network
connection goes down so that you can't reach 1.2.3.4, then
if you try to reboot, the driver will hang at that point in
its startup configuration, waiting for 1.2.3.4 to become
available.

Simply change that entry in mudos.cfg to something like
localhost or 127.0.0.1 and you should be able to boot again.


How do I add a default alias?

Add it to the Aliases array in /lib/nmsh.c



- Cratylus

Dead Souls Homepage