diff -c -r --new-file ds2.0r23/lib/cmds/admins/mfinger.c ds2.1/lib/cmds/admins/mfinger.c *** ds2.0r23/lib/cmds/admins/mfinger.c Mon Nov 7 13:28:38 2005 --- ds2.1/lib/cmds/admins/mfinger.c Sat Jul 8 23:30:54 2006 *************** *** 53,58 **** void help() { message("help", "Syntax: \n\n" ! "Allows you to get finger information from a player's site.", this_player()); } --- 53,63 ---- void help() { message("help", "Syntax: \n\n" ! "Allows you to get finger information from a player's site.\n\n" ! "Note: In 1995, you could reliably expect a UNIX machine to cheerfully " ! "respond to a finger request. Now, more than 10 years later, everything " ! "is blocked, firewalled, and hardened. This command is all but useless, " ! "and is kept as a historical curiosity. Any \"bugs\" it contains will " ! "not be fixed.", this_player()); } diff -c -r --new-file ds2.0r23/lib/cmds/common/help.c ds2.1/lib/cmds/common/help.c *** ds2.0r23/lib/cmds/common/help.c Sat Mar 11 11:13:28 2006 --- ds2.1/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.0r23/lib/cmds/creators/colors.c ds2.1/lib/cmds/creators/colors.c *** ds2.0r23/lib/cmds/creators/colors.c Thu Apr 13 21:03:19 2006 --- ds2.1/lib/cmds/creators/colors.c Sat Jul 8 23:30:54 2006 *************** *** 6,29 **** int cmd() { write( ! "%^RED%^RED\n" ! "%^GREEN%^GREEN\n" ! "%^ORANGE%^ORANGE\n" ! "%^YELLOW%^YELLOW\n" ! "%^BLUE%^BLUE\n" ! "%^CYAN%^CYAN\n" ! "%^MAGENTA%^MAGENTA\n" ! "%^BLACK%^BLACK\n" ! "%^WHITE%^WHITE\n" ! "%^B_RED%^B_RED\n" ! "%^B_GREEN%^B_GREEN\n" ! "%^B_ORANGE%^B_ORANGE\n" ! "%^B_YELLOW%^B_YELLOW\n" ! "%^B_BLUE%^B_BLUE\n" ! "%^B_CYAN%^B_CYAN\n" ! "%^B_BLACK%^B_BLACK\n" ! "%^B_WHITE%^B_WHITE%^RESET%^\n" ! "%^B_MAGENTA%^B_MAGENTA%^RESET%^\n" ); return 1; } --- 6,33 ---- int cmd() { write( ! "%^RED%^RED\t%%^^RED%%^^\n" ! "%^GREEN%^GREEN\t%%^^GREEN%%^^\n" ! "%^ORANGE%^ORANGE\t%%^^ORANGE%%^^\n" ! "%^YELLOW%^YELLOW\t%%^^YELLOW%%^^\n" ! "%^BLUE%^BLUE\t%%^^BLUE%%^^\n" ! "%^CYAN%^CYAN\t%%^^CYAN%%^^\n" ! "%^MAGENTA%^MAGENTA\t%%^^MAGENTA%%^^\n" ! "%^BLACK%^BLACK\t%%^^BLACK%%^^\n" ! "%^WHITE%^WHITE\t%%^^WHITE%%^^\n" ! "%^B_RED%^B_RED\t%%^^B_RED%%^^\n" ! "%^B_GREEN%^B_GREEN\t%%^^B_GREEN%%^^\n" ! "%^B_ORANGE%^B_ORANGE\t%%^^B_ORANGE%%^^\n" ! "%^B_YELLOW%^B_YELLOW\t%%^^B_YELLOW%%^^\n" ! "%^B_BLUE%^B_BLUE\t%%^^B_BLUE%%^^\n" ! "%^B_CYAN%^B_CYAN\t%%^^B_CYAN%%^^\n" ! "%^B_BLACK%^B_BLACK\t%%^^B_BLACK%%^^\n" ! "%^B_WHITE%^B_WHITE\t%%^^B_WHITE%%^^\n" ! "%^B_MAGENTA%^B_MAGENTA%^RESET%^\n\n" ! "Special tags: %%^^BOLD%%^^ and %%^^FLASH%%^^ and %%^^RESET%%^^\n\n" ! "You can mix and match, for example: \n" ! "%%^^B_RED%%^^%%^^CYAN%%^^%%^^BOLD%%^^%%^^FLASH%%^^Foo!%%^^RESET%%^^:" ! "%^B_RED%^%^CYAN%^%^BOLD%^%^FLASH%^Foo!%^RESET%^" ); return 1; } diff -c -r --new-file ds2.0r23/lib/cmds/creators/margins.c ds2.1/lib/cmds/creators/margins.c *** ds2.0r23/lib/cmds/creators/margins.c Wed Dec 31 19:00:00 1969 --- ds2.1/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.0r23/lib/cmds/creators/move.c ds2.1/lib/cmds/creators/move.c *** ds2.0r23/lib/cmds/creators/move.c Wed Apr 5 19:33:16 2006 --- ds2.1/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.0r23/lib/cmds/creators/people.c ds2.1/lib/cmds/creators/people.c *** ds2.0r23/lib/cmds/creators/people.c Mon Jan 16 23:01:17 2006 --- ds2.1/lib/cmds/creators/people.c Tue Jul 11 18:30:58 2006 *************** *** 76,82 **** } screenSize = ((int*)this_player()->GetScreen())[0]; formatString = calculateFormatString(screenSize); - // 74 '-'s. bar = "--------------------------------------------------------------------------"; for(i = 75; i < screenSize; i++) bar += "-"; bar += "\n"; --- 76,81 ---- *************** *** 244,250 **** string tzone; int x, offset; - //tzone = (string)this_player()->GetTimeZone() || local_time(time())[LT_ZONE]; tzone = query_tz(); offset = (int)TIME_D->GetOffset(tzone); offset += EXTRA_TIME_OFFSET; --- 243,248 ---- diff -c -r --new-file ds2.0r23/lib/cmds/creators/polyglottize.c ds2.1/lib/cmds/creators/polyglottize.c *** ds2.0r23/lib/cmds/creators/polyglottize.c Wed Dec 31 19:00:00 1969 --- ds2.1/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.0r23/lib/cmds/creators/transfer.c ds2.1/lib/cmds/creators/transfer.c *** ds2.0r23/lib/cmds/creators/transfer.c Wed Dec 31 19:00:00 1969 --- ds2.1/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.0r23/lib/cmds/players/biography.c ds2.1/lib/cmds/players/biography.c *** ds2.0r23/lib/cmds/players/biography.c Mon Nov 7 13:28:39 2005 --- ds2.1/lib/cmds/players/biography.c Tue Jul 11 18:30:58 2006 *************** *** 93,99 **** d2 = ({}); } else { - x = x/2; d1 = deaths[0..(x-1)]; d2 = deaths[x..]; } --- 93,98 ---- *************** *** 123,129 **** col3 = npcs[(2*x)..]; } for(i=0; i= sizeof(col1)) ? "" : col1[i] + " (" + kills[col1[i]] + ")", (i >= sizeof(col2)) ? "" : --- 122,128 ---- col3 = npcs[(2*x)..]; } for(i=0; i= sizeof(col1)) ? "" : col1[i] + " (" + kills[col1[i]] + ")", (i >= sizeof(col2)) ? "" : diff -c -r --new-file ds2.0r23/lib/cmds/players/consider.c ds2.1/lib/cmds/players/consider.c *** ds2.0r23/lib/cmds/players/consider.c Thu Feb 23 15:40:40 2006 --- ds2.1/lib/cmds/players/consider.c Tue Jul 11 18:30:58 2006 *************** *** 15,21 **** if(sizeof(weapons)){ foreach(object weapon in weapons){ - //tc("skill level for "+identify(weapon)+": "+whom->GetSkill(weapon->GetWeaponType()+" attack")["level"]); if(weapon->GetWeaponType() && whom->GetSkill(weapon->GetWeaponType()+" attack")){ attack_types += ({ weapon->GetWeaponType() }); score += ( whom->GetSkill(weapon->GetWeaponType()+" attack")["level"] ) * 3; --- 15,20 ---- *************** *** 25,42 **** if(weapon->GetHands() > 1) { if(!(whom->GetSkill("multi-hand"))) score /= 3; } - //tc("weapon score: "+score); } if(sizeof(weapons) >1) { if(!(whom->GetSkill("multi-weapon"))) score /= 3; } - //tc("final weapon score: "+score); } else if((whom->GetMelee())) { if(whom->GetSkill("melee attack")) score += (((whom->GetSkill("melee attack")["level"]) * 3)); - //tc("melee score: "+score); } if(!sizeof(attack_types)) attack_types = ({"blunt"}); foreach(string Type in attack_types){ --- 24,38 ---- *************** *** 70,87 **** DamType = 0; } - //tc("protection: "+protection,"blue"); score += whom->GetStatLevel("speed") * 2; - //tc("speed score: "+score); score += whom->GetStatLevel("strength") * 3; - //tc("strength score: "+score); score += whom->GetMaxHealthPoints() / 15; - //tc("hp score: "+score); score += protection; - //tc("score plus protection: "+score); - return score; } --- 66,77 ---- *************** *** 106,120 **** theirscore = eventConsider(thing, this_player()); myscore = eventConsider(this_player(), thing); - //write("Consider complete. "); - //write("My score: "+myscore); - //write("Their score: "+theirscore); - //if(myscore >= theirscore) { - // write("You have the advantage by "+(myscore - theirscore)+" points."); - //} - //else write("They the advantage by "+(theirscore - myscore)+" points."); totalscore = myscore - theirscore; - //write("totalscore: "+totalscore); if(totalscore > 100) write("Piece of cake."); else if(totalscore > 80) write("No problem."); else if(totalscore > 60) write("Very easy."); --- 96,102 ---- diff -c -r --new-file ds2.0r23/lib/cmds/players/emote.c ds2.1/lib/cmds/players/emote.c *** ds2.0r23/lib/cmds/players/emote.c Mon Nov 7 13:28:39 2005 --- ds2.1/lib/cmds/players/emote.c Tue Jul 11 18:30:58 2006 *************** *** 33,38 **** "Places any message you specify directly after your name. For " "example, \"emote smiles.\" would have others see " "\"Descartes smiles.\". Non-avatars lose a stamina point for " ! "each emote to discourage abuse.", this_player()); } --- 33,39 ---- "Places any message you specify directly after your name. For " "example, \"emote smiles.\" would have others see " "\"Descartes smiles.\". Non-avatars lose a stamina point for " ! "each emote to discourage abuse.\n" ! "", this_player()); } diff -c -r --new-file ds2.0r23/lib/cmds/players/env.c ds2.1/lib/cmds/players/env.c *** ds2.0r23/lib/cmds/players/env.c Wed Dec 31 19:00:00 1969 --- ds2.1/lib/cmds/players/env.c Tue Jul 11 18:30:58 2006 *************** *** 0 **** --- 1,18 ---- + #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" )); + 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.0r23/lib/cmds/players/language.c ds2.1/lib/cmds/players/language.c *** ds2.0r23/lib/cmds/players/language.c Wed Apr 5 19:33:16 2006 --- ds2.1/lib/cmds/players/language.c Wed Jul 12 13:29:17 2006 *************** *** 10,16 **** FluencyMap[lang] = this_player()->GetLanguageLevel(lang); } ! write("You speak:"); foreach(string key, int val in FluencyMap){ write(capitalize(key)+" with "+val+"% proficiency."); } --- 10,20 ---- FluencyMap[lang] = this_player()->GetLanguageLevel(lang); } ! if(this_player()->GetPolyglot()){ ! write("You understand all languages with 100% proficiency."); ! } ! ! write("You speak: "); foreach(string key, int val in FluencyMap){ write(capitalize(key)+" with "+val+"% proficiency."); } diff -c -r --new-file ds2.0r23/lib/cmds/players/mudlist.c ds2.1/lib/cmds/players/mudlist.c *** ds2.0r23/lib/cmds/players/mudlist.c Tue Mar 28 23:23:40 2006 --- ds2.1/lib/cmds/players/mudlist.c Tue Jul 11 18:30:58 2006 *************** *** 66,73 **** string msg, svc; int val, comma = 0; - //tc("borg: "+identify(borg)); - mud = keys(borg)[0]; msg = "\nDetailed information on %^GREEN%^" + mud + "%^RESET%^:\n"; msg += sprintf("MUD Type: %:-6s Server: %:-20s Library: %s\n", --- 66,71 ---- *************** *** 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; --- 98,106 ---- 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.0r23/lib/cmds/players/newbie.c ds2.1/lib/cmds/players/newbie.c *** ds2.0r23/lib/cmds/players/newbie.c Wed Dec 31 19:00:00 1969 --- ds2.1/lib/cmds/players/newbie.c Wed Jul 12 13:29:17 2006 *************** *** 0 **** --- 1,18 ---- + #include + + inherit LIB_DAEMON; + + int eventNoob(){ + write("%^RED%^WHAT A NEW PLAYER SHOULD KNOW\n%^RESET%^"); + this_player()->eventPage("/doc/help/players/handbook"); + return 1; + } + + mixed cmd(string str) { + return eventNoob(); + } + + void help() { + eventNoob(); + } + diff -c -r --new-file ds2.0r23/lib/cmds/players/screen.c ds2.1/lib/cmds/players/screen.c *** ds2.0r23/lib/cmds/players/screen.c Mon Nov 7 13:28:39 2005 --- ds2.1/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.0r23/lib/cmds/players/who.c ds2.1/lib/cmds/players/who.c *** ds2.0r23/lib/cmds/players/who.c Wed Feb 22 15:29:49 2006 --- ds2.1/lib/cmds/players/who.c Wed Jul 12 20:17:44 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,33 ---- 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%^]"; ! tmp += ": "; 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); - } --- 57,59 ---- diff -c -r --new-file ds2.0r23/lib/daemon/banish.c ds2.1/lib/daemon/banish.c *** ds2.0r23/lib/daemon/banish.c Wed Apr 12 23:47:49 2006 --- ds2.1/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.0r23/lib/daemon/decay.c ds2.1/lib/daemon/decay.c *** ds2.0r23/lib/daemon/decay.c Sat Mar 11 11:13:55 2006 --- ds2.1/lib/daemon/decay.c Tue Jul 11 18:30:58 2006 *************** *** 17,24 **** corpses += find_inheritors(LIB_CORPSE); limbs += find_inheritors(LIB_LIMB); - //tc("eventDecay called. limbs: "+sizeof(limbs)+", corpses: "+sizeof(corpses)); - limbs->eventDecay(); corpses->eventDecay(); --- 17,22 ---- diff -c -r --new-file ds2.0r23/lib/daemon/help.c ds2.1/lib/daemon/help.c *** ds2.0r23/lib/daemon/help.c Mon Jan 23 09:03:35 2006 --- ds2.1/lib/daemon/help.c Tue Jul 11 18:30:59 2006 *************** *** 255,261 **** } if( !sizeof(syn) ) { if( function_exists("help", load_object(file)) ) { - //Error = "This help may be out of date."; Error = " "; file->help(); return 0; --- 255,260 ---- *************** *** 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; --- 437,443 ---- help = "Index: %^GREEN%^" + index + "%^RESET%^\n" + "Topic: %^GREEN%^" + topic + "%^RESET%^\n\n" + help; if( file_exists(DIR_RACE_HELP + "/" + topic) ) ! return help; } Error = "No such race exists."; return 0; diff -c -r --new-file ds2.0r23/lib/daemon/intermud.c ds2.1/lib/daemon/intermud.c *** ds2.0r23/lib/daemon/intermud.c Wed Apr 12 23:47:49 2006 --- ds2.1/lib/daemon/intermud.c Tue Jul 11 18:30:59 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; *************** *** 88,94 **** return; } switch(packet[0]) { - //default : tc("Packet: "+identify(packet)); case "startup-reply": log_file("intermud",identify(packet)); tn("INTERMUD_D: "+identify(packet),"red"); --- 103,108 ---- *************** *** 120,126 **** } if( packet[6] == MudList->ID ) { tn("We don't like packet element 6. It is: "+identify(packet[6]),"red"); - //return; tn("We will continue anyway.","red"); } if( packet[2] != Nameservers[0][0] ) { --- 134,139 ---- *************** *** 163,169 **** SERVICES_D->eventReceiveChannelUserRequest(packet); break; case "chanlist-reply": ! // if( packet[6] == ChannelList->ID ) return; if( packet[2] != Nameservers[0][0] ) return; ChannelList->ID = packet[6]; foreach(cle, val in packet[7]) { --- 176,182 ---- SERVICES_D->eventReceiveChannelUserRequest(packet); break; case "chanlist-reply": ! 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.0r23/lib/daemon/races.c ds2.1/lib/daemon/races.c *** ds2.0r23/lib/daemon/races.c Mon May 22 11:34:50 2006 --- ds2.1/lib/daemon/races.c Tue Jul 11 18:30:59 2006 *************** *** 154,162 **** mixed array tmp_limb = allocate(4); class Stat s; - //tc("hello."); - //tc("hellow"); - res = new(class Race); res->Resistance = ([]); --- 154,159 ---- *************** *** 168,174 **** if( !file_exists(file) ) error("No such file: " + file); race = last_string_element(file,"/"); - //tc("race: "+race); lines = explode(read_file(file), "\n"); --- 165,170 ---- *************** *** 189,220 **** foreach(string line in explode(read_file(file),"\n")){ - //tc("line: "+line,"red"); - //tc("first_string_element: "+first_string_element(line," "),"green"); test_string = first_string_element(line," "); if(!test_string || !sizeof(test_string)) test_string = line; - //tc("test_string: "+test_string,"green"); - switch(test_string){ case "FLYINGRACE": - //tc("flying","red"); SetFlyingRace(race); break; case "LIMBLESSRACE": - //tc("limbless","red"); SetLimblessRace(race); break; case "LIMBLESSCOMBATRACE": - //tc("limblesscombat","red"); SetLimblessCombatRace(race); break; case "NONBITINGRACE": - //tc("nonbiting","red"); SetNonBitingRace(race); break; --- 185,208 ---- *************** *** 237,243 **** //TODO: This should be a Language array to handle multiple //languages but further research is required first. res->Language = replace_string(line, "LANGUAGE ", ""); - //tc("res->Language "+res->Language,"blue"); break; case "RESISTANCE": --- 225,230 ---- *************** *** 249,255 **** case "SKILL": tmp = explode(replace_string(line, "SKILL ", ""), ":"); - //tc("tmp: "+identify(tmp)); res->Skills[tmp[0]] = ({ tmp[1], tmp[2], tmp[3], tmp[4] }); break; --- 236,241 ---- *************** *** 257,274 **** tmp = ({}); s = new (class Stat); tmp = explode(replace_string(line, "STATS ",""), ":"); - //tc("stat: "+identify(tmp),"yellow"); s->Average = copy(to_int(tmp[1])); s->Class = copy(to_int(tmp[2])); res->Stats[tmp[0]] = s; - //tc("ihnfcaa: "+(res->Stats[tmp[0]])->Average,"yellow"); - //tc("ihnfcaax2: "+(res->Stats[tmp[0]])->Class,"yellow"); break; case "LIMB": limb = ({ ({}), ({}), ({}), ({}) }); tmp_limb = explode(replace_string(line, "LIMB ",""), ":"); - //tc("tmp_limb: "+identify(tmp_limb),"cyan"); limb[0] = tmp_limb[0]; limb[1] = (tmp_limb[1] == "0" ? 0 : tmp_limb[1]); limb[2] = to_int(tmp_limb[2]); --- 243,256 ---- *************** *** 277,283 **** if( x == 0 && str != "0" ) { return GetArmor(str); } return x; }); - //tc("limb: "+identify(limb),"green"); res->Limbs = ({ res->Limbs..., limb }); res->Limbs += ({limb}); --- 259,264 ---- *************** *** 293,300 **** } } - //tc("ok then.","blue"); - res->Complete = 1; if( player ) { --- 274,279 ---- *************** *** 307,322 **** Races[race] = res; wtf = save_variable(Races[race]); - //tc("wtf: "+identify(wtf),"yellow"); save_object(SAVE_RACES); } void RemoveRace(string race) { validate(); wtf = save_variable(Races[race]); - //tc("wtf: "+identify(wtf),"yellow"); map_delete(Races, race); ! if(Races[race]) //tc("wtf: "+identify(wtf),"blue"); save_object(SAVE_RACES); } --- 286,299 ---- Races[race] = res; wtf = save_variable(Races[race]); save_object(SAVE_RACES); } void RemoveRace(string race) { validate(); wtf = save_variable(Races[race]); map_delete(Races, race); ! if(Races[race]) save_object(SAVE_RACES); } *************** *** 419,437 **** tmp = ({ tmp..., ({ key, val }) }); args[0] = tmp; tmp = ({}); - //foreach(string key, class Stat stat in res->Stats){ StatMap = copy(res->Stats); schluss = ""; foreach(schluss in keys(StatMap)){ - //tc("key: "+identify(StatMap[schluss]),"green"); - //tc("Average: "+identify(StatMap[schluss]->Average),"green"); - //tc("Class: "+identify(StatMap[schluss]->Class),"green"); tmp = ({ tmp..., ({ schluss, StatMap[schluss]->Average, StatMap[schluss]->Class }) }); - //tc("SetCharacterRace: "+identify(tmp)); } args[1] = tmp; args[2] = res->Language; - //args[3] = ({ res->Sensitivity[0], res->Sensitivity[1] }); args[3] = res->Sensitivity; args[4] = res->Skills; } --- 396,408 ---- diff -c -r --new-file ds2.0r23/lib/daemon/reaper.c ds2.1/lib/daemon/reaper.c *** ds2.0r23/lib/daemon/reaper.c Mon Jan 23 09:18:51 2006 --- ds2.1/lib/daemon/reaper.c Wed Jul 12 21:34:24 2006 *************** *** 13,18 **** --- 13,19 ---- call_out((: eventReap :), 300); reap_dummies(); + reap_other(); } static void create() { diff -c -r --new-file ds2.0r23/lib/daemon/services/channel.c ds2.1/lib/daemon/services/channel.c *** ds2.0r23/lib/daemon/services/channel.c Thu Jun 1 23:22:23 2006 --- ds2.1/lib/daemon/services/channel.c Tue Jul 11 18:30:59 2006 *************** *** 211,217 **** } int RemoveChannel(string channel) { - //if( !((int)master()->valid_apply( ({}) )) ) return 0; tn("RemoveChannel: "+identify(channel),"green"); if( member_array(channel, (string array)INTERMUD_D->GetChannels()) == -1 ){ --- 211,216 ---- diff -c -r --new-file ds2.0r23/lib/daemon/services/who.c ds2.1/lib/daemon/services/who.c *** ds2.0r23/lib/daemon/services/who.c Mon May 22 11:34:50 2006 --- ds2.1/lib/daemon/services/who.c Tue Jul 11 18:30:59 2006 *************** *** 13,26 **** 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"); } --- 13,23 ---- *************** *** 45,51 **** 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"); } --- 42,48 ---- 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.0r23/lib/daemon/stargate.c ds2.1/lib/daemon/stargate.c *** ds2.0r23/lib/daemon/stargate.c Mon May 22 11:34:50 2006 --- ds2.1/lib/daemon/stargate.c Tue Jul 11 18:30:59 2006 *************** *** 27,50 **** 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"; --- 27,45 ---- *************** *** 55,139 **** } 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; --- 50,118 ---- diff -c -r --new-file ds2.0r23/lib/daemon/verbs.c ds2.1/lib/daemon/verbs.c *** ds2.0r23/lib/daemon/verbs.c Wed Feb 22 15:29:50 2006 --- ds2.1/lib/daemon/verbs.c Sun Jul 9 19:04:26 2006 *************** *** 23,29 **** string verb; int i; - //tc("/daemon/verbs: eventReloadVerbs"); if( arrayp(val) ) verbs = filter(val, (: GetValidVerb($1) :)); else if( stringp(val) ) { if( strlen(val) > 2 && val[<2..] == ".c" ) val = val[0..<3]; --- 23,28 ---- *************** *** 51,56 **** --- 50,63 ---- break; } } + foreach(dir in get_dir(DIR_SECURE_VERBS + "/")) { + dir = DIR_SECURE_VERBS + "/" + dir; + if( file_size(dir) != -2 ) continue; + if( file_exists( dir + "/" + val + ".c") ) { + verbs = ({ dir + "/" + val }); + break; + } + } if( !verbs ) return; } } *************** *** 64,69 **** --- 71,81 ---- if( file_size(dir) == -2 ) verbs += map(get_dir(dir + "/*.c"), (: $(dir) + "/" + $1 :)); } + foreach(dir in get_dir(DIR_SECURE_VERBS + "/")) { + dir = DIR_SECURE_VERBS + "/" + dir; + if( file_size(dir) == -2 ) + verbs += map(get_dir(dir + "/*.c"), (: $(dir) + "/" + $1 :)); + } } i = 0; foreach(verb in verbs) { *************** *** 87,101 **** } string GetErrorMessage(string verb) { - //tc("/daemon/verbs: GetErrorMessage"); if( !Verbs[verb] ) return 0; else return (string)Verbs[verb]->GetErrorMessage(); } int GetValidVerb(string verb) { ! //tc("/daemon/verbs: GetValidVerb: verb: "+verb); ! return !strsrch(verb, DIR_VERBS); ! //key_arr = keys(GetVerbs()); } mapping GetVerbs() { return copy(Verbs); } --- 99,111 ---- } string GetErrorMessage(string verb) { if( !Verbs[verb] ) return 0; else return (string)Verbs[verb]->GetErrorMessage(); } int GetValidVerb(string verb) { ! if(!strsrch(verb, DIR_VERBS) || !strsrch(verb, DIR_VERBS)) return 1; ! else return 0; } mapping GetVerbs() { return copy(Verbs); } diff -c -r --new-file ds2.0r23/lib/doc/CREDITS ds2.1/lib/doc/CREDITS *** ds2.0r23/lib/doc/CREDITS Mon May 15 11:27:29 2006 --- ds2.1/lib/doc/CREDITS Wed Jul 12 20:17:44 2006 *************** *** 3,26 **** 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, Alensin, Daelas, ! and Detah for their thoughtful comments and suggestions. ! Also: Xyzzy He Is Cool Cratylus @ Dead Souls ! 04 Jan 2006 ! updated May 2006 --- 3,33 ---- 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, Root, ! Kristus, Zeus, Dastuun, Detah, and Nulvect for their thoughtful comments and suggestions. ! * Thanks to Frostmud.com for letting me test on their box. ! * Thanks to Wolfpaw.com for letting me test on their box. ! ! ! Much gratitude to playtesters: Karri, Aten, Tacitus, Kaatil, Atomic, Daelas. + Also: Xyzzy He Is Cool Cratylus @ Dead Souls ! July 2006 diff -c -r --new-file ds2.0r23/lib/doc/README ds2.1/lib/doc/README *** ds2.0r23/lib/doc/README Mon Jan 23 09:17:12 2006 --- ds2.1/lib/doc/README Wed Dec 31 19:00:00 1969 *************** *** 1,53 **** - The Dead Souls Mud Library - Released 18 December 2005 - - UPGRADE NOTE: If you are upgrading from an older version of - Dead Souls, you have to copy your old /secure/cfg/mudos.cfg somewhere - 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 - the responsibility for getting you up and running, or fixing bugs. - This code is available to you as-is. - - Some years ago, Descartes @ Nightmare chose to retire his - Nightmare mudlib from distribution. Despite various disputes over - the years, this embargo has stood quite firm. Yet some folks felt - that it was a fine lib, and many were sorry to see it go. - - 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. - - Have fun! - - - Cratylus @ Frontiers - 18 December 2005 --- 0 ---- diff -c -r --new-file ds2.0r23/lib/doc/RELEASE_NOTES ds2.1/lib/doc/RELEASE_NOTES *** ds2.0r23/lib/doc/RELEASE_NOTES Thu Jun 1 23:22:23 2006 --- ds2.1/lib/doc/RELEASE_NOTES Wed Jul 12 13:29:17 2006 *************** *** 1,4 **** ! ---- 2.0r23 (unreleased) --- - 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. --- 1,152 ---- ! ---- 2.1 --- ! - Fixed relative include problem in QCS. ! - Fixed memcheck. ! - Added vis and invis to list of customizable messages with the ! message command. ! - Fixed bug in ls command with the -b flag. ! - Fixed index problems in chat.c with class channels. ! - Fixed a problem when looking at dummy items (e.g. buttons and doors). ! - Fixed color code problem in the arch room screen. ! - Fixed problem in look verb that caused problems looking at ! objects that inherit LIB_DUMMY. Tons of thanks to Daelas for this save. ! - Unused debug lines removed, general cleanup of ugly ! or unnecessary comments. ! - Miscellaneous tightening up of domain objects such as lowering ! the max health of newts, etc. ! - Miscellaneous tidying up of lib logic, such as preventing the ! fly command to commence flight whether already flying or not. ! - KNOWN ISSUES: ! o The blackjack table is officially on the "I'm not fixing it" list. ! It is left as an example of game code, but you are warned that ! it contains some subtle and not-so-subtle errors in its calculations. ! o addr_server.exe win32 binary removed, due to bugginess. Since ! it hasn't been working for a while, and it was only noticed by ! a bugtester, it's going away until post-2.1 ! o A peculiarity in grammar with multiple corpses can be seen. This is ! partly due to a MudOS idiosyncracy which will be addressed in the future. ! o In some cases combat events appear slighly out of order. This ! will be addressed in a rewrite of combat objects in the future. ! ! ---- 2.0r29 --- ! - Fixed finger daemon to not display ip addresses to players. ! - The verb copy now handles relative paths more gracefully. ! - LIB_TEACHER can now know all languages with SetAllLanguages(1) ! - Standard chairs and beds can no longer be taken when someone is using them. ! - Fixed church elevator buttons. ! - Fixed problem with "look at pile". ! - Fixed problem with examining objects on surfaces. ! - It is now also possible to look at things carried by others, ! e.g. "look at shirt on fighter". ! - Remote finger no longer betrays invisible people. ! - Added sefun: alpha_strip ! - Room descriptions now indicate which piece of furniture a creature ! is resting on, if applicable. ! - Objects on surfaces than can be sat or lain in are not visible ! or accessible if someone is lying or sitting on that surface. e.g., ! you can't examine or get the glasses under your butt on the chair. ! - SetMaxHealthPoints now works as one would expect. The kitchen rat ! is invincible no more. ! - Look at problem fixed. ! - Bank tellers (Zoe) now do a better job of retaining the correct ! surcharge on currency withdrawals. ! - Added /secure/obj/glasses.c as a creation object. Since you wear them, ! it's hard to lose them accidentally. Since few things are called "glasses", ! they won't get in the way of creating objects. New creators will have them ! automatically added to the table in their sample room. ! - One may now have a smiley in front of a channel message without ! it turning into an emote. ! - Fixed a conflict in the parsing system. ! - Verbified "force". ! - Fixed vendor bugs: appraising at zero, confusion with similar items. ! - Beefed up the answers_to sefun, to handle adjectives. ! - Fixed a couple of bugs in the lead/follow system. ! - Fixed null error when selling to non-vendors. ! - Fixed a channel log bug that logged to one of two files for ! some channels, depending on whether someone was logged on (!!). ! - Fixed bug in meals that prevented empty bottles replacing ! full ones. ! - Fixed a bug in the MudOS parser that screwed up things with apostrophes. ! ! ---- 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. diff -c -r --new-file ds2.0r23/lib/doc/SUPPORT ds2.1/lib/doc/SUPPORT *** ds2.0r23/lib/doc/SUPPORT Mon Jan 23 09:17:12 2006 --- ds2.1/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.0r23/lib/doc/faq/admin ds2.1/lib/doc/faq/admin *** ds2.0r23/lib/doc/faq/admin Sat Mar 11 11:22:47 2006 --- ds2.1/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.0r23/lib/doc/faq/general ds2.1/lib/doc/faq/general *** ds2.0r23/lib/doc/faq/general Sat Mar 11 11:22:47 2006 --- ds2.1/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.0r23/lib/doc/guide/chapter05 ds2.1/lib/doc/guide/chapter05 *** ds2.0r23/lib/doc/guide/chapter05 Thu Jun 1 23:22:23 2006 --- ds2.1/lib/doc/guide/chapter05 Wed Jul 5 00:01:03 2006 *************** *** 1,346 **** ! chapter 5 "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.sourceforge.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. --- 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.0r23/lib/doc/guide/chapter06 ds2.1/lib/doc/guide/chapter06 *** ds2.0r23/lib/doc/guide/chapter06 Mon May 22 11:34:50 2006 --- ds2.1/lib/doc/guide/chapter06 Wed Jul 5 00:01:03 2006 *************** *** 1,111 **** ! chapter 6 "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.sourceforge.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. --- 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.0r23/lib/doc/guide/chapter08 ds2.1/lib/doc/guide/chapter08 *** ds2.0r23/lib/doc/guide/chapter08 Mon May 22 11:34:50 2006 --- ds2.1/lib/doc/guide/chapter08 Wed Jul 5 00:01:03 2006 *************** *** 1,50 **** ! chapter 8 "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 lib, and as a lib coder, it isn't ! my business to interfere with that. --- 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.0r23/lib/doc/hbook/chapter04 ds2.1/lib/doc/hbook/chapter04 *** ds2.0r23/lib/doc/hbook/chapter04 Sat Mar 11 11:14:53 2006 --- ds2.1/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.0r23/lib/doc/help/creators/admin ds2.1/lib/doc/help/creators/admin *** ds2.0r23/lib/doc/help/creators/admin Fri May 12 21:13:22 2006 --- ds2.1/lib/doc/help/creators/admin Wed Jul 5 00:01:10 2006 *************** *** 10,18 **** Your most valuable tools will be the Dead Souls FAQs: ! http://dead-souls.sourceforge.net/ds-admin-faq.html ! http://dead-souls.sourceforge.net/ds-creator-faq.html Almost everything else will flow from your familiarity and understanding of the information there. --- 10,18 ---- 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. diff -c -r --new-file ds2.0r23/lib/doc/help/creators/creation ds2.1/lib/doc/help/creators/creation *** ds2.0r23/lib/doc/help/creators/creation Mon Jan 23 09:17:12 2006 --- ds2.1/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.0r23/lib/doc/help/creators/creator_general ds2.1/lib/doc/help/creators/creator_general *** ds2.0r23/lib/doc/help/creators/creator_general Wed Dec 31 19:00:00 1969 --- ds2.1/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.0r23/lib/doc/help/creators/force ds2.1/lib/doc/help/creators/force *** ds2.0r23/lib/doc/help/creators/force Wed Dec 31 19:00:00 1969 --- ds2.1/lib/doc/help/creators/force Tue Jul 11 18:36:11 2006 *************** *** 0 **** --- 1,4 ---- + Syntax: + + Allows you to command some living things to do + your bidding. diff -c -r --new-file ds2.0r23/lib/doc/help/creators/plan ds2.1/lib/doc/help/creators/plan *** ds2.0r23/lib/doc/help/creators/plan Wed Dec 31 19:00:00 1969 --- ds2.1/lib/doc/help/creators/plan Fri Jul 7 19:41:41 2006 *************** *** 0 **** --- 1,7 ---- + Your plan file is the extra information others see when + they finger you, usually listing what your projects are + and what you've been up to. To modify your plan, + edit the .plan file in your home directory. For example, + + cd + ed .plan diff -c -r --new-file ds2.0r23/lib/doc/help/creators/profile ds2.1/lib/doc/help/creators/profile *** ds2.0r23/lib/doc/help/creators/profile Wed Dec 31 19:00:00 1969 --- ds2.1/lib/doc/help/creators/profile Fri Jul 7 19:41:41 2006 *************** *** 0 **** --- 1,11 ---- + Your profile is a file that contains a list of + instructions. When you log in, the mud will force + you to execute those commands. To modify what those + "startup commands" are, edit the .profile file in + your home directory. For example: + + cd + ed .profile + + Note that the mud cannot force you to do + certain things as a security measure. diff -c -r --new-file ds2.0r23/lib/doc/help/players/alias ds2.1/lib/doc/help/players/alias *** ds2.0r23/lib/doc/help/players/alias Wed Dec 31 19:00:00 1969 --- ds2.1/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.0r23/lib/doc/help/players/channels ds2.1/lib/doc/help/players/channels *** ds2.0r23/lib/doc/help/players/channels Wed Dec 31 19:00:00 1969 --- ds2.1/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.0r23/lib/doc/help/players/credits ds2.1/lib/doc/help/players/credits *** ds2.0r23/lib/doc/help/players/credits Wed Dec 31 19:00:00 1969 --- ds2.1/lib/doc/help/players/credits Tue Jul 11 18:36:11 2006 *************** *** 0 **** --- 1,37 ---- + I'd like to thank the following people for their help, witting or + otherwise, in making the new release of Dead Souls possible: + + 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, Root, + Kristus, Zeus, Dastuun, Detah, and Nulvect for their + thoughtful comments and suggestions. + Thanks to Frostmud.com for letting me test on their box. + + Much gratitude to playtesters: Karri, Aten, Tacitus, Kaatil, Atomic. + + Also: Xyzzy He Is Cool + + The following people/organizations provided me with free products/services + they normally charge for that allowed me to complete this project: + - Wolfpaw http://wolfpaw.net/ + - Sun Microsystems http://www.sun.com + Note: This does not indicate an official corporate sponsorship of + any kind. It is simply charity that is well appreciated. + + Cratylus @ Dead Souls + July 2006 + diff -c -r --new-file ds2.0r23/lib/doc/help/players/handbook ds2.1/lib/doc/help/players/handbook *** ds2.0r23/lib/doc/help/players/handbook Wed Dec 31 19:00:00 1969 --- ds2.1/lib/doc/help/players/handbook Wed Jul 12 13:29:17 2006 *************** *** 0 **** --- 1,838 ---- + chapter 1 "Introduction" + + If you are unfamiliar with LPC based muds in general or Dead Souls + mudlib in particular, you will find this handbook valuable in + orienting you around what you can do and how you can do it. + + Keep in mind that this handbook describes the features of a mud + running an unmodifed version of the lib. The mud you are on may + differ somewhat, though probably not extremely so. + + To advance a page in a chapter, just hit "return". + + Let's start with just navigating this book. Once you are done + reading this chapter, you can read the next chapter by typing: + + %^GREEN%^read chapter 2 in handbook%^RESET%^ + + Make sure you wait until you are done reading this chapter, + though. The reason you should wait is that you are now in "reading + mode", which means that anything you type and send to the mud + is actually a command to the editing system that is displaying this + text. + + To leave reading mode (or more accurately, pager, or ed mode) + you can hit "return" a bunch of times to complete the chapter, thus + automatically exiting the pager. Another way is to enter the + letter "q" (without the quotes) and then "return". That will also + make you stop reading. + + When you are not in reading mode, you can find out the chapter + titles by typing: + + %^GREEN%^read index in handbook%^RESET%^ + + You really should read the whole thing, but in case you don't, the + chapter titles will help as a reference to find the information you + need. + + Something to watch out for is that if you or your environment + contain another handbook, the mud may not know which one you are + trying to read. If you get a message like "Which of the two handbooks + would you like to read?", you can try one or more of the following: + + %^GREEN%^read index in first handbook%^RESET%^ + + %^GREEN%^read index in my handbook%^RESET%^ + + %^GREEN%^read index in my first player handbook%^RESET%^ + + + \n + chapter 2 "Command Syntax: Doing Stuff" + + + Section 1: Manipulating Objects + ---------- + + You've already noticed that Dead Souls, like most modern LP muds, + uses natural-like command syntax, like: + + %^GREEN%^read first handbook%^RESET%^ + + rather than: + + %^GREEN%^read handbook 1%^RESET%^ + + This is because Dead Souls uses a natural language parser. It isn't + perfect, of course. If you try to "put all apples from box in my bag after + opening them" you won't see much success, but this will work: + + %^GREEN%^open box%^RESET%^ + + %^GREEN%^open bag%^RESET%^ + + %^GREEN%^get apples from box%^RESET%^ + + %^GREEN%^put apples in bag%^RESET%^ + + The parser will understand "the first box" or "my second bag", + assuming those objects exist in your inventory or in your environment. + + If you want to know what is in the box, the command is: + + %^GREEN%^look in box%^RESET%^ + + The command "look at box" or "examine box" will usually *not* show + you the contents of that box. This is because normally, boxes are + opaque, and in the real world, just looking at a box is rarely enough + to see what it contains as well. + An exception to this rule are transparent containers (a glass + trophy case, perhaps) whose interior is always visible from the + outside. + + Sometimes looking at an object reveals its contents because of + the nature of the object. A table, for example, can have things on it, + and typing: + + %^GREEN%^look at table %^RESET%^ + + ...will usually let you know what is on it. It is also possible to + see what other players are carrying by just looking at them, + unless what they have is inside a container. + You'll want to remember that while you can "put apple in bag", + if you want to put that apple on a surface like a table, you'll + need to: + + %^GREEN%^put apple on table%^RESET%^ + + You can give things to people, and they will automatically + accept them. However, you may not "take" or "get" things from living + beings. It's theirs, and it's up to them if they want to share. + You can try to "steal sword from fighter" if you dare, but unless + you have trained a lot, this is unlikely to succeed. We'll talk + more about training and skills in a later chapter. + Naturally you may also drop things you no longer need, though + it's nicer to your fellow mudders (and the mud's memory) to put + them in recycling bins so the bits can be reused. + Some other common object manipulation commands are: + + close, donate, attack, eat, drink, listen, smell, search, + shoot, touch, turn. + + There are many others you may find useful, but these will be + the ones you use most often to handle simple objects. + + * A note about articles: + + Dead Souls understands both definite and indefinite articles. + This means that you can refer to a specific apple, like so: + + %^GREEN%^get the apple%^RESET%^ + + But you can also be unspecific. If there are a dozen + apples in a crate and you don't care which one you pick up: + + %^GREEN%^get an apple from the crate%^RESET%^ + + + Section 2: Navigation + --------- + + Moving around here is probably much like any other mud. You + can expect to move mostly in cardinal directions (like north and + northwest), but you may sometimes need to go up, down, or out. + Strictly speaking, the way to do this is: + + %^GREEN%^go south%^RESET%^ + + %^GREEN%^go out%^RESET%^ + + ...and so on, but this can get tedious after a while. Instead + of having to type in "go" plus the entire direction, the mud allows + you to enter shortcuts like "sw" for "go southwest" or "u" for + "go up". + + When you enter a room, very often you will see letters in + brackets above the room description, like this: [n, u, out] + These are the "obvious exits" of that room, and help you + quickly find your way around without having to go through each + description. But remember! Just because a room has obvious exits + doesn't mean those are the only exits. Sometimes a room must + be searched to discover an exit, or there may be an exit available + that just doesn't happen to be very obvious. + If a room is dark, obvious exits may not be visible at all. + + Aside from those ordinary means of travel, there are situations + that require more specific locomotion than just "go". These are + examples of the use of some other commands to get around: + + %^GREEN%^jump onto road%^RESET%^ + + %^GREEN%^enter window%^RESET%^ + + %^GREEN%^climb ladder%^RESET%^ + + %^GREEN%^crawl east%^RESET%^ (if you are lying down and can't get up) + + %^GREEN%^fly up%^RESET%^ + + %^GREEN%^follow thief%^RESET%^ + + %^GREEN%^evade hunter%^RESET%^ + + + Section 3: Armor + ------- + + Now that you can manipulate objects and move around, you'll want + to be able to defend yourself, should the need arise. The special + object categories of "weapons" and "armor" should help. + + Armor is an item that can be worn. That means that a pair of + blue jeans is considered armor, and a suit of chainmail is considered + armor as well. Basically, if you can wear it, it's "armor", because + whether it's a lot or a little, it protects you. + Assuming you are humanoid, you have the following limbs: + + head, neck, torso, right arm, right hand, left arm, + left hand, right leg, right foot, left leg, left foot. + + Properly coded armor must be worn on the corect limbs. Usually + a command like: + + %^GREEN%^wear chainmail%^RESET%^ + + or + + %^GREEN%^wear all%^RESET%^ + + ...will cause you to automatically wear armor where it makes + most sense. However, it is possible to find armor that, + for example, can be worn either on your neck or your torso, like + 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 + hands but not the other. Sometimes you will find shoes, or gloves + that don't care which appendage they occupy, but usually these + are simply incorrectly coded. + + If you are of some exotic or non-humanoid race, you may have + additional limbs to consider, and humanoid armor may not work for you. + + + Section 4: Weapons + --------- + + You may be surprised to learn that almost any manipulable object + can be wielded as a weapon, or thrown as a missile. You can wield + a can of Spam and try to kill an orc with it...and you may even succeed, + if you are strong and tough enough. Don't count on it, though, + and instead go for items that are made specifically with personal + security in mind. + + 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, + like staves or pikes, may require the use of both hands. If this + is the case, wearing a shield may not be possible at the same time. + Like armor, weapons differ in quality and effectiveness. A + "well-crafted sword" is probably a better choice than a "small + rusty knife", but then again, you never know. Maybe rusty knives + are exactly what some monster is most vulnerable to. + + Note also that, like armor, weapons wear down with use. + Examples of commands that involve weapons or fighting: + + %^GREEN%^wield sword%^RESET%^ + + %^GREEN%^wield hammer in left hand%^RESET%^ + + %^GREEN%^wield staff in left hand and right hand%^RESET%^ + + %^GREEN%^unwield dagger%^RESET%^ + + %^GREEN%^shoot gun at otik%^RESET%^ + + %^GREEN%^throw dart at beggar%^RESET%^ + + %^GREEN%^kill all%^RESET%^ (this makes an enemy of everyone in the room) + + %^GREEN%^ignore first orc%^RESET%^ (lets you concentrate on the other orcs) + + %^GREEN%^ignore all%^RESET%^ (don't fight anyone in the room, even if they are attacking you) + + %^GREEN%^target boss orc%^RESET%^ (this makes you ignore attacks from anyone else) + + %^GREEN%^wimpy 30%^RESET%^ (this makes you run away if your health points drop below 30%) + + + Section 5: Miscellaneous Things to to with Things + --------- + + %^GREEN%^turn on flashlight%^RESET%^ + + %^GREEN%^turn off flashlight%^RESET%^ + + %^GREEN%^strike match%^RESET%^ + + %^GREEN%^light torch with match%^RESET%^ + + %^GREEN%^extinguish match%^RESET%^ + + %^GREEN%^dig hole with shovel%^RESET%^ + + %^GREEN%^move bed%^RESET%^ + + %^GREEN%^search %^RESET%^ (by default searches the room) + + %^GREEN%^search rocks%^RESET%^ + + %^GREEN%^unlock east door with silver key%^RESET%^ + + %^GREEN%^bait pole with worm%^RESET%^ + + %^GREEN%^fish with pole%^RESET%^ + + %^GREEN%^stop fishing%^RESET%^ + + %^GREEN%^drop all%^RESET%^ + + %^GREEN%^donate 2 silver%^RESET%^ + + %^GREEN%^get all%^RESET%^ + + %^GREEN%^get all from corpse%^RESET%^ + + %^GREEN%^sell first right glove to otik%^RESET%^ + + %^GREEN%^sell all to otik%^RESET%^ + + %^GREEN%^buy sword from otik%^RESET%^ + + %^GREEN%^buy 8 from otik%^RESET%^ (get Otik to sell you item number 8) + + chapter 3 "Your Health and Abilities" + + In the previous chapter you learned the basics of getting + around and taking care of yourself. It's important also to care + *for* yourself, and this chapter describes the various aspects of + your body's state and what abilities you may have. + + + The command that tells you almost everything you need to + know is "stat". This diplays a whole lot of stuff, perhaps some of + it completely unfamiliar. Let's start at the top, using my output + as an example. + + First line: + ---------- + %^CYAN%^Cratylus aka Cratylus the unaccomplished, level 10 male human Explorer%^RESET%^ + + Here you see my short name, my name with title, my level, my + gender, my race, and my class. Let's go over each. + + * short name: What a person would use to address you. "look at cratylus", + for example. + + * name with title: This displays my title. Creators can have whatever title + they want. Players can only have the titles they earn. As a player, a + title is usually earned when you are promoted a level or complete a + quest, though it is not always so on every mud. + + * level: This is a measure of your overall experience, expertise, and + all-around game status. Being promoted a level means your skills, + health, and vital statistics increase. This often means you can handle + tougher monsters, for example, or tackle more challenging quests, learn + new spells, and so on. + + * gender: This has no effect on your status. It is a cosmetic feature + of your body that is only useful to you in the social context of your + fellow mud players. + + * race: In Dead Souls, race has nothing to do with your local genetic + makeup on planet Earth. In the mud, "race" refers to what one typically + would call "species" in real-life. An example of a race other than human + might be "orc" or "feline". Not all races are available for players. Once + you have chosen a race to play, it is in theory possible to change it, but + there is a nonzero chance you'll hose up your player file and lose your + character forever. Besides, it's up to your local admins whether race + changing is permitted on your mud. Different races have different + abilities. Elves see better in darkness, for example. Orcs are stronger + than some other humanoids, but dumber, too (which does affect gameplay). + + * class: This can be considered an occupational specialty. In the real + world you have plumbers, doctors, soldiers, etc. In the mud world, + we can have explorers, fighters, mages, and the like. Each class brings + its own unique advantages and disadvantages to your gameplay. A fighter + can really kick more butt in melee combat than a mage, but a mage + gets to cast powerful spells. Explorers are a middle of the road class + that gives you a bit of everything without specializing in anything. + + + + Next line: + ---------- + + %^CYAN%^Alive / Awake%^RESET%^ + + It is indeed possible for your virtual body to cease life functions. + When this happens your spirit speeds off to the land of the dead, + where you drift until you decide to "regenerate" and regain your + physical form. Except for some special magical items, anything you + were carrying when you died is with that dead body, so it's a good + idea to rush your new body back to the scene of the fatality and get + your stuff back before someone else grabs it. Death is not only + inconvenient, it also incurs major penalties on your statistics, so it + should be avoided. + It is also possible to sleep. If you are drunk and asleep, your + injuries will heal more quickly. It's magic, don't worry about the + logic behind it. + If you are attacked while sleeping, you will wake up. You can + force yourself awake, too, but it's a bit tedious. + + + Next line: + --------- + + %^CYAN%^Health: 350/350 Magic: 560/560 Stamina: 400/400 Carry: 1184/1300%^RESET%^ + + In each case, the number on the left of the slash indicates the + current level, and the number on the right indicates what the maximum is. + + health: When I am 100% healthy, I have a total of 350 hp. If my hp ever + reach 0 or less (!), I die. Poison and illness can cause hp's to + gradually decrease, and although with time my hp's will normally + return to 350 as I heal, poison and illness can slow down that healing + or even cause me to die. Injury in combat is the most common source + of hp loss, though spells, falls, and other adverse events can cause + you injury or death. + + magic: I cast magic missile! Spell casting takes a toll on your magical + abilities, and mp measure how much magic you've got left in you at + any given point. Like hp, mp gradually grow back to your max if you + avoid spellcasting for a while. + + stamina: Fighting is tough work, and swinging around swords while + getting bashed with hammers really takes a lot out of a guy. Therefore + keep an eye on this stat while you're fighting, because if it gets too + low you will collapse and be unable to do anything for a while. + + carry: Objects have mass, and your body is of limited size and strength. + My carry capacity is 0 when I carry nothing, and 1300 when I can + carry no more. Creators are allowed to exceed their bodies' carry + capacity, but players cannot. + + + Next line: + --------- + + %^CYAN%^Food: 0 Drink: 0 Alcohol: 0 Caffeine: 0 Poison: 0 %^RESET%^ + + These are pretty self-explanatory. Alcohol is good for healing, + bad for fighting. Food and drink also help speed healing. Poison + has the opposite effect. Caffeine can speed up your combat slightly, + but tends to prevent full rest. + You will not die from lack of food or lack of drink, but you + will do better with a body not starved for nutrients. + Your maximum load for any of these is not fixed, and varies + depending on many factors, such as level, endurance, etc. + + + Next line: + --------- + + %^CYAN%^Training Points: 0 Quest Points: 0 Experience Points: 50 %^RESET%^ + + Training points can be cashed in with special NPC's called + trainers, who can help you improve some skills. A trainer that + specializes in fighting might be able to raise your "blade attack" + skill, for example. you earn training points when you are + promoted a level. + + Quest points are awarded when you complete a quest. In + the default version of Dead Souls, you cannot advance past a + certain player level unless you earn some qp's. Read the sign + in the adventurers guild for more details on this. + + Experience points can be awarded for various reasons: completing + 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. + + + + Limb section: + ------------ + + Remember how wearing armor requires the right body parts? + Well here they are, and this is their health. You can issue the + "body" command for a quicker self-check. + Let's look at what the numbers mean with an example: + + %^CYAN%^left leg (2) 160/160%^RESET%^ + + Obviously the first item identifies the limb in question. + + The (2) is a kind of "importance score", indicating how critical + a body part is. If this number is (1), like the head, it means that + losing that limb causes immediate death. + + The number on the right side of the slash indicates the hit point + damage you may receive on that limb before it is severed. The number + on the left is how many of those hits you have left. + It doesn't mean my leg has 160 of my hitpoints. If that were true, + my hit points would add up to a heck of a lot more than 350. + This means that if I've lost, say, 200hp fighting a troll, and + 159hp of those hits were on my left leg, getting hit there again means I + lose my left leg. + I would then collapse and have to crawl away to seek medical attention. + Wearing armor on your limbs is a great way to minimize the danger of + this happening. + + + Skills section: + -------------- + + Let's review skills by examining one of mine: + + %^CYAN%^blade attack (1) 00% - 20/24%^RESET%^ + + This measures how likely I am to hit an opponent when I + use a blade, and how good a hit it was. The number (1) means + that this is a skill critical to my class. If an explorer can't + swing a sword, he oughta think about another line + of work. + The 00% means I have thus far earned no blade attack + experience toward achieving the next level of this skill. + The 20 is my current proficiency level. + The 24 is the maximum level I can reach at my current + player level and with my current stats. + + What's all this mean? Well, if I practice a lot of blade + attacking, that 00% will gradually climb up to 99, and one more + point causes me to go from a level 20 slicer of things to a + level 2