diff -c -r --new-file ds2.0r21/lib/cmds/admins/gate.c ds2.0r28/lib/cmds/admins/gate.c *** ds2.0r21/lib/cmds/admins/gate.c Thu Apr 13 21:14:09 2006 --- ds2.0r28/lib/cmds/admins/gate.c Wed Dec 31 19:00:00 1969 *************** *** 1,52 **** - /** - * modification of code contributed by daelas - * started 2006-04-04 - */ - #include - #include - #include - - // inherit LIB_DAEMON; - inherit LIB_STARGATE; - - mixed cmd(string str) - { - mapping network; - - if (!archp(previous_object())) return 0; - - network = STARGATE_D->getStargates(); - if (str) - { - if (network[lower_case(str)]) - { - write(str+" is part of the Stargate Network.\n"); - } - else - { - write(str+" is not currently part of the Stargate Network.\n"); - } - - } - else - { - write("These are the current Stargate locations in the Network:\n"); - if (!sizeof(network)) - { - message("info", "No locations found.", this_player()); - } - else - { - string buf = ""; - string name; - class stargate info; - - foreach (name, info in network) - { - buf += sprintf("%:-15s %:-10s %s\n", name, info->status, info->destination); - } - write(buf); - } - } - return 1; - } --- 0 ---- diff -c -r --new-file ds2.0r21/lib/cmds/common/help.c ds2.0r28/lib/cmds/common/help.c *** ds2.0r21/lib/cmds/common/help.c Sat Mar 11 11:13:28 2006 --- ds2.0r28/lib/cmds/common/help.c Wed Jul 5 00:01:03 2006 *************** *** 16,28 **** mixed cmd(string arg) { object who = previous_object(); int array screen = (who->GetScreen() || ({ 80, 24 })); ! string help; ! if( !arg || arg == "" || arg == "help") { help = HELP_D->GetHelp("help"); write(help); return 1; } if( arg == "index" || HELP_D->GetTopics(arg) ) { if( arg == "index" ) { HelpMenu(); --- 16,35 ---- mixed cmd(string arg) { object who = previous_object(); int array screen = (who->GetScreen() || ({ 80, 24 })); ! string help = ""; ! if( arg == "help") { help = HELP_D->GetHelp("help"); write(help); return 1; } + if( !arg || arg == "") { + if(creatorp(this_player())) help = read_file("/doc/help/creators/creator_general"); + else help = read_file("/doc/help/players/player_general"); + if(!sizeof(help)) help = HELP_D->GetHelp("help"); + write(help); + return 1; + } if( arg == "index" || HELP_D->GetTopics(arg) ) { if( arg == "index" ) { HelpMenu(); diff -c -r --new-file ds2.0r21/lib/cmds/creators/i3who.c ds2.0r28/lib/cmds/creators/i3who.c *** ds2.0r21/lib/cmds/creators/i3who.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/i3who.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string str) { + foreach(string mud in INTERMUD_D->GetMuds()){ + SERVICES_D->eventSendWhoRequest(mud); + } + return 1; + } + + + void help() { + message("help", "Syntax: i3who\n\n" + "Queries each active mud for rwho information.\n\n", + this_player()); + } diff -c -r --new-file ds2.0r21/lib/cmds/creators/margins.c ds2.0r28/lib/cmds/creators/margins.c *** ds2.0r21/lib/cmds/creators/margins.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/margins.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,19 ---- + #include + + inherit LIB_DAEMON; + + mixed cmd(string str) { + return @ENDTEXT + |---------------------------------------------------------------|-------------| + ENDTEXT; + } + + void help() { + write("Syntax: margins\n"); + write(@EndText + This simple command prints a line to help creators when writing + descriptions. It gives a visual indicator of when to stop on + one line and continue on the next. + EndText + ); + } diff -c -r --new-file ds2.0r21/lib/cmds/creators/move.c ds2.0r28/lib/cmds/creators/move.c *** ds2.0r21/lib/cmds/creators/move.c Wed Apr 5 19:33:16 2006 --- ds2.0r28/lib/cmds/creators/move.c Wed Dec 31 19:00:00 1969 *************** *** 1,55 **** - /* /cmds/creators/move.c - * From the Dead Souls V Object Library - * Moves object from one place to another - * created by Descartes of Borg 961008 - * Version: @(#) move.c 1.2@(#) - * Last modified: 96/10/08 - */ - - #include - #include - - inherit LIB_DAEMON; - - mixed cmd(string args) { - object what, destination; - string a, b; - mixed res; - - if( sscanf(args, "%s into %s", a, b) != 2 && - sscanf(args, "%s to %s", a, b) != 2 ) { - return "Syntax: \n\n"; - } - what = to_object(a); - destination = to_object(b); - if( !what ) { - return "Unable to find " + a + "."; - } - if( !destination ) { - return "Unable to find " + b + "."; - } - if( living(what) && living(destination) ) { - return "None of that nonsense."; - } - res = what->eventMove(destination); - if( !res ) { - return "Failed to move " + identify(what) + " into " + - identify(destination) + "."; - } - else if( res != 1 ) { - return res; - } - previous_object()->eventPrint("Moved " + identify(what) + " into " + - identify(destination) + ".", MSG_SYSTEM); - if( living(what) ) { - what->eventDescribeEnvironment(); - } - return 1; - } - - string GetHelp() { - return ("Syntax: \n\n" - "Allows you to move the object you name into the container " - "you name.\n\n" - "See also: trans, expel, goto, return"); - } --- 0 ---- diff -c -r --new-file ds2.0r21/lib/cmds/creators/polyglottize.c ds2.0r28/lib/cmds/creators/polyglottize.c *** ds2.0r21/lib/cmds/creators/polyglottize.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/polyglottize.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,41 ---- + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string str) { + object target; + + if(!str || str == "") str = "me"; + + if(str == "me") str = this_player()->GetKeyName(); + if(!target = present(str, environment(this_player()))){ + write("They're not here."); + return 1; + } + if(!living(target)) { + write("That's not a living thing."); + return 1; + } + if(creatorp(target) && !archp(this_player()) && + target != this_player()){ + write("That's impolite."); + tell_player(target,capitalize(this_player()->GetKeyName())+ + " just tried to polyglottize you."); + return 1; + } + + target->SetPolyglot(1); + if(target == this_player()) str = "yourself"; + else str = capitalize(str); + write("You polyglottize "+str+"."); + if(target != this_player()) + tell_object(target, capitalize(this_player()->GetKeyName())+" polyglottizes you."); + return 1; + } + + void help() { + message("help", "Syntax: polyglottize \n\n" + "Make the target able to understand all languages.\n\n", + this_player()); + } diff -c -r --new-file ds2.0r21/lib/cmds/creators/stargate.c ds2.0r28/lib/cmds/creators/stargate.c *** ds2.0r21/lib/cmds/creators/stargate.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/stargate.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,46 ---- + /** + * modification of code contributed by daelas + * started 2006-04-04 + */ + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string str){ + mapping network; + + network = STARGATE_D->GetStargates(); + if (str){ + if (network[lower_case(str)]){ + write(str+" is part of the Stargate Network.\n"); + write(str+" data: "+identify(network[lower_case(str)])); + } + else { + write(str+" is not currently part of the Stargate Network.\n"); + } + return 1; + } + else { + write("These are the current Stargate locations in the Network:\n"); + if (!sizeof(network)){ + write("No locations found."); + return 1; + } + else { + string buf = ""; + string name; + write(implode(keys(network), ", ")); + } + } + return 1; + } + + void help() { + message("help", "Syntax: stargate \n\n" + "With an argument, this command will determine whether the argument " + "supplied is a valid stargate. If so, stargate data on that gate " + "is displayed. Without an argument, this command lists known valid " + "stargates.", + this_player()); + } diff -c -r --new-file ds2.0r21/lib/cmds/creators/transfer.c ds2.0r28/lib/cmds/creators/transfer.c *** ds2.0r21/lib/cmds/creators/transfer.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/transfer.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,59 ---- + /* /cmds/creators/transfer.c + * From the Dead Souls V Object Library + * Moves object from one place to another + * created by Descartes of Borg 961008 + * Version: @(#) transfer.c 1.2@(#) + * Last modified: 96/10/08 + */ + + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string args) { + object what, destination; + string a, b; + mixed res; + + if(!args || args == ""){ + return "Syntax: \n\n"; + } + + if( sscanf(args, "%s into %s", a, b) != 2 && + sscanf(args, "%s to %s", a, b) != 2 ) { + return "Syntax: \n\n"; + } + what = to_object(a); + destination = to_object(b); + if( !what ) { + return "Unable to find " + a + "."; + } + if( !destination ) { + return "Unable to find " + b + "."; + } + if( living(what) && living(destination) ) { + return "None of that nonsense."; + } + res = what->eventMove(destination); + if( !res ) { + return "Failed to transfer " + identify(what) + " into " + + identify(destination) + "."; + } + else if( res != 1 ) { + return res; + } + previous_object()->eventPrint("Transferred " + identify(what) + " into " + + identify(destination) + ".", MSG_SYSTEM); + if( living(what) ) { + what->eventDescribeEnvironment(); + } + return 1; + } + + string GetHelp() { + return ("Syntax: \n\n" + "Allows you to transfer the object you name into the container " + "you name.\n\n" + "See also: trans, expel, goto, return"); + } diff -c -r --new-file ds2.0r21/lib/cmds/players/biography.c ds2.0r28/lib/cmds/players/biography.c *** ds2.0r21/lib/cmds/players/biography.c Mon Nov 7 13:28:39 2005 --- ds2.0r28/lib/cmds/players/biography.c Wed Jul 5 19:58:18 2006 *************** *** 93,99 **** d2 = ({}); } else { ! x = x/2; d1 = deaths[0..(x-1)]; d2 = deaths[x..]; } --- 93,99 ---- d2 = ({}); } else { ! //x = x/2; d1 = deaths[0..(x-1)]; d2 = deaths[x..]; } *************** *** 123,129 **** col3 = npcs[(2*x)..]; } for(i=0; i= sizeof(col1)) ? "" : col1[i] + " (" + kills[col1[i]] + ")", (i >= sizeof(col2)) ? "" : --- 123,129 ---- col3 = npcs[(2*x)..]; } for(i=0; i= sizeof(col1)) ? "" : col1[i] + " (" + kills[col1[i]] + ")", (i >= sizeof(col2)) ? "" : diff -c -r --new-file ds2.0r21/lib/cmds/players/earmuff.c ds2.0r28/lib/cmds/players/earmuff.c *** ds2.0r21/lib/cmds/players/earmuff.c Thu Feb 23 15:40:40 2006 --- ds2.0r28/lib/cmds/players/earmuff.c Wed Jul 5 00:01:03 2006 *************** *** 19,26 **** void help() { message("help", "Syntax: earmuff\n" ! " earmuff \n\n" "This command allows you to ignore channel messages from the name specified.\n" "See also: whomuffed, unmuff\n\n", this_player() ); } --- 19,29 ---- void help() { message("help", "Syntax: earmuff\n" ! " earmuff \n" ! " earmuff @\n\n" "This command allows you to ignore channel messages from the name specified.\n" + "You can also earmuff all channel messages coming from a " + "specific mud, for example: earmuff @Spammy Mud II\n" "See also: whomuffed, unmuff\n\n", this_player() ); } diff -c -r --new-file ds2.0r21/lib/cmds/players/env.c ds2.0r28/lib/cmds/players/env.c *** ds2.0r21/lib/cmds/players/env.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/players/env.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,19 ---- + #include + + inherit LIB_DAEMON; + + mixed cmd(string args) { + write("Screen: \t\t"+identify(this_player()->GetScreen())); + write("Terminal: \t\t"+this_player()->GetTerminal()); + write("Brief mode: \t\t"+ ( (this_player()->GetBriefMode()) ? "on" : "off" )); + //write("PlayerKill mode: \t"+ ( (this_player()->GetPK()) ? "on" : "off" )); + if(creatorp(this_player())) + write("Debug mode: \t\t"+ ( (this_player()->GetProperty("debug")) ? "on" : "off" )); + return 1; + } + + void help() { + message("help", "Syntax: \n\n" + "Displays your basic interface and play settings. " + + "See also: brief, terminal, screen", this_player()); + } diff -c -r --new-file ds2.0r21/lib/cmds/players/language.c ds2.0r28/lib/cmds/players/language.c *** ds2.0r21/lib/cmds/players/language.c Wed Apr 5 19:33:16 2006 --- ds2.0r28/lib/cmds/players/language.c Wed Jul 5 00:01:03 2006 *************** *** 11,18 **** } write("You speak:"); ! foreach(string key, int val in FluencyMap){ ! write(capitalize(key)+" with "+val+"% proficiency."); } return 1; --- 11,25 ---- } write("You speak:"); ! ! if(this_player()->GetPolyglot()){ ! write("All languages with 100% proficiency."); ! } ! ! else { ! foreach(string key, int val in FluencyMap){ ! write(capitalize(key)+" with "+val+"% proficiency."); ! } } return 1; diff -c -r --new-file ds2.0r21/lib/cmds/players/mudlist.c ds2.0r28/lib/cmds/players/mudlist.c *** ds2.0r21/lib/cmds/players/mudlist.c Tue Mar 28 23:23:40 2006 --- ds2.0r28/lib/cmds/players/mudlist.c Wed Jul 5 19:58:18 2006 *************** *** 100,108 **** list = ({}); foreach(mud, info in borg) list += ({ sprintf("%:-15s %:-6s %:-15s %:-18s %s %d", ! mud, info[8], info[7], info[5], info[1], info[2]) }); list = sort_array(list, 1); ! list = ({ mud_name() + " recognizes " + consolidate(sizeof(borg), "a mud")+ " matching your query: ", "" }) + list; this_player()->eventPage(list); return 1; --- 100,108 ---- list = ({}); foreach(mud, info in borg) list += ({ sprintf("%:-15s %:-6s %:-15s %:-18s %s %d", ! replace_string(mud,"%^","%%^^"), info[8], info[7], info[5], info[1], info[2]) }); list = sort_array(list, 1); ! list = ({ replace_string(mud_name(),"%^","%%^^") + " recognizes " + consolidate(sizeof(borg), "a mud")+ " matching your query: ", "" }) + list; this_player()->eventPage(list); return 1; diff -c -r --new-file ds2.0r21/lib/cmds/players/screen.c ds2.0r28/lib/cmds/players/screen.c *** ds2.0r21/lib/cmds/players/screen.c Mon Nov 7 13:28:39 2005 --- ds2.0r28/lib/cmds/players/screen.c Wed Jul 5 00:01:03 2006 *************** *** 11,21 **** mixed cmd(string args) { int *screen; int h, w; if( args == "" || !args ) ! return "You need to specify both width and height."; if( sscanf(args, "%d %d", w, h) != 2 ) ! return "You need to specify both width and height."; this_player()->SetScreen(w, h); message("system", "Screen set to " + w + " by " + h + ".", this_player()); return 1; --- 11,24 ---- mixed cmd(string args) { int *screen; int h, w; + string chide = "You need to specify both width and height.\n"; + string ret = "Your current settings are: "+ this_player()->GetScreen()[0]; + ret += " "+ this_player()->GetScreen()[1]; if( args == "" || !args ) ! return chide + ret; if( sscanf(args, "%d %d", w, h) != 2 ) ! return chide + ret; this_player()->SetScreen(w, h); message("system", "Screen set to " + w + " by " + h + ".", this_player()); return 1; diff -c -r --new-file ds2.0r21/lib/cmds/players/stat.c ds2.0r28/lib/cmds/players/stat.c *** ds2.0r21/lib/cmds/players/stat.c Tue Mar 28 23:23:40 2006 --- ds2.0r28/lib/cmds/players/stat.c Wed Jul 5 00:01:03 2006 *************** *** 24,29 **** --- 24,30 ---- if( !(ob = find_player(convert_name(args))) && !(ob = find_living(lower_case(args))) ) return capitalize(args) + " is nowhere to be found."; + if(!living(ob)) return capitalize(args) + " is not alive."; cols = ((int *)this_player()->GetScreen())[0]; tmp1 = (string)ob->GetCapName() + " aka " + (string)ob->GetShort() + ", level " + (int)ob->GetLevel() + " " + (string)ob->GetGender(); *************** *** 63,69 **** }); lines += ({ "", "Limbs:" }); limbs = (string *)ob->GetWieldingLimbs(); ! if(!ob->GetGhost()) arr = map((string *)ob->GetLimbs(), (: sprintf("%:-14s%s (%d) %d/%d", $1, ((member_array($1, $(limbs)) == -1) ? " " : "*"), (int)($(ob))->GetLimbClass($1), --- 64,70 ---- }); lines += ({ "", "Limbs:" }); limbs = (string *)ob->GetWieldingLimbs(); ! if(ob && !ob->GetGhost()) arr = map((string *)ob->GetLimbs(), (: sprintf("%:-14s%s (%d) %d/%d", $1, ((member_array($1, $(limbs)) == -1) ? " " : "*"), (int)($(ob))->GetLimbClass($1), diff -c -r --new-file ds2.0r21/lib/cmds/players/unmuff.c ds2.0r28/lib/cmds/players/unmuff.c *** ds2.0r21/lib/cmds/players/unmuff.c Thu Feb 23 15:40:40 2006 --- ds2.0r28/lib/cmds/players/unmuff.c Wed Jul 5 00:01:03 2006 *************** *** 7,13 **** else if(!str || str == "") return "Please be more specific."; else { string *iglist = this_player()->GetMuffed(); ! if(member_array(lower_case(str),iglist) == -1) return "You aren't ignoring that person."; iglist -= ({ lower_case(str) }); this_player()->SetMuffed(iglist); write("You remove "+capitalize(str)+" from your earmuffed list."); --- 7,13 ---- else if(!str || str == "") return "Please be more specific."; else { string *iglist = this_player()->GetMuffed(); ! if(member_array(lower_case(str),iglist) == -1) return "You aren't ignoring them."; iglist -= ({ lower_case(str) }); this_player()->SetMuffed(iglist); write("You remove "+capitalize(str)+" from your earmuffed list."); diff -c -r --new-file ds2.0r21/lib/cmds/players/who.c ds2.0r28/lib/cmds/players/who.c *** ds2.0r21/lib/cmds/players/who.c Wed Feb 22 15:29:49 2006 --- ds2.0r28/lib/cmds/players/who.c Wed Jul 5 00:01:03 2006 *************** *** 6,12 **** #include inherit LIB_DAEMON; - int elderp(object foo); #define SEP repeat_string("*=",39)+"*\n"; --- 6,11 ---- *************** *** 23,30 **** if(!obs[i]->GetInvis()) { if(archp(obs[i])) tmp+="[%^BLUE%^ARCH%^RESET%^]"; else if(creatorp(obs[i]) ) tmp+="[%^CYAN%^WIZ%^RESET%^]"; else tmp+=sprintf("[%d]", obs[i]->GetLevel() ); ! if(elderp(obs[i])) tmp+=" [%^GREEN%^ELDER%^RESET%^]"; if(sizeof(obs[i]->GetShort()) < 50) { tmp+=sprintf(" %s", obs[i]->GetShort()); } --- 22,32 ---- if(!obs[i]->GetInvis()) { if(archp(obs[i])) tmp+="[%^BLUE%^ARCH%^RESET%^]"; else if(creatorp(obs[i]) ) tmp+="[%^CYAN%^WIZ%^RESET%^]"; + else if(avatarp(obs[i]) ) tmp+="[%^GREEN%^AVATAR%^RESET%^]"; + else if(high_mortalp(obs[i]) ) tmp+="[%^GREEN%^HIGH MORTAL%^RESET%^]"; else tmp+=sprintf("[%d]", obs[i]->GetLevel() ); ! if(elderp(obs[i])) tmp+=" [%^YELLOW%^ELDER%^RESET%^]"; ! if(ambassadorp(obs[i])) tmp+=" [%^YELLOW%^AMBASSADOR%^RESET%^]"; if(sizeof(obs[i]->GetShort()) < 50) { tmp+=sprintf(" %s", obs[i]->GetShort()); } *************** *** 54,61 **** return 1; } - int elderp(object ob){ - string str; - str=ob->GetKeyName(); - return member_group(str, PRIV_ELDER); - } --- 56,58 ---- diff -c -r --new-file ds2.0r21/lib/daemon/banish.c ds2.0r28/lib/daemon/banish.c *** ds2.0r21/lib/daemon/banish.c Wed Apr 12 23:47:49 2006 --- ds2.0r28/lib/daemon/banish.c Wed Jul 5 00:00:58 2006 *************** *** 156,161 **** --- 156,162 ---- } void banish_name(string str) { + if(!valid_access(previous_object())) return; unguarded( (: log_file, "banish", (string)this_player()->GetName() + " banished " + str + "." :) ); __Names = distinct_array(__Names + ({ lower_case(str) })); diff -c -r --new-file ds2.0r21/lib/daemon/help.c ds2.0r28/lib/daemon/help.c *** ds2.0r21/lib/daemon/help.c Mon Jan 23 09:03:35 2006 --- ds2.0r28/lib/daemon/help.c Wed Jul 5 00:00:58 2006 *************** *** 438,445 **** help = "Index: %^GREEN%^" + index + "%^RESET%^\n" + "Topic: %^GREEN%^" + topic + "%^RESET%^\n\n" + help; if( file_exists(DIR_RACE_HELP + "/" + topic) ) ! help += read_file(DIR_RACE_HELP + "/" + topic); ! return help; } Error = "No such race exists."; return 0; --- 438,445 ---- help = "Index: %^GREEN%^" + index + "%^RESET%^\n" + "Topic: %^GREEN%^" + topic + "%^RESET%^\n\n" + help; if( file_exists(DIR_RACE_HELP + "/" + topic) ) ! //help += read_file(DIR_RACE_HELP + "/" + topic); ! return help; } Error = "No such race exists."; return 0; diff -c -r --new-file ds2.0r21/lib/daemon/include/stargate.h ds2.0r28/lib/daemon/include/stargate.h *** ds2.0r21/lib/daemon/include/stargate.h Thu Apr 13 21:14:09 2006 --- ds2.0r28/lib/daemon/include/stargate.h Wed Jul 5 00:01:03 2006 *************** *** 3,19 **** #ifndef daemon_stargate_h #define daemon_stargate_h ! void load(); ! void save(); ! int setStargate(string address, string destination); ! class stargate getStargate(string address); ! int delStargate(string address); ! mapping getStargates(); ! int setStatus(string address, string status); ! string getStatus(string address); ! string getDestination(string address); ! string getEndpoint(string address); ! int connect(string from, string to); ! int disconnect(string from); #endif --- 3,18 ---- #ifndef daemon_stargate_h #define daemon_stargate_h ! void eventLoad(); ! void eventSave(); ! int SetStargate(string address, string destination); ! int RemoveStargate(string address); ! mapping GetStargates(); ! int SetStatus(string address, string status); ! string GetStatus(string address); ! string GetDestination(string address); ! string GetEndpoint(string address); ! int eventConnect(string from, string to); ! int eventDisconnect(string from); #endif diff -c -r --new-file ds2.0r21/lib/daemon/intermud.c ds2.0r28/lib/daemon/intermud.c *** ds2.0r21/lib/daemon/intermud.c Wed Apr 12 23:47:49 2006 --- ds2.0r28/lib/daemon/intermud.c Wed Jul 5 00:00:58 2006 *************** *** 11,16 **** --- 11,17 ---- #else #include + #include #include #include #include *************** *** 31,37 **** Password = 0; Tries = 0; Banned = ([]); - Nameservers = ({ ({ "*yatmim", "149.152.218.102 23" }) }); MudList = new(class list); ChannelList = new(class list); MudList->ID = -1; --- 32,37 ---- *************** *** 40,45 **** --- 40,46 ---- ChannelList->List = ([]); if( file_size( SAVE_INTERMUD __SAVE_EXTENSION__ ) > 0 ) unguarded( (: restore_object, SAVE_INTERMUD, 1 :) ); + Nameservers = ({ ({ "*yatmim", "149.152.218.102 23" }) }); SetNoClean(1); tn("INTERMUD_D reloaded."); SetDestructOnClose(1); *************** *** 73,78 **** --- 74,93 ---- (mapping)SERVICES_D->GetServices(), ([]) }) ), "red");; } + void eventClearVars(){ + if( !((int)master()->valid_apply(({ PRIV_ASSIST, INTERMUD_D }))) ) + error("Illegal attempt to reset intermud: "+get_stack()+" "+identify(previous_object(-1))); + Connected = 0; + Tries = 0; + MudList = new(class list); + ChannelList = new(class list); + MudList->ID = -1; + MudList->List = ([]); + ChannelList->ID = -1; + ChannelList->List = ([]); + save_object(SAVE_INTERMUD); + } + static void eventRead(mixed *packet) { mixed val; string cle; *************** *** 164,169 **** --- 179,185 ---- break; case "chanlist-reply": // if( packet[6] == ChannelList->ID ) return; + tn("chanlist reply: "+identify(packet), "blue"); if( packet[2] != Nameservers[0][0] ) return; ChannelList->ID = packet[6]; foreach(cle, val in packet[7]) { diff -c -r --new-file ds2.0r21/lib/daemon/races.c ds2.0r28/lib/daemon/races.c *** ds2.0r21/lib/daemon/races.c Sun Apr 9 23:49:20 2006 --- ds2.0r28/lib/daemon/races.c Wed Jul 5 00:00:58 2006 *************** *** 220,226 **** case "RACE": race = replace_string(line, "RACE ", ""); ! if( Races[race] ) error("Race already exists"); break; case "SENSITIVITY": --- 220,226 ---- case "RACE": race = replace_string(line, "RACE ", ""); ! if( Races[race] ) error(race+": Race already exists"); break; case "SENSITIVITY": *************** *** 459,464 **** --- 459,465 ---- h_file = "/doc/help/races/"+lower_case(race); if(file_exists(h_file)) return read_file(h_file); limbs = map(res->Limbs, (: $1[0] :)); + limbs = singular_array(limbs); help += "Limbs:\n"; help += capitalize(item_list(map(limbs, (: add_article :)))) + ".\n"; help += "\nFingered limbs:\n"; diff -c -r --new-file ds2.0r21/lib/daemon/services/auth.c ds2.0r28/lib/daemon/services/auth.c *** ds2.0r21/lib/daemon/services/auth.c Wed Apr 12 23:47:49 2006 --- ds2.0r28/lib/daemon/services/auth.c Wed Jul 5 00:01:03 2006 *************** *** 14,19 **** --- 14,20 ---- } } tn("Auth reply received from "+packet[2]+".","white"); + tn("Ping packet: "+identify(packet),"white"); if(sizeof(pingers)){ foreach(object dude in pingers){ tell_player(dude, packet[2]+" has just replied to a ping request from "+ *************** *** 34,40 **** if(!grepp(mudlist,packet[2]) || packet[2] == "DeadSoulsNew" || packet[2] == "DeadSoulsWin"){ write_file("/tmp/muds.txt",packet[2]+"\n"); ! //tc("We have a new mud! "+packet[2]+" has joined intermud.","red"); tn("We have a new mud! "+packet[2]+" has joined intermud.","red"); } --- 35,41 ---- if(!grepp(mudlist,packet[2]) || packet[2] == "DeadSoulsNew" || packet[2] == "DeadSoulsWin"){ write_file("/tmp/muds.txt",packet[2]+"\n"); ! tc("We have a new mud! "+packet[2]+" has joined intermud.","red"); tn("We have a new mud! "+packet[2]+" has joined intermud.","red"); } diff -c -r --new-file ds2.0r21/lib/daemon/services/channel.c ds2.0r28/lib/daemon/services/channel.c *** ds2.0r21/lib/daemon/services/channel.c Sun Apr 9 23:49:20 2006 --- ds2.0r28/lib/daemon/services/channel.c Wed Jul 5 00:01:03 2006 *************** *** 12,17 **** --- 12,21 ---- #include #include + static private string *local_chans = ({"newbie","cre","gossip","admin","error", + "priest", "mage", "explorer", "thief", "fighter", "death" }); + + void eventReceiveChannelWhoReply(mixed array packet) { object ob; tn("eventReceiveChannelWhoReply: "+identify(packet),"green"); *************** *** 136,143 **** } else packet = ({ "channel-m", 5, mud_name(), convert_name(who), 0, 0, ch, who, msg }); ! INTERMUD_D->eventWrite(packet); ! tn("eventSendChannel processed: "+identify(packet),"green"); } void eventSendChannelWhoRequest(string channel, string mud) { --- 140,149 ---- } else packet = ({ "channel-m", 5, mud_name(), convert_name(who), 0, 0, ch, who, msg }); ! if(member_array(ch, local_chans) == -1){ ! INTERMUD_D->eventWrite(packet); ! tn("eventSendChannel processed: "+identify(packet),"green"); ! } } void eventSendChannelWhoRequest(string channel, string mud) { diff -c -r --new-file ds2.0r21/lib/daemon/services/who.c ds2.0r28/lib/daemon/services/who.c *** ds2.0r21/lib/daemon/services/who.c Sun Apr 9 23:49:20 2006 --- ds2.0r28/lib/daemon/services/who.c Wed Jul 5 00:01:03 2006 *************** *** 10,24 **** #include void eventReceiveWhoReply(mixed *packet) { ! string *list, *who; object ob; if( file_name(previous_object()) != INTERMUD_D ) return; if( !packet[5] || !(ob = find_player(convert_name(packet[5]))) ) return; ! list = ({ "Remote who information from " + packet[2] + ":" }); foreach(who in packet[6]) ! list += ({ who[0] + " (" + who[1] + " idle): " + who[2] }); ! ob->eventPage(list); tn("eventReceiveWhoReply: "+identify(packet),"blue"); } --- 10,27 ---- #include void eventReceiveWhoReply(mixed *packet) { ! string list, *who; object ob; + //tc("who packet: "+identify(packet)); if( file_name(previous_object()) != INTERMUD_D ) return; if( !packet[5] || !(ob = find_player(convert_name(packet[5]))) ) return; ! list = "%^MAGENTA%^Remote who information from " + packet[2] + ":%^RESET%^\n"; foreach(who in packet[6]) ! list += who[0] + " (" + who[1] + " idle): " + who[2] +"\n"; ! //tc("list: "+list,"blue"); ! //ob->eventPage(({list})); ! ob->eventPrint(list); tn("eventReceiveWhoReply: "+identify(packet),"blue"); } *************** *** 42,48 **** void eventSendWhoRequest(string mud) { string who; ! who = (string)this_player(1)->GetName(); INTERMUD_D->eventWrite(({ "who-req", 5, mud_name(), who, mud, 0 })); tn("eventSendWhoRequest: "+identify( ({ "who-req", 5, mud_name(), who, mud, 0 })), "blue"); } --- 45,51 ---- void eventSendWhoRequest(string mud) { string who; ! who = (string)this_player(1)->GetKeyName(); INTERMUD_D->eventWrite(({ "who-req", 5, mud_name(), who, mud, 0 })); tn("eventSendWhoRequest: "+identify( ({ "who-req", 5, mud_name(), who, mud, 0 })), "blue"); } diff -c -r --new-file ds2.0r21/lib/daemon/stargate.c ds2.0r28/lib/daemon/stargate.c *** ds2.0r21/lib/daemon/stargate.c Thu Apr 13 21:14:09 2006 --- ds2.0r28/lib/daemon/stargate.c Wed Jul 5 00:00:58 2006 *************** *** 16,185 **** inherit LIB_DAEMON; ! private mapping stargates = ([]); ! static void create() ! { daemon::create(); SetNoClean(1); ! load(); ! if (!stargates) stargates = ([]); } ! void save() ! { unguarded( (: save_object, SAVE_STARGATE, 1 :) ); ! tell_player("jonez", "stargate daemon saved itself"); return; } ! void load() ! { ! if (file_size(SAVE_STARGATE __SAVE_EXTENSION__) > 0) ! { ! tc("stargate save file exists"); unguarded( (: restore_object, SAVE_STARGATE :) ); } ! tell_player("jonez", "stargate daemon loaded itself"); return; } ! int setStargate(string address, string destination) ! { ! class stargate s = new(class stargate); ! if (address == "" || destination == "") return 1; ! ! s->status = "idle"; ! s->destination = destination; ! s->endpoint = 0; ! stargates[address] = s; ! save(); return 0; } ! class stargate getStargate(string address) ! { ! class stargate s = stargates[address]; ! if (!s) return 0; ! ! tell_player("jonez", sprintf("get: address=%s, status=%s destination=%s endpoint=%s", address, s->status, s->destination, s->endpoint)); ! return (class stargate)stargates[address]; } ! int delStargate(string address) ! { ! map_delete(stargates, address); ! save(); return 0; } ! mapping getStargates() ! { ! /* ! string buf = ""; ! ! foreach(string n, class stargate g in stargates) ! { ! buf += sprintf("name=%s, status=%s, destination=%s, endpoint=%s; ", n, g->status, g->destination, g->endpoint); ! } ! return buf; ! */ ! return copy(stargates); ! } ! ! int setStatus(string address, string status) ! { ! class stargate s; ! s = stargates[address]; ! if (!s) return 1; ! s->status = status; ! save(); return 0; } ! string getStatus(string address) ! { ! class stargate s = stargates[address]; ! if (!s) return ""; ! ! return s->status; } ! string getDestination(string address) ! { ! class stargate s = stargates[address]; ! if (!s) return ""; ! return s->destination; } ! string getEndpoint(string address) ! { ! class stargate s = stargates[address]; ! if (!s) return ""; ! return s->endpoint; } ! // return 1 on success, 0 on error ! int connect(string from, string to) ! { ! class stargate t, f; ! ! tell_player("jonez", sprintf("stargate_d->connect(%s, %s)", from, to)); if (from == to) return 0; ! f = stargates[from]; ! if (!f) ! { ! tell_player("jonez", "failed to lookup status of outbound gate"); return 0; } ! t = stargates[to]; ! if (!t) ! { ! tell_player("jonez", "failed to lookup status of inbound gate"); return 0; } ! tell_player("jonez", sprintf("%s->status=%s, %s->status=%s", from, f->status, to, t->status)); ! if (f->status == "idle" && t->status == "idle") ! { ! f->endpoint = to; ! f->status = "outbound"; ! t->endpoint = from; ! t->status = "inbound"; ! ! save(); return 1; } return 0; } ! // return 1 on success, 0 on error ! int disconnect(string from) ! { ! class stargate f; string endpoint; ! tell_player("jonez", sprintf("stargate_d->disconnect(%s)", from)); ! ! f = stargates[from]; ! if (!f) return 0; ! endpoint = stargates[from]->endpoint; if (!endpoint) return 0; ! stargates[endpoint]->endpoint = ""; ! stargates[endpoint]->status = "idle"; ! stargates[from]->endpoint = ""; ! stargates[from]->status = "idle"; ! save(); return 1; } --- 16,153 ---- inherit LIB_DAEMON; ! private mapping Stargates = ([]); ! static void create(){ daemon::create(); SetNoClean(1); ! eventLoad(); ! if (!Stargates) Stargates = ([]); } ! void eventSave(){ unguarded( (: save_object, SAVE_STARGATE, 1 :) ); ! //tc("stargate daemon saved itself"); return; } ! void eventLoad(){ ! if (file_size(SAVE_STARGATE __SAVE_EXTENSION__) > 0){ ! //tc("stargate save file exists"); unguarded( (: restore_object, SAVE_STARGATE :) ); } ! //tc("stargate daemon loaded itself"); ! //tc("Stargates: "+identify(Stargates),"red"); return; } ! int SetStargate(string address, string destination){ ! mapping tmp = ([]); ! Stargates[address] = tmp; ! //tc("Stargates: "+identify(Stargates),"yellow"); if (address == "" || destination == "") return 1; ! if(sizeof(Stargates[address])) return 1; ! Stargates[address]["status"] = "idle"; ! Stargates[address]["destination"] = destination; ! Stargates[address]["endpoint"] = ""; ! eventSave(); return 0; } ! mapping GetStargate(string address){ ! //tc("Stargates: "+identify(Stargates),"blue"); ! return copy(Stargates[address]); } ! int RemoveStargate(string address){ ! //tc("Stargates: "+identify(Stargates),"red"); ! map_delete(Stargates, address); ! //tc("Stargates: "+identify(Stargates),"cyan"); ! eventSave(); return 0; } ! mapping GetStargates(){ ! //tc("Stargates: "+identify(Stargates),"blue"); ! return copy(Stargates); ! } ! int SetStatus(string address, string status){ ! //tc("Setting status of "+status+" on "+address+"."); ! Stargates[address]["status"] = status; ! eventSave(); return 0; } ! string GetStatus(string address){ ! //tc("Stargates: "+identify(Stargates),"red"); ! return Stargates[address]["status"]; } ! string GetDestination(string address){ ! string ret = Stargates[address]; ! //tc("Stargates: "+identify(Stargates),"white"); ! if(sizeof(Stargates[address]) && sizeof(Stargates[address]["destination"])) ! return Stargates[address]["destination"]; ! else return ""; } ! string GetEndpoint(string address){ ! //tc("Stargates: "+identify(Stargates),"blue"); ! return Stargates[address]["endpoint"]; } ! int eventConnect(string from, string to){ ! //tc("Stargates: "+identify(Stargates),"red"); ! //tc("STARGATE_D, from: "+from+", to: "+to,"green"); if (from == to) return 0; ! if (!Stargates[from] || !sizeof(Stargates[from])){ ! //tc("failed to lookup status of outbound gate"); return 0; } ! if (!Stargates[to] || !sizeof(Stargates[to])){ ! //tc("failed to lookup status of inbound gate"); return 0; } ! if (Stargates[from]["status"] == "idle" && Stargates[to]["status"] == "idle"){ ! //tc("situation normal"); ! Stargates[from]["endpoint"] = to; ! Stargates[from]["status"] = "outbound"; ! Stargates[to]["endpoint"] = from; ! Stargates[to]["status"] = "inbound"; ! //tc("Stargates: "+identify(Stargates)); ! eventSave(); return 1; } + //tc("exception"); return 0; } ! int eventDisconnect(string from){ string endpoint; + if(!from || from == "") return 0; + //tc("Stargates: "+identify(Stargates),"blue"); ! if (!Stargates[from] || !sizeof(Stargates[from])) return 0; ! endpoint = Stargates[from]["endpoint"]; if (!endpoint) return 0; ! if(sizeof(Stargates[endpoint])){ ! Stargates[endpoint]["endpoint"] = ""; ! Stargates[endpoint]["status"] = "idle"; ! } ! ! Stargates[from]["endpoint"] = ""; ! Stargates[from]["status"] = "idle"; ! eventSave(); return 1; } diff -c -r --new-file ds2.0r21/lib/doc/CREDITS ds2.0r28/lib/doc/CREDITS *** ds2.0r21/lib/doc/CREDITS Wed Apr 5 19:33:16 2006 --- ds2.0r28/lib/doc/CREDITS Wed Jul 5 00:00:58 2006 *************** *** 3,19 **** Sine qua non: Descartes, the legion of MudOS developers, and all those coders who toiled at Nightmare, and Lars Pensjö. Direct conributors: Haderach and his clever code and inspiration, Duuk and his willingness to let me poke through his lib and filch code. Great thanks to Marajin for his direct and substantial contribution to the Windows port. Thanks also to the following for code donation, support, and/or contribution: Tim@TimMUD, Manchi, ! Brodbane, Ashon, Shadyman, Jonez, Cecil. Appreciation of: Jayren, Kaylus, Arianrhod, Nosmo, Pyro, Abby, Balmung, ! Aten, Metiscus, Garfield, Javelin, and Alensin for their thoughtful comments and suggestions. Also: Xyzzy He Is Cool --- 3,23 ---- Sine qua non: Descartes, the legion of MudOS developers, and all those coders who toiled at Nightmare, and Lars Pensjö. + Marius for his kind permission to bundle MudOS. Direct conributors: Haderach and his clever code and inspiration, Duuk and his willingness to let me poke through his lib and filch code. Great thanks to Marajin for his direct and substantial contribution to the Windows port. + Much gratitude to Saquivor, for whom a town street is + now named, for getting the Windows socket code working. Thanks also to the following for code donation, support, and/or contribution: Tim@TimMUD, Manchi, ! Brodbane, Ashon, Shadyman, Jonez, Cecil, Daelas. Appreciation of: Jayren, Kaylus, Arianrhod, Nosmo, Pyro, Abby, Balmung, ! Aten, Metiscus, Garfield, Javelin, Alensin, Daelas, ! Zeus, Dastuun, Detah, and Nulvect for their thoughtful comments and suggestions. Also: Xyzzy He Is Cool *************** *** 21,25 **** Cratylus @ Dead Souls 04 Jan 2006 ! updated Mar 2006 --- 25,29 ---- Cratylus @ Dead Souls 04 Jan 2006 ! updated May 2006 diff -c -r --new-file ds2.0r21/lib/doc/README ds2.0r28/lib/doc/README *** ds2.0r21/lib/doc/README Mon Jan 23 09:17:12 2006 --- ds2.0r28/lib/doc/README Wed Jul 5 00:00:58 2006 *************** *** 6,21 **** safe first, and then restore it after you upgrade. Alternately you may just edit the new mudos.cfg to say what the old one said. ! GENERAL FAQ: http://dead-souls.sourceforge.net/ds-faq.html ! ADMIN FAQ: http://dead-souls.sourceforge.net/ds-admin-faq.html ! ED TUTORIAL: http://dead-souls.sourceforge.net/editor.html ! NEW CREATION SYSTEM: http://dead-souls.sourceforge.net/example.html ! ! The Frontiers LPC Foundation is pleased to present the ! re-release of Dead Souls 2. Please read /doc/SUPPORT for details on the supportability of this software. Note that the Frontiers LPC Foundation does not take --- 6,18 ---- safe first, and then restore it after you upgrade. Alternately you may just edit the new mudos.cfg to say what the old one said. ! GENERAL FAQ: http://dead-souls.net/ds-faq.html ! ADMIN FAQ: http://dead-souls.net/ds-admin-faq.html ! ED TUTORIAL: http://dead-souls.net/editor.html ! NEW CREATION SYSTEM: http://dead-souls.net/example.html Please read /doc/SUPPORT for details on the supportability of this software. Note that the Frontiers LPC Foundation does not take *************** *** 30,49 **** This mudlib is based on that old warhorse. It is entirely free from those copyright problems, and can be shared. ! We felt that too many substandard libs were starting to ! pop up, and that there was a need to bring back some of the old ! LPC magic. In accordance with this wish to cater to the elite, we have ! disabled some intermud channels by default. To enable them, all you ! need to do is add them to yourself with these commands: ! call me->AddChannel("intergossip") ! call me->AddChannel("intercre") ! ! If you want to contribute to the Dead Souls Lib Resurrection ! project, please visit Frontiers MUD and leave some mudmail for ! Cratylus. You can also request to sign up as a lib developer at ! http://sourceforge.net/projects/dead-souls/ ! ! The latest available files will be at http://sourceforge.net/project/showfiles.php?group_id=148388 so check often. Please review /doc/old/README for more historical background. --- 27,34 ---- This mudlib is based on that old warhorse. It is entirely free from those copyright problems, and can be shared. ! The latest files will be at ! http://sourceforge.net/project/showfiles.php?group_id=148388 Please review /doc/old/README for more historical background. diff -c -r --new-file ds2.0r21/lib/doc/RELEASE_NOTES ds2.0r28/lib/doc/RELEASE_NOTES *** ds2.0r21/lib/doc/RELEASE_NOTES Sat Apr 22 15:44:45 2006 --- ds2.0r28/lib/doc/RELEASE_NOTES Wed Jul 5 20:52:28 2006 *************** *** 1,3 **** --- 1,138 ---- + ---- 2.0r28 --- + - Fixed minor bug in body.c that interfered with collapsing. + - Fixed message boards. + - Added command: snoopreport + - Fixed bug that caused players to be essentially immortal. + - Player death history is now accurately recorded. + - The command mudlist now ignores colors. + + ---- 2.0r27 --- + - Fixed currency problem in dying NPC's. + - Added commands: env, polyglottize + - Fixed "about" verb. + - Tweaked snoop daemon and snoop objects. + - Added pay-for-lessons feature in language teachers. + - Fixed bug in LIB_EXITS that hosed various things, + including wandering NPC's. + - mv command no longer overwrites an existing destination file. + - Fixed campus rooms with hosed CanReceive()'s that horked logins. + - Turned "move" command into "transfer", to address a conflict with + the "move" verb. - Fixed bug in admintool that prevented assistant admins from + using it. + - Fixed bug in eval that prevented assistant admins from using it. + - i3router: dynamic channel data is now persistent (newly created + channels won't disappear when the router resets). + - i3router: fixed a bug in chanlist-reply that stopped the + channel list being sent to LPUni lib muds. + - Modified install process to handle compiling on Wolfpaw servers. + - Added code example domain that was donated by Daelas @ Moraelinost. + - Added new podium, conference room, and margins command that were + donated by Daelas @ Moraelinost. + - i3router: correct password is now honored. + - Fixed help daemon bug that displayed race help twice. + - QCS: creating an enter no longer wipes exits from an existing + target room. + - Fixed bug in rescue login (Thanks, Nulvect). + - Fixed bug in tell command that mishandled mud name ambiguity. + - Fixed bug in CHAT_D that failed to return remote channel listeners. + - i3router: fixed bug that incorrectly rejected targeted emotes. + - Killing a creature super-ultra-extremely fast no longer + generates multiple corpses. + - QCS: Fixed some money problems with both how much things cost and + how much money they have. + - Modified encumbrance to be rather less cumbersome. + - Mailer default behavior now is to notify you when you receive new + mail. Already created characters do not have this default. + - Fixed opacity problem in worn storage. + - Fixed message board in arch room. + + ---- 2.0r26 --- + - Plugged some serious security holes ( http://dead-souls.net/news.html#16jun06 ) + - Cleaned up some unnecessary call_outs in lib objects. + - Added LIB_PULL. + - Added Virtual Campus domain. + - Fixed qcs problem that screwed LIB_DUMMY. + - Fixed local channel emote problem in RESTRICTED_INTERMUD mode. + - Added sefun: alpha_crypt. + - Added conference room east of the Adventurer's Hall. + - admintool no longer lets you remove the last + currency. + - COMPAT BUSTER: UNIX version now uses MD5 crypt, like the Windows + version. Character files created prior to using this driver + will not work with this driver. + - rwho no longer cares if the issuer of the + command is invisible. + + ---- 2.0r25 --- + - r24 had some unfortunate licensing problems attached. + r25 includes a Win32 native binary that does not depend + on any GPL code to run. + - This release is hereby dedicated to Saquivor, who was + instrumental in getting this binary compiled. + - r25 lib does not differ from r24 or r23. Unless you + need the native Win32 binary, you should skip this + release if you have r23 or r24. + + ---- 2.0r24 --- + - Ran into some trouble when releasing r23. For + technical reasons, it's being re-released as r24. + + ---- 2.0r23 --- + - Fixed a bug that sent local channel data to the i3 + router. Sorry about this, guys. As soon as I found + this, I killed it. It appears to have affected r22 only. + - Fixed a conflict between room SetActions and LIB_FISHING. + - It is no longer possible to fish while asleep. + - Admins can no longer decre themselves. + - Modified MudOS source to compile on IRIX using Nekoware. + - Fixed PK bug. Added PLAYER_KILL to config.h . + - Fixed problem with monitor failures and runaway + snooper generation. + - Fixed gate command, renamed it stargate.c. + - Added Administrator's Guidebook. Initial draft available + at http://dead-souls.net/guide/ + - Added downloads.html to doc pages. + - Added verbs.html to doc pages. + - Added i3who command to list who data on all muds. + - Fixed a germ bug that triggered a combat message. + - Fixed an invalid index bug in STARGATE_D and + in LIB_STARGATE. + + ---- 2.0r22 --- + - Changed UNIX config and start scripts to assume + Bourne shell rather than bash. + - Fixed "look in" bug in transparent containers. + - Added stargate lab east of the Creators' Hall. + - Added sefun: compare_array. + - Fixed divide-by-zero bug in net worth calculator. + - Fixed "look in" bug in opaque containers. + - Fixed snoop and monitoring bugs. + - Added SetAction to rooms, for time-based events. See + /domains/town/room/shore.c for an example. + - Fixed plural limb problem in RACES_D help. + - Worn/wielded items must be removed/unwielded before they can be dropped with "drop all". + - Worn/wielded items must be removed/unwielded before they can be sold with "sell all". + - Consolidated Windows and UNIX distributions into a + single download file. + - Converted class variables in STARGATE_D to mappings, + and fixed "inbound/idle gate" bug, as well as room + message bug. + - Updated FAQs and miscellaneous documentation. + - Fixed bug in RESTRICTED_CHANNELS. + - Cleaned up odd function names in LIB_LEAD. + - Tightened up earmuffing, added muffing of entire muds. + - Fixed a bug in look verb that prevented looking + at dummy items. + - Fixed a few bugs in trainers. Added a SetNoSpells() lfun + to control whether a trainer automatically can teach the + spells she knows. + - Fixed noisy index error in LIB_GERM. + - Fixed CHAT_D bug that prevented talking on some channels. + - Fixed problem in LIB_FISHING that made one's catch disappear. + - Fixed opacity for containers. If an item's opacity is about + 33 or below, its contents are visible on casual examination. + Otherwise, you have to "look in" it. + ---- 2.0r21 --- - Fixed a bug in "following" code. - Fixed a bug in trainer code. diff -c -r --new-file ds2.0r21/lib/doc/RELEASE_NOTES_HTTP ds2.0r28/lib/doc/RELEASE_NOTES_HTTP *** ds2.0r21/lib/doc/RELEASE_NOTES_HTTP Wed Apr 12 23:47:49 2006 --- ds2.0r28/lib/doc/RELEASE_NOTES_HTTP Wed Dec 31 19:00:00 1969 *************** *** 1,386 **** - ---- 2.0r20 (unreleased) --- - - The encre and decre of non-logged-on users now - behaves properly. - - Furnaces now destroy objects almost immediately. - - Fixed voting system. - - LIB_GUILD changed to LIB_CLAN. It works, but is - not actually useful. Proper clan functionality - is planned post-2.1. - - Heal command now fixes individual limbs as well. - - Added ENABLE_ENCUMBRANCE define to config.h to - toggle the encumbrance combat modifier. - - Modified combat so it's difficult to fight while - carrying stuff. Anything worn or wielded doesn't - affect combat capability. NPC's are unaffected by this. - - Fixed horrendous carry-capacity leak in all containers. - - Added "every" token to reload verb, enabling the - reload of all loaded objects that inherit the specified - library object, eg "reload every npc". - - Fixed bugs in invisibility. - - Enabled QCS to work in /domains directories for - creators set as domain admins with the - domainadmin command. - - Fixed error in RACES_D that dramatically distorted stats. - - Added sefun: domain_admin. - - Fixed mudlist cache problem. - - Added command: switchrouter, domainadmin. - - Added set_heart_beat to QCS. - - Fixed bugs in commands: banish, anglicize. - - Integrated most packet data with network room. - - Added router room for I3 router debugging. - - Integrated most I3 packets with router room. - - ---- 2.0r19 --- - - Fixed menu item bug in LIB_BARKEEP. - - Fixed Ylsrim pub. - - Added keepalive pinger tool to wiz chest. - - Added commands: anglicize, debug, expel, resetpasswd. - - Fixed first boot problem with /secure/daemon/letters.c. - - Driver: set heart_beat to approximately one per second. - - Driver: added locale workaround to startmud script. - - Added Brodbane's New and Improved cp command. - - Added Brodbane's sefuns: wild_card, remove_dots. - - Elision bug in pager.c fixed by Brodbane. - - Added network troubleshooting room. - - Fixed bug in invisibility. - - Made tricorder and remote control emit warnings, logs, - and errors when used by a non-creator who does not have a - visitor pass. - - Added colon emote behavior to channels, eg, "ds :smile" works - the same as "dsemote smile". - - Tim's I3 router integrated into the lib. Fixes forthcoming. - - Object Properties map variable now persists as well. - - Added Brodbane's dsversion command. - - Fixed bug in LIB_SENTIENT eventReceiveEmote. - - Added Shadyman's fix to the imc2 daemon. - - Added language teacher and schoolhouse to /domains/town. - - Added LIB_TEACHER. - - Tweaked interactive.c to omit null obvious exits. - - Fixed "list" conflict with restricted channels and shops. - - Added SetNativeLanguage to QCS. - - Added PINGING_MUDS, ENGLISH_ONLY and HUMANS_ONLY defines to config.h. - - Added commands: anglicize, debug, expel. - - Added SetNativeLanguage() to LIB_LANGUAGE. - - Added GetEquippedLimbs() to LIB_BODY. - - Visitor's pass now suppresses autosave messages. - - Full cardinal direction aliases added to players (eg "north"). - - Added direction aliases to 'peer' command. - - Player Properties map variable now persists across quits and boots. - This may or may not be a good thing, and could change in - future releases. - - Added sefuns debug(), tell_creators(); - - Fixed socket_address(). - - Added AUTOEXEC_D. - - ---- 2.0r18 --- - - Changed default intermud router to 149.152.218.102 port 23 - - Added a sanity check in telnet room. - - Fixed bug in Newbie Mansion Quest (thx Jonez). - - Added verb: pulsecheck. - - Fixed bug in delete verb that broke when deleting an - item with a relative include defined. - - Fixed a wielding bug that let you wield a two-handed - weapon AND a one-handed weapon. - - Added more damage types. - - Fixed month bug in timestamp.c. - - Fixed light bug in ROOM_VOID. - - ---- 2.0r17 --- - - Fixed bug that prevented assistant admins from shutting down. - - Added Shadyman's emote doc. - - Tweaked timestamp() (thx, Jonez). - - Tweaked "dest" code (thx, Cecil). - - Added convert_ascii() sefun to stringify ascii codes. - - Added get_random_living() sefun. - - QCS now sanely stops when the target is virtual. - - Players can no longer be hosed by being initfixed. - - Fixed bug that returned conflicting messages if - an intermud tell was received while invis with - voicemail enabled. - - timezone.cfg can now be set to blank with admintool. - - Fixed problem in CHAT_D that restricted local channel - emotes when intermud was set to be restricted. - - Fixed a bug in null currency addition in admintool. - - Smushed another apostrophe problem. This is really ridiculous, I - should just fix the real problem, but it's such a dumb - bug, it's easier to pretend it doesn't exist. - - Added SetCustomXP to /lib/combat so that NPC's can have - expee value independent of that calculated from their level. - - Added SetCustomXP to QCS. - - Wrapped users() efun in a sefun to exclude users without - an environment. - - Removed old, counterproductive intermud update event. - - Added log rotation daemon in /secure/daemon/log.c - - Added a log rotation check every 2 hours. - - Format of timestamp() sefun changed to prevent screwing the - mud when running on Windows and logs rotate. - - Fixed bug in update() sefun. - - Prettified devel mud welcome file and added warning about - submitted code being automatically GPL. - - The title and chfn commands now automatically update finger - info with current data. - - *COMPAT BUSTER* RACES_D re-written (Thanks, Ashon). If you've - added your own races, you'll need to re-add them using the new format. - - /www FAQ material updated. - - Fixed Radagast's training skills, fixed QCS trainer creation. - - Modified telnet room to not permit recursive logins on the - development Dead Souls mud. - - Removed nonexistent boards from boards command. - - Added commands: addraces, removeraces, ascii, resetall, flushobs. - - ---- 2.0r16 --- - - Admin email specified at login now gets sent to config.h. - - New FAQ material added to /www - - If a file exists in /doc/help/races for a specified race, - help will display that file instead of the autogenerated - race body data. - - ---- 2.0r15 --- - - Intermud can be disabled entirely by toggling DISABLE_INTERMUD - in /secure/include/config.h. - - *COMPAT BUSTER* Basic framework for race-based skills in - place. Old races.o files will not work with the new race - data file format expected by RACES_D. - - Fleas and lice examples now unbroken. - - Peer command unbroken. - - Fixed miscellaneous i3 services bugs. - - Tweaked the apostrophe workaround. - - "cd here" now works. - - Added intermud link failure/restoration announcement - to arch room. - - Fixed LIB_READ so that receiving a string for a functional's - return of a GetRead makes that string the text to be read. - - Fixed read bug in /lib/bboard.c. - - Fixed a problem with eval that puked on ASSIST members. - - Fixes and updates made to answering machine. Intermud - tell support added. - - Intermud tells now reach the player if she is invisible. The - tell sender's mud receives an "unknown user" error, and the - player receives an "unknowingly tells you" message. - - Intermud channels can be disabled by toggling - RESTRICTED_INTERMUD in /secure/include/config.h. Exceptions - to this restriction can be made by adding users to - the INTERMUD group using admintool. - - Automatic promotion of new characters to creator status can - be enabled by editing /secure/include/config.h and - toggling AUTO_WIZ. - - Update and runtime errors now attempt to display more helpful - messages to the user, if the user is a creator (Thx, Brodbane). - - Error logs now include timestamps. - - Added trainers to QCS. - - *COMPAT BUSTER*: Trainer skills now have to be specified with - an array, not just a series of strings: - RIGHT: AddTrainingSkills( ({ "alpha", "bravo", "charlie" }) ); - WRONG: AddTrainingSkills( "alpha", "bravo", "charlie" ); - - Fixed error message bug in /lib/trainer.c. - - Fixed chat.c bug that allowed emotes from earmuffed players - to be printed. - - Added languages to say verb. - - Added languages to reading. - - Added commands: language, ping. - - Updated/added various help files. - - Added FAQs (/doc/faq...accessed with the faq command). - - Updated Player's Handbook. - - Miscellaneous header fixes. - - Fixed issues in description.c and look.c that interfered with - having multiple Item elements in objects and having arrays - for keys in Item elements in objects. - - Added IDLE_TIMEOUT to /secure/include/config.h - - Added sefuns: imud_privp, find_inheritors, find_deep_inheritors, - securep. - - Overhauled limb and corpse decay. DECAY_D now handles the - callouts, reducing the number of decaying callouts to 1, regardless - of the number of limbs and corpses lying about. - - Limb ID bug fixed. - - Added tweaks to read verb and faq command submitted by Manchi. - - ---- 2.0r14 --- - - Added barkeeps to QCS. - - Added vendors to QCS. - - Barkeeps now properly handle array keys in menu items. See Lars. - - Updated www directory. - - Abbreviated RELEASE_NOTES: dropped pre-v2 data. - - Added commands: consider, whomuffed. - - Fixed QCS bug that hosed room paths. See "room filenames" notes - in chapter 35 of the Creator's Manual. - - Fixed problem with hobbling 4-legged NPC's. - - Additional docs, helpfiles, updated faqs and expanded QCS chapters. - - ---- 2.0r13 --- - - Numerous minor fixes to commands and lib objects. - - Keepalive daemon implemented to detect when the intermud - connection is down and attempts to restart it. - - Intermud services now supports "auth" packets, somewhat. - - The bk command now also works on objects. - - Added commands: kills, chanban, chanunban, earmuff, unmuff. - - Fixed duplicate handbook bug in encre. - - New cres are no longer forced to quit. - - Fixed parser bug when dealing with identical items in different - containers. - - Added sefuns: query_names, answers_to, add_event, remove_event, - update, local_ctime. - - Fixed events system (see *_event sefuns). - - Non-admins now can't use the dest or trans commands on admins. Note that - if a creator really wants to, she could get around using the commands and - trans or dest you anyway. However, now they can't do it "accidentally". - - The bull shark is no longer drinkable. - - Applied workaround to an apostrophe bug. Full fix pending. - - More sefun documentation. - - ---- 2.0r12 --- - - Fixed function conflict that made "scan -i" fail. - - Tightened up "get" lib code. - - Verbified "zap". - - Added atoi sefun. - - Added LIB_WORN_STORAGE to more gracefully handle wearable containers - like backpacks and such, also added it to QCS. - - QCS: fixed a bug that hosed up armor protection settings. - - ---- 2.0r11 --- - - Added findobs sefun and findobj command. - - Fixed "no steal" item property so thieves can't steal such things. - - Android corpses and severed limbs now decay in their own special way. - - Fixed up the sample flu and cold so they don't permanently affect a - a player's stats. Added a very nasty rage virus. - - Ftpd and httpd now work (Thanks to Duuk @ Haven). To enable them, uncomment - inet in /secure/cfg/preload.cfg. They are UNSUPPORTED, and if they ruin - your life, it's not my problem. System security is on you. - - Added valid_link() to master.c so that link() efun works. An interactive, - privileged, nonforced object is required in the previous_object() stack - to avoid abuse. Do NOT use this functionality unless you know EXACTLY - what you're doing. It probably doesn't work the way you think it does. - Be especially careful not to link privileged files to directories that - unprivileged users have write access to. Windows users should just - forget they read any of this. - - Verbified dest command. Peculiar "desting of nonexistent things" bug - should be dead at long last. - - Golems can have their composition specified. As an example, the combat - dummy is now a wood golem. - - Creatures born without limbs are now able to fight while in their - natural prone position. Creatures who used to have limbs and no longer - do have more limited options. - - SetUnique() now does what common sense requires. - - ---- 2.0r10 --- - - Fixed a problem in the death system that allowed creators to - be undead without quite realizing it. - - Fixed miscellaneous minor gotchas in the sample town. - - Added commands: lightme, quests. - - Tweaked miscellaneous commands. - - Fixed germs, added germ testing lab east of the wiz hall. - - ---- 2.0r9 --- - - Added a channel for kills notices. - - Miscellaneous fixes, tweak, etc. - - Fixed channels bug that changed lognames if someone was listening - to a channel. Now both log. - - Encre now forces the new creator to quit. This is necessary in order - to enable certain characteristics of their new body. - - Fixed a truly vile room bug that leaked objects and memory. - - Added reaper daemon to clean up junk from memory. - - Fixed multiple bugs in lighting system. - - Added light meter to creators' chest. - - Removed roommaker from creators' chest. - - Fixed remaining goto command problem. - - Set EXTRA_TIME_OFFSET in /secure/include/config.h to 0. - - Fixed bug in rescue login. Creators now can use it. - - Reorganized efun man pages and added missing efun and sefun docs. - - Added flying system. - - QCS feature add: you can now add includes and inherits. - - QCS fix: modify delete now works properly. - - Added numerous new directives to QCS. - - Added lib object check and NoModify checks to QCS verbs. - - Fixed object manipulation: creatures without prehensile appendages can - no longer accept or manipulate objects. If a creator somehow - manages to lose both hands they can use the "heal" command to fully - restore themselves. - - Fixed a variety of body related issues with races, created a - menagerie of sample npc's for testing. - - Fixed stealing system, added thief class. - - Miscellaneous lib object fixes and additions (eg SetAction now - takes mixed arrays, new SetPermitLoad lfun on npc's, some npc move - messages fixed, etc). - - ---- 2.0r8 --- - - Added intermud announcements to arch room (/secure/room/arch). - - Fixed bug in targeted intermud emotes. - - Channels now log without needing to have a player listening. - - Admin channel now logs to /secure/log - - Fixed lib/std/book.c bug that failed horribly if there was a hidden - file in the text source directory. - - Extensive code cleanup of unused variables. - - Miscellaneous tweaks to sample domain. - - Added tighter restriction to "no teleport" property in rooms. - - Miscellaneous fixes of verb code. - - Modified wrap() sefun to output truncated text rather than just - error out when buffer overflows. - - Added arch command. - - Added EXTRA_TIME_OFFSET parameter to /secure/include/config.h to - accommodate OS'es with peculiar timekeeping. - - Changed local_options to avoid excessive warning messages in /log/errors. - This is only useful if doing a new install of Dead Souls, or - if you copy local_options from the full distribution and recompile - the driver. For the Windows version, all that is needed is to - copy the new driver.exe over the old one, if you're doing an upgrade. - - Rescue login feature added. If when you try to log in, everything - goes to hell, try logging in adding "_rescue" to your name, which - in my case is: cratylus_rescue - - For admins, eval now writes the temp file to /secure, to avoid - annoying /realms dir permission conflicts. - - Cleaned up goto and dest command ugliness. - - Modified reload command and reload() sefun not to perform recursive - updates by default. This should speed up QCS response time and cut - down on mud-wide lag. - - Added some directives to QCS. - - ---- 2.0r7 --- - - Added sample virtual forest to town area. - - Added intermud list of Dead Souls muds to arch room ("read screen"). - - Added mudtime and ticktock commands, and tweaked the time system. - - Updated documentation. - - Added Tim's imc2 client. Doesn't quite work yet. Suggestions welcome. - - Created ds intermud channels ds and ds_test. Enabled ds for cres - by default (i3 names: dead_souls, dead_test4). - - Balanced/fixed attack spells a bit. - - Fixed QCS bug that prevented barkeeps from having stuff added - to their inventories. - - Made it harder to join the mages (The game is too hard for a - first level mage). - - Fixed a bug that made Herkimer a cheat. - - Applied workaround for a bug in Clepius. - - ---- 2.0r6 --- - - Added manuals and such to first admin logon. - - Cleaned up miscellaneous login quirks. - - Got rid of that pesky elog message at startup. - - Updated news files. - - ---- 2.0r5 --- - - Fixed problem with loading a working handbook on first login. - - Fixed QCS bug of reloading files instead of objects. - - Added CREDITS file. - - ---- 2.0r4 --- - - Nailed down nasty bug that overwrote rooms when creating an enter. - - Fixed a bug in "give" code that prevented giving of money. - - Fixed door bug that prevented proper setting of SetLocked and SetClosed. - - Updated some minor documentation unclarities. - - Modified reload() sefun and update command, as well as LastLocation - settings to avoid unnecesary teleportation when reloading objects. - - Modified donate verb and lib object to behave more sanely. - - QCS code cleanup and tightening, also added inits to templates. - - Tightened up sample town code. - - Added Players Handbook - - ---- 2.0r3 --- - - Added workaround for Windows time-of-day problem. - - Fixed minor QCS issues. - - ---- 2.0r2 --- - - Many QCS fixes and updates. - - Added doors and meals to QCS. - - Added thorough QCS documentation: /doc/manual/chapter31 and above. - - ---- 2.0r1 --- - - Fixed peculiar "multiple doors in a room" bug. - --- 0 ---- diff -c -r --new-file ds2.0r21/lib/doc/SUPPORT ds2.0r28/lib/doc/SUPPORT *** ds2.0r21/lib/doc/SUPPORT Mon Jan 23 09:17:12 2006 --- ds2.0r28/lib/doc/SUPPORT Wed Jul 5 00:00:58 2006 *************** *** 12,18 **** For your convenience, a telnet room has been added to your mud that can help you connect to Frontiers, so that you may ask for help if you run into trouble. Just enter the telnet room ! west of the wizard hall, and type: connect You may ask questions of creators there, but don't be offended if they are more interested in building --- 12,18 ---- For your convenience, a telnet room has been added to your mud that can help you connect to Frontiers, so that you may ask for help if you run into trouble. Just enter the telnet room ! west and north of the wizard hall, and type: connect You may ask questions of creators there, but don't be offended if they are more interested in building diff -c -r --new-file ds2.0r21/lib/doc/faq/admin ds2.0r28/lib/doc/faq/admin *** ds2.0r21/lib/doc/faq/admin Sat Mar 11 11:22:47 2006 --- ds2.0r28/lib/doc/faq/admin Wed Jul 5 00:01:03 2006 *************** *** 420,426 **** %^GREEN%^*** I found a bug. For real. Can you please fix it?***%^RESET%^ ! Email me: @users.sourceforge.net Please include a detailed description of the bug, and the exact error text and commands that produced it. A log file or --- 420,426 ---- %^GREEN%^*** I found a bug. For real. Can you please fix it?***%^RESET%^ ! Email me: @comcast.net Please include a detailed description of the bug, and the exact error text and commands that produced it. A log file or diff -c -r --new-file ds2.0r21/lib/doc/faq/general ds2.0r28/lib/doc/faq/general *** ds2.0r21/lib/doc/faq/general Sat Mar 11 11:22:47 2006 --- ds2.0r28/lib/doc/faq/general Wed Jul 5 00:01:03 2006 *************** *** 159,165 **** %^GREEN%^ How do I get started? %^RESET%^ ! Download the latest version from http://dead-souls.sourceforge.net/ or http://www.mudmagic.com/codes/download/lpc/mudos/dead_souls and install it. There are versions available for Windows and for Unix. The main difference between the two is the driver. The Windows driver is a Windows --- 159,165 ---- %^GREEN%^ How do I get started? %^RESET%^ ! Download the latest version from http://dead-souls.net/ or http://www.mudmagic.com/codes/download/lpc/mudos/dead_souls and install it. There are versions available for Windows and for Unix. The main difference between the two is the driver. The Windows driver is a Windows diff -c -r --new-file ds2.0r21/lib/doc/guide/chapter01 ds2.0r28/lib/doc/guide/chapter01 *** ds2.0r21/lib/doc/guide/chapter01 Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/guide/chapter01 Wed Jul 5 00:01:03 2006 *************** *** 1 **** --- 1,36 ---- chapter 1 "Introduction" + + If you're reading this, you've probably been + successful in installing Dead Souls, and are able + to get around and manipulate stuff within it. + + There are lots of questions that new admins + have at this point. This book is not intended to + answer them. Specific questions about administration + are handled in the Admin FAQ, which you can read + at http://dead-souls.net/ds-admin-faq.html . A + local copy is archived in the /www directory, but + this may be out of date by now, and you'd be best + served by looking at the online version. + + This guidebook isn't about "how to" or "where + is," although such issues may be handled incidentally. + The point of this guidebook is to describe to you + various principles that are important to your + success as a Dead Souls mud admin. + + The tone of these chapters is intended to be + conversational. Because of this, it may sound like + I'm being condescending (that means "talking down + to you"), but that isn't intentional. I'm + assuming that you fully understand I'm not the boss + of you, that you can decide for yourself what is + best for your mud, and that the contents of this + guidebook are thoroughly biased. + + However rambling these pages might be, know that + I claim no authority over What Should Be. I can only + tell you, from my experience, how things look, and + how I *think* things work best. + + diff -c -r --new-file ds2.0r21/lib/doc/guide/chapter02 ds2.0r28/lib/doc/guide/chapter02 *** ds2.0r21/lib/doc/guide/chapter02 Mon Jan 23 09:17:12 2006 --- ds2.0r28/lib/doc/guide/chapter02 Wed Jul 5 00:01:03 2006 *************** *** 1,35 **** ! chapter 2 "Player Management" ! Snooping: ! -------- ! ! One of the most powerful and most easily abused tools ! in your administrative arsenal is the snoop command. When ! you "snoop ", you get to see everything they ! say and do. ! Players usually find this intrusive and objectionable, ! and it is ethically shaky to do this without their ! knowledge and consent. The only circumstances under which ! snooping is unambiguously ethical are: ! ! * Snooping one of your own test characters. ! ! * Snooping a player (with their consent) for the purposes of ! troubleshooting a bug. ! ! * Snooping a player (without their consent) to investigate ! a legitimate suspicion of cheating. ! ! Secretly snooping people for your personal amusement is ! pretty much just flat wrong. ! ! By default, only admins can snoop. Admins are players who ! are members of one or both of the groups SECURE and ASSIST. ! An assistant admin *can* snoop a full admin. When this ! occurs, the full admin receives the message that he or she is being ! snooped. ! When an assistant admin is snooped by full admin, they ! do not receive this message. ! --- 1,113 ---- ! chapter 2 "The Vision Thing" + Are you sure you want to run a mud? I mean, are + you *really* sure? ! Most newbie admins have no idea what a difficult ! task lays before them. I started my own mud in 1995. ! It's still around today, in fact. Back then, I'd ! been coding on a mud that had its hosting pulled. I ! finagled access to my university's systems and ! told the old mud's admin "Hey, let's host it here!" ! He didn't want to, so it was just me and my ! new Nightmare IV mud. I figured "what the heck, maybe ! I can run my own," and the rest is history. ! ! I hadn't a clue how to manage people, and things ! just wouldn't come together. I had literally dozens of ! creators come and go, and I could never figure ! out why they'd build a few things and leave. The ! problem was me, obviously. There was nothing about ! the mud people disliked: Nightmare was a very popular ! lib at the time. ! The problem was that people wanted leadership ! from me, and I didn't even know it, much less know ! how to provide it. ! ! Creators ("builders") are your most precious resource. ! Without them you don't have a mud, you have a lib. Sure, ! you can try building everything yourself...and with ! Dead Souls, that's not so farfetched an idea. But ! after a few months of toil, you'll see that you have ! weaknesses, you are not the perfect builder, and you ! will wish for the help and support of others. ! If you don't carefully cultivate your relationships ! with these people, you will fail. Your mud will be a ! failed mud, and your self-expression squelched. ! ! This is why I ask you if you're *really* sure you ! want to run a mud. Running a mud isn't about lording ! it over puny mortal players. It isn't about being ! the sharpest lib coder logged in. It isn't about ! bossing your staff, or making long lists of rules ! and job titles and meeting schedules. ! ! Your job as an administrator is to manage ! people, and guide them toward a single vision, over ! which you yourself may not have full control. People ! will listen to the admin at first because, well, she's ! the admin. But if you can't demonstrate the qualities ! of leadership they expect, they will stop respecting ! you, and they will leave. Or worse, they will hang ! around and be difficult. ! ! What's this about a "vision"? People will work for ! a variety of reasons, mostly money, fun, recognition, ! etc. Rewards. When your new coders show up, they ! will need motivation to work. Since you probably ! won't be offering much in the way of money or ! recognition, you'll need to find a way to motivate ! your coders by making it fun to work with you. ! ! Obviously I don't mean you need to be jolly and ! wear funny hats. In fact, you can be quite boring a ! person and still be good to work with. When I mean it ! has to be fun for your creators, I mean that they ! have to be inspired to do stuff...they have to *want* ! to build because they are expressing themselves in ! a way they enjoy. ! ! This means you'd be unwise to start parceling out ! "missions" and "assignments". Find out what your new ! creator *wants* to do, then do your best to ! accommodate them. It's that simple. If they're working ! on what they *want* to do, you don't need to actively ! motivate them...you just need to make sure they ! have what they need, and that they understand what ! is expected of them. ! ! These expectations are the other part of the ! individual management of creators. Just as is it ! fatal to give creators "homework", it is just as ! counterproductive to say "do whatever you want, man, ! you're free to do anything." Part of the fun of ! work is knowing what the standards are, and how your ! work will be judged. If your creator feels like you ! don't actually care what she builds, she won't ! care much about doing a job that's up to any standards ! but her own. After a while of this, she's going to ! figure out she might as well just run her *own* mud. ! ! You therefore have to have a strong sense of what ! your mud will look like, and what each creator's role ! in that mud will be. If you don't know, or it seems like ! you don't know, you'll lose them. ! ! You don't run the mud because you have the admin ! password. You run it because people think you run it. ! If they stop thinking it, you stop running it. ! ! So I ask again. Do you know what you want out of ! this mud? Have you planned out what you want people ! to be doing? When a talented coder shows up, will ! you be prepared to negotiate their proper role, ! and persuade them that the mud will succeed? ! ! Do you *really* want to be a mud admin? Or are ! you just looking to be someone's boss? ! ! First, find your vision. Everything else will be ! hard work, but if you know what your mud will be, ! and what you need from other people, then you ! just might have a chance to succeed. diff -c -r --new-file ds2.0r21/lib/doc/guide/chapter03 ds2.0r28/lib/doc/guide/chapter03 *** ds2.0r21/lib/doc/guide/chapter03 Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/guide/chapter03 Wed Jul 5 00:01:03 2006 *************** *** 1,3 **** ! chapter 3 "Intermud" --- 1,79 ---- ! chapter 3 "Getting Started" + If you've read this far, there's a good chance + you already like the lib and are eager to get + going on this whole mud thing. Whether this is + true or not, this is where you find out for sure. + Let's assume you're set with the vision thing. + You're going to make a mud with a Dora the Explorer + theme. You can practically hear the music even + now! Let's get this mud written and open! Vamonos! + + The first thing that happens here is you need + to get real familiar with this mud. If you haven't + done so already, when you finish this chapter, + you must do the following: + + 1) Read the Player's Handbook, cover to cover. + + 2) Create a test character. Do *not* use your + admin character's powers to give her any + equipment or money. Using the information from the + Player's Handbook, play this character until she + solves the Orcslayer Quest. Do not use any creator + characters to help her in any way. + + It is very important that you do this. It + is the best way you will know for sure whether you + have made the right lib choice. + + This doesn't mean that I'm asking you if you're + happy with the questing system, or how the items + in your inventory get listed, or whatever. Such + systems and cosmetics can be changed, sometimes with + trivial work. + What you're testing is the feel of the mud, + the parser, and that certain "I don't know what" + that tells you whether this is really a mud lib + you can live with. + + Don't like quest advancement? That can be removed. + Want turns-based combat? That can be arranged (though + not trivially). But if you get a low level discomfort, + and can't shake the feeling that you can't get + anything done, then this is when you'll find out. + + The second advantage to completing the Orcslayer + Quest is that it helps you see how things are + organized. As you proceed along the quest, you should + be using your admin character to examine the + files that compose the rooms, items, and npc's you see. + You will know where there are working samples of + doors, locks, hostile npc's, friendly npc's, spells, + and so on. This information will be valuable to you + in the next step you take. + + If you complete the Orcslayer Quest and decide + you still like the lib, your next step is to create a + small area. Read the Creator's Manual starting from + chapter 31. This provides you a detailed set of + instructions on how to get stuff built quickly and + painlessly. + Build a few rooms. If you can't think of something + to build, create a room just like the one you're + sitting in right now, including desk, door, and + scruffy mud geek sitting on a chair. + Or you might already know exactly what you want + to build. This is a good time to build a few + rooms of Dora's Grandma's House, or the tree house + of Tico the Squirrel. + + It's vitally important that you start using the + building tools, because just like with the Orcslayer + Quest, this is the point where you will discover whether + the build system here is a deal killer. + + Once you're done with your few starter rooms, you'll + be in a position to know whether you've really made + the right mudlib choice. diff -c -r --new-file ds2.0r21/lib/doc/guide/chapter04 ds2.0r28/lib/doc/guide/chapter04 *** ds2.0r21/lib/doc/guide/chapter04 Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/guide/chapter04 Wed Jul 5 00:01:03 2006 *************** *** 1,2 **** ! chapter 4 "Lib design" --- 1,70 ---- ! chapter 4 "Gaining Experience" + Now you must prepare for the + technical demands of your creators. + + Your creators will expect you to have + answers to their questions. For the most part, + they'll find these answers in the Creator's FAQ, + at http://dead-souls.net/ds-creator-faq.html . + + But you're going to get questions not on + that FAQ. You'll get stuff like: + + * How many quest points should the Issa Quest award? + + * What's the maximum player level on this mud? + + * Can I make a player class called "Swiper"? + + * What's a good weapon type for The Bouncy Ball? + + These are questions that depend strictly on you + and what your vision for the mud is. Dead Souls is + a starting point. The classes, levels, systems, + *everything*, is open to modification. + + It is normal and natural not to have all of + these answers at first. I suggest you concentrate on + making an "area", perhaps a quest, consisting of + perhaps 15 to 20 rooms and a few npc's, weapons, + pieces of armor and general items. + + Test your weapons and armor in the arena. To + get to the arena, first go to the Creators' Hall + by typing: wiz + + Then go east, then north. + + You can have the dummy wear armor like this: + + give mithril shirt to dummy + force dummy to wear shirt + + And you can test your weapons by beating on the + dummy: + + force fighter to drop sword + clone hammer + give hammer to fighter + force fighter to wield hammer + force fighter to kill dummy + + The dummy will very helpfully blurt out the amount + and type of damage it receives. + + You can get ideas for your npc's by visiting the + menagerie. It is east and south of the Creators' Hall. + + By creating your first quest, and putting test + characters through it, you will gain the experience + you need to be able to tell your players things like: + + "The Issa Quest is supposed to be easy, so make it 2qp." + + "Level 50 explorers are way too strong. I'm capping + player advancement at level 40." + + "No, there is already a thief class." + + "Make it a projectile weapon." diff -c -r --new-file ds2.0r21/lib/doc/guide/chapter05 ds2.0r28/lib/doc/guide/chapter05 *** ds2.0r21/lib/doc/guide/chapter05 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/guide/chapter05 Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,111 ---- + chapter 5 "Guilds, Classes, and Clans" + + Section I: Classes + ------------------ + + I suspect you are already quite familiar with + the concept of classes. Some people even have very + strong feelings about classes, specifically, they + hate them. + + Dead Souls 1 came with a class system, and + I decided to keep it because it sort of worked, and + many people are familiar with classes and want to + have them on their mud. + + However, you don't have to use them. + + That's right. Using classes is not required. You + can very easily make your Dead Souls mud completely + devoid of classes, if that's what you want. + + The reason for this is that in Dead Souls, the only + thing a class does is confer on a player a class title, + like "Fighter", and load her up with skill settings appropriate + to that class. That's it. Classes do nothing more. + + If you want player X to have all the skills of a + fighter and all the skills of a mage, just make it so. + They don't need to have class to have skills. Add + "kite flying" while you're at it. It doesn't matter. + Dead Souls operates on a skill system. The class system + is incidental to it and can be dispensed with entirely. + + On the other hand, for those folks who appreciate + the role play and tactical elements involved in using + classes, Dead Souls provides you the ability to use + the existing stock classes, and permits you to create + your own. The files in /secure/cfg/classes describe them. + See http://dead-souls.net/ds-creator-faq.html#2.46 + for the exact syntax of these files. + + You'll notice that there is a field for "how important" + a skill is. What this modifier does is determine how + quickly your player's skill levels rise when her player + level rises. A fighter's magical ability does not increase + much when she is promoted a player level, but a mage's + magical ability certainly does. + + For those who find classes distasteful, this kind + of "skill hobbling" is just the reason they hate classes: + they feel they are too restrictive. If you are such + an admin, just dont use classes, and whenever you award + a skill to a player, set the "how important" number + (techninally known as the "skill class" but that's a very + confusing term) to the same for everyone. + + Incidentally, you don't *need* player levels either. + I will leave it as an exercise for the reader to imagine + a scheme where players do not have advancement levels. + + DS1 allowed players to join more than one class. + Unfortunately, the system was buggy enough and stripped + of classes so that it was both meaningless and a bit + of a problem. Multi-classing is by default not permitted + on DS2, but it's easy enough to implement on your own. + Review the header data in the class files to see the + syntax. + + However, since multiclassing isn't something I + am interested in working on right now, I will not be + assisting anyone in getting that to work. + + + Section II: Guilds + ------------------ + + The concept of "guilds" carries some baggage for me. I + learned about mudding by playing on Darker Realms, an LP + mud where a "guild" was effectively a class. There was + the mage's guild, the barbarian guild, etc. There were + also guilds that blurred the distinction between class + and race, like shapeshifters, cyborg, and dragon. + + When I ran into the Dead Souls 1 conception of guilds, + then, I was pretty confused. In DS1, a guild was + kind of a player-run club. There was a guild object + that made some sort of determination about who + was in or out, who was the boss, etc. My presumption is + that in later iterations of Nightmare V, these guilds + were fleshed out and worked properly. I presume this + because in DS1 they didn't, and they seemed to make some + assumptions about the lib that were not correct. + + I decided to change this for DS2, and the way it now + works is that guilds are neither classes nor player-run + clubs. The plan is to have guilds be not-necessarily-class- + based affiliations a player can have with balanced + advantages and disadvantages. As of DS2.0 there is no + working sample of this, but that's the plan for post + 2.1 development. + + + Section III: Clans + ------------------ + + Clans serve the purpose that DS1 guilds did. They are + player-run affiliations, managed by clan objects that + confer identity and status. As of DS2.0 there is no working + sample of this, but that's the plan for post 2.1 development. + + diff -c -r --new-file ds2.0r21/lib/doc/guide/chapter06 ds2.0r28/lib/doc/guide/chapter06 *** ds2.0r21/lib/doc/guide/chapter06 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/guide/chapter06 Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,50 ---- + chapter 6 "Privacy" + + One of the most powerful and most easily abused tools + in your administrative arsenal is the snoop command. When + you "snoop ", you get to see everything they + say and do. + Players usually find this intrusive and objectionable, + and it is ethically shaky to do this without their + knowledge and consent. The only circumstances under which + snooping is unambiguously ethical are: + + * Snooping one of your own test characters. + + * Snooping a player (with their consent) for the purposes of + troubleshooting a bug. + + * Snooping a user (without their consent) to investigate + a legitimate suspicion of malfeasance. + + Secretly snooping people for your personal amusement is + just flat wrong. + + By default, only admins can snoop. Admins are players who + are members of one or both of the groups SECURE and ASSIST. + + An assistant admin *cannot* snoop a full admin. However, + assistant admins have read access to the snoop log directory, + so if global monitoring is enabled, they can read the + contents of a full admin's monitor log. + + The new SNOOP_D system allows for the simultaneous + snooping of multiple people, and allows multiple people to + snoop the same person. It also permits you to enable + monitoring of users without having to snoop, by using the + monitor command to log i/o to /secure/log/adm. + + The GLOBAL_MONITOR parameter in config.h will take one of three + arguments. 0 = monitor nobody. 1 = monitor everyone. 2 = monitor + everyone except admins. After changing it, reboot the mud + to make sure the change takes effect. + + This functionality isn't here for your entertainment. In + fact, I had to think long and hard before sharing my snoop + code with you and putting it in the general lib distribution. + + In the end, though, I believe that the benefits outweigh + the risk of abuse. As an admin, you have the right to know + what's going on in your mud, and as a lib coder, it isn't + my business to interfere with that. + diff -c -r --new-file ds2.0r21/lib/doc/guide/chapter07 ds2.0r28/lib/doc/guide/chapter07 *** ds2.0r21/lib/doc/guide/chapter07 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/guide/chapter07 Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,167 ---- + chapter 7 "Advanced Topics" + + Section I: Shadows + ------------------ + + Shadows are a problematic topic. My first impulse is to warn + you sternly not to mess with them, they shouldn't be used, etc. In + his legendary LPC text, Descartes goes so far as to say he hasn't + seen a shadow do something that couldn't be done better another way. + + So, be aware that the topic of shadows tends to generate + strong opinions. + + Shadows *are* hazardous pretty much by definition. A shadow + is an object that effectively "wraps" another object, like an + invisible shadow around it. When a call is made to the shadowed + object, the shadow intercepts that call. + + What the shadow does with the call is up to you. It can + do nothing at all, and simply pass the call along to the + shadowed object. It could block that call. It could manipulate + that call and send the modified version to the shadowed + object. + + You can see an example of a shadow in /secure/npc/drone.c . + This is the code that enables you to take control of an npc + with the remote control. The remote control loads /shadows/drone.c + which inherits /secure/npc/drone.c , and attaches that shadow to + the npc that is to be controlled. This is a way of "adding + functions on the fly" to an already-loaded npc. + The drone shadow is in the lib as an example + of how shadows work, and an example of how to get an object to + posess functions it did not have when loaded. It is not + intended to represent shadow advocacy. + + The danger, and the reason some people go ballistic + when they hear the phrase "I think I'll use a shadow for that" + is that a lib that allows unrestricted shadow use + effectively has no security at all. You can have creators + enshadow an arch for example, or enshadow other privileged + objects. + + Dead Souls shadows are pretty tightly restricted. The + master object does not permit a shadow to be created unless its + code is in /shadows . This means creators can't hide their + rootkit shadows in their homedirs and expect them to work. + + Further, because /shadows is outside the /secure dir, + it serves as an obstacle to defeating the stack security + model. + + In any case, I strongly recommend you avoid using them + except in the extremely unusual case of a task that has + no other solution. If your mud starts collecting a bunch + of shadows out of laziness, sadness will likely be the result. + + + Section II: The "class" Data Type + --------------------------------- + + In 1995 Beek added a data type to MudOS: class. + I have to admit that I'm at a bit of a loss to explain classes, + because I am not a C guy, I'm an LPC guy. For people who + grok C, the class data type is a natural and elegant solution + for organizing related sets of variables. + + I have nothing but respect for Beek and the leet programmers + who built MudOS, so please don't go running around saying I'm + dissing them. + + But in my experience, the use of classes generally serves + the purpose of obscuring code and making it more difficult + to debug. + + I've seen newbie LPC coders take to classes like fish to water. + I can't explain it other than to speculate that for some people + the class data type (I've even had people argue at me that it's + really a "data structure", like I have the slightest clue what + the difference is) Just Makes Sense. If you are one of those people, + then bully for you. I'm serious. I don't understand you, but + your thing probably works for you, so, right on. + + However, I do not recommend that the average newbie coder + spend too much time on classes. You'll have plenty of opportunity + when you start dissecting the lib, but my friendly advice to + the noob is to use mappings instead. I've yet to see a class + do something that a mapping couldn't do with greater clarity. + + + Section III: add_action + ----------------------- + + Yet another topic with potential for violence. The passions + can run high on this one, and in fact, the Lima team felt + strongly enough about it that they don't enable it by default. + No add_actions by default. That's hard core. + + add_action is an efun that LP muds originally depended + on for most kinds of user input. If you wanted to be able to + throw a ball, that ball needed an add_action for it. You'd + have that ball provide a user with the throw command whenever + the user came in proximity to the ball. You can see the syntax + for add_action by examining the /lib/shop.c file. + + It's simple. It works. I mean, really, It Just Works, and + it's the fastest way to add functionality to any object. People + used add_action from pretty much the genesis of LP, as far as + I can tell, and it became just a way of life. That was just + how it was done. Yes, that wording was intentional ;) + + However, there were serious problems with this parsing + scheme. Basically it let any creator, regardless of skill + level, define commands for the mud. Joe's throw add_action for + his ball could be poorly coded and worded, and was liable to + behave differently from Jon's version. + + And suppose you held two or three items that had a throw + add_action each? Which one took precedence? What if that + one was bugged? + + Using add_actions for general lib command functionality + is really problematic for this reason. It fosters a lack + of uniformity across the lib that can leave users basically + playing a "guess the syntax" game for any item like this, + and allows for conflicts by incorrectly coded items. The + natural language parser was the MudOS solution to this problem, + implementing the verb system with which you are now so + familiar. + + The controversy boils down to preference. For some people, + add_action is just How It Is Done, and you still have + people starting muds with libs like Skylib and TMI-2 (!!) + that lack an advanced lib-wide parser. For these people, + verbs are an overcomplicated mess that they just don't + have a need to understand. + + Then you have the people who find add_action anathema, and + simply an unacceptable vestige of a more primitive form of + mudding. These people view add_actioners as atavistic knuckle- + draggers, either too dumb or too pig-headed to understand the + beauty and majesty of natural language parsing. + + My view, predictably, is somewhere in the middle. Verbs + *can* be exhausting to accommodate when you're just Trying To + Do One Thing. But add_actions truly are of limited use in + a modern lib, and allowing their proliferation out of + laziness is probably a bad idea. + + That isn't to say there isn't a place for add_actions. Dead + Souls supports them, and you'll see them every now and then. + In fact, technically, every command you issue, verb + or not, is evaluated by an add_action in the mud shell object + (LIB_NMSH). It is nevertheless better to learn to use verbs, because + they eliminate many problems you don't need to reinvent the + wheel for. + + I had one person tell me, as they chose a MudOS lib that + didn't use verbs, that they planned to write their own natural + language parser in the lib. I bade him good luck. I wonder + how he's coming along these days. + + + Section IV: Thoughts on MudOS + ----------------------------- + + Like, wow. MudOS. You know? + diff -c -r --new-file ds2.0r21/lib/doc/guide/chapter08 ds2.0r28/lib/doc/guide/chapter08 *** ds2.0r21/lib/doc/guide/chapter08 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/guide/chapter08 Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,346 ---- + chapter 8 "Understanding the Lib" + + One of the most common questions I get goes something + like this: "I'd like to change combat so that it is + turns-based, with actions. How would I do this?" Another + example might be "I'm setting up a farming system, with + livestock and stuff. What should I look at?" + + To me, the questions are the same. Translated into + my language, this is the meaning: "I have great ideas that + require advanced knowledge of the lib to implement. How do I do it?" + + I'm usually at a loss when I get one of these, because + I want to set people straight, but I don't want to hurt + their feelings, either. In the FAQ's, my response is + something along the lines of: + + "If there's anything in the Creator's Manual you don't + understand, you aren't ready to try this." + + I hate to say that, because I think it's probably discouraging + to hear. After all, whatever the project, it is very likely + doable. You can make an LP mud do pretty much anything + you want...that's the beauty of the flexibility of LPC. + However, as they say, with great power comes great responsibility, + and in this case, it is your responsibility to understand the + lib, if you want to make major changes to it. Let's take the + example of farming. + + Section I: Verbs + ---------------- + + It is critical to understand how verbs work in order to + do anything in Dead Souls of an advanced nature. Verbs are + basically commands that do something to your environment, + something in your environment, your "body", or something + in your inventory. + + For example, "who" is not a verb. It's a standard command, + which doesn't act on any cloned items. All it does is communicate + with the lib to query the list of users logged on, and displays + it to you in a particular manner. + + Then there's something like "zap". That *is* a verb, and + it takes cloned items as arguments. When you "zap orc" this + has a special meaning to the parsing system. The parser is the + part of the game driver that tries to interpret your input + and attempts to do something useful with it. When the parser + catches a verb at the beginning of your input, it gets to + work on figuring out how the rest of the words in the input + relate to that verb. + + This is done through "rules". You can take a look + at /verbs/creators/zap.c for the specific rules in this case. + If the word or words (for example "first orc", "orcs", "an orc") + match one or more objects in the room, the parser then + sends the arguments to the verb object. The verb object is + the loaded code from /verbs/creators/zap.c in this case. + + Depending on how the verb is coded, your command line will + succeed or fail. + + For your new farming system, you're going to need some new + verbs, so the first thing you need to do is understand verbs. + You're going to have to build new verbs like "plow", and "plant", + and "harvest". Therefore, you'll need to go over the verb + tutorial, which is at http://dead-souls.net/verbs.html + + + Section II: Lib Event Objects + ----------------------------- + + In the verb tutorial, you read that when a verb acts on + an object, the parser requires that the object have a function + that handles that verb. If a chair object lacks a function + like direct_sit() or something similar, the parser will assume + your sit verb doesn't apply to chairs, and the command line + will fail with something like "You can't sit on the chair". + + It would be incredibly tedious to have to code a sit verb + handler in every piece of furniture you create. Similarly, + your farmer's field plow *could* have a plow verb handler + coded in it, but it is much better to create a lib object that + your plow will inherit. That way, other objects can inherit + that functionality without having to reinvent the wheel, and + plowing in general will be a uniform experience across the mud. + + For example, one of the first systems I made when + I started my lib obsession was the inheritable flashlight + system. The original Dead Souls lib had regular old torches + you'd light with a match, but it seemed to me that not every + Dead Souls mud would be Sword & Sandals style, and a modern + illumination system should be available. So I set about + making a "turn" verb, so that once I had flashlights, + you could "turn on the flashlight". + + I then created the lib object /lib/events/turn.c (when + referring to lib objects, I often use the macro name. In + this case, if I'd said LIB_TURN, it would be the same thing + as saying /lib/events/turn.c). The lib object doesn't really + *do* much of anything. That object isn't really where you + need to be checking for validity of commands. What that + object does, almost *all* it does, is to have functions that + correspond to the verb "turn". That's it. It's kind of like + a socket for a plug. The verb is the plug and you're trying + to use it on something. If that something has a socket + that fits your plug, then it'll work. + + Lib event objects come in different flavors, and some + really do perform a bunch of thinking. But for the most part, + for simple verbs, all you need is a lib event object that + says "yes, I understand that verb". + + LIB_TURN is inherited by LIB_FLASHLIGHT. That means + that when you clone an object that inherits LIB_FLASHLIGHT, + it contains all the functions of /lib/flashlight.c plus + all the functions that LIB_FLASHLIGHT inherits from LIB_TURN. + + Because your flashlight inherits LIB_FLASHLIGHT, + which inherits LIB_TURN, when you issue the command line + "turn on flashlight", the parser checks with the + flashlight to see if it knows what you're talking about, + and gets a "yes, I know that verb" response. At that point + the parser says "fine, here's the rest of what this + player thinks he can do with you and the turn verb" and now + it's up to LIB_FLASHLIGHT to figure out whether it has + enough batteries, of the right kind, with sufficient + charge, and so on. + + For your new farming system, you'll need to implement + a similar scheme. Your "plow" and "hoe" verbs will need + lib event objects that can be inherited by the cloned + objects you want to plow and hoe with. + + In this case, LIB_FLASHLIGHT and the turn verb + aren't the best models for your new plowing system. This + is because your plow is something you plow *with*, + as opposed to something that *is plowed*. + + To see how a plowing system might be implemented, + take a look at the "dig" verb, LIB_DIGGING, and + LIB_DIG_WITH. This is what a shovel would use, so + that you can "dig in sand with the shovel". After + studying the dig system, and lots of trial and error, + you will hopefully eventually come up with a + plow system that will let you "plow field with plow", + for example. + + + Section III: Daemons + -------------------- + + So, now you've created a plow verb, and a plow lib + event object, it works, and now you're happily plowing + along. Let's say that the rooms field1.c and field2.c + are plowable rooms. Presumably, you don't want people + to be able to plow here all the time. The fields need + time to do their thing, and constant plowing would + slow down the growth of your tender young corn stalks. + + Normally, you might deal with this by having + a local variable in the room, so that "harvest time is + 50 hours, unless someone plows again, which + makes it take longer", this sort of thing. Let's call + that variable PlowedTimes. + + But, oh noes! The mud rebooted! Now all the rooms + have reset, and the planting and plowing variables + have reset! + You might avoid this problem by just not rebooting, + but even if you manage never ever to reboot your mud, + the mud periodically does resets of unused objects, + retiring them from memory and resetting their values + to zero. + You might avoid *that* problem by setting your + fields to be "NoClean", to avoid resets, but this is + very inelegant. Rather than ensuring the integrity + of your game data, you're just crossing your fingers + and hoping it doesn't go away. + + The solution is to use a daemon. A daemon is an + object loaded into memory that acts like an arbiter + of information. For example, STARGATE_D keeps track + of where stargates are, and which gates are in + what state, and which gates are connected to each + other. It is important to have one location where + this data can be accessed, because a new gate must + be able to know what other valid gates there are, and + it must be able to know what gates are idle and + therefore accessible. STARGATE_D is a central + repository of this data, and serves as a mediator + for connection requests, keeping things working right. + + In this case, the daemon's job would be to + keep track of which fields have been plowed, how + many times, and how long it'll take to get to harvest + time. Dead Souls daemons typically use object + persistence files ( http://dead-souls.net/ds-admin-faq.html#80 ) + to avoid losing information during object reloads or + mud reboots. A FARMING_D is exactly what you need to + keep track of and manage this kind of data. + + + Section IV: Skills + ------------------ + + To what extent should people be able to plow? How + well should they do it? If you care enough about farming + to have come this far, you've probably got ideas about + what good plowing is and what criteria a player should + have for extracting the most from their land. + + This is where skills can play an important role. + What you have to understand about skills is that they + are simply variables in a player's body. Skills don't + have to be gained by joining a class, guild, or being + member of a race. Adding a skill to a player is as + simple as having an object do something like this: + + this_player()->SetSkill("scuba diving",1); + + And if just strapping on a scuba tank does it, then + now that player has that skill. + + Now, *normally* players are granted skills through + something more sensible than just picking up an object. + It makes more sense to have skills granted when a + player is taught something by an npc, or joins a guild, + or whatever, which is why traditionally that's how + it has worked. + + So let's say you have a Farmer's Guild, then. When + you show up and sign the registry, some npc pops out, + "teaches" you the farming skills you need (by simply + adding the skills "farming" and "plowing" and "sowing" + to the player) and now you have the skills. If you + want, you can even create a Farmer class, like Fighters, + but that's up to you and not in the scope of this chapter. + + This plowing skill is totally useless right + now. It does nothing at all, because you haven't yet + coded anything that makes use of it. This is the key + concept of the skills system that you must understand. + + Just giving a player a skill does not mean that + it has any use. For a skill to be useful, there + must be lib verbs and/or objects that evaluate the + skill and perform calculations based on it. + + It is therefore time to add these skill checks to the + objects that need them. For example, suppose our + farmer's plowing skill is at level 5. This doesn't + mean he's a level 5 player necessarily, just that + at plowing, his skill level is 5. + You might have a function in your /verbs/items/plow.c + verb that checks that skill, and determines how long + the field will take to grow based on it. Perhaps + for a level 5 plower, the field will be ready for + harvest in 45 hours. Perhaps for a level 10 plower, + it would be 35. You might have either the plow verb + or the plow lib event object do something like: + + int PlowFunction(string field){ + int skill_level = this_player()->GetSkillLevel("plowing"); + + if(skill_level) skill_level *= 2; + else skill_level = 1; + FARMING_D->eventModHarvestTime(field, skill_level); + return 1; + } + + It's a silly example, but you get the idea. The + "plowing" skill is valuable because the lib uses it + in some way to modify events the player performs. If + the lib doesn't know about it, the skill has no value. + + In the case of, for example, "blade attack", the + lib checks for this if you're wielding a sword and + you're in combat. Based on how good you are at blade + attack, combat.c will modify how much damage you + inflict when you hit your opponent. + + + Section V: Special Abilities + ---------------------------- + + Perhaps "plant" and "sow" are verbs that should + only be available to players with the skills "planting" + and "sowing". + Or, if farming isn't your thing and you want to + enhance combat, you might want Fighters who are members + of the Viking Guild to have a special ability called + "massacre" that can do extra special damage. + + This is best done by simply creating the sow, + plant, and/or massacre verbs, then coding the verbs to + work only for those people you designate. If the player + isn't a Fighter and a Viking, perhaps the massacre + verb would return something like "You have no idea + how to do that." and do no more. + + You are, of course, free to implement a Special + Abilities System along the lines of the existing Dead + Souls spell system. I encourage you to do so, if + you're so inclined, and to share that code with me, + if it works. But it isn't necessary. The existing + verb system is plenty sophisticated enough to + handle such special events. + + + Section IV: Summary + ------------------- + + At this point in my lib coder development, I have + a hard time distinguishing what is easy and what is + hard for new people. I have been surprised by people + who take a long time to grasp simple concepts. I have + been surprised by people who grasp complex concepts + so quickly that I can't answer their questions. + + Where you stand in that continuum I can't say. + What I can say is that if this chapter seems like it + went mostly over your head, you shouldn't worry too + much about it. It took me years of coding experience + and months of obsessed lib analysis to reach my + current level of understanding. You should not expect + yourself to grok everything in this guidebook the + first time around. + + As suggested in the previous chapters, it's best + to start small, slow, and steady. As you build simple + things, more complex things will make more sense, and + you'll eventually reach the level of technical + expertise you need. + + This chapter was not written to make you feel + overwhelmed by what you don't know. It was written so + that you understand what you're asking when you + say "How do I revamp bodies and limbs so they have + knees and elbows you can poke people with?" + + Once you understand the lib, it really really isn't + that hard to do. But if you are a beginner, don't + set yourself up for failure by taking a leap at a + project you don't have the experience to tackle. + diff -c -r --new-file ds2.0r21/lib/doc/guide/chapter09 ds2.0r28/lib/doc/guide/chapter09 *** ds2.0r21/lib/doc/guide/chapter09 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/guide/chapter09 Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,67 ---- + chapter 9 "The Future" + + In the late 1990's, Descartes @ Nightmare released + a public domain version of the Nightmare lib called + Dead Souls, and pulled the official Nightmare lib from + distribution. They were very similar, but Dead Souls + lacked documentation. + + His final realease of Dead Souls was 1.1. + + As you must know by now, from reading the FAQ's (you + *did* read the FAQ's, right?) at some point I lost my mind + and decided to dust off that old lib, get it working, and + get people using it so that I could have other people to + discuss LPC code with. + + I can honestly say I didn't know what I was getting + myself into. I mean, when I started, it sure *seemed* like + things "mostly worked". The hard part was just getting it + installed, right? + + It's now been slightly over a year since I started + realizing that fixing A broke B, and fixing B broke A + and C, etc, ad nauseam. My guiding principle was "get it + working" with a corollary of "make it work well". My + main aim was bugfixes, but where a feature gap made it + obviously difficult for a beginner, I attempted to address + it with a new system. Hence, admintool, QCS, SNOOP_D, etc. + + In other cases, a new system was trivially easy + to add and its absence was an unreasonable burden, such + as SetAction for rooms. + + Sometimes a new system comes from my desire to have + a tool that makes my own life easier while fixing the + lib, such as the medical tricorder, remote control, and + the laboratory facility east of the Creators' Hall. + + For the most part, though, my main focus has been + fixing stuff, not adding stuff. The intention has been + to release Dead Souls 2.1 as a version that is as free + of pain as possible, as clear of bugs as reasonable, and + as fun and useful as 1.1 should have been. Today it is + May 18 2006, and I think that I am very close + to that landmark. Today I am at the point where the list + of bugs consists of minor annoyances, of the kind that + players would hardly ever take note. + + The future for Dead Souls I see as lots of fun for me. + I yearn to be free of doing nothing but fix fix fix. As + great as Dead Souls is, it needs major new systems to make + it fully competitive with the libs currently out there. + Adding these new systems is the kind of fun challenge + I'd really meant to be doing all along, but suckered + myself out of. + + Post 2.1 I intend to concentrate on things like + mounts, vehicles, naval/vehicle combat, 3d travel, extending + virtual rooms, player-independent world persistence, + and lots of other fun stuff. I'm not in the habit of + making promises about the lib. As the Dead Souls community + knows, I prefer to just *make* a new system than talk + about it. I wanted to share these plans with you, though, + so that you know that Dead Souls development continues + apace, and great things are on the horizon. + + diff -c -r --new-file ds2.0r21/lib/doc/hbook/chapter02 ds2.0r28/lib/doc/hbook/chapter02 *** ds2.0r21/lib/doc/hbook/chapter02 Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/hbook/chapter02 Wed Jul 5 00:01:03 2006 *************** *** 162,168 **** an amulet. If this is so, you'll need to specify where you want it. There are various types of armor, like cloak, pants, glove, etc. Many of them overlap. You can wear a shirt on your torso as ! well as a cloak and combat armor, but you may noy wear two of the same type. If you have a robe and a cape that are both cloaks, you'll have to decide which one is going on. You will find that shoes and gloves are often for one of your --- 162,168 ---- an amulet. If this is so, you'll need to specify where you want it. There are various types of armor, like cloak, pants, glove, etc. Many of them overlap. You can wear a shirt on your torso as ! well as a cloak and combat armor, but you may not wear two of the same type. If you have a robe and a cape that are both cloaks, you'll have to decide which one is going on. You will find that shoes and gloves are often for one of your *************** *** 186,195 **** There are four main types of weapons: ! blade: like swords, knives, and spears blunt: like clubs, staves, and shillelaghs ! projectile: like guns and bows ! missile: things designed to be thrown, like darts or grenades Unless it is a special device or magical item, weapons must be wielded in order to be of use in combat. Some weapons, --- 186,195 ---- There are four main types of weapons: ! knife: knives, daggers ! blade: like swords, and spears blunt: like clubs, staves, and shillelaghs ! projectile: things designed to be thrown, like darts or grenades Unless it is a special device or magical item, weapons must be wielded in order to be of use in combat. Some weapons, diff -c -r --new-file ds2.0r21/lib/doc/hbook/chapter03 ds2.0r28/lib/doc/hbook/chapter03 *** ds2.0r21/lib/doc/hbook/chapter03 Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/hbook/chapter03 Wed Jul 5 00:01:03 2006 *************** *** 145,151 **** a quest, solving a puzzle, winning a contest. Most often you will receive xp after killing an NPC. The amount of xp awarded will depend on the level of the NPC. Like qp, xp are needed to ! quilify for level advancement. --- 145,151 ---- a quest, solving a puzzle, winning a contest. Most often you will receive xp after killing an NPC. The amount of xp awarded will depend on the level of the NPC. Like qp, xp are needed to ! qualify for level advancement. diff -c -r --new-file ds2.0r21/lib/doc/hbook/chapter04 ds2.0r28/lib/doc/hbook/chapter04 *** ds2.0r21/lib/doc/hbook/chapter04 Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/hbook/chapter04 Wed Jul 5 00:01:03 2006 *************** *** 23,31 **** friends to tackle the orcs together, or raise your level to the point where you're tough enough to take them on. ! To raise your level, wander around in the newbie mansion. There's ! lots of loot there you can sell at Otik's shop, and with the cash you ! can then get some proper weaponry and armor. Silver is heavy, so don't try to carry all your money around all the time. Request an account from Zoe the banker and keep your money there until you really need it. --- 23,34 ---- friends to tackle the orcs together, or raise your level to the point where you're tough enough to take them on. ! To raise your level, wander around in the newbie mansion, which ! is south of the village church. ! ! There's lots of loot there you can sell at Otik's shop, and with the ! cash you can then get some proper weaponry and armor. ! Silver is heavy, so don't try to carry all your money around all the time. Request an account from Zoe the banker and keep your money there until you really need it. *************** *** 34,40 **** finding the secret room will give you experience and quest points too. (hint, there might be more than one secret room) ! Once you have enough experience and/and or points, go to Dirk in the adventurers hall and "%^GREEN%^ask dirk to advance%^RESET%^". Make sure you learn some spells from Herkimer, because if you --- 37,43 ---- finding the secret room will give you experience and quest points too. (hint, there might be more than one secret room) ! Once you have enough experience and/or points, go to Dirk in the adventurers hall and "%^GREEN%^ask dirk to advance%^RESET%^". Make sure you learn some spells from Herkimer, because if you diff -c -r --new-file ds2.0r21/lib/doc/hbook/chapter07 ds2.0r28/lib/doc/hbook/chapter07 *** ds2.0r21/lib/doc/hbook/chapter07 Mon Jan 23 09:17:12 2006 --- ds2.0r28/lib/doc/hbook/chapter07 Wed Jul 5 00:01:03 2006 *************** *** 50,56 **** - Local light sources (flashlights, torches, etc) - Your race's light sensitivity - Magical effects ! - Exposure to a excessive-light event It's important to remember that a room may be too dark for you to see everything in it. You might be able to see the description --- 50,56 ---- - Local light sources (flashlights, torches, etc) - Your race's light sensitivity - Magical effects ! - Exposure to an excessive-light event It's important to remember that a room may be too dark for you to see everything in it. You might be able to see the description diff -c -r --new-file ds2.0r21/lib/doc/help/creators/admin ds2.0r28/lib/doc/help/creators/admin *** ds2.0r21/lib/doc/help/creators/admin Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/creators/admin Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,43 ---- + Dead Souls Administration + + Being a successful MUD admin is heavily dependent + on how well you can get stuff done. It also depends on + your ability to manage people, resolve conflict, articulate + direction, enforce guidelines, and inspire loyalty. + But those other things I can't help you with. What + I can help you with is having the tools you need to get + stuff done. + + Your most valuable tools will be the Dead Souls FAQs: + + http://dead-souls.net/ds-admin-faq.html + + http://dead-souls.net/ds-creator-faq.html + + Almost everything else will flow from your + familiarity and understanding of the information there. + + Navigate to the /secure/cmds/admins directory. This + is where your commands are. Know them. Understand them. + In particular, pay close attention to the command: + + admintool + + It is a valuable tool for new admins to get important + stuff done before they are 100% familiar with everything + they need. + + Finally, the intermud Dead Souls community is a + vital resource. They are (thus far) friendly and helpful, + and if the Player's Handbook, Creator's Manual, and + the (upcoming) Admin's Guide don't have the answer, use + the channel to ask for help. + + As to the qualities of leadership, determination, + humility, responsibility, fairness, and selflessness you'll + need to make a successful mud, you are on your own. + + Good luck. + + - Cratylus @ Dead Souls + 05 May 2006 diff -c -r --new-file ds2.0r21/lib/doc/help/creators/creation ds2.0r28/lib/doc/help/creators/creation *** ds2.0r21/lib/doc/help/creators/creation Mon Jan 23 09:17:12 2006 --- ds2.0r28/lib/doc/help/creators/creation Wed Jul 5 00:01:10 2006 *************** *** 16,21 **** In the meantime, take a look below at the commands in actual use, with a few added comments: ! http://dead-souls.sourceforge.net/example.html --- 16,21 ---- In the meantime, take a look below at the commands in actual use, with a few added comments: ! http://dead-souls.net/example.html diff -c -r --new-file ds2.0r21/lib/doc/help/creators/creator_general ds2.0r28/lib/doc/help/creators/creator_general *** ds2.0r21/lib/doc/help/creators/creator_general Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/creators/creator_general Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,21 ---- + Common Creator commands: + + File commands: + ------------- + cp - copy a file + mv - move or rename a file + cd - change your working directory + ls - list the contents of your directory + ed - edit a file (WARNING: if you get stuck, type a + single period on a blank line, then Q, then enter) + rm - delete a file + more - page through the contents of a file + cat - display the entire contents of a file + update - load a file into memory + + Creation commands (used on objects, not files): + ------------- + create, modify, reload, delete, add, copy + + For more information on a command, type: help + See also: help help diff -c -r --new-file ds2.0r21/lib/doc/help/players/alias ds2.0r28/lib/doc/help/players/alias *** ds2.0r21/lib/doc/help/players/alias Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/players/alias Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,28 ---- + Syntax: alias + alias $* + + This command lets you substitute a short command for a long one. + For example, rather than type out "get all from corpse" you + can create this alias: + + %^GREEN%^alias gc get all from corpse%^RESET%^ + + And all you need do is type "gc" to get the same effect. + You can also use a wildcard, like this: + + %^GREEN%^alias gc get all from $* corpse%^RESET%^ + + So that typing: %^GREEN%^gc first%^RESET%^ + Expands out to: %^GREEN%^get all from first corpse%^RESET%^ + + The wildcard is also helpful for channel aliases: + + %^GREEN%^alias ige intergossipemote $*%^RESET%^ + + To see your aliases, type: %^GREEN%^alias%^RESET%^ + + To remove an alias, type alias plus the alias, like so: + + %^GREEN%^alias gc%^RESET%^ + + diff -c -r --new-file ds2.0r21/lib/doc/help/players/channels ds2.0r28/lib/doc/help/players/channels *** ds2.0r21/lib/doc/help/players/channels Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/players/channels Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,55 ---- + Channels are an out-of-character (OOC) means for users + to communicate with each other. You may hear the terms + "channel" and "line" used interchangeably. + + There are two main types of channels: local and intermud. + The default Dead Souls distribution uses these channels as + local: + + cre - only creators hear this + gossip - general offtopic stuff + newbie - everyone can hear this unless they turn it off + thief - channel for the thief class + fighter - channel for the fighter class + error - system errors + death - death announcements + mage - channel for the thief class + priest - channel for the thief class + explorer - channel for the thief class + admin - only admins hear this + + The following are intermud channels: + + ds - Dead Souls mud code talk + ds_test - testing testing 1, 2, 3, etc + intergossip - general offtopic stuff + lpuni - LPUniversity discussion + intercre - general technical chatter + + + By default, players do not have access to intermud channels. + Mud admins are asked to maintain some level of adherence to + the channel topics from their users. Muds that violate the + router admin's interpretation of "on-topic" will be asked + politely, if possible, to conform to the channel standards. + + Continued violations subject the offending mud to potential + banning. + + Hate speech is not tolerated, and flaming is frowned + upon, though each mud is expected to police itself and + enforce these standards on their own. + + If you don't like these rules, use a router other than the default. + + For local channels of course, none of this applies. Whatever + local rules are in place, that's what must be obeyed. + + Some tips: + --------- + To turn on/off a channel, type its name by itself, like this: newbie + + To know who is listening to a channel: list newbie + + To see a brief history of channel messages: hist newbie + diff -c -r --new-file ds2.0r21/lib/doc/help/players/player_general ds2.0r28/lib/doc/help/players/player_general *** ds2.0r21/lib/doc/help/players/player_general Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/players/player_general Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,23 ---- + Basic player commands: + + look - get a view of your environment + inventory - take stock of your possessions + stat - your health and statistics + scor