Dead Souls Admin FAQ

Written by Cratylus @ Dead Souls, October 2005
Updated December 2007

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 thatn 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.

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 are some do's and don'ts?

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?

112 How do reset() and clean_up() work?

113 When do reset() and clean_up() happen?

114 I want a 100% PK mud. Setting rooms PK one by one is not acceptable.

115 How do I make a new skill?

116 Why was Descartes so lame?

117 The mud is locked whats the command to add someone to the allow list?

118 Shouldn't you change all the documentation to reflect the move to FluffOS?

119 How do I change my timezone?

120 So I herd u liek mudkip

121 Where is all the player information stored?

122 The addrace command complains that the race already exists.

123 I am confused about the player/creator distinction.

124 How do I prevent people from using channels?

125 How do i disable the rss bot, or other channels?

126 I made a verb but it doesn't work.

127 Does Dead Souls support databases like MYSQL?


128 How do I make my new currency work?

129 My friends can't connect to my mud, but I can!

130 My efun override is not working.





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 starting January 2007, for any of your code to become
part of the official Dead Souls distribution, you must officially
disclaim copyright to it and place it into public domain.


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 has been dead as of
November 2006, though, 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 your intermud connection with the command:

mudconfig intermud disable


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 requireraces 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?


To make a creator named Xyzzy an assistant admin, ype:

groupmod -a ASSIST xyzzy

Xyzzy then needs to log out and log back in. To
make him a full admin, you'd add him to the SECURE group instead.


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 for 2.1 and below, uncomment the "inet" line in
/secure/cfg/preload.cfg

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

On 2.3 and above, use the commands:
mudconfig inet enable
mudconfig http enable


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.

Make sure you have read this:

http://www.chiark.greenend.org.uk/~sgtatham/bugs.html



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.

Note that disconnecting and logging back in is not enough.
You have to actually quit, so your old player object
is completely destroyed.


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. 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.

Lately I've heard rave reviews for Alternate Realm Hosting from
people with good judgment. If I weren't already happy with
my arrangements I'd probably give them a day in court. They're
supposedly inexpensive and have very good service and support.

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 (you must make it Public Domain), allowing me to
publish it and preventing you from ever revoking my right to distribute 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.

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.

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
simpler. 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

Yes it does. If you tried to send intermud mail to someone
with Dead Souls and it failed, then one or more of the following is true:

* You are using a Dead Souls version below 2.4.1.
* The recipient is using a Dead Souls version below 2.4.1.
* The recipient has disabled their OOB service.
* The recipient has disabled their INET service.
* The recipient is firewalled and cannot accept OOB connections.


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.


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.


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 DS v1/Nightmare IV/3. 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 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.4.1 is released as the current stable version.


The Dead Souls router is down.

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 was known as *gjs.

If the router you are on is down, try using the switchrouter
command to connect to a backup. As of this writing, the *i4
and *yatmim routers serve as mirrors for each other, so
that connecting to one will give you access to the same muds
as those on the other.

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.


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?

If the race already exists, and it is, say, kobold, type:
removerace kobold

Then 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/gid:
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 defined in /secure/include/config.h .

In Dead Souls 2.4.1 and above, you can use the prompt command
to change the default to something else, and you can even
have dynamic prompts which indicate your health status, etc.
Type:

help prompt


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 are some do's and don'ts?

There aren't too many, 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 be too adventurous with your admin character. I've
had to change admin tools so people can't remove themselves
from admin groups, and so that people can't demote themselves
from creator to player...not because I thought maybe someone
might do it, but because people have done it. If you play games
with your admin's body, gender, stats, whatever, it probably won't be
fatal, but then, it might. Don't experiment on your admin. Use
a test character.

- Always always always back up any lib files you mess
with. The bk and restore commands are your best friends.

- 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.

- Don't edit files that end in ".o". Those are data files,
and are very very easy to corrupt if you edit them by hand,
possibly damaging your mud.

- Don't assume it's anyone's responsibility but your own
to teach you LPC and how to use Dead Souls.

- You should avoid changing your lib name unless you have
a good reason for doing so. Changing from "Dead Souls" to
"MyLib" or whatever probably seems like a fun thing to do, but
makes you look like you're trying to claim credit that is not due.
People really do notice, and really can tell. It makes you look bad.
Keep in mind that most of what is currently in Dead Souls
was written exclusively by me*, and yet I have not changed the name.
Similarly, unless you're actually branching MudOS, don't change
the name that is reported by it. Leaving the driver and lib names
alone is perhaps the one way you have to demonstrate your
gratitude to the dozens of developers that made them available
to you.

* After removing docs from each, the uncompressed lib material
in DS1.1 is about 5 megs contained in about 1000 files and
directories, and DS2.4 is about 12 megs contained in about 2300
files and directories.



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 five minutes, but if your timeout interval appears to be
shorter than that, you can tweak your intermud ping interval in
Dead Souls 2.5a19 and above by typing: mudconfig pinginterval 120

That will shorten your intermud ping interval to 2 minutes,
which should keep most such aggressive timeouts from happening.
It's probably not a good idea to lower your interval below 2 minutes,
as your mud may wind up getting stuck in an i3 reconnect loop.

Dead Souls muds below 2.5a19 may need to manually edit PING_INTERVAL
in /secure/include/config.h or /secure/daemon/ping.c and reboot.


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.

Strictly speaking it's "public domain". For more information on that
version, see:
http://dead-souls.net/ds-II-faq.html

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.

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 LPUn, etc. You can choose from a number of
libs from the LPMuds.net download page: http://lpmuds.net/downloads.html

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.

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) In your new domain, make sure that the room/ directory contains (working) rooms
with the following names:

void.c
death.c
freezer.c
furnace.c
pod.c
wiz_hall.c
start.c

See the rooms in /domains/default/room to see what these rooms do and how they work.
The domaincreate command generates these rooms by default.

2) Use the mudconfig command with the defaultdomain subcommand. If your new
default domain is
/domains/dragonballz, you would type:

mudconfig defaultdomain
/domains/dragonballz

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


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


How do reset() and clean_up() work?

LPmuds come from a tradition of trying to be as conservative with
computer memory as possible. Back when a server with 128 megabytes
of RAM was worth killing for, people often had to make do with
scant memory resources. Objects needed to be be either swapped to
disk, or unloaded from memory entirely, if they weren't really needed.

The clean_up() apply was meant to address this. The driver
periodically calls clean_up() on every object. Typically, the
clean_up() function coded into a given object contains instructions
such as "if you're not in a player's inventory and you're just
lying around, then destruct yourself", that sort of thing. In
Dead Souls, clean_up() is a function in LIB_CLEAN, which is
inherited by most objects.

Some objects should never be unloaded from memory, like daemons,
and some special objects. Such things should have SetNoClean(1)
specified in their create() function, so that the clean_up()
apply doesn't try to destroy them.

Tangible objects (shoes, swords) that are SetNoClean(1) will
prevent the object they are in (NPC or room) from doing a clean_up().

reset() is another "driver apply", or function that is called by
the driver. Like clean_up(), reset() is called periodically, but
it is intended not to be a trigger for auto-destruction, so much
as a set of instructions to make an object presentable to
players again.

For example, if Joe Player completes the Orcslayer quest by
killing a bunch of orcs, then when Jane Player wants to do the
quest, she's just going to find a bunch of dead orcs. However,
when reset() gets called on the room, then the inventory can
reload, so that Jane gets a crack at those orcs as well.

Like clean_up(), reset() is not generally meant to be put in
run of the mill objects. By default, rooms inherit reset()
from LIB_ROOM, and it serves the purpose of reloading the
inventory the room is supposed to have.


When do reset() and clean_up() happen?

The way MudOS works, the driver calls reset() and clean_up()
on objects based on the interval specified in the runtime
configuration file.

That means that if mudos.cfg
has a "time to reset" of
3600, your reset interval is 1 hour. Orcs will repopulate the
cave every hour at that rate (assuming they've been killed).

Similarly, "time to clean up" specifies the driver's
interval between clean_up()'s.

While this is a valid scheme, Dead Souls doesn't rely
on it. Dead Souls uses the TIME_TO_RESET variable in
/secure/include/config.h to determine the reset() and
clean_up() interval. If TIME_TO_RESET is 14400, then the
master daemon (MASTER_D) will run eventReset() every four
hours. eventReset() is a function that seeks out objects and
calls reset() and clean_up() on them.

Note that this may cause set_reset() to behave in a way you don't
expect, and it means you'll get reset()'s in your mud even if
you compile the driver not to do so.

Therefore, it's a good idea to set your "time to clean up"
and
"time to reset" in mudos.cfg to something very large
(like 2000000000, aka 63 years) so that you don't have
two separate systems doing reset()'s and clean_up()'s.

In Dead Souls 2.4.1 and below, MASTER_D calls reset() and
clean_up() on 25% of loaded objects at a time, to avoid
lag on busy muds. 2.5a1 and above can choose to have these
fuctions called on all loaded objects with the RESET_ALL
definition in /secure/include/config.h


I want a 100% PK mud. Setting rooms PK one by one is not acceptable.

Setting your DS mud to be 100% PK (pplayer killing) is not that convenient
by default, I agree. The reason for this is that from what I've seen,
unrestricted PK is a great way to ruin a mud, and it should not be
something you can enable accidentally.

Having said that, this is the procedure you would follow to make
a Dead Souls mud 100% unrestricted PK.

1) Run the command: mudconfig pk yes
2) Edit /lib/std/room.c. Change

private static int      PlayerKill    = 0;

to

private static int      PlayerKill    = 1;

3) Edit /lib/living.c. Change

    isPK = 0;

to

    isPK = 1;

4) Reboot

5) Players created before this change may still need to use the pk command
to enable player killing for themselves.


How do I make a new skill?

What people usually mean by this is Diku style "skills", which are
more like special commands or spells than Dead Souls skills. In
Dead Souls, a "skill" is a property of a living thing that allows it
to be proficient to some specified level at a kind of activity. For
example, to be able to cast a defensive spell like buffer, you
may need a particular level of proficiency at the skill of "magic defense".

That kind of skill isn't "created" in the standard sense. That kind
of skill is added to a player or NPC programmatically, usually when
their character is created, or they advance levels, or join a class.

For more information on that kind of skill, please read Section IV
of Chapter 8 of the Admin Guide.

In order to make the Diku-style "skill", all you really need to
do is write a new command. For example, take a look at /cmds/players/flee.c

That's what a Dead Souls command looks like. Pretty straightforward,
but you'll need to become a little familiar with LPC to make your
own. Read the Creator's Manual to become familiar with LPC, then
play around with making a command of your own by copying flee.c to
bash.c or whatever, and tinkering with the code.

There's no "quick" way to making a new skill of this kind. This is the
point where you decide whether to invest the time in learning enough
LPC to get your vision implemented in earnest.

For the advanced coders, I would suggest creating a new verb, rather
than a new command. Verbs are far more powerful and sophisticated than
commands and are suited for just this kind of purpose. However, they
require intermediate-to-advanced LPC coding skills, so if you are
new to LPC, please do not try verbs yet.


Why was Descartes so lame?

People have really got the wrong idea here. There are two main complaints
against the original author of the Dead Souls lib:

"Descartes was a mean jerk."

and

"Descartes was an incompetent coder and/or docwriter."

My first response is that even if these things were true, it doesn't matter.

Whether Descartes was personally hurtful to you once is totally
irrelevant to your mud. He has left the mudding community and
will not hurt you again. Further, Dead Souls 2 was built from
public domain code, meaning he can never ever revoke your right
to use Dead Souls. By nursing your old resentments against Descartes,
you are only casting yourself in a bad light, by seeming petty
and self-involved.

As to his supposed programming competence, this also is entirely irrelevant
to you. I can tell you that as the current maintainer of DS, I am
intimately familiar with his code and am in an excellent position
to sit here and bitch about it. The main reason I don't is that:

1) I am eternally grateful he wrote it in the first place.
2) Given the TENS OF THOUSANDS of lines of good code he's written, a few
   stumbles aren't worth getting smarmy about.
3) Whether the code was written by him, one of his people, or dictated
   to the lib directly from the mouth of Satan in the pits of hell, in the end, the
   original author is not the problem. If the code doesn't do what you want, there
   is really no point at all in grousing about it. Either fix it, ask for help, or
   get a new lib. If you're an admin it's because you're a can-do type,
   and willing to DIY where necessary. If not, blaming and complaining aren't
   the answer. Meditation and introspection are. As in, you should be asking
   yourself if running a mud is what you should be doing.

Ok, now that I got the ranting out of my system, let's address the specific accusations:

"Descartes was a mean jerk."

    Yeah, sort of. It really depended on how you approached him. Really,
as far as I could tell, he was a normal person with a somewhat low
threshold for having his buttons pushed. And people enjoyed pushing
his buttons. A lot. And this lowered his threshold for it. Rinse, repeat.

    As a result, if you were to publicly approach him in a way that
he identified as making you likely to be a button pusher, he'd tend to
handle you as such. You were less likely to get bile on you if you
approached him privately, but then, you might just get ignored as
Yet Another Loser wanting her hand held rather than just putting in
the work learning how to build her mud.

    On occasion he'd also just be generally irritable, combative, and argumentative.
In short, he was a normal person. I have personally been involved in
plenty of flaming back and forth with Descartes...quite thoroughly hostile
and ill-spirited. I doubt either one of us took it personally. This sort
of behavior was kind of the norm on intermud at the time. If you took it
personally, really, that's your problem, not his.

    And remember, we're talking about Descartes "in character". Whenever
I've communicated with George Reese out of his Descartes character, he's been
nothing but polite, courteous, and personable. Don't mistake the player
for the character.

"Descartes was an incompetent coder and/or docwriter."

    This one bugs me. The main reason is that I don't think the people
who say these things are in a position to judge. I think that something like
99% of his code is just dandy. It's useful and effective. And most of
it is quite efficient: remember that Dead Souls was developed on very
weak machines and was the basis for a very busy mud. It was vital that
things run efficiently and load economically. 

    That his code contains some weaknesses is beyond dispute. If I were
to criticize something about his code, though, it wouldn't be that it is
shoddy or ill-conceived. Where I run into something that makes me spit,
usually it's obvious that he meant to finish a thing, and just didn't
get to it. If you run into something that tempts you to say "bah,
more DescartesLogic", step back and take a deep breath. The chances are
that you're really not grasping that bigger picture of the code you're
examining.

    On the other hand, yes, some objects really seem to have been handled
carelessly. I believe I lost a few months off my life from the aggravation
of trying to fix various issues in armor. This does not mean Descartes
was an incompetent coder. It means that, like normal people who work on
a hobby that does not feed, clothe, or house them, Descartes on occasion
slapped something together to just get it working and do what he needed quickly.

    Is that something anyone is not guilty of?

    As to weak docs, remember that his Basic and Intermediate LPC texts
are of biblical significance in the history of Dead Souls. They are, though
imperfect, a bedrock of documentation that is massive in size and
greatly detailed. This is in addition to the material in /doc/build. If
those docs seem inadequate to you, then you simply cannot be pleased.

    In the end, keep this in mind. George Reese is a professional developer,
who runs a software business. He is also a professional docwriter, having
published technical books that people have paid real money to buy. Unless
you have comparable credentials, and/or have published a mudlib yourself
which thousands of people have used, then you might want to reconsider
complaining about Descartes and his competence in these areas.


The mud is locked whats the command to add someone to the allow list?

groupmod -a test playername

Note that this tags the player as a test char and
gives her access to normally restricted areas. For
details on what groups grant what access, see the
FAQ entry: http://dead-souls.net/ds-admin-faq.html#84
   

Shouldn't you change all the documentation to reflect the move to FluffOS?

No. See this faq entry: http://dead-souls.net/ds-faq.html#driver

Referring to the driver as MudOS is imprecise for the reader if
she is currently running FluffOS, but it is not altogether
incorrect and her potential confusion so minimal that I do not
see a need to rephrase each instance of "MudOS" into "the driver you are
using, which may be MudOS for older releases, and FluffOS for newer ones,
although FluffOS is a derivative of MudOS and functionally
indistiguishable at runtime except if you use its extended features,
in which case you should not be confused anyway".

Where appropriate and convenient, I do from time to time change the
docs to reflect the migration, but it's not going to be a to-do list item.


How do I change my timezone?

Use the command: admintool

Select option: c


So I herd u liek mudkip

You herd right.


Where is all the player information stored?

If you mean "where is each player's information stored?",
the answer is "in their playerfile." In my case, it's
/secure/save/creators/c/cratylus.o , for a non-creator,
it might be something like /secure/save/players/t/testguy.o .

Note that .o files should never be edited.

If you mean "where is the information for all players?",
then there isn't really any such thing. The best answer to that
is /secure/save/creators and /secure/save/players, because
that's where the save files live.


The addrace command complains that the race already exists.

A very common error is to copy an old race file to
a new name, and try to add it just like that. The
problem is that the new file contains inside it a
race name that is already known to the races daemon.

Edit the new file and change the race name in it to
reflect the name of the new race, and try again.



I am confused about the player/creator distinction.

The way it was explained to me is that "imms" on
Diku-derivative muds are basically "superplayers"...
that is, powerful and high-level, but not set apart
from players as fundamentally as is the case on DS.

For example, someone once was shocked to discover
that I'd never bothered to test lead/follow code
on creators. My response was something along the lines
of "I guess I just never figured they'd have much
use for it," which was even more horrifying.

The thing to realize is that creators are not players
at all. They cannot be, because their powers are
so vast as to subvert any concept of fair play.
A creator can kill any monster instantly with the
zap command. She can read the code for a quest and
complete it with no effort by just cloning the
desired object, or even just evaluating the proper
function call to achieve the desired effect. She
doesn't have to "follow" anyone, she can just instantly
teleport herself to the intended location.

In fact, on the original Dead Souls 1.1 codebase,
creators technically didn't even have bodies. They
were just kind of amorphous entities floating around
the game...but boy, people hated that. They wanted
to wield and wear things, and do other stuff that
players can do. And so today you can see creators
strolling about as if they share the same mortal
limitations players do, but do not be fooled.

Creators are not players. They are godlike beings
walking among players, able to manipulate the essence
of their world. Therefore, please expect that lots of
things simply don't apply to them.


How do I prevent people from using channels?

By default, only creators have intermud channel access.
New players can't use intermud, unless a creator adds
an intermud channel to them (for example, call joe->AddChannel("dchat") ).

If you want to have more strict control on who can use
intermud channels, use the mudconfig command to
restrict intermud:

mudconfig intermud restrict

Once you do that, only people in the INTERMUD group in
/secure/cfg/groups.cfg can use intermud channels,
regardless of what channel has been added to them.
To add someone to the INTERMUD group:

groupmod -a intermud joe

to remove them:

groupmod -r intermud joe

Warning: use great care with the groupmod command.


How do i disable the rss bot, or other channels?

By default, creators have some standard channels
added to them upon their promotion to creator status.
You can see which channels they are by reading
/secure/cmds/admins/encre.c and looking for a line similar to this:

cre_ob->AddChannel(({"cre", "newbie", "gossip", "ds", "ds_test", "lpuni", "death", "connections","intercre","dchat","inews" }));

Modify that line to remove channels that you
feel new creators do not need, then type:

update
/secure/cmds/admins/encre.c

And people you promote to creator after that won't have
the channels you removed from that line.

To simply turn off a channel you dislike yourself,
just type the channel name alone at the command prompt, like:

inews


I made a verb but it doesn't work

Please refer to the verb tutorial, and
really read the whole thing through. Note that
the most common error is failing to add the
appropriate direct_/indirect_ applies to the
target object.


Does Dead Souls support databases like MYSQL?

Short answer: Not really.

More correct answer: Sort of. FluffOS/MudOS, the driver
that DS uses as its "engine", has some support for
databases built in. However, enabling it requires
recompiling the driver with the proper config options,
and if you manage to do this correctly by some
great feat of luck, you'll have a driver that supports
MYSQL features from back in 2000 or before.

That is to say, relying on the driver's support for
DB is chancy, and success doesn't mean you actually
succeed in doing anything useful.

These days, when people want to use a FluffOS/MudOS
lib like Dead Souls in conjunction with a database,
the most common and successful approach is to use
an intermediary script, like perl or python. You
code a lib object that uses MudOS sockets or
external_start() to talk to your script/program, and the
script/program then does the heavy lifting of correctly
communicating with the database.

There's no DS lib object currently in the release
that handles this sort of stuff. If you want DB support,
you'll pretty much have to DIY. The good news is that
it's certainly doable...folks have done it in the past.
The bad news is you'll really have to know what you're
doing for it to work.


How do I make my new currency work?

Presumably you've already used admintool options 2
and j to add a new currency and are now wondering
what to do to put it in the game.

Currency isn't like a normal "object". When you
pick up a pile of coins, for example, that pile
was only a kind of placeholder object. Once you get
it, it vanishes, and the weight and value it had
are added to you, without there being a specific
"money object" you're carrying. When you drop
money, a pile is created to hold that value, but
again, when someone picks it up, it goes away.

So, now that there are Quatloos in your game, how
do you get your hands on some?

As a creator, it couldn't be simpler. Just type:

call me->AddCurrency("quatloos",500)

But I'm guessing what you're really wanting is
to make Quatloos the standard legal tender for
your mud. In that case, you'll want your vendors,
bank tellers, and barkeeps to use that as their
default currency.

Tanke a look at how this is specified in the following
commercial NPC's, and modify your own accordingly:

/domains/town/npc/otik.c
/domains/town/npc/lars.c
/domains/town/npc/zoe.c


My friends can't connect to my mud, but I can!

The most common scenario here is that you are running
your mud at home, and you are able to telnet to it
with no problem because you are local to the mud.

However, these days there are usually a couple of
layers of security between your PC and the internet.
Chances are that your internet connection is through
a "router" or "firewall" device. Find the physical
device that your computer's network port is connected
to. Examine it to determine its manufacturer name and
the device's model number.

Now go on Google and do a search for it, for example:

+linksys +pos2000 +user +manual

Keep varying the search terms until you find the
documentation for your device. Then download it and
read it. It should describe how to log into the
device and configure its firewalling to allow incoming
connections to be forwarded to the computer that is
running the mud.

You'll probably need to know the IP address of the
mud computer. If it is running windows, open a command
window and type:

ipconfig /all

(protip: 127.0.0.1 is not the correct IP to forward to)

If you're running UNIX/Linux, try: ifconfig -a

Using the documentation for your device, and the networking
information from the computer, configure your device to
forward incoming connections to whatever port your
mud is running (typically port 6666).

If that *still* doesn't work, you may be running a
software firewall on the mud computer that rejects incoming
connections. Temprarily disable the computer's firewall and
see if your friends are then able to connect. If so,
then you know you need to figure out how to configure your
software firewall to allow connections on the mud port.

If you can't figure it out, use Google to download
documentation on your firewall software.


My efun override is not working

Put it in /secure/sefun/sefun.c


- Cratylus

Dead Souls Homepage