diff -c -r --new-file ds2.0r18/lib/cfg/timezone.cfg ds2.0r28/lib/cfg/timezone.cfg *** ds2.0r18/lib/cfg/timezone.cfg Sun Nov 6 01:06:32 2005 --- ds2.0r28/lib/cfg/timezone.cfg Wed Jul 5 00:00:58 2006 *************** *** 1 **** ! EST \ No newline at end of file --- 1 ---- ! EDT diff -c -r --new-file ds2.0r18/lib/cmds/common/help.c ds2.0r28/lib/cmds/common/help.c *** ds2.0r18/lib/cmds/common/help.c Sat Mar 11 11:13:28 2006 --- ds2.0r28/lib/cmds/common/help.c Wed Jul 5 00:01:03 2006 *************** *** 16,28 **** mixed cmd(string arg) { object who = previous_object(); int array screen = (who->GetScreen() || ({ 80, 24 })); ! string help; ! if( !arg || arg == "" || arg == "help") { help = HELP_D->GetHelp("help"); write(help); return 1; } if( arg == "index" || HELP_D->GetTopics(arg) ) { if( arg == "index" ) { HelpMenu(); --- 16,35 ---- mixed cmd(string arg) { object who = previous_object(); int array screen = (who->GetScreen() || ({ 80, 24 })); ! string help = ""; ! if( arg == "help") { help = HELP_D->GetHelp("help"); write(help); return 1; } + if( !arg || arg == "") { + if(creatorp(this_player())) help = read_file("/doc/help/creators/creator_general"); + else help = read_file("/doc/help/players/player_general"); + if(!sizeof(help)) help = HELP_D->GetHelp("help"); + write(help); + return 1; + } if( arg == "index" || HELP_D->GetTopics(arg) ) { if( arg == "index" ) { HelpMenu(); diff -c -r --new-file ds2.0r18/lib/cmds/creators/anglicize.c ds2.0r28/lib/cmds/creators/anglicize.c *** ds2.0r18/lib/cmds/creators/anglicize.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/anglicize.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 anglicize you."); + return 1; + } + + target->SetNativeLanguage("English"); + if(target == this_player()) str = "yourself"; + else str = capitalize(str); + write("You anglicize "+str+"."); + if(target != this_player()) + tell_object(target, capitalize(this_player()->GetKeyName())+" anglicizes you."); + return 1; + } + + void help() { + message("help", "Syntax: anglicize \n\n" + "Make the target's native language English.\n\n", + this_player()); + } diff -c -r --new-file ds2.0r18/lib/cmds/creators/colors.c ds2.0r28/lib/cmds/creators/colors.c *** ds2.0r18/lib/cmds/creators/colors.c Wed Dec 7 14:12:58 2005 --- ds2.0r28/lib/cmds/creators/colors.c Wed Jul 5 00:01:03 2006 *************** *** 3,9 **** inherit LIB_DAEMON; ! void cmd() { write( "%^RED%^RED\n" --- 3,9 ---- inherit LIB_DAEMON; ! int cmd() { write( "%^RED%^RED\n" *************** *** 25,35 **** "%^B_WHITE%^B_WHITE%^RESET%^\n" "%^B_MAGENTA%^B_MAGENTA%^RESET%^\n" ); ! } string GetHelp() { ! return ("Syntax: colors\n\n" ! "Lists all available colors in the corresponding color.\n\n"); } --- 25,36 ---- "%^B_WHITE%^B_WHITE%^RESET%^\n" "%^B_MAGENTA%^B_MAGENTA%^RESET%^\n" ); ! return 1; } string GetHelp() { ! return("Syntax: colors\n\n" ! "Lists all available colors in the corresponding color." ! "\n\n"); } diff -c -r --new-file ds2.0r18/lib/cmds/creators/debug.c ds2.0r28/lib/cmds/creators/debug.c *** ds2.0r18/lib/cmds/creators/debug.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/debug.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,25 ---- + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string str) { + int status = this_player()->GetProperty("debug"); + if(!str && !status) str = "on"; + else if(!str && status) str = "off"; + if(str != "on" && str != "off") return 0; + if(str == "on"){ + write("You enable debugging."); + this_player()->SetProperty("debug", 1); + return 1; + } + write("You disable debugging."); + this_player()->SetProperty("debug", 0); + return 1; + } + + void help() { + message("help", "Syntax: debug [on | off]\n\n" + "Allows you to receive debugging information\n\n", + this_player()); + } diff -c -r --new-file ds2.0r18/lib/cmds/creators/expel.c ds2.0r28/lib/cmds/creators/expel.c *** ds2.0r18/lib/cmds/creators/expel.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/expel.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,53 ---- + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string args) { + object ob, *obs; + + if( !args || args == "" ) return "Expel whom?"; + ob = present(args,environment(this_player())); + if(args != "all" && (!ob || !living(ob))){ + + return "Expel only works for living things in your environment."; + } + if(archp(ob) && !archp(this_player())){ + write("You can't expel an admin."); + tell_player(ob, this_player()->GetName()+" just tried to expel you."); + return 1; + } + + if(args == "all"){ + if(archp(this_player())) { + obs = filter(get_livings(environment(this_player())), (: $1 != this_player() :) ); + } + else { + obs = filter(get_livings(environment(this_player())), + (: $1 != this_player() && !archp($1) :) ); + } + } + + else obs = ({ ob }); + + foreach(object nuisance in obs){ + nuisance->eventWimpy(1); + } + + foreach(object nuisance in obs){ + if(environment(nuisance) == environment(this_player())){ + if(creatorp(nuisance)) { + nuisance->eventMoveLiving(homedir(nuisance)+"/workroom"); + } + else nuisance->eventMoveLiving(ROOM_START); + } + } + + return 1; + } + + void help() { + message("help", "Syntax: expel \n\n" + "Forces the specified living thing to leave your environment.\n\n" + "See also: return, goto, move, trans", this_player()); + } diff -c -r --new-file ds2.0r18/lib/cmds/creators/goto.c ds2.0r28/lib/cmds/creators/goto.c *** ds2.0r18/lib/cmds/creators/goto.c Mon Jan 23 09:03:35 2006 --- ds2.0r28/lib/cmds/creators/goto.c Wed Jul 5 00:01:03 2006 *************** *** 43,49 **** "Syntax: \n\n" "This command will move you to where the living thing is if it can " "be found, otherwise it will search for the file named and try to " ! "move you into that file.\n\nSee also: home, move, trans.", this_player() ); } --- 43,49 ---- "Syntax: \n\n" "This command will move you to where the living thing is if it can " "be found, otherwise it will search for the file named and try to " ! "move you into that file.\n\nSee also: home, move, trans, expel.", this_player() ); } diff -c -r --new-file ds2.0r18/lib/cmds/creators/i3who.c ds2.0r28/lib/cmds/creators/i3who.c *** ds2.0r18/lib/cmds/creators/i3who.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/i3who.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string str) { + foreach(string mud in INTERMUD_D->GetMuds()){ + SERVICES_D->eventSendWhoRequest(mud); + } + return 1; + } + + + void help() { + message("help", "Syntax: i3who\n\n" + "Queries each active mud for rwho information.\n\n", + this_player()); + } diff -c -r --new-file ds2.0r18/lib/cmds/creators/margins.c ds2.0r28/lib/cmds/creators/margins.c *** ds2.0r18/lib/cmds/creators/margins.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/margins.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,19 ---- + #include + + inherit LIB_DAEMON; + + mixed cmd(string str) { + return @ENDTEXT + |---------------------------------------------------------------|-------------| + ENDTEXT; + } + + void help() { + write("Syntax: margins\n"); + write(@EndText + This simple command prints a line to help creators when writing + descriptions. It gives a visual indicator of when to stop on + one line and continue on the next. + EndText + ); + } diff -c -r --new-file ds2.0r18/lib/cmds/creators/move.c ds2.0r28/lib/cmds/creators/move.c *** ds2.0r18/lib/cmds/creators/move.c Mon Nov 7 13:28:38 2005 --- ds2.0r28/lib/cmds/creators/move.c Wed Dec 31 19:00:00 1969 *************** *** 1,55 **** - /* /cmds/creators/move.c - * From the Dead Souls V Object Library - * Moves object from one place to another - * created by Descartes of Borg 961008 - * Version: @(#) move.c 1.2@(#) - * Last modified: 96/10/08 - */ - - #include - #include - - inherit LIB_DAEMON; - - mixed cmd(string args) { - object what, destination; - string a, b; - mixed res; - - if( sscanf(args, "%s into %s", a, b) != 2 && - sscanf(args, "%s to %s", a, b) != 2 ) { - return "Syntax: \n\n"; - } - what = to_object(a); - destination = to_object(b); - if( !what ) { - return "Unable to find " + a + "."; - } - if( !destination ) { - return "Unable to find " + b + "."; - } - if( living(what) && living(destination) ) { - return "None of that nonsense."; - } - res = what->eventMove(destination); - if( !res ) { - return "Failed to move " + identify(what) + " into " + - identify(destination) + "."; - } - else if( res != 1 ) { - return res; - } - previous_object()->eventPrint("Moved " + identify(what) + " into " + - identify(destination) + ".", MSG_SYSTEM); - if( living(what) ) { - what->eventDescribeEnvironment(); - } - return 1; - } - - string GetHelp() { - return ("Syntax: \n\n" - "Allows you to move the object you name into the container " - "you name.\n\n" - "See also: trans"); - } --- 0 ---- diff -c -r --new-file ds2.0r18/lib/cmds/creators/polyglottize.c ds2.0r28/lib/cmds/creators/polyglottize.c *** ds2.0r18/lib/cmds/creators/polyglottize.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/polyglottize.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,41 ---- + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string str) { + object target; + + if(!str || str == "") str = "me"; + + if(str == "me") str = this_player()->GetKeyName(); + if(!target = present(str, environment(this_player()))){ + write("They're not here."); + return 1; + } + if(!living(target)) { + write("That's not a living thing."); + return 1; + } + if(creatorp(target) && !archp(this_player()) && + target != this_player()){ + write("That's impolite."); + tell_player(target,capitalize(this_player()->GetKeyName())+ + " just tried to polyglottize you."); + return 1; + } + + target->SetPolyglot(1); + if(target == this_player()) str = "yourself"; + else str = capitalize(str); + write("You polyglottize "+str+"."); + if(target != this_player()) + tell_object(target, capitalize(this_player()->GetKeyName())+" polyglottizes you."); + return 1; + } + + void help() { + message("help", "Syntax: polyglottize \n\n" + "Make the target able to understand all languages.\n\n", + this_player()); + } diff -c -r --new-file ds2.0r18/lib/cmds/creators/scan.c ds2.0r28/lib/cmds/creators/scan.c *** ds2.0r18/lib/cmds/creators/scan.c Mon Nov 7 13:28:39 2005 --- ds2.0r28/lib/cmds/creators/scan.c Wed Jul 5 00:01:03 2006 *************** *** 63,69 **** tmp += sprintf("(%s) - Mass: %d Value: %d Class: %d", capitalize((string)ob->GetKeyName()), (int)ob->GetMass(), (int)ob->GetValue(), ! (int)ob->GetClass() ); if( ob->GetWorn() ) tmp += " (worn)"; ret += tmp; } --- 63,69 ---- tmp += sprintf("(%s) - Mass: %d Value: %d Class: %d", capitalize((string)ob->GetKeyName()), (int)ob->GetMass(), (int)ob->GetValue(), ! intp((int)ob->GetClass()) ? (int)ob->GetClass() : 0 ); if( ob->GetWorn() ) tmp += " (worn)"; ret += tmp; } diff -c -r --new-file ds2.0r18/lib/cmds/creators/stargate.c ds2.0r28/lib/cmds/creators/stargate.c *** ds2.0r18/lib/cmds/creators/stargate.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/stargate.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,46 ---- + /** + * modification of code contributed by daelas + * started 2006-04-04 + */ + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string str){ + mapping network; + + network = STARGATE_D->GetStargates(); + if (str){ + if (network[lower_case(str)]){ + write(str+" is part of the Stargate Network.\n"); + write(str+" data: "+identify(network[lower_case(str)])); + } + else { + write(str+" is not currently part of the Stargate Network.\n"); + } + return 1; + } + else { + write("These are the current Stargate locations in the Network:\n"); + if (!sizeof(network)){ + write("No locations found."); + return 1; + } + else { + string buf = ""; + string name; + write(implode(keys(network), ", ")); + } + } + return 1; + } + + void help() { + message("help", "Syntax: stargate \n\n" + "With an argument, this command will determine whether the argument " + "supplied is a valid stargate. If so, stargate data on that gate " + "is displayed. Without an argument, this command lists known valid " + "stargates.", + this_player()); + } diff -c -r --new-file ds2.0r18/lib/cmds/creators/trans.c ds2.0r28/lib/cmds/creators/trans.c *** ds2.0r18/lib/cmds/creators/trans.c Fri Mar 24 14:36:35 2006 --- ds2.0r28/lib/cmds/creators/trans.c Wed Jul 5 00:01:03 2006 *************** *** 34,38 **** void help() { message("help", "Syntax: \n\n" "Brings a living thing to your location.\n\n" ! "See also: return, goto, move", this_player()); } --- 34,38 ---- void help() { message("help", "Syntax: \n\n" "Brings a living thing to your location.\n\n" ! "See also: return, goto, move, expel", this_player()); } diff -c -r --new-file ds2.0r18/lib/cmds/creators/transfer.c ds2.0r28/lib/cmds/creators/transfer.c *** ds2.0r18/lib/cmds/creators/transfer.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/creators/transfer.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,59 ---- + /* /cmds/creators/transfer.c + * From the Dead Souls V Object Library + * Moves object from one place to another + * created by Descartes of Borg 961008 + * Version: @(#) transfer.c 1.2@(#) + * Last modified: 96/10/08 + */ + + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string args) { + object what, destination; + string a, b; + mixed res; + + if(!args || args == ""){ + return "Syntax: \n\n"; + } + + if( sscanf(args, "%s into %s", a, b) != 2 && + sscanf(args, "%s to %s", a, b) != 2 ) { + return "Syntax: \n\n"; + } + what = to_object(a); + destination = to_object(b); + if( !what ) { + return "Unable to find " + a + "."; + } + if( !destination ) { + return "Unable to find " + b + "."; + } + if( living(what) && living(destination) ) { + return "None of that nonsense."; + } + res = what->eventMove(destination); + if( !res ) { + return "Failed to transfer " + identify(what) + " into " + + identify(destination) + "."; + } + else if( res != 1 ) { + return res; + } + previous_object()->eventPrint("Transferred " + identify(what) + " into " + + identify(destination) + ".", MSG_SYSTEM); + if( living(what) ) { + what->eventDescribeEnvironment(); + } + return 1; + } + + string GetHelp() { + return ("Syntax: \n\n" + "Allows you to transfer the object you name into the container " + "you name.\n\n" + "See also: trans, expel, goto, return"); + } diff -c -r --new-file ds2.0r18/lib/cmds/players/biography.c ds2.0r28/lib/cmds/players/biography.c *** ds2.0r18/lib/cmds/players/biography.c Mon Nov 7 13:28:39 2005 --- ds2.0r28/lib/cmds/players/biography.c Wed Jul 5 19:58:18 2006 *************** *** 93,99 **** d2 = ({}); } else { ! x = x/2; d1 = deaths[0..(x-1)]; d2 = deaths[x..]; } --- 93,99 ---- d2 = ({}); } else { ! //x = x/2; d1 = deaths[0..(x-1)]; d2 = deaths[x..]; } *************** *** 123,129 **** col3 = npcs[(2*x)..]; } for(i=0; i= sizeof(col1)) ? "" : col1[i] + " (" + kills[col1[i]] + ")", (i >= sizeof(col2)) ? "" : --- 123,129 ---- col3 = npcs[(2*x)..]; } for(i=0; i= sizeof(col1)) ? "" : col1[i] + " (" + kills[col1[i]] + ")", (i >= sizeof(col2)) ? "" : diff -c -r --new-file ds2.0r18/lib/cmds/players/date.c ds2.0r28/lib/cmds/players/date.c *** ds2.0r18/lib/cmds/players/date.c Mon Jan 16 23:01:17 2006 --- ds2.0r28/lib/cmds/players/date.c Wed Jul 5 00:01:03 2006 *************** *** 8,17 **** #include #include ! mixed cmd(string unused) { string *parts, year, time; int offset, x, hour, min, sec; offset = (int)TIME_D->GetOffset(local_time()[9]); offset += EXTRA_TIME_OFFSET; if(query_os_type() != "windows" ) --- 8,22 ---- #include #include ! mixed cmd(string timezone) { string *parts, year, time; int offset, x, hour, min, sec; + if(timezone && timezone != "" && valid_timezone(timezone)){ + write(local_time(timezone)); + return 1; + } + offset = (int)TIME_D->GetOffset(local_time()[9]); offset += EXTRA_TIME_OFFSET; if(query_os_type() != "windows" ) diff -c -r --new-file ds2.0r18/lib/cmds/players/earmuff.c ds2.0r28/lib/cmds/players/earmuff.c *** ds2.0r18/lib/cmds/players/earmuff.c Thu Feb 23 15:40:40 2006 --- ds2.0r28/lib/cmds/players/earmuff.c Wed Jul 5 00:01:03 2006 *************** *** 19,26 **** void help() { message("help", "Syntax: earmuff\n" ! " earmuff \n\n" "This command allows you to ignore channel messages from the name specified.\n" "See also: whomuffed, unmuff\n\n", this_player() ); } --- 19,29 ---- void help() { message("help", "Syntax: earmuff\n" ! " earmuff \n" ! " earmuff @\n\n" "This command allows you to ignore channel messages from the name specified.\n" + "You can also earmuff all channel messages coming from a " + "specific mud, for example: earmuff @Spammy Mud II\n" "See also: whomuffed, unmuff\n\n", this_player() ); } diff -c -r --new-file ds2.0r18/lib/cmds/players/env.c ds2.0r28/lib/cmds/players/env.c *** ds2.0r18/lib/cmds/players/env.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/cmds/players/env.c Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,19 ---- + #include + + inherit LIB_DAEMON; + + mixed cmd(string args) { + write("Screen: \t\t"+identify(this_player()->GetScreen())); + write("Terminal: \t\t"+this_player()->GetTerminal()); + write("Brief mode: \t\t"+ ( (this_player()->GetBriefMode()) ? "on" : "off" )); + //write("PlayerKill mode: \t"+ ( (this_player()->GetPK()) ? "on" : "off" )); + if(creatorp(this_player())) + write("Debug mode: \t\t"+ ( (this_player()->GetProperty("debug")) ? "on" : "off" )); + return 1; + } + + void help() { + message("help", "Syntax: \n\n" + "Displays your basic interface and play settings. " + + "See also: brief, terminal, screen", this_player()); + } diff -c -r --new-file ds2.0r18/lib/cmds/players/inventory.c ds2.0r28/lib/cmds/players/inventory.c *** ds2.0r18/lib/cmds/players/inventory.c Mon Nov 7 13:28:39 2005 --- ds2.0r28/lib/cmds/players/inventory.c Wed Jul 5 00:01:03 2006 *************** *** 38,46 **** i = sizeof(shorts = keys(borg)); while(i--) ret += capitalize(consolidate(borg[shorts[i]], shorts[i]))+"\n"; message("look", ret, this_player()); ! message("other_action", (string)this_player()->GetName() + " checks " + ! possessive(this_player()) + " possessions.", ! environment(this_player()), ({ this_player() })); } void help() { --- 38,47 ---- i = sizeof(shorts = keys(borg)); while(i--) ret += capitalize(consolidate(borg[shorts[i]], shorts[i]))+"\n"; message("look", ret, this_player()); ! if(!this_player()->GetInvis()) ! message("other_action", (string)this_player()->GetName() + " checks " + ! possessive(this_player()) + " possessions.", ! environment(this_player()), ({ this_player() })); } void help() { diff -c -r --new-file ds2.0r18/lib/cmds/players/language.c ds2.0r28/lib/cmds/players/language.c *** ds2.0r18/lib/cmds/players/language.c Sat Mar 11 11:13:28 2006 --- ds2.0r28/lib/cmds/players/language.c Wed Jul 5 00:01:03 2006 *************** *** 11,18 **** } write("You speak:"); ! foreach(string key, int val in FluencyMap){ ! write(key+" with "+val+"% proficiency."); } return 1; --- 11,25 ---- } write("You speak:"); ! ! if(this_player()->GetPolyglot()){ ! write("All languages with 100% proficiency."); ! } ! ! else { ! foreach(string key, int val in FluencyMap){ ! write(capitalize(key)+" with "+val+"% proficiency."); ! } } return 1; diff -c -r --new-file ds2.0r18/lib/cmds/players/mudlist.c ds2.0r28/lib/cmds/players/mudlist.c *** ds2.0r18/lib/cmds/players/mudlist.c Tue Mar 28 23:23:40 2006 --- ds2.0r28/lib/cmds/players/mudlist.c Wed Jul 5 19:58:18 2006 *************** *** 100,108 **** list = ({}); foreach(mud, info in borg) list += ({ sprintf("%:-15s %:-6s %:-15s %:-18s %s %d", ! mud, info[8], info[7], info[5], info[1], info[2]) }); list = sort_array(list, 1); ! list = ({ mud_name() + " recognizes " + consolidate(sizeof(borg), "a mud")+ " matching your query: ", "" }) + list; this_player()->eventPage(list); return 1; --- 100,108 ---- list = ({}); foreach(mud, info in borg) list += ({ sprintf("%:-15s %:-6s %:-15s %:-18s %s %d", ! replace_string(mud,"%^","%%^^"), info[8], info[7], info[5], info[1], info[2]) }); list = sort_array(list, 1); ! list = ({ replace_string(mud_name(),"%^","%%^^") + " recognizes " + consolidate(sizeof(borg), "a mud")+ " matching your query: ", "" }) + list; this_player()->eventPage(list); return 1; diff -c -r --new-file ds2.0r18/lib/cmds/players/screen.c ds2.0r28/lib/cmds/players/screen.c *** ds2.0r18/lib/cmds/players/screen.c Mon Nov 7 13:28:39 2005 --- ds2.0r28/lib/cmds/players/screen.c Wed Jul 5 00:01:03 2006 *************** *** 11,21 **** mixed cmd(string args) { int *screen; int h, w; if( args == "" || !args ) ! return "You need to specify both width and height."; if( sscanf(args, "%d %d", w, h) != 2 ) ! return "You need to specify both width and height."; this_player()->SetScreen(w, h); message("system", "Screen set to " + w + " by " + h + ".", this_player()); return 1; --- 11,24 ---- mixed cmd(string args) { int *screen; int h, w; + string chide = "You need to specify both width and height.\n"; + string ret = "Your current settings are: "+ this_player()->GetScreen()[0]; + ret += " "+ this_player()->GetScreen()[1]; if( args == "" || !args ) ! return chide + ret; if( sscanf(args, "%d %d", w, h) != 2 ) ! return chide + ret; this_player()->SetScreen(w, h); message("system", "Screen set to " + w + " by " + h + ".", this_player()); return 1; diff -c -r --new-file ds2.0r18/lib/cmds/players/stat.c ds2.0r28/lib/cmds/players/stat.c *** ds2.0r18/lib/cmds/players/stat.c Tue Mar 28 23:23:40 2006 --- ds2.0r28/lib/cmds/players/stat.c Wed Jul 5 00:01:03 2006 *************** *** 24,29 **** --- 24,30 ---- if( !(ob = find_player(convert_name(args))) && !(ob = find_living(lower_case(args))) ) return capitalize(args) + " is nowhere to be found."; + if(!living(ob)) return capitalize(args) + " is not alive."; cols = ((int *)this_player()->GetScreen())[0]; tmp1 = (string)ob->GetCapName() + " aka " + (string)ob->GetShort() + ", level " + (int)ob->GetLevel() + " " + (string)ob->GetGender(); *************** *** 63,69 **** }); lines += ({ "", "Limbs:" }); limbs = (string *)ob->GetWieldingLimbs(); ! if(!ob->GetGhost()) arr = map((string *)ob->GetLimbs(), (: sprintf("%:-14s%s (%d) %d/%d", $1, ((member_array($1, $(limbs)) == -1) ? " " : "*"), (int)($(ob))->GetLimbClass($1), --- 64,70 ---- }); lines += ({ "", "Limbs:" }); limbs = (string *)ob->GetWieldingLimbs(); ! if(ob && !ob->GetGhost()) arr = map((string *)ob->GetLimbs(), (: sprintf("%:-14s%s (%d) %d/%d", $1, ((member_array($1, $(limbs)) == -1) ? " " : "*"), (int)($(ob))->GetLimbClass($1), diff -c -r --new-file ds2.0r18/lib/cmds/players/unmuff.c ds2.0r28/lib/cmds/players/unmuff.c *** ds2.0r18/lib/cmds/players/unmuff.c Thu Feb 23 15:40:40 2006 --- ds2.0r28/lib/cmds/players/unmuff.c Wed Jul 5 00:01:03 2006 *************** *** 7,13 **** else if(!str || str == "") return "Please be more specific."; else { string *iglist = this_player()->GetMuffed(); ! if(member_array(lower_case(str),iglist) == -1) return "You aren't ignoring that person."; iglist -= ({ lower_case(str) }); this_player()->SetMuffed(iglist); write("You remove "+capitalize(str)+" from your earmuffed list."); --- 7,13 ---- else if(!str || str == "") return "Please be more specific."; else { string *iglist = this_player()->GetMuffed(); ! if(member_array(lower_case(str),iglist) == -1) return "You aren't ignoring them."; iglist -= ({ lower_case(str) }); this_player()->SetMuffed(iglist); write("You remove "+capitalize(str)+" from your earmuffed list."); diff -c -r --new-file ds2.0r18/lib/cmds/players/who.c ds2.0r28/lib/cmds/players/who.c *** ds2.0r18/lib/cmds/players/who.c Wed Feb 22 15:29:49 2006 --- ds2.0r28/lib/cmds/players/who.c Wed Jul 5 00:01:03 2006 *************** *** 6,12 **** #include inherit LIB_DAEMON; - int elderp(object foo); #define SEP repeat_string("*=",39)+"*\n"; --- 6,11 ---- *************** *** 23,30 **** if(!obs[i]->GetInvis()) { if(archp(obs[i])) tmp+="[%^BLUE%^ARCH%^RESET%^]"; else if(creatorp(obs[i]) ) tmp+="[%^CYAN%^WIZ%^RESET%^]"; else tmp+=sprintf("[%d]", obs[i]->GetLevel() ); ! if(elderp(obs[i])) tmp+=" [%^GREEN%^ELDER%^RESET%^]"; if(sizeof(obs[i]->GetShort()) < 50) { tmp+=sprintf(" %s", obs[i]->GetShort()); } --- 22,32 ---- if(!obs[i]->GetInvis()) { if(archp(obs[i])) tmp+="[%^BLUE%^ARCH%^RESET%^]"; else if(creatorp(obs[i]) ) tmp+="[%^CYAN%^WIZ%^RESET%^]"; + else if(avatarp(obs[i]) ) tmp+="[%^GREEN%^AVATAR%^RESET%^]"; + else if(high_mortalp(obs[i]) ) tmp+="[%^GREEN%^HIGH MORTAL%^RESET%^]"; else tmp+=sprintf("[%d]", obs[i]->GetLevel() ); ! if(elderp(obs[i])) tmp+=" [%^YELLOW%^ELDER%^RESET%^]"; ! if(ambassadorp(obs[i])) tmp+=" [%^YELLOW%^AMBASSADOR%^RESET%^]"; if(sizeof(obs[i]->GetShort()) < 50) { tmp+=sprintf(" %s", obs[i]->GetShort()); } *************** *** 54,61 **** return 1; } - int elderp(object ob){ - string str; - str=ob->GetKeyName(); - return member_group(str, PRIV_ELDER); - } --- 56,58 ---- diff -c -r --new-file ds2.0r18/lib/daemon/banish.c ds2.0r28/lib/daemon/banish.c *** ds2.0r18/lib/daemon/banish.c Mon Jan 16 23:01:42 2006 --- ds2.0r28/lib/daemon/banish.c Wed Jul 5 00:00:58 2006 *************** *** 5,10 **** --- 5,11 ---- */ #include + #include #include #include #include *************** *** 67,73 **** } static private int valid_access(object ob) { ! return (int)master()->valid_apply( ({ "LAW", "SUPERUSER" }) ); } int valid_cap_name(string cap, string nom) { --- 68,74 ---- } static private int valid_access(object ob) { ! return (int)master()->valid_apply( ({ "ASSIST" }) ); } int valid_cap_name(string cap, string nom) { *************** *** 155,160 **** --- 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.0r18/lib/daemon/help.c ds2.0r28/lib/daemon/help.c *** ds2.0r18/lib/daemon/help.c Mon Jan 23 09:03:35 2006 --- ds2.0r28/lib/daemon/help.c Wed Jul 5 00:00:58 2006 *************** *** 438,445 **** help = "Index: %^GREEN%^" + index + "%^RESET%^\n" + "Topic: %^GREEN%^" + topic + "%^RESET%^\n\n" + help; if( file_exists(DIR_RACE_HELP + "/" + topic) ) ! help += read_file(DIR_RACE_HELP + "/" + topic); ! return help; } Error = "No such race exists."; return 0; --- 438,445 ---- help = "Index: %^GREEN%^" + index + "%^RESET%^\n" + "Topic: %^GREEN%^" + topic + "%^RESET%^\n\n" + help; if( file_exists(DIR_RACE_HELP + "/" + topic) ) ! //help += read_file(DIR_RACE_HELP + "/" + topic); ! return help; } Error = "No such race exists."; return 0; diff -c -r --new-file ds2.0r18/lib/daemon/include/stargate.h ds2.0r28/lib/daemon/include/stargate.h *** ds2.0r18/lib/daemon/include/stargate.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/daemon/include/stargate.h Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,18 ---- + #include "/include/stargate.h" + + #ifndef daemon_stargate_h + #define daemon_stargate_h + + void eventLoad(); + void eventSave(); + int SetStargate(string address, string destination); + int RemoveStargate(string address); + mapping GetStargates(); + int SetStatus(string address, string status); + string GetStatus(string address); + string GetDestination(string address); + string GetEndpoint(string address); + int eventConnect(string from, string to); + int eventDisconnect(string from); + + #endif diff -c -r --new-file ds2.0r18/lib/daemon/intermud.c ds2.0r28/lib/daemon/intermud.c *** ds2.0r18/lib/daemon/intermud.c Tue Mar 28 23:54:03 2006 --- ds2.0r28/lib/daemon/intermud.c Wed Jul 5 00:00:58 2006 *************** *** 11,16 **** --- 11,17 ---- #else #include + #include #include #include #include *************** *** 31,40 **** Password = 0; Tries = 0; Banned = ([]); - // There is only one known I3 router as of - // Feb 2006: us-1.i3.intermud.org - //Nameservers = ({ ({ "*gjs", "198.144.203.194 9000" }) }); - Nameservers = ({ ({ "*yatmim", "149.152.218.102 23" }) }); MudList = new(class list); ChannelList = new(class list); MudList->ID = -1; --- 32,37 ---- *************** *** 43,49 **** --- 40,48 ---- 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); SetSocketType(MUD); if(DISABLE_INTERMUD == 1){ *************** *** 66,71 **** --- 65,91 ---- mudlib() + " " + mudlib_version(), version(), "LPMud", MUD_STATUS, ADMIN_EMAIL, (mapping)SERVICES_D->GetServices(), ([]) }) ); + tn("INTERMUD_D setup: "+identify( ({ + "startup-req-3", 5, mud_name(), 0, Nameservers[0][0], 0, + Password, MudList->ID, ChannelList->ID, query_host_port(), + PORT_OOB, PORT_UDP, mudlib() + " " + mudlib_version(), + mudlib() + " " + mudlib_version(), version(), "LPMud", + MUD_STATUS, ADMIN_EMAIL, + (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) { *************** *** 86,93 **** //default : tc("Packet: "+identify(packet)); case "startup-reply": log_file("intermud",identify(packet)); ! if( sizeof(packet) != 8 ) return; /* should send error */ ! if( !sizeof(packet[6]) ) return; if( packet[6][0][0] == Nameservers[0][0] ) { Nameservers = packet[6]; Connected = Nameservers[0][0]; --- 106,120 ---- //default : tc("Packet: "+identify(packet)); case "startup-reply": log_file("intermud",identify(packet)); ! tn("INTERMUD_D: "+identify(packet),"red"); ! if( sizeof(packet) != 8 ) { ! tn("We don't like the mudlist packet size.","red"); ! return; ! } ! if( !sizeof(packet[6]) ) { ! tn("We don't like an absence of packet element 6.","red"); ! return; ! } if( packet[6][0][0] == Nameservers[0][0] ) { Nameservers = packet[6]; Connected = Nameservers[0][0]; *************** *** 100,110 **** } return; case "mudlist": ! if( sizeof(packet) != 8 ) return; ! if( packet[6] == MudList->ID ) return; ! if( packet[2] != Nameservers[0][0] ) return; MudList->ID = packet[6]; foreach(cle, val in packet[7]) { if( !val && MudList->List[cle] != 0 ) map_delete(MudList->List, cle); else if( val ) MudList->List[cle] = val; --- 127,152 ---- } return; case "mudlist": ! tn("INTERMUD_D mudlist received.","red"); ! log_file("mudlist_packet",identify(packet),1); ! if( sizeof(packet) != 8 ) { ! tn("We don't like the mudlist packet size.","red"); ! return; ! } ! 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] ) { ! tn("We don't like packet element 2. It is: "+identify(packet[2]),"red"); ! return; ! } ! MudList->ID = packet[6]; foreach(cle, val in packet[7]) { + if(cle) tn("Procesing cle: "+identify(cle),"cyan"); + if(val) tn("Procesing val: "+identify(val)+"\n--\n","cyan"); if( !val && MudList->List[cle] != 0 ) map_delete(MudList->List, cle); else if( val ) MudList->List[cle] = val; *************** *** 137,142 **** --- 179,185 ---- break; case "chanlist-reply": // if( packet[6] == ChannelList->ID ) return; + tn("chanlist reply: "+identify(packet), "blue"); if( packet[2] != Nameservers[0][0] ) return; ChannelList->ID = packet[6]; foreach(cle, val in packet[7]) { *************** *** 166,171 **** --- 209,215 ---- SERVICES_D->eventReceiveTell(packet); break; case "chan-user-reply": + tn("INTERMUD_D: chan-user-reply received.","red"); case "ucache-update": SERVICES_D->eventReceiveUcacheUpdate(packet); break; *************** *** 185,190 **** --- 229,235 ---- SERVICES_D->eventReceiveMailOk(packet); break; case "file": + tn("INTERMUD_D: file packet received.","red"); break; case "error": SERVICES_D->eventReceiveError(packet); *************** *** 205,210 **** --- 250,256 ---- static void eventConnectionFailure() { if( Connected ) return; + tn("INTERMUD_D: CONNECTION FAILED","red"); error("Failed to find a useful name server.\n"); } diff -c -r --new-file ds2.0r18/lib/daemon/preload_check.c ds2.0r28/lib/daemon/preload_check.c *** ds2.0r18/lib/daemon/preload_check.c Sat Mar 11 11:14:52 2006 --- ds2.0r28/lib/daemon/preload_check.c Wed Jul 5 00:00:58 2006 *************** *** 8,14 **** static void checkPreloads(){ foreach(string daemon in preloads){ ! if(!find_object(daemon) && daemon != INTERMUD_D) update(daemon); } call_out((: checkPreloads :), 300); --- 8,15 ---- static void checkPreloads(){ foreach(string daemon in preloads){ ! if(!find_object(daemon) && daemon != INTERMUD_D && ! daemon != AUTOEXEC_D) update(daemon); } call_out((: checkPreloads :), 300); diff -c -r --new-file ds2.0r18/lib/daemon/races.c ds2.0r28/lib/daemon/races.c *** ds2.0r18/lib/daemon/races.c Fri Mar 24 14:36:35 2006 --- ds2.0r28/lib/daemon/races.c Wed Jul 5 00:00:58 2006 *************** *** 158,164 **** //tc("hellow"); res = new(class Race); - s = new (class Stat); res->Resistance = ([]); res->Skills = ([]); --- 158,163 ---- *************** *** 221,227 **** case "RACE": race = replace_string(line, "RACE ", ""); ! if( Races[race] ) error("Race already exists"); break; case "SENSITIVITY": --- 220,226 ---- case "RACE": race = replace_string(line, "RACE ", ""); ! if( Races[race] ) error(race+": Race already exists"); break; case "SENSITIVITY": *************** *** 255,264 **** break; case "STATS": tmp = explode(replace_string(line, "STATS ",""), ":"); ! s->Average = to_int(tmp[1]); ! s->Class = to_int(tmp[2]); res->Stats[tmp[0]] = s; break; case "LIMB": --- 254,268 ---- break; case "STATS": + 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": *************** *** 406,411 **** --- 410,417 ---- void SetCharacterRace(string race, mixed array args) { class Race res = Races[race]; mixed array tmp; + mapping StatMap; + string schluss; if( !res || !res->Complete || sizeof(args) != 5 ) return; tmp = ({}); *************** *** 413,420 **** tmp = ({ tmp..., ({ key, val }) }); args[0] = tmp; tmp = ({}); ! foreach(string key, class Stat stat in res->Stats) ! tmp = ({ tmp..., ({ key, stat->Average, stat->Class }) }); args[1] = tmp; args[2] = res->Language; //args[3] = ({ res->Sensitivity[0], res->Sensitivity[1] }); --- 419,434 ---- 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] }); *************** *** 445,450 **** --- 459,465 ---- h_file = "/doc/help/races/"+lower_case(race); if(file_exists(h_file)) return read_file(h_file); limbs = map(res->Limbs, (: $1[0] :)); + limbs = singular_array(limbs); help += "Limbs:\n"; help += capitalize(item_list(map(limbs, (: add_article :)))) + ".\n"; help += "\nFingered limbs:\n"; diff -c -r --new-file ds2.0r18/lib/daemon/services/auth.c ds2.0r28/lib/daemon/services/auth.c *** ds2.0r18/lib/daemon/services/auth.c Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/daemon/services/auth.c Wed Jul 5 00:01:03 2006 *************** *** 13,18 **** --- 13,20 ---- pinger->SetOK(1); } } + tn("Auth reply received from "+packet[2]+".","white"); + tn("Ping packet: "+identify(packet),"white"); if(sizeof(pingers)){ foreach(object dude in pingers){ tell_player(dude, packet[2]+" has just replied to a ping request from "+ *************** *** 25,30 **** --- 27,33 ---- void eventReceiveAuthRequest(mixed array packet) { string mudlist = ""; PING_D->SetOK(); + tn("Auth request received from "+packet[2]+".","white"); INTERMUD_D->eventWrite( ({"auth-mud-reply", 5, mud_name(), 0, packet[2], 0, (random(9999) * 10000) + 1138 }) ); if(file_exists("/tmp/muds.txt")) *************** *** 33,38 **** --- 36,42 ---- packet[2] == "DeadSoulsWin"){ write_file("/tmp/muds.txt",packet[2]+"\n"); tc("We have a new mud! "+packet[2]+" has joined intermud.","red"); + tn("We have a new mud! "+packet[2]+" has joined intermud.","red"); } } diff -c -r --new-file ds2.0r18/lib/daemon/services/channel.c ds2.0r28/lib/daemon/services/channel.c *** ds2.0r18/lib/daemon/services/channel.c Tue Mar 28 23:23:40 2006 --- ds2.0r28/lib/daemon/services/channel.c Wed Jul 5 00:01:03 2006 *************** *** 12,19 **** --- 12,24 ---- #include #include + static private string *local_chans = ({"newbie","cre","gossip","admin","error", + "priest", "mage", "explorer", "thief", "fighter", "death" }); + + void eventReceiveChannelWhoReply(mixed array packet) { object ob; + tn("eventReceiveChannelWhoReply: "+identify(packet),"green"); if( file_name(previous_object()) != INTERMUD_D ) return; if( !(ob = find_player(packet[5])) ) return; *************** *** 39,44 **** --- 44,50 ---- ret += entry+", "; } ret = truncate(ret,2); + tn("eventReceiveChannelWhoRequest: "+identify(packet),"green"); tell_room(ROOM_ARCH,"The Arch Room loudspeaker announces: \"%^BOLD%^CYAN%^"+capitalize(packet[3])+" at "+packet[2]+" has requested a list of users listening to channel "+packet[6]+". Replying with: %^BOLD%^GREEN%^"+ret+".%^RESET%^\""); } *************** *** 48,53 **** --- 54,60 ---- string visname; int gender; if( file_name(previous_object()) != INTERMUD_D ) return; + tn("eventReceiveChannelUserRequest: "+identify(packet),"green"); if( !(ob = find_player(packet[6])) ) { INTERMUD_D->eventWrite( ({ "error", 5, mud_name(), 0, packet[2], 0, "unk-user", packet[6] + " is not a valid " *************** *** 65,70 **** --- 72,79 ---- } void eventReceiveChannelMessage(mixed array packet) { + tn("eventReceiveChannelMessage: "+identify(packet),"green"); + if( file_name(previous_object()) != INTERMUD_D ) return; if( packet[2] == mud_name() ) return; *************** *** 75,80 **** --- 84,91 ---- } void eventReceiveChannelEmote(mixed array packet) { + tn("eventReceiveChannelEmote: "+identify(packet),"green"); + if( file_name(previous_object()) != INTERMUD_D ) return; if( packet[2] == mud_name() ) return; if( !packet[7] ) return; *************** *** 85,90 **** --- 96,102 ---- void eventReceiveChannelTargettedEmote(mixed array packet) { string target; + tn("eventReceiveChannelTargettedEmote: "+identify(packet),"green"); if( file_name(previous_object()) != INTERMUD_D ) return; if( packet[2] == mud_name() ) return; *************** *** 98,106 **** --- 110,121 ---- varargs void eventSendChannel(string who, string ch, string msg, int emote, string target, string targmsg) { mixed array packet; + mixed array packet_thing = ({ who, ch, msg, emote || "", target || "", targmsg || "" }); string targpl, where; // targpl is target keyname + tn("eventSendChannel raw: "+identify( packet_thing ),"green"); + if( emote ) { if( target && targmsg ) { if( sscanf(target, "%s@%s", targpl, where) != 2 ) { *************** *** 125,131 **** } else packet = ({ "channel-m", 5, mud_name(), convert_name(who), 0, 0, ch, who, msg }); ! INTERMUD_D->eventWrite(packet); } void eventSendChannelWhoRequest(string channel, string mud) { --- 140,149 ---- } else packet = ({ "channel-m", 5, mud_name(), convert_name(who), 0, 0, ch, who, msg }); ! if(member_array(ch, local_chans) == -1){ ! INTERMUD_D->eventWrite(packet); ! tn("eventSendChannel processed: "+identify(packet),"green"); ! } } void eventSendChannelWhoRequest(string channel, string mud) { *************** *** 134,139 **** --- 152,158 ---- pl = (string)this_player(1)->GetKeyName(); INTERMUD_D->eventWrite(({ "chan-who-req", 5, mud_name(), pl, mud, 0, channel })); + tn("eventSendChannelWhoRequest: "+identify( ({ "chan-who-req", 5, mud_name(), pl, mud, 0, channel })) , "green"); } void eventRegisterChannels(mapping list) { *************** *** 155,164 **** --- 174,187 ---- else INTERMUD_D->eventWrite(({ "channel-listen", 5, mud_name(), 0, ns, 0, channel, 1 })); } + tn("eventRegisterChannels: "+identify(list),"green"); + } int eventAdministerChannel(string channel, string array additions, string array subs) { + tn("eventAdministerChannel. ","green"); + if( !((int)master()->valid_apply( ({}) )) ) return 0; if( member_array(channel, (string array)INTERMUD_D->GetChannels()) == -1 ) return 0; *************** *** 166,175 **** --- 189,202 ---- (string)this_player(1)->GetKeyName(), (string)INTERMUD_D->GetNameserver(), 0, channel, additions, subs })); + + tn("eventAdministerChannel: "+channel+" "+identify(additions)+" "+identify(subs),"green"); return 1; } int AddChannel(string channel, int privee) { + tn("eventAdministerChannel: "+channel+", "+privee,"green"); + if( !((int)master()->valid_apply( ({}) )) ){ return 0; } *************** *** 185,190 **** --- 212,219 ---- 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 ){ return 0; } diff -c -r --new-file ds2.0r18/lib/daemon/services/emoteto.c ds2.0r28/lib/daemon/services/emoteto.c *** ds2.0r18/lib/daemon/services/emoteto.c Mon Nov 7 13:29:14 2005 --- ds2.0r28/lib/daemon/services/emoteto.c Wed Jul 5 00:01:03 2006 *************** *** 12,17 **** --- 12,18 ---- object ob; string who; + tn("eventReceiveEmote: "+identify(packet), "green"); if( file_name(previous_object()) != INTERMUD_D ) return; who = convert_name(packet[5]); if( !(ob = find_player(who)) || (int)ob->GetInvis() ) { *************** *** 34,39 **** --- 35,41 ---- where = (string)INTERMUD_D->GetMudName(where); INTERMUD_D->eventWrite(({ "emoteto", 5, mud_name(), pl, where, convert_name(who), plc, msg })); + tn("eventSendEmote: "+identify( "emoteto", 5, mud_name(), pl, where,convert_name(who), plc, msg ),"green"); } diff -c -r --new-file ds2.0r18/lib/daemon/services/error.c ds2.0r28/lib/daemon/services/error.c *** ds2.0r18/lib/daemon/services/error.c Mon Nov 7 13:29:14 2005 --- ds2.0r28/lib/daemon/services/error.c Wed Jul 5 00:01:03 2006 *************** *** 8,13 **** --- 8,15 ---- object ob; string error_code, mud, target, msg; + tn("ERROR RECEIVED: "+identify(packet)); + if( packet[5] ) { target = convert_name(packet[5]); if( !(ob = find_player(target)) ) return; diff -c -r --new-file ds2.0r18/lib/daemon/services/finger.c ds2.0r28/lib/daemon/services/finger.c *** ds2.0r18/lib/daemon/services/finger.c Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/daemon/services/finger.c Wed Jul 5 00:01:03 2006 *************** *** 26,31 **** --- 26,32 ---- ret = ({ "finger-reply", 5, mud_name(), 0, packet[2], packet[3] }) + ret; INTERMUD_D->eventWrite(ret); tell_room(ROOM_ARCH,"The Arch Room loudspeaker announces: \"%^BOLD%^CYAN%^"+capitalize(packet[3])+" at "+packet[2]+" has requested finger information about "+capitalize(ret[6])+".%^RESET%^\""); + tn("eventReceiveFingerRequest: "+identify(packet),"cyan"); } *************** *** 52,57 **** --- 53,59 ---- fing += "Site: " + (packet[12] ? packet[12] : "Confidential") + "\n"; fing += (packet[14] ? packet[14] : "\n"); ob->eventPrint(fing, MSG_SYSTEM); + tn("eventReceiveFingerReply: "+identify(packet),"cyan"); } void eventSendFingerRequest(string who, string where) { *************** *** 60,63 **** --- 62,66 ---- if( !(pl = (string)this_player(1)->GetKeyName()) ) return; INTERMUD_D->eventWrite( ({ "finger-req", 5, mud_name(), pl, where, 0, who }) ); + tn("eventSendFingerRequest: "+identify( ({ "finger-req", 5, mud_name(), pl, where, 0,who }) ),"cyan"); } diff -c -r --new-file ds2.0r18/lib/daemon/services/locate.c ds2.0r28/lib/daemon/services/locate.c *** ds2.0r18/lib/daemon/services/locate.c Wed Feb 22 15:29:50 2006 --- ds2.0r28/lib/daemon/services/locate.c Wed Jul 5 00:01:03 2006 *************** *** 19,24 **** --- 19,25 ---- if( file_name(previous_object()) != INTERMUD_D ) return; tell_room(ROOM_ARCH,"The Arch Room loudspeaker announces: \"%^BOLD%^CYAN%^"+capitalize(packet[3])+" at "+packet[2]+" has issued a locate request for %^BOLD%^YELLOW%^"+capitalize(packet[6])+".%^RESET%^\""); + tn("Locate request received: "+identify(packet),"white"); if( !(ob = find_player(packet[6])) || ob->GetInvis()) return; if( interactive(ob) ) { string array tmp = ({ }); *************** *** 43,48 **** --- 44,50 ---- if( file_name(previous_object()) != INTERMUD_D ) return; if( !stringp(packet[5]) || !(ob = find_player(convert_name(packet[5]))) ) return; + tn("Locate reply received: "+identify(packet),"white"); m = packet[7] + " was just located on " + packet[6] + "."; if( (idl = (int)packet[8]) > 60 ) m += sprintf(" (idle %02d:%02d:%02d)", idl/3600, (idl/60)%60, idl%60); *************** *** 53,59 **** void eventSendLocateRequest(string who) { string pl; ! if( !(pl = (string)this_player(1)->GetKeyName()) ) return; INTERMUD_D->eventWrite( ({ "locate-req", 5, mud_name(), pl, 0, 0, who }) ); } --- 55,62 ---- void eventSendLocateRequest(string who) { string pl; ! mixed *locate_request = ({ "locate-req", 5, mud_name(), pl, 0, 0, who }); if( !(pl = (string)this_player(1)->GetKeyName()) ) return; INTERMUD_D->eventWrite( ({ "locate-req", 5, mud_name(), pl, 0, 0, who }) ); + tn("Locate request being sent: "+identify(locate_request),"white"); } diff -c -r --new-file ds2.0r18/lib/daemon/services/tell.c ds2.0r28/lib/daemon/services/tell.c *** ds2.0r18/lib/daemon/services/tell.c Fri Mar 24 14:36:35 2006 --- ds2.0r28/lib/daemon/services/tell.c Wed Jul 5 00:01:03 2006 *************** *** 14,19 **** --- 14,20 ---- string who; string adverb = ""; + tn("eventReceiveTell: "+identify(packet),"yellow"); if( file_name(previous_object()) != INTERMUD_D ) return; who = convert_name(packet[5]); if( !(ob = find_player(who)) || (int)ob->GetInvis() ) { *************** *** 59,64 **** --- 60,66 ---- this_player(1)->eventPrint("%^BOLD%^RED%^You tell " + capitalize(who) + "@" + where + ":%^RESET%^ " + msg, MSG_CONV); + tn("eventSendTell: "+identify( ({ "tell", 5, mud_name(), pl, where, convert_name(who), plc, msg }) ), "yellow"); } diff -c -r --new-file ds2.0r18/lib/daemon/services/who.c ds2.0r28/lib/daemon/services/who.c *** ds2.0r18/lib/daemon/services/who.c Fri Mar 24 14:36:35 2006 --- ds2.0r28/lib/daemon/services/who.c Wed Jul 5 00:01:03 2006 *************** *** 10,24 **** #include void eventReceiveWhoReply(mixed *packet) { ! string *list, *who; object ob; if( file_name(previous_object()) != INTERMUD_D ) return; if( !packet[5] || !(ob = find_player(convert_name(packet[5]))) ) return; ! list = ({ "Remote who information from " + packet[2] + ":" }); foreach(who in packet[6]) ! list += ({ who[0] + " (" + who[1] + " idle): " + who[2] }); ! ob->eventPage(list); } void eventReceiveWhoRequest(mixed *packet) { --- 10,28 ---- #include void eventReceiveWhoReply(mixed *packet) { ! string list, *who; object ob; + //tc("who packet: "+identify(packet)); if( file_name(previous_object()) != INTERMUD_D ) return; if( !packet[5] || !(ob = find_player(convert_name(packet[5]))) ) return; ! list = "%^MAGENTA%^Remote who information from " + packet[2] + ":%^RESET%^\n"; foreach(who in packet[6]) ! list += who[0] + " (" + who[1] + " idle): " + who[2] +"\n"; ! //tc("list: "+list,"blue"); ! //ob->eventPage(({list})); ! ob->eventPrint(list); ! tn("eventReceiveWhoReply: "+identify(packet),"blue"); } void eventReceiveWhoRequest(mixed *packet) { *************** *** 34,48 **** ret += entry[0]+", "; } ret = truncate(ret,2); ! tell_room(ROOM_ARCH,"The Arch Room loudspeaker announces: \"%^BOLD%^CYAN%^"+capitalize(packet[3])+" at "+packet[2]+" has requested a list of users currently logged on. Replying with: %^BOLD%^YELLOW%^"+ret+".%^RESET%^\""); } void eventSendWhoRequest(string mud) { string who; ! who = (string)this_player(1)->GetName(); INTERMUD_D->eventWrite(({ "who-req", 5, mud_name(), who, mud, 0 })); } --- 38,53 ---- ret += entry[0]+", "; } ret = truncate(ret,2); ! tn("eventReceiveWhoRequest: "+identify(packet),"blue"); tell_room(ROOM_ARCH,"The Arch Room loudspeaker announces: \"%^BOLD%^CYAN%^"+capitalize(packet[3])+" at "+packet[2]+" has requested a list of users currently logged on. Replying with: %^BOLD%^YELLOW%^"+ret+".%^RESET%^\""); } 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.0r18/lib/daemon/stargate.c ds2.0r28/lib/daemon/stargate.c *** ds2.0r18/lib/daemon/stargate.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/daemon/stargate.c Wed Jul 5 00:00:58 2006 *************** *** 0 **** --- 1,153 ---- + /** + * stargate_d : stargate daemon. tracks the entire stargate network. + * started 2006-03-23 by jonez + * + * 2006-03-24, jonez + * - with help from cratylus, changed the daemon so it saves it's state + * whenever there is a change, and tries to load from disk at create + * time. + * 2006-03-28, jonez + * - gate is status is now "idle", "outbound", or "inbound". gate cannot be entered from the inbound side. + */ + + #include + #include + #include "/daemon/include/stargate.h" + + inherit LIB_DAEMON; + + private mapping Stargates = ([]); + + static void create(){ + daemon::create(); + SetNoClean(1); + eventLoad(); + if (!Stargates) Stargates = ([]); + } + + void eventSave(){ + unguarded( (: save_object, SAVE_STARGATE, 1 :) ); + //tc("stargate daemon saved itself"); + return; + } + + void eventLoad(){ + if (file_size(SAVE_STARGATE __SAVE_EXTENSION__) > 0){ + //tc("stargate save file exists"); + unguarded( (: restore_object, SAVE_STARGATE :) ); + } + //tc("stargate daemon loaded itself"); + //tc("Stargates: "+identify(Stargates),"red"); + return; + } + + int SetStargate(string address, string destination){ + mapping tmp = ([]); + Stargates[address] = tmp; + //tc("Stargates: "+identify(Stargates),"yellow"); + if (address == "" || destination == "") return 1; + if(sizeof(Stargates[address])) return 1; + Stargates[address]["status"] = "idle"; + Stargates[address]["destination"] = destination; + Stargates[address]["endpoint"] = ""; + eventSave(); + return 0; + } + + mapping GetStargate(string address){ + //tc("Stargates: "+identify(Stargates),"blue"); + return copy(Stargates[address]); + } + + int RemoveStargate(string address){ + //tc("Stargates: "+identify(Stargates),"red"); + map_delete(Stargates, address); + //tc("Stargates: "+identify(Stargates),"cyan"); + eventSave(); + return 0; + } + + mapping GetStargates(){ + //tc("Stargates: "+identify(Stargates),"blue"); + return copy(Stargates); + } + + int SetStatus(string address, string status){ + //tc("Setting status of "+status+" on "+address+"."); + Stargates[address]["status"] = status; + eventSave(); + return 0; + } + + string GetStatus(string address){ + //tc("Stargates: "+identify(Stargates),"red"); + return Stargates[address]["status"]; + } + + string GetDestination(string address){ + string ret = Stargates[address]; + //tc("Stargates: "+identify(Stargates),"white"); + if(sizeof(Stargates[address]) && sizeof(Stargates[address]["destination"])) + return Stargates[address]["destination"]; + else return ""; + } + + string GetEndpoint(string address){ + //tc("Stargates: "+identify(Stargates),"blue"); + return Stargates[address]["endpoint"]; + } + + int eventConnect(string from, string to){ + //tc("Stargates: "+identify(Stargates),"red"); + //tc("STARGATE_D, from: "+from+", to: "+to,"green"); + + if (from == to) return 0; + + if (!Stargates[from] || !sizeof(Stargates[from])){ + //tc("failed to lookup status of outbound gate"); + return 0; + } + + if (!Stargates[to] || !sizeof(Stargates[to])){ + //tc("failed to lookup status of inbound gate"); + return 0; + } + + if (Stargates[from]["status"] == "idle" && Stargates[to]["status"] == "idle"){ + //tc("situation normal"); + + Stargates[from]["endpoint"] = to; + Stargates[from]["status"] = "outbound"; + + Stargates[to]["endpoint"] = from; + Stargates[to]["status"] = "inbound"; + //tc("Stargates: "+identify(Stargates)); + eventSave(); + + return 1; + } + //tc("exception"); + return 0; + } + + int eventDisconnect(string from){ + string endpoint; + if(!from || from == "") return 0; + //tc("Stargates: "+identify(Stargates),"blue"); + + if (!Stargates[from] || !sizeof(Stargates[from])) return 0; + + endpoint = Stargates[from]["endpoint"]; + if (!endpoint) return 0; + + if(sizeof(Stargates[endpoint])){ + Stargates[endpoint]["endpoint"] = ""; + Stargates[endpoint]["status"] = "idle"; + } + + Stargates[from]["endpoint"] = ""; + Stargates[from]["status"] = "idle"; + + eventSave(); + return 1; + } diff -c -r --new-file ds2.0r18/lib/doc/CREDITS ds2.0r28/lib/doc/CREDITS *** ds2.0r18/lib/doc/CREDITS Fri Mar 24 14:36:35 2006 --- ds2.0r28/lib/doc/CREDITS Wed Jul 5 00:00:58 2006 *************** *** 3,19 **** Sine qua non: Descartes, the legion of MudOS developers, and all those coders who toiled at Nightmare, and Lars Pensjö. Direct conributors: Haderach and his clever code and inspiration, Duuk and his willingness to let me poke through his lib and filch code. Great thanks to Marajin for his direct and substantial contribution to the Windows port. Thanks also to the following for code donation, support, and/or contribution: Tim@TimMUD, Manchi, ! Brodbane, Ashon, Shadyman, Jonez, Cecil. Appreciation of: Jayren, Kaylus, Arianrhod, Nosmo, Pyro, Abby, Balmung, ! Aten, Metiscus, and Alensin for their thoughtful comments and suggestions. Also: Xyzzy He Is Cool --- 3,23 ---- Sine qua non: Descartes, the legion of MudOS developers, and all those coders who toiled at Nightmare, and Lars Pensjö. + Marius for his kind permission to bundle MudOS. Direct conributors: Haderach and his clever code and inspiration, Duuk and his willingness to let me poke through his lib and filch code. Great thanks to Marajin for his direct and substantial contribution to the Windows port. + Much gratitude to Saquivor, for whom a town street is + now named, for getting the Windows socket code working. Thanks also to the following for code donation, support, and/or contribution: Tim@TimMUD, Manchi, ! Brodbane, Ashon, Shadyman, Jonez, Cecil, Daelas. Appreciation of: Jayren, Kaylus, Arianrhod, Nosmo, Pyro, Abby, Balmung, ! Aten, Metiscus, Garfield, Javelin, Alensin, Daelas, ! Zeus, Dastuun, Detah, and Nulvect for their thoughtful comments and suggestions. Also: Xyzzy He Is Cool *************** *** 21,25 **** Cratylus @ Dead Souls 04 Jan 2006 ! updated Mar 2006 --- 25,29 ---- Cratylus @ Dead Souls 04 Jan 2006 ! updated May 2006 diff -c -r --new-file ds2.0r18/lib/doc/README ds2.0r28/lib/doc/README *** ds2.0r18/lib/doc/README Mon Jan 23 09:17:12 2006 --- ds2.0r28/lib/doc/README Wed Jul 5 00:00:58 2006 *************** *** 6,21 **** safe first, and then restore it after you upgrade. Alternately you may just edit the new mudos.cfg to say what the old one said. ! GENERAL FAQ: http://dead-souls.sourceforge.net/ds-faq.html ! ADMIN FAQ: http://dead-souls.sourceforge.net/ds-admin-faq.html ! ED TUTORIAL: http://dead-souls.sourceforge.net/editor.html ! NEW CREATION SYSTEM: http://dead-souls.sourceforge.net/example.html ! ! The Frontiers LPC Foundation is pleased to present the ! re-release of Dead Souls 2. Please read /doc/SUPPORT for details on the supportability of this software. Note that the Frontiers LPC Foundation does not take --- 6,18 ---- safe first, and then restore it after you upgrade. Alternately you may just edit the new mudos.cfg to say what the old one said. ! GENERAL FAQ: http://dead-souls.net/ds-faq.html ! ADMIN FAQ: http://dead-souls.net/ds-admin-faq.html ! ED TUTORIAL: http://dead-souls.net/editor.html ! NEW CREATION SYSTEM: http://dead-souls.net/example.html Please read /doc/SUPPORT for details on the supportability of this software. Note that the Frontiers LPC Foundation does not take *************** *** 30,49 **** This mudlib is based on that old warhorse. It is entirely free from those copyright problems, and can be shared. ! We felt that too many substandard libs were starting to ! pop up, and that there was a need to bring back some of the old ! LPC magic. In accordance with this wish to cater to the elite, we have ! disabled some intermud channels by default. To enable them, all you ! need to do is add them to yourself with these commands: ! call me->AddChannel("intergossip") ! call me->AddChannel("intercre") ! ! If you want to contribute to the Dead Souls Lib Resurrection ! project, please visit Frontiers MUD and leave some mudmail for ! Cratylus. You can also request to sign up as a lib developer at ! http://sourceforge.net/projects/dead-souls/ ! ! The latest available files will be at http://sourceforge.net/project/showfiles.php?group_id=148388 so check often. Please review /doc/old/README for more historical background. --- 27,34 ---- This mudlib is based on that old warhorse. It is entirely free from those copyright problems, and can be shared. ! The latest files will be at ! http://sourceforge.net/project/showfiles.php?group_id=148388 Please review /doc/old/README for more historical background. diff -c -r --new-file ds2.0r18/lib/doc/RELEASE_NOTES ds2.0r28/lib/doc/RELEASE_NOTES *** ds2.0r18/lib/doc/RELEASE_NOTES Tue Mar 28 23:23:40 2006 --- ds2.0r28/lib/doc/RELEASE_NOTES Wed Jul 5 20:52:28 2006 *************** *** 1,5 **** ---- 2.0r18 --- ! - Changed default intermud router to 149.152.218.102 port 25 - Added a sanity check in telnet room. - Fixed bug in Newbie Mansion Quest (thx Jonez). - Added verb: pulsecheck. --- 1,245 ---- + ---- 2.0r28 --- + - Fixed minor bug in body.c that interfered with collapsing. + - Fixed message boards. + - Added command: snoopreport + - Fixed bug that caused players to be essentially immortal. + - Player death history is now accurately recorded. + - The command mudlist now ignores colors. + + ---- 2.0r27 --- + - Fixed currency problem in dying NPC's. + - Added commands: env, polyglottize + - Fixed "about" verb. + - Tweaked snoop daemon and snoop objects. + - Added pay-for-lessons feature in language teachers. + - Fixed bug in LIB_EXITS that hosed various things, + including wandering NPC's. + - mv command no longer overwrites an existing destination file. + - Fixed campus rooms with hosed CanReceive()'s that horked logins. + - Turned "move" command into "transfer", to address a conflict with + the "move" verb. - Fixed bug in admintool that prevented assistant admins from + using it. + - Fixed bug in eval that prevented assistant admins from using it. + - i3router: dynamic channel data is now persistent (newly created + channels won't disappear when the router resets). + - i3router: fixed a bug in chanlist-reply that stopped the + channel list being sent to LPUni lib muds. + - Modified install process to handle compiling on Wolfpaw servers. + - Added code example domain that was donated by Daelas @ Moraelinost. + - Added new podium, conference room, and margins command that were + donated by Daelas @ Moraelinost. + - i3router: correct password is now honored. + - Fixed help daemon bug that displayed race help twice. + - QCS: creating an enter no longer wipes exits from an existing + target room. + - Fixed bug in rescue login (Thanks, Nulvect). + - Fixed bug in tell command that mishandled mud name ambiguity. + - Fixed bug in CHAT_D that failed to return remote channel listeners. + - i3router: fixed bug that incorrectly rejected targeted emotes. + - Killing a creature super-ultra-extremely fast no longer + generates multiple corpses. + - QCS: Fixed some money problems with both how much things cost and + how much money they have. + - Modified encumbrance to be rather less cumbersome. + - Mailer default behavior now is to notify you when you receive new + mail. Already created characters do not have this default. + - Fixed opacity problem in worn storage. + - Fixed message board in arch room. + + ---- 2.0r26 --- + - Plugged some serious security holes ( http://dead-souls.net/news.html#16jun06 ) + - Cleaned up some unnecessary call_outs in lib objects. + - Added LIB_PULL. + - Added Virtual Campus domain. + - Fixed qcs problem that screwed LIB_DUMMY. + - Fixed local channel emote problem in RESTRICTED_INTERMUD mode. + - Added sefun: alpha_crypt. + - Added conference room east of the Adventurer's Hall. + - admintool no longer lets you remove the last + currency. + - COMPAT BUSTER: UNIX version now uses MD5 crypt, like the Windows + version. Character files created prior to using this driver + will not work with this driver. + - rwho no longer cares if the issuer of the + command is invisible. + + ---- 2.0r25 --- + - r24 had some unfortunate licensing problems attached. + r25 includes a Win32 native binary that does not depend + on any GPL code to run. + - This release is hereby dedicated to Saquivor, who was + instrumental in getting this binary compiled. + - r25 lib does not differ from r24 or r23. Unless you + need the native Win32 binary, you should skip this + release if you have r23 or r24. + + ---- 2.0r24 --- + - Ran into some trouble when releasing r23. For + technical reasons, it's being re-released as r24. + + ---- 2.0r23 --- + - Fixed a bug that sent local channel data to the i3 + router. Sorry about this, guys. As soon as I found + this, I killed it. It appears to have affected r22 only. + - Fixed a conflict between room SetActions and LIB_FISHING. + - It is no longer possible to fish while asleep. + - Admins can no longer decre themselves. + - Modified MudOS source to compile on IRIX using Nekoware. + - Fixed PK bug. Added PLAYER_KILL to config.h . + - Fixed problem with monitor failures and runaway + snooper generation. + - Fixed gate command, renamed it stargate.c. + - Added Administrator's Guidebook. Initial draft available + at http://dead-souls.net/guide/ + - Added downloads.html to doc pages. + - Added verbs.html to doc pages. + - Added i3who command to list who data on all muds. + - Fixed a germ bug that triggered a combat message. + - Fixed an invalid index bug in STARGATE_D and + in LIB_STARGATE. + + ---- 2.0r22 --- + - Changed UNIX config and start scripts to assume + Bourne shell rather than bash. + - Fixed "look in" bug in transparent containers. + - Added stargate lab east of the Creators' Hall. + - Added sefun: compare_array. + - Fixed divide-by-zero bug in net worth calculator. + - Fixed "look in" bug in opaque containers. + - Fixed snoop and monitoring bugs. + - Added SetAction to rooms, for time-based events. See + /domains/town/room/shore.c for an example. + - Fixed plural limb problem in RACES_D help. + - Worn/wielded items must be removed/unwielded before they can be dropped with "drop all". + - Worn/wielded items must be removed/unwielded before they can be sold with "sell all". + - Consolidated Windows and UNIX distributions into a + single download file. + - Converted class variables in STARGATE_D to mappings, + and fixed "inbound/idle gate" bug, as well as room + message bug. + - Updated FAQs and miscellaneous documentation. + - Fixed bug in RESTRICTED_CHANNELS. + - Cleaned up odd function names in LIB_LEAD. + - Tightened up earmuffing, added muffing of entire muds. + - Fixed a bug in look verb that prevented looking + at dummy items. + - Fixed a few bugs in trainers. Added a SetNoSpells() lfun + to control whether a trainer automatically can teach the + spells she knows. + - Fixed noisy index error in LIB_GERM. + - Fixed CHAT_D bug that prevented talking on some channels. + - Fixed problem in LIB_FISHING that made one's catch disappear. + - Fixed opacity for containers. If an item's opacity is about + 33 or below, its contents are visible on casual examination. + Otherwise, you have to "look in" it. + + ---- 2.0r21 --- + - Fixed a bug in "following" code. + - Fixed a bug in trainer code. + - Fixed latent SNOOP_D bugs. + - Lowered log rotation threshold. + - Corrected stat distortion problem in races.o. + - Added the domaincreate command. + - General minor typo/bugfixes. + - Tidied up interaction between rid, suicide, and + PLAYERS_D. + - Updated FAQs. + - Fixed bug in scan when providing all of the flags: -e -d -i + - Fixed put.c. + - Fixed unusually generous vendors. + - Fixed bug in objects() sefun that interfered + with resets. + - Removed clan inheritance from gstaff.c. + + ---- 2.0r20 --- + - "put all in " now ignores worn and wielded + items. + - Added commands: switchrouter, domainadmin, + monitor, unmonitor. + - (hopefully) Fixed rare and peculiar bug that hosed + up logins unpredictably. + - Added the Jonez stargate system. + - Container bug fixed. It is now possible to put + amounts of money into containers and onto surfaces. + - Daemonized snoop system. This permits the logging + of snoop data, unmanned snoop logs, and snooping + multiple players at once. Still slightly buggy, so + please report any problems with it. + - The encre and decre of non-logged-on users now + behaves properly. + - Furnaces now destroy objects almost immediately. + - Fixed voting system. + - LIB_GUILD changed to LIB_CLAN. It works, but is + not actually useful. Proper clan functionality + is planned post-2.1. + - Heal command now fixes individual limbs as well. + - Added ENABLE_ENCUMBRANCE define to config.h to + toggle the encumbrance combat modifier. + - Modified combat so it's difficult to fight while + carrying stuff. Anything worn or wielded doesn't + affect combat capability. NPC's are unaffected by this. + - Fixed horrendous carry-capacity leak in all containers. + - Added "every" token to reload verb, enabling the + reload of all loaded objects that inherit the specified + library object, eg "reload every npc". + - Fixed bugs in invisibility. + - Enabled QCS to work in /domains directories for + creators set as domain admins with the + domainadmin command. + - Fixed error in RACES_D that dramatically distorted stats. + - Added sefun: domain_admin. + - Fixed mudlist cache problem. + - Added command: switchrouter, domainadmin. + - Added set_heart_beat to QCS. + - Fixed bugs in commands: banish, anglicize. + - Integrated most packet data with network room. + - Added router room for I3 router debugging. + - Integrated most I3 packets with router room. + + ---- 2.0r19 --- + - Fixed menu item bug in LIB_BARKEEP. + - Fixed Ylsrim pub. + - Added keepalive pinger tool to wiz chest. + - Added commands: anglicize, debug, expel, resetpasswd. + - Fixed first boot problem with /secure/daemon/letters.c. + - Driver: set heart_beat to approximately one per second. + - Driver: added locale workaround to startmud script. + - Added Brodbane's New and Improved cp command. + - Added Brodbane's sefuns: wild_card, remove_dots. + - Elision bug in pager.c fixed by Brodbane. + - Added network troubleshooting room. + - Fixed bug in invisibility. + - Made tricorder and remote control emit warnings, logs, + and errors when used by a non-creator who does not have a + visitor pass. + - Added colon emote behavior to channels, eg, "ds :smile" works + the same as "dsemote smile". + - Tim's I3 router integrated into the lib. Fixes forthcoming. + - Object Properties map variable now persists as well. + - Added Brodbane's dsversion command. + - Fixed bug in LIB_SENTIENT eventReceiveEmote. + - Added Shadyman's fix to the imc2 daemon. + - Added language teacher and schoolhouse to /domains/town. + - Added LIB_TEACHER. + - Tweaked interactive.c to omit null obvious exits. + - Fixed "list" conflict with restricted channels and shops. + - Added SetNativeLanguage to QCS. + - Added PINGING_MUDS, ENGLISH_ONLY and HUMANS_ONLY defines to config.h. + - Added commands: anglicize, debug, expel. + - Added SetNativeLanguage() to LIB_LANGUAGE. + - Added GetEquippedLimbs() to LIB_BODY. + - Visitor's pass now suppresses autosave messages. + - Full cardinal direction aliases added to players (eg "north"). + - Added direction aliases to 'peer' command. + - Player Properties map variable now persists across quits and boots. + This may or may not be a good thing, and could change in + future releases. + - Added sefuns debug(), tell_creators(); + - Fixed socket_address(). + - Added AUTOEXEC_D. + ---- 2.0r18 --- ! - Changed default intermud router to 149.152.218.102 port 23 - Added a sanity check in telnet room. - Fixed bug in Newbie Mansion Quest (thx Jonez). - Added verb: pulsecheck. diff -c -r --new-file ds2.0r18/lib/doc/SUPPORT ds2.0r28/lib/doc/SUPPORT *** ds2.0r18/lib/doc/SUPPORT Mon Jan 23 09:17:12 2006 --- ds2.0r28/lib/doc/SUPPORT Wed Jul 5 00:00:58 2006 *************** *** 12,18 **** For your convenience, a telnet room has been added to your mud that can help you connect to Frontiers, so that you may ask for help if you run into trouble. Just enter the telnet room ! west of the wizard hall, and type: connect You may ask questions of creators there, but don't be offended if they are more interested in building --- 12,18 ---- For your convenience, a telnet room has been added to your mud that can help you connect to Frontiers, so that you may ask for help if you run into trouble. Just enter the telnet room ! west and north of the wizard hall, and type: connect You may ask questions of creators there, but don't be offended if they are more interested in building diff -c -r --new-file ds2.0r18/lib/doc/efun/all/explode ds2.0r28/lib/doc/efun/all/explode *** ds2.0r18/lib/doc/efun/all/explode Mon Jan 23 09:17:12 2006 --- ds2.0r28/lib/doc/efun/all/explode Wed Jul 5 00:01:10 2006 *************** *** 11,16 **** --- 11,17 ---- by spaces) in the string 'str'. See also: + implode, sscanf, replace_string, strsrch diff -c -r --new-file ds2.0r18/lib/doc/efun/strings/explode ds2.0r28/lib/doc/efun/strings/explode *** ds2.0r18/lib/doc/efun/strings/explode Mon Jan 23 09:17:12 2006 --- ds2.0r28/lib/doc/efun/strings/explode Wed Jul 5 00:01:10 2006 *************** *** 11,16 **** --- 11,17 ---- by spaces) in the string 'str'. See also: + implode, sscanf, replace_string, strsrch diff -c -r --new-file ds2.0r18/lib/doc/faq/admin ds2.0r28/lib/doc/faq/admin *** ds2.0r18/lib/doc/faq/admin Sat Mar 11 11:22:47 2006 --- ds2.0r28/lib/doc/faq/admin Wed Jul 5 00:01:03 2006 *************** *** 420,426 **** %^GREEN%^*** I found a bug. For real. Can you please fix it?***%^RESET%^ ! Email me: @users.sourceforge.net Please include a detailed description of the bug, and the exact error text and commands that produced it. A log file or --- 420,426 ---- %^GREEN%^*** I found a bug. For real. Can you please fix it?***%^RESET%^ ! Email me: @comcast.net Please include a detailed description of the bug, and the exact error text and commands that produced it. A log file or diff -c -r --new-file ds2.0r18/lib/doc/faq/general ds2.0r28/lib/doc/faq/general *** ds2.0r18/lib/doc/faq/general Sat Mar 11 11:22:47 2006 --- ds2.0r28/lib/doc/faq/general Wed Jul 5 00:01:03 2006 *************** *** 159,165 **** %^GREEN%^ How do I get started? %^RESET%^ ! Download the latest version from http://dead-souls.sourceforge.net/ or http://www.mudmagic.com/codes/download/lpc/mudos/dead_souls and install it. There are versions available for Windows and for Unix. The main difference between the two is the driver. The Windows driver is a Windows --- 159,165 ---- %^GREEN%^ How do I get started? %^RESET%^ ! Download the latest version from http://dead-souls.net/ or http://www.mudmagic.com/codes/download/lpc/mudos/dead_souls and install it. There are versions available for Windows and for Unix. The main difference between the two is the driver. The Windows driver is a Windows diff -c -r --new-file ds2.0r18/lib/doc/guide/chapter01 ds2.0r28/lib/doc/guide/chapter01 *** ds2.0r18/lib/doc/guide/chapter01 Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/guide/chapter01 Wed Jul 5 00:01:03 2006 *************** *** 1 **** --- 1,36 ---- chapter 1 "Introduction" + + If you're reading this, you've probably been + successful in installing Dead Souls, and are able + to get around and manipulate stuff within it. + + There are lots of questions that new admins + have at this point. This book is not intended to + answer them. Specific questions about administration + are handled in the Admin FAQ, which you can read + at http://dead-souls.net/ds-admin-faq.html . A + local copy is archived in the /www directory, but + this may be out of date by now, and you'd be best + served by looking at the online version. + + This guidebook isn't about "how to" or "where + is," although such issues may be handled incidentally. + The point of this guidebook is to describe to you + various principles that are important to your + success as a Dead Souls mud admin. + + The tone of these chapters is intended to be + conversational. Because of this, it may sound like + I'm being condescending (that means "talking down + to you"), but that isn't intentional. I'm + assuming that you fully understand I'm not the boss + of you, that you can decide for yourself what is + best for your mud, and that the contents of this + guidebook are thoroughly biased. + + However rambling these pages might be, know that + I claim no authority over What Should Be. I can only + tell you, from my experience, how things look, and + how I *think* things work best. + + diff -c -r --new-file ds2.0r18/lib/doc/guide/chapter02 ds2.0r28/lib/doc/guide/chapter02 *** ds2.0r18/lib/doc/guide/chapter02 Mon Jan 23 09:17:12 2006 --- ds2.0r28/lib/doc/guide/chapter02 Wed Jul 5 00:01:03 2006 *************** *** 1,35 **** ! chapter 2 "Player Management" ! Snooping: ! -------- ! ! One of the most powerful and most easily abused tools ! in your administrative arsenal is the snoop command. When ! you "snoop ", you get to see everything they ! say and do. ! Players usually find this intrusive and objectionable, ! and it is ethically shaky to do this without their ! knowledge and consent. The only circumstances under which ! snooping is unambiguously ethical are: ! ! * Snooping one of your own test characters. ! ! * Snooping a player (with their consent) for the purposes of ! troubleshooting a bug. ! ! * Snooping a player (without their consent) to investigate ! a legitimate suspicion of cheating. ! ! Secretly snooping people for your personal amusement is ! pretty much just flat wrong. ! ! By default, only admins can snoop. Admins are players who ! are members of one or both of the groups SECURE and ASSIST. ! An assistant admin *can* snoop a full admin. When this ! occurs, the full admin receives the message that he or she is being ! snooped. ! When an assistant admin is snooped by full admin, they ! do not receive this message. ! --- 1,113 ---- ! chapter 2 "The Vision Thing" + Are you sure you want to run a mud? I mean, are + you *really* sure? ! Most newbie admins have no idea what a difficult ! task lays before them. I started my own mud in 1995. ! It's still around today, in fact. Back then, I'd ! been coding on a mud that had its hosting pulled. I ! finagled access to my university's systems and ! told the old mud's admin "Hey, let's host it here!" ! He didn't want to, so it was just me and my ! new Nightmare IV mud. I figured "what the heck, maybe ! I can run my own," and the rest is history. ! ! I hadn't a clue how to manage people, and things ! just wouldn't come together. I had literally dozens of ! creators come and go, and I could never figure ! out why they'd build a few things and leave. The ! problem was me, obviously. There was nothing about ! the mud people disliked: Nightmare was a very popular ! lib at the time. ! The problem was that people wanted leadership ! from me, and I didn't even know it, much less know ! how to provide it. ! ! Creators ("builders") are your most precious resource. ! Without them you don't have a mud, you have a lib. Sure, ! you can try building everything yourself...and with ! Dead Souls, that's not so farfetched an idea. But ! after a few months of toil, you'll see that you have ! weaknesses, you are not the perfect builder, and you ! will wish for the help and support of others. ! If you don't carefully cultivate your relationships ! with these people, you will fail. Your mud will be a ! failed mud, and your self-expression squelched. ! ! This is why I ask you if you're *really* sure you ! want to run a mud. Running a mud isn't about lording ! it over puny mortal players. It isn't about being ! the sharpest lib coder logged in. It isn't about ! bossing your staff, or making long lists of rules ! and job titles and meeting schedules. ! ! Your job as an administrator is to manage ! people, and guide them toward a single vision, over ! which you yourself may not have full control. People ! will listen to the admin at first because, well, she's ! the admin. But if you can't demonstrate the qualities ! of leadership they expect, they will stop respecting ! you, and they will leave. Or worse, they will hang ! around and be difficult. ! ! What's this about a "vision"? People will work for ! a variety of reasons, mostly money, fun, recognition, ! etc. Rewards. When your new coders show up, they ! will need motivation to work. Since you probably ! won't be offering much in the way of money or ! recognition, you'll need to find a way to motivate ! your coders by making it fun to work with you. ! ! Obviously I don't mean you need to be jolly and ! wear funny hats. In fact, you can be quite boring a ! person and still be good to work with. When I mean it ! has to be fun for your creators, I mean that they ! have to be inspired to do stuff...they have to *want* ! to build because they are expressing themselves in ! a way they enjoy. ! ! This means you'd be unwise to start parceling out ! "missions" and "assignments". Find out what your new ! creator *wants* to do, then do your best to ! accommodate them. It's that simple. If they're working ! on what they *want* to do, you don't need to actively ! motivate them...you just need to make sure they ! have what they need, and that they understand what ! is expected of them. ! ! These expectations are the other part of the ! individual management of creators. Just as is it ! fatal to give creators "homework", it is just as ! counterproductive to say "do whatever you want, man, ! you're free to do anything." Part of the fun of ! work is knowing what the standards are, and how your ! work will be judged. If your creator feels like you ! don't actually care what she builds, she won't ! care much about doing a job that's up to any standards ! but her own. After a while of this, she's going to ! figure out she might as well just run her *own* mud. ! ! You therefore have to have a strong sense of what ! your mud will look like, and what each creator's role ! in that mud will be. If you don't know, or it seems like ! you don't know, you'll lose them. ! ! You don't run the mud because you have the admin ! password. You run it because people think you run it. ! If they stop thinking it, you stop running it. ! ! So I ask again. Do you know what you want out of ! this mud? Have you planned out what you want people ! to be doing? When a talented coder shows up, will ! you be prepared to negotiate their proper role, ! and persuade them that the mud will succeed? ! ! Do you *really* want to be a mud admin? Or are ! you just looking to be someone's boss? ! ! First, find your vision. Everything else will be ! hard work, but if you know what your mud will be, ! and what you need from other people, then you ! just might have a chance to succeed. diff -c -r --new-file ds2.0r18/lib/doc/guide/chapter03 ds2.0r28/lib/doc/guide/chapter03 *** ds2.0r18/lib/doc/guide/chapter03 Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/guide/chapter03 Wed Jul 5 00:01:03 2006 *************** *** 1,3 **** ! chapter 3 "Intermud" --- 1,79 ---- ! chapter 3 "Getting Started" + If you've read this far, there's a good chance + you already like the lib and are eager to get + going on this whole mud thing. Whether this is + true or not, this is where you find out for sure. + Let's assume you're set with the vision thing. + You're going to make a mud with a Dora the Explorer + theme. You can practically hear the music even + now! Let's get this mud written and open! Vamonos! + + The first thing that happens here is you need + to get real familiar with this mud. If you haven't + done so already, when you finish this chapter, + you must do the following: + + 1) Read the Player's Handbook, cover to cover. + + 2) Create a test character. Do *not* use your + admin character's powers to give her any + equipment or money. Using the information from the + Player's Handbook, play this character until she + solves the Orcslayer Quest. Do not use any creator + characters to help her in any way. + + It is very important that you do this. It + is the best way you will know for sure whether you + have made the right lib choice. + + This doesn't mean that I'm asking you if you're + happy with the questing system, or how the items + in your inventory get listed, or whatever. Such + systems and cosmetics can be changed, sometimes with + trivial work. + What you're testing is the feel of the mud, + the parser, and that certain "I don't know what" + that tells you whether this is really a mud lib + you can live with. + + Don't like quest advancement? That can be removed. + Want turns-based combat? That can be arranged (though + not trivially). But if you get a low level discomfort, + and can't shake the feeling that you can't get + anything done, then this is when you'll find out. + + The second advantage to completing the Orcslayer + Quest is that it helps you see how things are + organized. As you proceed along the quest, you should + be using your admin character to examine the + files that compose the rooms, items, and npc's you see. + You will know where there are working samples of + doors, locks, hostile npc's, friendly npc's, spells, + and so on. This information will be valuable to you + in the next step you take. + + If you complete the Orcslayer Quest and decide + you still like the lib, your next step is to create a + small area. Read the Creator's Manual starting from + chapter 31. This provides you a detailed set of + instructions on how to get stuff built quickly and + painlessly. + Build a few rooms. If you can't think of something + to build, create a room just like the one you're + sitting in right now, including desk, door, and + scruffy mud geek sitting on a chair. + Or you might already know exactly what you want + to build. This is a good time to build a few + rooms of Dora's Grandma's House, or the tree house + of Tico the Squirrel. + + It's vitally important that you start using the + building tools, because just like with the Orcslayer + Quest, this is the point where you will discover whether + the build system here is a deal killer. + + Once you're done with your few starter rooms, you'll + be in a position to know whether you've really made + the right mudlib choice. diff -c -r --new-file ds2.0r18/lib/doc/guide/chapter04 ds2.0r28/lib/doc/guide/chapter04 *** ds2.0r18/lib/doc/guide/chapter04 Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/guide/chapter04 Wed Jul 5 00:01:03 2006 *************** *** 1,2 **** ! chapter 4 "Lib design" --- 1,70 ---- ! chapter 4 "Gaining Experience" + Now you must prepare for the + technical demands of your creators. + + Your creators will expect you to have + answers to their questions. For the most part, + they'll find these answers in the Creator's FAQ, + at http://dead-souls.net/ds-creator-faq.html . + + But you're going to get questions not on + that FAQ. You'll get stuff like: + + * How many quest points should the Issa Quest award? + + * What's the maximum player level on this mud? + + * Can I make a player class called "Swiper"? + + * What's a good weapon type for The Bouncy Ball? + + These are questions that depend strictly on you + and what your vision for the mud is. Dead Souls is + a starting point. The classes, levels, systems, + *everything*, is open to modification. + + It is normal and natural not to have all of + these answers at first. I suggest you concentrate on + making an "area", perhaps a quest, consisting of + perhaps 15 to 20 rooms and a few npc's, weapons, + pieces of armor and general items. + + Test your weapons and armor in the arena. To + get to the arena, first go to the Creators' Hall + by typing: wiz + + Then go east, then north. + + You can have the dummy wear armor like this: + + give mithril shirt to dummy + force dummy to wear shirt + + And you can test your weapons by beating on the + dummy: + + force fighter to drop sword + clone hammer + give hammer to fighter + force fighter to wield hammer + force fighter to kill dummy + + The dummy will very helpfully blurt out the amount + and type of damage it receives. + + You can get ideas for your npc's by visiting the + menagerie. It is east and south of the Creators' Hall. + + By creating your first quest, and putting test + characters through it, you will gain the experience + you need to be able to tell your players things like: + + "The Issa Quest is supposed to be easy, so make it 2qp." + + "Level 50 explorers are way too strong. I'm capping + player advancement at level 40." + + "No, there is already a thief class." + + "Make it a projectile weapon." diff -c -r --new-file ds2.0r18/lib/doc/guide/chapter05 ds2.0r28/lib/doc/guide/chapter05 *** ds2.0r18/lib/doc/guide/chapter05 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/guide/chapter05 Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,111 ---- + chapter 5 "Guilds, Classes, and Clans" + + Section I: Classes + ------------------ + + I suspect you are already quite familiar with + the concept of classes. Some people even have very + strong feelings about classes, specifically, they + hate them. + + Dead Souls 1 came with a class system, and + I decided to keep it because it sort of worked, and + many people are familiar with classes and want to + have them on their mud. + + However, you don't have to use them. + + That's right. Using classes is not required. You + can very easily make your Dead Souls mud completely + devoid of classes, if that's what you want. + + The reason for this is that in Dead Souls, the only + thing a class does is confer on a player a class title, + like "Fighter", and load her up with skill settings appropriate + to that class. That's it. Classes do nothing more. + + If you want player X to have all the skills of a + fighter and all the skills of a mage, just make it so. + They don't need to have class to have skills. Add + "kite flying" while you're at it. It doesn't matter. + Dead Souls operates on a skill system. The class system + is incidental to it and can be dispensed with entirely. + + On the other hand, for those folks who appreciate + the role play and tactical elements involved in using + classes, Dead Souls provides you the ability to use + the existing stock classes, and permits you to create + your own. The files in /secure/cfg/classes describe them. + See http://dead-souls.net/ds-creator-faq.html#2.46 + for the exact syntax of these files. + + You'll notice that there is a field for "how important" + a skill is. What this modifier does is determine how + quickly your player's skill levels rise when her player + level rises. A fighter's magical ability does not increase + much when she is promoted a player level, but a mage's + magical ability certainly does. + + For those who find classes distasteful, this kind + of "skill hobbling" is just the reason they hate classes: + they feel they are too restrictive. If you are such + an admin, just dont use classes, and whenever you award + a skill to a player, set the "how important" number + (techninally known as the "skill class" but that's a very + confusing term) to the same for everyone. + + Incidentally, you don't *need* player levels either. + I will leave it as an exercise for the reader to imagine + a scheme where players do not have advancement levels. + + DS1 allowed players to join more than one class. + Unfortunately, the system was buggy enough and stripped + of classes so that it was both meaningless and a bit + of a problem. Multi-classing is by default not permitted + on DS2, but it's easy enough to implement on your own. + Review the header data in the class files to see the + syntax. + + However, since multiclassing isn't something I + am interested in working on right now, I will not be + assisting anyone in getting that to work. + + + Section II: Guilds + ------------------ + + The concept of "guilds" carries some baggage for me. I + learned about mudding by playing on Darker Realms, an LP + mud where a "guild" was effectively a class. There was + the mage's guild, the barbarian guild, etc. There were + also guilds that blurred the distinction between class + and race, like shapeshifters, cyborg, and dragon. + + When I ran into the Dead Souls 1 conception of guilds, + then, I was pretty confused. In DS1, a guild was + kind of a player-run club. There was a guild object + that made some sort of determination about who + was in or out, who was the boss, etc. My presumption is + that in later iterations of Nightmare V, these guilds + were fleshed out and worked properly. I presume this + because in DS1 they didn't, and they seemed to make some + assumptions about the lib that were not correct. + + I decided to change this for DS2, and the way it now + works is that guilds are neither classes nor player-run + clubs. The plan is to have guilds be not-necessarily-class- + based affiliations a player can have with balanced + advantages and disadvantages. As of DS2.0 there is no + working sample of this, but that's the plan for post + 2.1 development. + + + Section III: Clans + ------------------ + + Clans serve the purpose that DS1 guilds did. They are + player-run affiliations, managed by clan objects that + confer identity and status. As of DS2.0 there is no working + sample of this, but that's the plan for post 2.1 development. + + diff -c -r --new-file ds2.0r18/lib/doc/guide/chapter06 ds2.0r28/lib/doc/guide/chapter06 *** ds2.0r18/lib/doc/guide/chapter06 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/guide/chapter06 Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,50 ---- + chapter 6 "Privacy" + + One of the most powerful and most easily abused tools + in your administrative arsenal is the snoop command. When + you "snoop ", you get to see everything they + say and do. + Players usually find this intrusive and objectionable, + and it is ethically shaky to do this without their + knowledge and consent. The only circumstances under which + snooping is unambiguously ethical are: + + * Snooping one of your own test characters. + + * Snooping a player (with their consent) for the purposes of + troubleshooting a bug. + + * Snooping a user (without their consent) to investigate + a legitimate suspicion of malfeasance. + + Secretly snooping people for your personal amusement is + just flat wrong. + + By default, only admins can snoop. Admins are players who + are members of one or both of the groups SECURE and ASSIST. + + An assistant admin *cannot* snoop a full admin. However, + assistant admins have read access to the snoop log directory, + so if global monitoring is enabled, they can read the + contents of a full admin's monitor log. + + The new SNOOP_D system allows for the simultaneous + snooping of multiple people, and allows multiple people to + snoop the same person. It also permits you to enable + monitoring of users without having to snoop, by using the + monitor command to log i/o to /secure/log/adm. + + The GLOBAL_MONITOR parameter in config.h will take one of three + arguments. 0 = monitor nobody. 1 = monitor everyone. 2 = monitor + everyone except admins. After changing it, reboot the mud + to make sure the change takes effect. + + This functionality isn't here for your entertainment. In + fact, I had to think long and hard before sharing my snoop + code with you and putting it in the general lib distribution. + + In the end, though, I believe that the benefits outweigh + the risk of abuse. As an admin, you have the right to know + what's going on in your mud, and as a lib coder, it isn't + my business to interfere with that. + diff -c -r --new-file ds2.0r18/lib/doc/guide/chapter07 ds2.0r28/lib/doc/guide/chapter07 *** ds2.0r18/lib/doc/guide/chapter07 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/guide/chapter07 Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,167 ---- + chapter 7 "Advanced Topics" + + Section I: Shadows + ------------------ + + Shadows are a problematic topic. My first impulse is to warn + you sternly not to mess with them, they shouldn't be used, etc. In + his legendary LPC text, Descartes goes so far as to say he hasn't + seen a shadow do something that couldn't be done better another way. + + So, be aware that the topic of shadows tends to generate + strong opinions. + + Shadows *are* hazardous pretty much by definition. A shadow + is an object that effectively "wraps" another object, like an + invisible shadow around it. When a call is made to the shadowed + object, the shadow intercepts that call. + + What the shadow does with the call is up to you. It can + do nothing at all, and simply pass the call along to the + shadowed object. It could block that call. It could manipulate + that call and send the modified version to the shadowed + object. + + You can see an example of a shadow in /secure/npc/drone.c . + This is the code that enables you to take control of an npc + with the remote control. The remote control loads /shadows/drone.c + which inherits /secure/npc/drone.c , and attaches that shadow to + the npc that is to be controlled. This is a way of "adding + functions on the fly" to an already-loaded npc. + The drone shadow is in the lib as an example + of how shadows work, and an example of how to get an object to + posess functions it did not have when loaded. It is not + intended to represent shadow advocacy. + + The danger, and the reason some people go ballistic + when they hear the phrase "I think I'll use a shadow for that" + is that a lib that allows unrestricted shadow use + effectively has no security at all. You can have creators + enshadow an arch for example, or enshadow other privileged + objects. + + Dead Souls shadows are pretty tightly restricted. The + master object does not permit a shadow to be created unless its + code is in /shadows . This means creators can't hide their + rootkit shadows in their homedirs and expect them to work. + + Further, because /shadows is outside the /secure dir, + it serves as an obstacle to defeating the stack security + model. + + In any case, I strongly recommend you avoid using them + except in the extremely unusual case of a task that has + no other solution. If your mud starts collecting a bunch + of shadows out of laziness, sadness will likely be the result. + + + Section II: The "class" Data Type + --------------------------------- + + In 1995 Beek added a data type to MudOS: class. + I have to admit that I'm at a bit of a loss to explain classes, + because I am not a C guy, I'm an LPC guy. For people who + grok C, the class data type is a natural and elegant solution + for organizing related sets of variables. + + I have nothing but respect for Beek and the leet programmers + who built MudOS, so please don't go running around saying I'm + dissing them. + + But in my experience, the use of classes generally serves + the purpose of obscuring code and making it more difficult + to debug. + + I've seen newbie LPC coders take to classes like fish to water. + I can't explain it other than to speculate that for some people + the class data type (I've even had people argue at me that it's + really a "data structure", like I have the slightest clue what + the difference is) Just Makes Sense. If you are one of those people, + then bully for you. I'm serious. I don't understand you, but + your thing probably works for you, so, right on. + + However, I do not recommend that the average newbie coder + spend too much time on classes. You'll have plenty of opportunity + when you start dissecting the lib, but my friendly advice to + the noob is to use mappings instead. I've yet to see a class + do something that a mapping couldn't do with greater clarity. + + + Section III: add_action + ----------------------- + + Yet another topic with potential for violence. The passions + can run high on this one, and in fact, the Lima team felt + strongly enough about it that they don't enable it by default. + No add_actions by default. That's hard core. + + add_action is an efun that LP muds originally depended + on for most kinds of user input. If you wanted to be able to + throw a ball, that ball needed an add_action for it. You'd + have that ball provide a user with the throw command whenever + the user came in proximity to the ball. You can see the syntax + for add_action by examining the /lib/shop.c file. + + It's simple. It works. I mean, really, It Just Works, and + it's the fastest way to add functionality to any object. People + used add_action from pretty much the genesis of LP, as far as + I can tell, and it became just a way of life. That was just + how it was done. Yes, that wording was intentional ;) + + However, there were serious problems with this parsing + scheme. Basically it let any creator, regardless of skill + level, define commands for the mud. Joe's throw add_action for + his ball could be poorly coded and worded, and was liable to + behave differently from Jon's version. + + And suppose you held two or three items that had a throw + add_action each? Which one took precedence? What if that + one was bugged? + + Using add_actions for general lib command functionality + is really problematic for this reason. It fosters a lack + of uniformity across the lib that can leave users basically + playing a "guess the syntax" game for any item like this, + and allows for conflicts by incorrectly coded items. The + natural language parser was the MudOS solution to this problem, + implementing the verb system with which you are now so + familiar. + + The controversy boils down to preference. For some people, + add_action is just How It Is Done, and you still have + people starting muds with libs like Skylib and TMI-2 (!!) + that lack an advanced lib-wide parser. For these people, + verbs are an overcomplicated mess that they just don't + have a need to understand. + + Then you have the people who find add_action anathema, and + simply an unacceptable vestige of a more primitive form of + mudding. These people view add_actioners as atavistic knuckle- + draggers, either too dumb or too pig-headed to understand the + beauty and majesty of natural language parsing. + + My view, predictably, is somewhere in the middle. Verbs + *can* be exhausting to accommodate when you're just Trying To + Do One Thing. But add_actions truly are of limited use in + a modern lib, and allowing their proliferation out of + laziness is probably a bad idea. + + That isn't to say there isn't a place for add_actions. Dead + Souls supports them, and you'll see them every now and then. + In fact, technically, every command you issue, verb + or not, is evaluated by an add_action in the mud shell object + (LIB_NMSH). It is nevertheless better to learn to use verbs, because + they eliminate many problems you don't need to reinvent the + wheel for. + + I had one person tell me, as they chose a MudOS lib that + didn't use verbs, that they planned to write their own natural + language parser in the lib. I bade him good luck. I wonder + how he's coming along these days. + + + Section IV: Thoughts on MudOS + ----------------------------- + + Like, wow. MudOS. You know? + diff -c -r --new-file ds2.0r18/lib/doc/guide/chapter08 ds2.0r28/lib/doc/guide/chapter08 *** ds2.0r18/lib/doc/guide/chapter08 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/guide/chapter08 Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,346 ---- + chapter 8 "Understanding the Lib" + + One of the most common questions I get goes something + like this: "I'd like to change combat so that it is + turns-based, with actions. How would I do this?" Another + example might be "I'm setting up a farming system, with + livestock and stuff. What should I look at?" + + To me, the questions are the same. Translated into + my language, this is the meaning: "I have great ideas that + require advanced knowledge of the lib to implement. How do I do it?" + + I'm usually at a loss when I get one of these, because + I want to set people straight, but I don't want to hurt + their feelings, either. In the FAQ's, my response is + something along the lines of: + + "If there's anything in the Creator's Manual you don't + understand, you aren't ready to try this." + + I hate to say that, because I think it's probably discouraging + to hear. After all, whatever the project, it is very likely + doable. You can make an LP mud do pretty much anything + you want...that's the beauty of the flexibility of LPC. + However, as they say, with great power comes great responsibility, + and in this case, it is your responsibility to understand the + lib, if you want to make major changes to it. Let's take the + example of farming. + + Section I: Verbs + ---------------- + + It is critical to understand how verbs work in order to + do anything in Dead Souls of an advanced nature. Verbs are + basically commands that do something to your environment, + something in your environment, your "body", or something + in your inventory. + + For example, "who" is not a verb. It's a standard command, + which doesn't act on any cloned items. All it does is communicate + with the lib to query the list of users logged on, and displays + it to you in a particular manner. + + Then there's something like "zap". That *is* a verb, and + it takes cloned items as arguments. When you "zap orc" this + has a special meaning to the parsing system. The parser is the + part of the game driver that tries to interpret your input + and attempts to do something useful with it. When the parser + catches a verb at the beginning of your input, it gets to + work on figuring out how the rest of the words in the input + relate to that verb. + + This is done through "rules". You can take a look + at /verbs/creators/zap.c for the specific rules in this case. + If the word or words (for example "first orc", "orcs", "an orc") + match one or more objects in the room, the parser then + sends the arguments to the verb object. The verb object is + the loaded code from /verbs/creators/zap.c in this case. + + Depending on how the verb is coded, your command line will + succeed or fail. + + For your new farming system, you're going to need some new + verbs, so the first thing you need to do is understand verbs. + You're going to have to build new verbs like "plow", and "plant", + and "harvest". Therefore, you'll need to go over the verb + tutorial, which is at http://dead-souls.net/verbs.html + + + Section II: Lib Event Objects + ----------------------------- + + In the verb tutorial, you read that when a verb acts on + an object, the parser requires that the object have a function + that handles that verb. If a chair object lacks a function + like direct_sit() or something similar, the parser will assume + your sit verb doesn't apply to chairs, and the command line + will fail with something like "You can't sit on the chair". + + It would be incredibly tedious to have to code a sit verb + handler in every piece of furniture you create. Similarly, + your farmer's field plow *could* have a plow verb handler + coded in it, but it is much better to create a lib object that + your plow will inherit. That way, other objects can inherit + that functionality without having to reinvent the wheel, and + plowing in general will be a uniform experience across the mud. + + For example, one of the first systems I made when + I started my lib obsession was the inheritable flashlight + system. The original Dead Souls lib had regular old torches + you'd light with a match, but it seemed to me that not every + Dead Souls mud would be Sword & Sandals style, and a modern + illumination system should be available. So I set about + making a "turn" verb, so that once I had flashlights, + you could "turn on the flashlight". + + I then created the lib object /lib/events/turn.c (when + referring to lib objects, I often use the macro name. In + this case, if I'd said LIB_TURN, it would be the same thing + as saying /lib/events/turn.c). The lib object doesn't really + *do* much of anything. That object isn't really where you + need to be checking for validity of commands. What that + object does, almost *all* it does, is to have functions that + correspond to the verb "turn". That's it. It's kind of like + a socket for a plug. The verb is the plug and you're trying + to use it on something. If that something has a socket + that fits your plug, then it'll work. + + Lib event objects come in different flavors, and some + really do perform a bunch of thinking. But for the most part, + for simple verbs, all you need is a lib event object that + says "yes, I understand that verb". + + LIB_TURN is inherited by LIB_FLASHLIGHT. That means + that when you clone an object that inherits LIB_FLASHLIGHT, + it contains all the functions of /lib/flashlight.c plus + all the functions that LIB_FLASHLIGHT inherits from LIB_TURN. + + Because your flashlight inherits LIB_FLASHLIGHT, + which inherits LIB_TURN, when you issue the command line + "turn on flashlight", the parser checks with the + flashlight to see if it knows what you're talking about, + and gets a "yes, I know that verb" response. At that point + the parser says "fine, here's the rest of what this + player thinks he can do with you and the turn verb" and now + it's up to LIB_FLASHLIGHT to figure out whether it has + enough batteries, of the right kind, with sufficient + charge, and so on. + + For your new farming system, you'll need to implement + a similar scheme. Your "plow" and "hoe" verbs will need + lib event objects that can be inherited by the cloned + objects you want to plow and hoe with. + + In this case, LIB_FLASHLIGHT and the turn verb + aren't the best models for your new plowing system. This + is because your plow is something you plow *with*, + as opposed to something that *is plowed*. + + To see how a plowing system might be implemented, + take a look at the "dig" verb, LIB_DIGGING, and + LIB_DIG_WITH. This is what a shovel would use, so + that you can "dig in sand with the shovel". After + studying the dig system, and lots of trial and error, + you will hopefully eventually come up with a + plow system that will let you "plow field with plow", + for example. + + + Section III: Daemons + -------------------- + + So, now you've created a plow verb, and a plow lib + event object, it works, and now you're happily plowing + along. Let's say that the rooms field1.c and field2.c + are plowable rooms. Presumably, you don't want people + to be able to plow here all the time. The fields need + time to do their thing, and constant plowing would + slow down the growth of your tender young corn stalks. + + Normally, you might deal with this by having + a local variable in the room, so that "harvest time is + 50 hours, unless someone plows again, which + makes it take longer", this sort of thing. Let's call + that variable PlowedTimes. + + But, oh noes! The mud rebooted! Now all the rooms + have reset, and the planting and plowing variables + have reset! + You might avoid this problem by just not rebooting, + but even if you manage never ever to reboot your mud, + the mud periodically does resets of unused objects, + retiring them from memory and resetting their values + to zero. + You might avoid *that* problem by setting your + fields to be "NoClean", to avoid resets, but this is + very inelegant. Rather than ensuring the integrity + of your game data, you're just crossing your fingers + and hoping it doesn't go away. + + The solution is to use a daemon. A daemon is an + object loaded into memory that acts like an arbiter + of information. For example, STARGATE_D keeps track + of where stargates are, and which gates are in + what state, and which gates are connected to each + other. It is important to have one location where + this data can be accessed, because a new gate must + be able to know what other valid gates there are, and + it must be able to know what gates are idle and + therefore accessible. STARGATE_D is a central + repository of this data, and serves as a mediator + for connection requests, keeping things working right. + + In this case, the daemon's job would be to + keep track of which fields have been plowed, how + many times, and how long it'll take to get to harvest + time. Dead Souls daemons typically use object + persistence files ( http://dead-souls.net/ds-admin-faq.html#80 ) + to avoid losing information during object reloads or + mud reboots. A FARMING_D is exactly what you need to + keep track of and manage this kind of data. + + + Section IV: Skills + ------------------ + + To what extent should people be able to plow? How + well should they do it? If you care enough about farming + to have come this far, you've probably got ideas about + what good plowing is and what criteria a player should + have for extracting the most from their land. + + This is where skills can play an important role. + What you have to understand about skills is that they + are simply variables in a player's body. Skills don't + have to be gained by joining a class, guild, or being + member of a race. Adding a skill to a player is as + simple as having an object do something like this: + + this_player()->SetSkill("scuba diving",1); + + And if just strapping on a scuba tank does it, then + now that player has that skill. + + Now, *normally* players are granted skills through + something more sensible than just picking up an object. + It makes more sense to have skills granted when a + player is taught something by an npc, or joins a guild, + or whatever, which is why traditionally that's how + it has worked. + + So let's say you have a Farmer's Guild, then. When + you show up and sign the registry, some npc pops out, + "teaches" you the farming skills you need (by simply + adding the skills "farming" and "plowing" and "sowing" + to the player) and now you have the skills. If you + want, you can even create a Farmer class, like Fighters, + but that's up to you and not in the scope of this chapter. + + This plowing skill is totally useless right + now. It does nothing at all, because you haven't yet + coded anything that makes use of it. This is the key + concept of the skills system that you must understand. + + Just giving a player a skill does not mean that + it has any use. For a skill to be useful, there + must be lib verbs and/or objects that evaluate the + skill and perform calculations based on it. + + It is therefore time to add these skill checks to the + objects that need them. For example, suppose our + farmer's plowing skill is at level 5. This doesn't + mean he's a level 5 player necessarily, just that + at plowing, his skill level is 5. + You might have a function in your /verbs/items/plow.c + verb that checks that skill, and determines how long + the field will take to grow based on it. Perhaps + for a level 5 plower, the field will be ready for + harvest in 45 hours. Perhaps for a level 10 plower, + it would be 35. You might have either the plow verb + or the plow lib event object do something like: + + int PlowFunction(string field){ + int skill_level = this_player()->GetSkillLevel("plowing"); + + if(skill_level) skill_level *= 2; + else skill_level = 1; + FARMING_D->eventModHarvestTime(field, skill_level); + return 1; + } + + It's a silly example, but you get the idea. The + "plowing" skill is valuable because the lib uses it + in some way to modify events the player performs. If + the lib doesn't know about it, the skill has no value. + + In the case of, for example, "blade attack", the + lib checks for this if you're wielding a sword and + you're in combat. Based on how good you are at blade + attack, combat.c will modify how much damage you + inflict when you hit your opponent. + + + Section V: Special Abilities + ---------------------------- + + Perhaps "plant" and "sow" are verbs that should + only be available to players with the skills "planting" + and "sowing". + Or, if farming isn't your thing and you want to + enhance combat, you might want Fighters who are members + of the Viking Guild to have a special ability called + "massacre" that can do extra special damage. + + This is best done by simply creating the sow, + plant, and/or massacre verbs, then coding the verbs to + work only for those people you designate. If the player + isn't a Fighter and a Viking, perhaps the massacre + verb would return something like "You have no idea + how to do that." and do no more. + + You are, of course, free to implement a Special + Abilities System along the lines of the existing Dead + Souls spell system. I encourage you to do so, if + you're so inclined, and to share that code with me, + if it works. But it isn't necessary. The existing + verb system is plenty sophisticated enough to + handle such special events. + + + Section IV: Summary + ------------------- + + At this point in my lib coder development, I have + a hard time distinguishing what is easy and what is + hard for new people. I have been surprised by people + who take a long time to grasp simple concepts. I have + been surprised by people who grasp complex concepts + so quickly that I can't answer their questions. + + Where you stand in that continuum I can't say. + What I can say is that if this chapter seems like it + went mostly over your head, you shouldn't worry too + much about it. It took me years of coding experience + and months of obsessed lib analysis to reach my + current level of understanding. You should not expect + yourself to grok everything in this guidebook the + first time around. + + As suggested in the previous chapters, it's best + to start small, slow, and steady. As you build simple + things, more complex things will make more sense, and + you'll eventually reach the level of technical + expertise you need. + + This chapter was not written to make you feel + overwhelmed by what you don't know. It was written so + that you understand what you're asking when you + say "How do I revamp bodies and limbs so they have + knees and elbows you can poke people with?" + + Once you understand the lib, it really really isn't + that hard to do. But if you are a beginner, don't + set yourself up for failure by taking a leap at a + project you don't have the experience to tackle. + diff -c -r --new-file ds2.0r18/lib/doc/guide/chapter09 ds2.0r28/lib/doc/guide/chapter09 *** ds2.0r18/lib/doc/guide/chapter09 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/guide/chapter09 Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,67 ---- + chapter 9 "The Future" + + In the late 1990's, Descartes @ Nightmare released + a public domain version of the Nightmare lib called + Dead Souls, and pulled the official Nightmare lib from + distribution. They were very similar, but Dead Souls + lacked documentation. + + His final realease of Dead Souls was 1.1. + + As you must know by now, from reading the FAQ's (you + *did* read the FAQ's, right?) at some point I lost my mind + and decided to dust off that old lib, get it working, and + get people using it so that I could have other people to + discuss LPC code with. + + I can honestly say I didn't know what I was getting + myself into. I mean, when I started, it sure *seemed* like + things "mostly worked". The hard part was just getting it + installed, right? + + It's now been slightly over a year since I started + realizing that fixing A broke B, and fixing B broke A + and C, etc, ad nauseam. My guiding principle was "get it + working" with a corollary of "make it work well". My + main aim was bugfixes, but where a feature gap made it + obviously difficult for a beginner, I attempted to address + it with a new system. Hence, admintool, QCS, SNOOP_D, etc. + + In other cases, a new system was trivially easy + to add and its absence was an unreasonable burden, such + as SetAction for rooms. + + Sometimes a new system comes from my desire to have + a tool that makes my own life easier while fixing the + lib, such as the medical tricorder, remote control, and + the laboratory facility east of the Creators' Hall. + + For the most part, though, my main focus has been + fixing stuff, not adding stuff. The intention has been + to release Dead Souls 2.1 as a version that is as free + of pain as possible, as clear of bugs as reasonable, and + as fun and useful as 1.1 should have been. Today it is + May 18 2006, and I think that I am very close + to that landmark. Today I am at the point where the list + of bugs consists of minor annoyances, of the kind that + players would hardly ever take note. + + The future for Dead Souls I see as lots of fun for me. + I yearn to be free of doing nothing but fix fix fix. As + great as Dead Souls is, it needs major new systems to make + it fully competitive with the libs currently out there. + Adding these new systems is the kind of fun challenge + I'd really meant to be doing all along, but suckered + myself out of. + + Post 2.1 I intend to concentrate on things like + mounts, vehicles, naval/vehicle combat, 3d travel, extending + virtual rooms, player-independent world persistence, + and lots of other fun stuff. I'm not in the habit of + making promises about the lib. As the Dead Souls community + knows, I prefer to just *make* a new system than talk + about it. I wanted to share these plans with you, though, + so that you know that Dead Souls development continues + apace, and great things are on the horizon. + + diff -c -r --new-file ds2.0r18/lib/doc/hbook/chapter02 ds2.0r28/lib/doc/hbook/chapter02 *** ds2.0r18/lib/doc/hbook/chapter02 Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/hbook/chapter02 Wed Jul 5 00:01:03 2006 *************** *** 162,168 **** an amulet. If this is so, you'll need to specify where you want it. There are various types of armor, like cloak, pants, glove, etc. Many of them overlap. You can wear a shirt on your torso as ! well as a cloak and combat armor, but you may noy wear two of the same type. If you have a robe and a cape that are both cloaks, you'll have to decide which one is going on. You will find that shoes and gloves are often for one of your --- 162,168 ---- an amulet. If this is so, you'll need to specify where you want it. There are various types of armor, like cloak, pants, glove, etc. Many of them overlap. You can wear a shirt on your torso as ! well as a cloak and combat armor, but you may not wear two of the same type. If you have a robe and a cape that are both cloaks, you'll have to decide which one is going on. You will find that shoes and gloves are often for one of your *************** *** 186,195 **** There are four main types of weapons: ! blade: like swords, knives, and spears blunt: like clubs, staves, and shillelaghs ! projectile: like guns and bows ! missile: things designed to be thrown, like darts or grenades Unless it is a special device or magical item, weapons must be wielded in order to be of use in combat. Some weapons, --- 186,195 ---- There are four main types of weapons: ! knife: knives, daggers ! blade: like swords, and spears blunt: like clubs, staves, and shillelaghs ! projectile: things designed to be thrown, like darts or grenades Unless it is a special device or magical item, weapons must be wielded in order to be of use in combat. Some weapons, diff -c -r --new-file ds2.0r18/lib/doc/hbook/chapter03 ds2.0r28/lib/doc/hbook/chapter03 *** ds2.0r18/lib/doc/hbook/chapter03 Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/hbook/chapter03 Wed Jul 5 00:01:03 2006 *************** *** 145,151 **** a quest, solving a puzzle, winning a contest. Most often you will receive xp after killing an NPC. The amount of xp awarded will depend on the level of the NPC. Like qp, xp are needed to ! quilify for level advancement. --- 145,151 ---- a quest, solving a puzzle, winning a contest. Most often you will receive xp after killing an NPC. The amount of xp awarded will depend on the level of the NPC. Like qp, xp are needed to ! qualify for level advancement. diff -c -r --new-file ds2.0r18/lib/doc/hbook/chapter04 ds2.0r28/lib/doc/hbook/chapter04 *** ds2.0r18/lib/doc/hbook/chapter04 Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/hbook/chapter04 Wed Jul 5 00:01:03 2006 *************** *** 23,31 **** friends to tackle the orcs together, or raise your level to the point where you're tough enough to take them on. ! To raise your level, wander around in the newbie mansion. There's ! lots of loot there you can sell at Otik's shop, and with the cash you ! can then get some proper weaponry and armor. Silver is heavy, so don't try to carry all your money around all the time. Request an account from Zoe the banker and keep your money there until you really need it. --- 23,34 ---- friends to tackle the orcs together, or raise your level to the point where you're tough enough to take them on. ! To raise your level, wander around in the newbie mansion, which ! is south of the village church. ! ! There's lots of loot there you can sell at Otik's shop, and with the ! cash you can then get some proper weaponry and armor. ! Silver is heavy, so don't try to carry all your money around all the time. Request an account from Zoe the banker and keep your money there until you really need it. *************** *** 34,40 **** finding the secret room will give you experience and quest points too. (hint, there might be more than one secret room) ! Once you have enough experience and/and or points, go to Dirk in the adventurers hall and "%^GREEN%^ask dirk to advance%^RESET%^". Make sure you learn some spells from Herkimer, because if you --- 37,43 ---- finding the secret room will give you experience and quest points too. (hint, there might be more than one secret room) ! Once you have enough experience and/or points, go to Dirk in the adventurers hall and "%^GREEN%^ask dirk to advance%^RESET%^". Make sure you learn some spells from Herkimer, because if you diff -c -r --new-file ds2.0r18/lib/doc/hbook/chapter07 ds2.0r28/lib/doc/hbook/chapter07 *** ds2.0r18/lib/doc/hbook/chapter07 Mon Jan 23 09:17:12 2006 --- ds2.0r28/lib/doc/hbook/chapter07 Wed Jul 5 00:01:03 2006 *************** *** 50,56 **** - Local light sources (flashlights, torches, etc) - Your race's light sensitivity - Magical effects ! - Exposure to a excessive-light event It's important to remember that a room may be too dark for you to see everything in it. You might be able to see the description --- 50,56 ---- - Local light sources (flashlights, torches, etc) - Your race's light sensitivity - Magical effects ! - Exposure to an excessive-light event It's important to remember that a room may be too dark for you to see everything in it. You might be able to see the description diff -c -r --new-file ds2.0r18/lib/doc/help/classes/cleric ds2.0r28/lib/doc/help/classes/cleric *** ds2.0r18/lib/doc/help/classes/cleric Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/classes/cleric Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,27 ---- + Dead Souls LPMud Cleric Class + Originally written 951129 by Descartes of Borg + Last modified 951129 + + The cleric holds the natural world in highest esteem, shunning + violence and things unnatural. They specialize in the healing arts + and defense against magic and blunt weapons. They also have powers of + faith which draw from the gods of the natural world they worship. + + A person who chooses to play a cleric will never fight powerfully. + Instead, people playing clerics + play the class because they enjoy working with teams to accomplish a + task and also because they love helping others. Clerics are most + often seen as doctors or party healers in adventuring groups. + + One exception to the cleric non-violence oath is their power over the + unnatural world of the undead. Their faith bestows upon them the + ability to rid the world of the undead, or to bring the undead back to + the world of the living. + + Primary Skills: + faith + healing + blunt defense + magic defense + + diff -c -r --new-file ds2.0r18/lib/doc/help/classes/mage ds2.0r28/lib/doc/help/classes/mage *** ds2.0r18/lib/doc/help/classes/mage Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/classes/mage Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,22 ---- + Dead Souls LPMud Mage Class + Originally written 951202 by Descartes of Borg + Last modified 951202 + + Mages are powerful magic users who make their livings through their + magical talents. They are an integral piece to any adventuring group, + as many situations require the use of magic to change the way the die + have been cast. Given so much attention to the magic arts, however, + mages find themselves poorly suited to weapon-based combat. Thus, + when engaged in combat, mages tend to rely instead on their magic + talents to avoid damage and strike at their opponents. + + The mage class is perhaps better suited to the hack-n-slash style of + player, through role-players and socials can likely find attractive + characteristics in a well played mage. + + Primary Skills: + conjuring + magic attack + magic defense + projectile defense + diff -c -r --new-file ds2.0r18/lib/doc/help/classes/thief ds2.0r28/lib/doc/help/classes/thief *** ds2.0r18/lib/doc/help/classes/thief Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/classes/thief Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,20 ---- + Dead Souls LPMud Thief Class + Originally written 951202 by Descartes of Borg + Last modified 951202 + + Thieves are an extremely varied bunch of scum who spend their days + practicing the less accepted crafts of society. Though skills such as + lock picking are often desired in adventuring parties, skills such as + stealing make people avoid them. + + Thieves are designed for people who like to role-play and adventure in + groups. The role-player will find the unique character of being a + thief challenging, and people who enjoy group adventuring will find + their skills in high demand. + + Primary Skills: + bargaining + stealing + stealth + knife attack + diff -c -r --new-file ds2.0r18/lib/doc/help/creators/admin ds2.0r28/lib/doc/help/creators/admin *** ds2.0r18/lib/doc/help/creators/admin Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/creators/admin Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,43 ---- + Dead Souls Administration + + Being a successful MUD admin is heavily dependent + on how well you can get stuff done. It also depends on + your ability to manage people, resolve conflict, articulate + direction, enforce guidelines, and inspire loyalty. + But those other things I can't help you with. What + I can help you with is having the tools you need to get + stuff done. + + Your most valuable tools will be the Dead Souls FAQs: + + http://dead-souls.net/ds-admin-faq.html + + http://dead-souls.net/ds-creator-faq.html + + Almost everything else will flow from your + familiarity and understanding of the information there. + + Navigate to the /secure/cmds/admins directory. This + is where your commands are. Know them. Understand them. + In particular, pay close attention to the command: + + admintool + + It is a valuable tool for new admins to get important + stuff done before they are 100% familiar with everything + they need. + + Finally, the intermud Dead Souls community is a + vital resource. They are (thus far) friendly and helpful, + and if the Player's Handbook, Creator's Manual, and + the (upcoming) Admin's Guide don't have the answer, use + the channel to ask for help. + + As to the qualities of leadership, determination, + humility, responsibility, fairness, and selflessness you'll + need to make a successful mud, you are on your own. + + Good luck. + + - Cratylus @ Dead Souls + 05 May 2006 diff -c -r --new-file ds2.0r18/lib/doc/help/creators/creation ds2.0r28/lib/doc/help/creators/creation *** ds2.0r18/lib/doc/help/creators/creation Mon Jan 23 09:17:12 2006 --- ds2.0r28/lib/doc/help/creators/creation Wed Jul 5 00:01:10 2006 *************** *** 16,21 **** In the meantime, take a look below at the commands in actual use, with a few added comments: ! http://dead-souls.sourceforge.net/example.html --- 16,21 ---- In the meantime, take a look below at the commands in actual use, with a few added comments: ! http://dead-souls.net/example.html diff -c -r --new-file ds2.0r18/lib/doc/help/creators/creator_general ds2.0r28/lib/doc/help/creators/creator_general *** ds2.0r18/lib/doc/help/creators/creator_general Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/creators/creator_general Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,21 ---- + Common Creator commands: + + File commands: + ------------- + cp - copy a file + mv - move or rename a file + cd - change your working directory + ls - list the contents of your directory + ed - edit a file (WARNING: if you get stuck, type a + single period on a blank line, then Q, then enter) + rm - delete a file + more - page through the contents of a file + cat - display the entire contents of a file + update - load a file into memory + + Creation commands (used on objects, not files): + ------------- + create, modify, reload, delete, add, copy + + For more information on a command, type: help + See also: help help diff -c -r --new-file ds2.0r18/lib/doc/help/players/alias ds2.0r28/lib/doc/help/players/alias *** ds2.0r18/lib/doc/help/players/alias Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/players/alias Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,28 ---- + Syntax: alias + alias $* + + This command lets you substitute a short command for a long one. + For example, rather than type out "get all from corpse" you + can create this alias: + + %^GREEN%^alias gc get all from corpse%^RESET%^ + + And all you need do is type "gc" to get the same effect. + You can also use a wildcard, like this: + + %^GREEN%^alias gc get all from $* corpse%^RESET%^ + + So that typing: %^GREEN%^gc first%^RESET%^ + Expands out to: %^GREEN%^get all from first corpse%^RESET%^ + + The wildcard is also helpful for channel aliases: + + %^GREEN%^alias ige intergossipemote $*%^RESET%^ + + To see your aliases, type: %^GREEN%^alias%^RESET%^ + + To remove an alias, type alias plus the alias, like so: + + %^GREEN%^alias gc%^RESET%^ + + diff -c -r --new-file ds2.0r18/lib/doc/help/players/channels ds2.0r28/lib/doc/help/players/channels *** ds2.0r18/lib/doc/help/players/channels Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/players/channels Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,55 ---- + Channels are an out-of-character (OOC) means for users + to communicate with each other. You may hear the terms + "channel" and "line" used interchangeably. + + There are two main types of channels: local and intermud. + The default Dead Souls distribution uses these channels as + local: + + cre - only creators hear this + gossip - general offtopic stuff + newbie - everyone can hear this unless they turn it off + thief - channel for the thief class + fighter - channel for the fighter class + error - system errors + death - death announcements + mage - channel for the thief class + priest - channel for the thief class + explorer - channel for the thief class + admin - only admins hear this + + The following are intermud channels: + + ds - Dead Souls mud code talk + ds_test - testing testing 1, 2, 3, etc + intergossip - general offtopic stuff + lpuni - LPUniversity discussion + intercre - general technical chatter + + + By default, players do not have access to intermud channels. + Mud admins are asked to maintain some level of adherence to + the channel topics from their users. Muds that violate the + router admin's interpretation of "on-topic" will be asked + politely, if possible, to conform to the channel standards. + + Continued violations subject the offending mud to potential + banning. + + Hate speech is not tolerated, and flaming is frowned + upon, though each mud is expected to police itself and + enforce these standards on their own. + + If you don't like these rules, use a router other than the default. + + For local channels of course, none of this applies. Whatever + local rules are in place, that's what must be obeyed. + + Some tips: + --------- + To turn on/off a channel, type its name by itself, like this: newbie + + To know who is listening to a channel: list newbie + + To see a brief history of channel messages: hist newbie + diff -c -r --new-file ds2.0r18/lib/doc/help/players/cleric ds2.0r28/lib/doc/help/players/cleric *** ds2.0r18/lib/doc/help/players/cleric Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/help/players/cleric Wed Dec 31 19:00:00 1969 *************** *** 1,27 **** - Dead Souls LPMud Cleric Class - Originally written 951129 by Descartes of Borg - Last modified 951129 - - The cleric holds the natural world in highest esteem, shunning - violence and things unnatural. They specialize in the healing arts - and defense against magic and blunt weapons. They also have powers of - faith which draw from the gods of the natural world they worship. - - A person who chooses to play a cleric will never fight powerfully. - Instead, people playing clerics - play the class because they enjoy working with teams to accomplish a - task and also because they love helping others. Clerics are most - often seen as doctors or party healers in adventuring groups. - - One exception to the cleric non-violence oath is their power over the - unnatural world of the undead. Their faith bestows upon them the - ability to rid the world of the undead, or to bring the undead back to - the world of the living. - - Primary Skills: - faith - healing - blunt defense - magic defense - - --- 0 ---- diff -c -r --new-file ds2.0r18/lib/doc/help/players/mage ds2.0r28/lib/doc/help/players/mage *** ds2.0r18/lib/doc/help/players/mage Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/help/players/mage Wed Dec 31 19:00:00 1969 *************** *** 1,22 **** - Dead Souls LPMud Mage Class - Originally written 951202 by Descartes of Borg - Last modified 951202 - - Mages are powerful magic users who make their livings through their - magical talents. They are an integral piece to any adventuring group, - as many situations require the use of magic to change the way the die - have been cast. Given so much attention to the magic arts, however, - mages find themselves poorly suited to weapon-based combat. Thus, - when engaged in combat, mages tend to rely instead on their magic - talents to avoid damage and strike at their opponents. - - The mage class is perhaps better suited to the hack-n-slash style of - player, through role-players and socials can likely find attractive - characteristics in a well played mage. - - Primary Skills: - conjuring - magic attack - magic defense - projectile defense - --- 0 ---- diff -c -r --new-file ds2.0r18/lib/doc/help/players/player_general ds2.0r28/lib/doc/help/players/player_general *** ds2.0r18/lib/doc/help/players/player_general Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/help/players/player_general Wed Jul 5 00:01:10 2006 *************** *** 0 **** --- 1,23 ---- + Basic player commands: + + look - get a view of your environment + inventory - take stock of your possessions + stat - your health and statistics + score - your overall ranking and information + + Dealing with objects: + -------------------- + look at, look in + get, drop, put, give + open, close + read + wield, unwield, wear, remove + + Moving around: + ------------- + n, s, e, w, ne, nw, se, sw, u, d + enter, go out, climb up, climb down, jump down + crawl, fly + + See also: help help + diff -c -r --new-file ds2.0r18/lib/doc/help/players/thief ds2.0r28/lib/doc/help/players/thief *** ds2.0r18/lib/doc/help/players/thief Sat Mar 11 11:14:53 2006 --- ds2.0r28/lib/doc/help/players/thief Wed Dec 31 19:00:00 1969 *************** *** 1,20 **** - Dead Souls LPMud Thief Class - Originally written 951202 by Descartes of Borg - Last modified 951202 - - Thieves are an extremely varied bunch of scum who spend their days - practicing the less accepted crafts of society. Though skills such as - lock picking are often desired in adventuring parties, skills such as - stealing make people avoid them. - - Thieves are designed for people who like to role-play and adventure in - groups. The role-player will find the unique character of being a - thief challenging, and people who enjoy group adventuring will find - their skills in high demand. - - Primary Skills: - bargaining - stealing - stealth - knife attack - --- 0 ---- diff -c -r --new-file ds2.0r18/lib/doc/manual/chapter39 ds2.0r28/lib/doc/manual/chapter39 *** ds2.0r18/lib/doc/manual/chapter39 Thu Feb 23 15:40:40 2006 --- ds2.0r28/lib/doc/manual/chapter39 Wed Jul 5 00:01:03 2006 *************** *** 64,69 **** --- 64,74 ---- tedious, remember that a door leading south is also a door leading north from the other room. + * Doors generally are not visible in the same way that regular + objects are. To make a door especially obvious and noticeable, + do something like: + %^GREEN%^modify door sethiddendoor 0%^RESET%^ + * SetCurrency is for adding money to NPC's. SetMoney is for adding money to non-living containers (bags, etc). diff -c -r --new-file ds2.0r18/lib/doc/sefun/debug ds2.0r28/lib/doc/sefun/debug *** ds2.0r18/lib/doc/sefun/debug Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/doc/sefun/debug Wed Jul 5 00:01:03 2006 *************** *** 0 **** --- 1,28 ---- + + DEBUG(1) DEBUG(1) + + NAME + debug() - Generates messages useful for debugging. + + SYNOPSIS + varargs void debug(mixed msg, mixed var, string color) + + DESCRIPTION + This command sends 'msg' to all users() who have + enabled receipt of debug info with the debug command. The + optional 'var' is stringified and included in the message. + The optional 'color' indicates what color the message + should be. + + EXAMPLE + + In a misbehaving npc: + debug("This npc's skills are: ",this_object()->GetSkills(),"red"); + + LOCATION + /secure/sefun/communications.c + + Author + Cratylus @ Dead Souls + + 1 diff -c -r --new-file ds2.0r18/lib/domains/Ylsrim/etc/shovel.c ds2.0r28/lib/domains/Ylsrim/etc/shovel.c *** ds2.0r18/lib/domains/Ylsrim/etc/shovel.c Mon Nov 7 13:29:44 2005 --- ds2.0r28/lib/domains/Ylsrim/etc/shovel.c Wed Jul 5 00:01:11 2006 *************** *** 20,22 **** --- 20,25 ---- SetMass(87); SetValue(50); } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/Ylsrim/meal/ale.c ds2.0r28/lib/domains/Ylsrim/meal/ale.c *** ds2.0r18/lib/domains/Ylsrim/meal/ale.c Mon Nov 7 13:29:44 2005 --- ds2.0r28/lib/domains/Ylsrim/meal/ale.c Wed Jul 5 00:01:11 2006 *************** *** 15,20 **** --- 15,21 ---- SetShort("a bottle of ale"); SetLong("A nice bottle of Lars' famous Ylsrim Ale."); SetMass(60); + SetBaseCost("electrum", 20); SetMealType(MEAL_DRINK | MEAL_ALCOHOL); SetStrength(10); SetMealMessages("You drink a wonderful bottle of Ylsrim Ale.", *************** *** 23,25 **** --- 24,29 ---- SetEmptyShort("an empty bottle of Ylsrim Ale"); SetEmptyLong("It is an empty brown bottle that once held some ale."); } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/Ylsrim/npc/lars.c ds2.0r28/lib/domains/Ylsrim/npc/lars.c *** ds2.0r18/lib/domains/Ylsrim/npc/lars.c Mon Nov 7 13:29:44 2005 --- ds2.0r28/lib/domains/Ylsrim/npc/lars.c Wed Jul 5 00:01:11 2006 *************** *** 31,35 **** // He takes electrum SetLocalCurrency("electrum"); // What he sells ! SetMenuItems(([ "ale" : "/domains/Ylsrim"+ "/meal/ale" ])); } --- 31,40 ---- // He takes electrum SetLocalCurrency("electrum"); // What he sells ! SetMenuItems(([ ! ({ "ale", "beer" }) : "/domains/Ylsrim/meal/ale", ! ])); ! } ! void init(){ ! ::init(); } diff -c -r --new-file ds2.0r18/lib/domains/Ylsrim/obj/stargate.c ds2.0r28/lib/domains/Ylsrim/obj/stargate.c *** ds2.0r18/lib/domains/Ylsrim/obj/stargate.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/Ylsrim/obj/stargate.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + #include + #include + #include "/lib/include/stargate.h" + + inherit LIB_STARGATE; + + int ReadScreen(); + + void create() + { + ::create(); + SetOrigin("tower", "/domains/Ylsrim/room/tower"); + SetRead(([ ({ "screen" }) : (: ReadScreen :) ]) ); + SetItems(([ ({ "screen" }) : "a computer screen which shows the status of the gate network" ]) ); + } + + void init() + { + ::init(); + } + + int ReadScreen() + { + write("stargate network status\n"); + write("-----------------------\n"); + write("\n"); + + } diff -c -r --new-file ds2.0r18/lib/domains/Ylsrim/room/armory.c ds2.0r28/lib/domains/Ylsrim/room/armory.c *** ds2.0r18/lib/domains/Ylsrim/room/armory.c Mon Nov 7 13:29:44 2005 --- ds2.0r28/lib/domains/Ylsrim/room/armory.c Wed Jul 5 00:01:11 2006 *************** *** 49,59 **** } string CheckItem(string str) { ! if( str == "case" || str == "cases" ) { ! if( query_night() ) return "They are empty."; ! else if ( present("vendor") ) return "They are filled with armor."; ! else return "They are broken and covered in blood."; ! } } void init(){ --- 49,57 ---- } string CheckItem(string str) { ! if( query_night() ) return "They are empty."; ! else if ( present("vendor") ) return "They are filled with armor."; ! else return "They are broken and covered in blood."; } void init(){ diff -c -r --new-file ds2.0r18/lib/domains/Ylsrim/room/bazaar.c ds2.0r28/lib/domains/Ylsrim/room/bazaar.c *** ds2.0r18/lib/domains/Ylsrim/room/bazaar.c Wed Dec 7 13:59:22 2005 --- ds2.0r28/lib/domains/Ylsrim/room/bazaar.c Wed Jul 5 00:01:11 2006 *************** *** 20,26 **** // the is the amount of light the street lamps make at night SetAmbientLight(30); // the obvious exits tell people how to leave the room - SetObviousExits("n, s, enter armory, enter weaponry"); // set the sounds people hear SetListen("Vendors are begging you to come look at their goods."); // set the short description... should not be capitalized --- 20,25 ---- diff -c -r --new-file ds2.0r18/lib/domains/Ylsrim/room/furnace.c ds2.0r28/lib/domains/Ylsrim/room/furnace.c *** ds2.0r18/lib/domains/Ylsrim/room/furnace.c Mon Jan 23 09:15:29 2006 --- ds2.0r28/lib/domains/Ylsrim/room/furnace.c Wed Jul 5 00:01:11 2006 *************** *** 7,24 **** room::create(); SetAmbientLight(30); SetShort("the furnace"); ! SetLong("The furnace. Things that arrive here are periodically "+ "incinerated. You probably shouldn't be here. Go down to get out."); SetProperties(([ "no attack" : 1, ])); SetExits( ([ "down" : ROOM_START ]) ); ! call_out((: reload_room :), 360, load_object(base_name(this_object()))); SetNoModify(1); } int CanReceive(object ob){ return 1; } void init(){ ::init(); } --- 7,36 ---- room::create(); SetAmbientLight(30); SetShort("the furnace"); ! SetLong("The furnace. Things that arrive here are "+ "incinerated. You probably shouldn't be here. Go down to get out."); SetProperties(([ "no attack" : 1, ])); SetExits( ([ "down" : ROOM_START ]) ); ! call_out((: reload_room :), 600, load_object(base_name(this_object()))); ! set_heart_beat(1); SetNoModify(1); } int CanReceive(object ob){ + if(interactive(ob)){ + tell_object(ob, "You fail to enter the furnace."); + return 0; + } return 1; } void init(){ ::init(); } + void heart_beat(){ + if(sizeof(all_inventory(this_object()))){ + foreach(object ob in deep_inventory(this_object())){ + ob->eventDestruct(); + } + } + } diff -c -r --new-file ds2.0r18/lib/domains/Ylsrim/room/kaliid4.c ds2.0r28/lib/domains/Ylsrim/room/kaliid4.c *** ds2.0r18/lib/domains/Ylsrim/room/kaliid4.c Wed Dec 7 13:59:22 2005 --- ds2.0r28/lib/domains/Ylsrim/room/kaliid4.c Wed Jul 5 00:01:11 2006 *************** *** 14,24 **** SetClimate("arid"); SetAmbientLight(30); SetShort("Kaliid Road north of the bazaar"); ! SetLong("Kaliid Road stretches as far as you can see east and west " ! "across Ylsrim. South, Kaliid opens up into the central " ! "bazaar where vendors sell goods day and night. " ! "on the opposite side of the road is the entrance to " ! "the local adventurers' hall. North of here is a new town."); AddItem("hall", "A small building which serves as the focal point for " "the adventuring activities for which Ylsrim's support " "is widely known.", ({ "adventurer", "adventurers" })); --- 14,25 ---- SetClimate("arid"); SetAmbientLight(30); SetShort("Kaliid Road north of the bazaar"); ! SetLong("Kaliid Road stretches as far as you can see east and west across Ylsrim. South, Kaliid opens up into the central bazaar where vendors sell goods day and night. on the opposite side of the road is the entrance to the local adventurers' hall."); ! SetExits( ([ ! "east" : "/domains/Ylsrim/room/kaliid3", ! "south" : "/domains/Ylsrim/room/bazaar", ! "west" : "/domains/Ylsrim/room/kaliid5", ! ]) ); AddItem("hall", "A small building which serves as the focal point for " "the adventuring activities for which Ylsrim's support " "is widely known.", ({ "adventurer", "adventurers" })); *************** *** 29,43 **** AddItem("vendor", "There are many vendors wandering about the bazaar."); AddItem("town", "A new town, north of here."); AddItem("road", "The main street for Ylsrim.", ({ "kaliid" })); - SetObviousExits("e, w, n, s, enter hall"); - SetExits( ([ "east" : "/domains/Ylsrim/room/"+ "kaliid3", - "west" : "/domains/Ylsrim/room/"+ "kaliid5", - "north" : "/domains/town/room/south_road2", - "south" : "/domains/Ylsrim/room/"+ "bazaar" ]) ); SetEnters( ([ "hall" : "/domains/Ylsrim/room/"+ "adv_hall" ])); } void init(){ ::init(); } - --- 30,38 ---- diff -c -r --new-file ds2.0r18/lib/domains/Ylsrim/room/pub.c ds2.0r28/lib/domains/Ylsrim/room/pub.c *** ds2.0r18/lib/domains/Ylsrim/room/pub.c Wed Jan 11 23:08:48 2006 --- ds2.0r28/lib/domains/Ylsrim/room/pub.c Wed Jul 5 00:01:11 2006 *************** *** 13,31 **** // the menu int readMenu(object who, string str) { string array tmp = ({ sprintf("%:-20s %:-7s", "Drink", "Cost") }); object ob = present("lars"); if( !ob ) { // lars is dead! ! who->eventPrint("The menu is too bloodstained to read."); return 1; } ! foreach(string item in keys(ob->GetMenuItems())) { ! tmp += ({ sprintf("%:-20s %:-7d electrum", capitalize(item), ! ob->GetCost(item)) }); } // show the menu a page at a time ! who->eventPage(tmp, MSG_SYSTEM); // MSG_SYSTEM means ignore blocking return 1; } static void create() { --- 13,37 ---- // the menu int readMenu(object who, string str) { + string array tmp2 = ({}); string array tmp = ({ sprintf("%:-20s %:-7s", "Drink", "Cost") }); object ob = present("lars"); if( !ob ) { // lars is dead! ! this_player()->eventPrint("The menu is too bloodstained to read."); return 1; } ! foreach(string *item in keys(ob->GetMenuItems())) { ! tmp += ({ sprintf("%:-20s %d electrum", capitalize(item[0]), ! to_int(ob->GetCost(item))) }); } + foreach(string element in tmp){ + element = translate(element, this_player()->GetLanguageLevel("Edhellen")); + tmp2 += ({ element }); + } + tmp = tmp2; // show the menu a page at a time ! this_player()->eventPage(tmp, MSG_SYSTEM); // MSG_SYSTEM means ignore blocking return 1; } static void create() { *************** *** 40,45 **** --- 46,55 ---- "with a hodge-podge of writing in all different languages " "covering the wall. A menu of drinks is about the only " "readable thing on the wall. If you read Edhellen."); + SetLanguage("Edhellen"); + SetInventory(([ + "/domains/Ylsrim/npc/lars" : 1, + ])); SetListen("Rowdy party sounds make it hard to hear anything else."); SetSmell("The place smells like it is soaked in ale."); AddItem(({ "tables", "stools" }), "The tables and stools begin " *************** *** 53,59 **** SetObviousExits("e"); SetExits(([ "east" : "/domains/Ylsrim/room/"+ "s_bazaar" ])); // Bring in the Bar Keep - SetInventory(([ "/domains/Ylsrim"+ "/npc/lars" : 1 ])); // make the writing and the menu readable SetRead("writing", (: readMenu :)); SetRead("menu", (: readMenu :)); --- 63,68 ---- diff -c -r --new-file ds2.0r18/lib/domains/Ylsrim/room/tower.c ds2.0r28/lib/domains/Ylsrim/room/tower.c *** ds2.0r18/lib/domains/Ylsrim/room/tower.c Mon Nov 7 13:29:44 2005 --- ds2.0r28/lib/domains/Ylsrim/room/tower.c Wed Jul 5 00:01:11 2006 *************** *** 9,14 **** --- 9,19 ---- inherit LIB_ROOM; inherit LIB_JUMP; + int ReadSign() { + this_player()->more("/domains/town/txt/warning_sign.txt"); + return 1; + } + void create() { room::create(); SetClimate("indoors"); *************** *** 17,40 **** SetShort("Ylsrim Tower"); SetLong("The tower looks out over Kaliid Road. South of the road is " "the always busy Ylsrim bazaar. A spiraling staircase leads " ! "down into the heart of the adventurer's hall."); SetItems( ([ ({ "road", "kaliid road" }) : "You could probably jump down into the road from here.", "bazaar" : "It looks like it is bustling.", "tower" : "The tower you are on.", ({ "stairs", "staircase" }) : "They lead down into the " "heart of the hall." ]) ); SetObviousExits("d"); SetExits( ([ "down" : "/domains/Ylsrim/room/"+ "adv_hall" ]) ); ! ! //AddJump("road", "/domains/Ylsrim/room/"+ "kaliid4", JUMP_INTO); ! //AddJump("kaliid road", "/domains/Ylsrim/room/"+ "kaliid4", JUMP_INTO); ! //AddJump("tower", "/domains/Ylsrim/room/"+ "kaliid4", JUMP_FROM); ! SetJump( ([ ! "road" : ({ "/domains/Ylsrim/room/kaliid4", JUMP_INTO }), ! "kaliid road" : ({ "/domains/Ylsrim/room/kaliid4", JUMP_INTO }), ! "tower" : ({ "/domains/Ylsrim/room/kaliid4", JUMP_FROM }), ! ]) ); } void init(){ ::init(); --- 22,42 ---- SetShort("Ylsrim Tower"); SetLong("The tower looks out over Kaliid Road. South of the road is " "the always busy Ylsrim bazaar. A spiraling staircase leads " ! "down into the heart of the adventurer's hall." ! "\n%^RED%^There is a sign here you can read.%^RESET%^"); SetItems( ([ ({ "road", "kaliid road" }) : "You could probably jump down into the road from here.", "bazaar" : "It looks like it is bustling.", + "sign":"A sign. To read it, 'read sign'.", "tower" : "The tower you are on.", ({ "stairs", "staircase" }) : "They lead down into the " "heart of the hall." ]) ); SetObviousExits("d"); SetExits( ([ "down" : "/domains/Ylsrim/room/"+ "adv_hall" ]) ); ! SetInventory(([ ! "/domains/Ylsrim/obj/stargate" : 1, ! ])); ! SetRead("sign", (: ReadSign :) ); } void init(){ ::init(); diff -c -r --new-file ds2.0r18/lib/domains/Ylsrim/room/vote_hall.c ds2.0r28/lib/domains/Ylsrim/room/vote_hall.c *** ds2.0r18/lib/domains/Ylsrim/room/vote_hall.c Mon Nov 7 13:29:44 2005 --- ds2.0r28/lib/domains/Ylsrim/room/vote_hall.c Wed Jul 5 00:01:11 2006 *************** *** 20,28 **** SetProperties( ([ "no kill" : 1, "no attack" : 1, "no steal" : 1, "no magic" : 1, "light" : 3, "no bump" : 1, "no teleport" : 1 ]) ); SetShort("voting hall"); ! SetLong("You are in the voting hall of Dead Souls. This is where " ! "people come to nominate candidates for class leader and to " ! "cast their vote. There is a list posted on the wall here."); SetItems( ([ "list" : "This is the list of candidates." ]) ); SetRead( "list", (: ReadList :) ); SetObviousExits("d"); --- 20,26 ---- SetProperties( ([ "no kill" : 1, "no attack" : 1, "no steal" : 1, "no magic" : 1, "light" : 3, "no bump" : 1, "no teleport" : 1 ]) ); SetShort("voting hall"); ! SetLong("You are in the voting hall of Ylsrim. This is where people come to nominate candidates for class leader and to cast their vote. There is a list posted on the wall here."); SetItems( ([ "list" : "This is the list of candidates." ]) ); SetRead( "list", (: ReadList :) ); SetObviousExits("d"); diff -c -r --new-file ds2.0r18/lib/domains/Ylsrim/room/weaponry.c ds2.0r28/lib/domains/Ylsrim/room/weaponry.c *** ds2.0r18/lib/domains/Ylsrim/room/weaponry.c Mon Nov 7 13:29:44 2005 --- ds2.0r28/lib/domains/Ylsrim/room/weaponry.c Wed Jul 5 00:01:11 2006 *************** *** 48,59 **** "is east."); } ! string CheckItem(string str) { ! if( str == "case" || str == "cases" ) { ! if( query_night() ) return "They are empty."; ! else if ( present("vendor") ) return "They are filled with weapons."; ! else return "They are broken and covered in blood."; ! } } void init(){ --- 48,57 ---- "is east."); } ! string CheckItem(object ob) { ! if( query_night() ) return "They are empty."; ! else if ( present("vendor") ) return "They are filled with weapons."; ! else return "They are broken and covered in blood."; } void init(){ diff -c -r --new-file ds2.0r18/lib/domains/campus/adm/README ds2.0r28/lib/domains/campus/adm/README *** ds2.0r18/lib/domains/campus/adm/README Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/adm/README Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,14 ---- + /domains/campus/adm + The Administrative Directory for campus + + This directory contains all files necessary for domain + administration. The following files are required for any standard + domain, but not for secondary domains or realms: + + void.c - The place people go when their environment is destructed + freezer.c - The place people go when they go net-dead + cache.c - The place hidden items go to hide + + The access object is used in any realm or domain which is giving out + access which is nonstandard. This is traditionally handled through + the 'grant' command. diff -c -r --new-file ds2.0r18/lib/domains/campus/adm/access.c ds2.0r28/lib/domains/campus/adm/access.c *** ds2.0r18/lib/domains/campus/adm/access.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/adm/access.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,9 ---- + /* /domains/campus/adm/access.c + * From the Nightmare V Object Library + * the access object for the campus domain + * created by Descartes of Borg 960302 + */ + + #include + + inherit LIB_ACCESS; diff -c -r --new-file ds2.0r18/lib/domains/campus/adm/cache.c ds2.0r28/lib/domains/campus/adm/cache.c *** ds2.0r18/lib/domains/campus/adm/cache.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/adm/cache.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,17 ---- + /* /domains/campus/adm/cache.c + * from the Nightmare V Object Library + * room where hidden objects are stored + * created by Descartes of Borg 960302 + */ + + #include + #include + + inherit LIB_ROOM; + + void create() { + room::create(); + SetShort( "The cache"); + SetLong( "Things are hidden here."); + SetProperties( ([ "storage room" : 1, "logout" : ROOM_START ]) ); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/adm/death.txt ds2.0r28/lib/domains/campus/adm/death.txt *** ds2.0r18/lib/domains/campus/adm/death.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/adm/death.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,21 ---- + + + NONONONO...... MNO! ......................... MN N! . + NONONON.... NOONNOO! MMMMMMMMMMPPPOII! NNNO!!!! . + NONONONO... O! NNO! MMMMMMMMMMMMMPPPOOOII!! NO! ... + NONONONONO........ MMMMMOOOOOOPPPPPPPPOOOOMII! ... + NONONONONON....... MMMMM.. OPPMMP .,OMI! .... + NONONONONONO...... MMMM:: o ,OPMP, o ::I!! ... + NONONONONONONONO.... NNM:::.,,OOPM!P,.::::!! .... + NONONONONONONONON.. MMNNNNNOOOOP NNIIPPO!!O! ..... + NONONONONONONONON...... MMMONNMMNNNIIIOO! ......... + NONONONONONONO.......... MOM!!!!!!!!!III ............. + NONONONON...... NNN.MNO! . O!!!!!!!!!O . OONO NO! ....... + NONONONONO.... MNNNNNO! ...OOOOOOOOOOO . MMNNON! ....... + NNNOOO!!! ...... MNNNNO! .. PPPPPPPPP .. MMNON! ..... + ...... OO! ................. ON! ....... + + YOU ARE DEAD! + + You are in formless void without substance and outside time. + diff -c -r --new-file ds2.0r18/lib/domains/campus/adm/freezer.c ds2.0r28/lib/domains/campus/adm/freezer.c *** ds2.0r18/lib/domains/campus/adm/freezer.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/adm/freezer.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,37 ---- + #include + #include + #include + + inherit LIB_ROOM; + + static private object *Old; + + void create() { + room::create(); + SetNoClean(1); + SetProperties(([ "login" : ROOM_START ])); + SetShort( "The freezer"); + SetLong( "The local freezer. Go down to leave."); + SetObviousExits("d"); + SetExits( ([ "down" : ROOM_START ]) ); + Old = ({}); + call_out("clean_room", MAX_NET_DEAD_TIME); + SetNoModify(1); + } + + static void clean_room() { + object *clean_me; + object ob; + + foreach(ob in filter(all_inventory(), (: !living($1) :))) + ob->eventDestruct(); + if( !sizeof(filter(all_inventory(), (: living :))) ) { + Old = ({}); + call_out((: clean_room :), MAX_NET_DEAD_TIME); + return; + } + clean_me = (all_inventory() & Old); + Old = all_inventory() - clean_me; + foreach(ob in clean_me) ob->eventDestruct(); + call_out((: clean_room :), MAX_NET_DEAD_TIME); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/adm/furnace.c ds2.0r28/lib/domains/campus/adm/furnace.c *** ds2.0r18/lib/domains/campus/adm/furnace.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/adm/furnace.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,36 ---- + #include + #include + + inherit LIB_ROOM; + + void create() { + room::create(); + SetAmbientLight(30); + SetShort("the furnace"); + SetLong("The furnace. Things that arrive here are "+ + "incinerated. You probably shouldn't be here. Go down to get out."); + SetProperties(([ + "no attack" : 1, + ])); + SetExits( ([ "down" : ROOM_START ]) ); + call_out((: reload_room :), 600, load_object(base_name(this_object()))); + set_heart_beat(1); + SetNoModify(1); + } + int CanReceive(object ob){ + if(interactive(ob)){ + tell_object(ob, "You fail to enter the furnace."); + return 0; + } + return 1; + } + void init(){ + ::init(); + } + void heart_beat(){ + if(sizeof(all_inventory(this_object()))){ + foreach(object ob in deep_inventory(this_object())){ + ob->eventDestruct(); + } + } + } diff -c -r --new-file ds2.0r18/lib/domains/campus/adm/pod.c ds2.0r28/lib/domains/campus/adm/pod.c *** ds2.0r18/lib/domains/campus/adm/pod.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/adm/pod.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/campus/adm/void.c + * from the Nightmare V Object Library + * place where people go when their environments accidentally are + * destructed + * created by Descartes of Borg 960302 + */ + + #include + #include + + inherit LIB_ROOM; + + void create() { + room::create(); + SetShort("the incept pod"); + SetLong("The incept pod. Some objects come here to be created "+ + "and identified. Go down to get out."); + SetExits( ([ "down" : ROOM_START ]) ); + } + int CanReceive(object ob){ + if(!interactive(ob)){ + ob->eventDestruct(); + return 1; + } + ob->eventMove(ROOM_VOID); + return 1; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/adm/void.c ds2.0r28/lib/domains/campus/adm/void.c *** ds2.0r18/lib/domains/campus/adm/void.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/adm/void.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,16 ---- + #include + #include + + inherit LIB_ROOM; + + void create() { + room::create(); + SetAmbientLight(30); + SetShort("the void"); + SetLong("The void. Go down to get out."); + SetExits( ([ "down" : ROOM_START ]) ); + SetNoModify(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/badge.c ds2.0r28/lib/domains/campus/armor/badge.c *** ds2.0r18/lib/domains/campus/armor/badge.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/badge.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,50 ---- + #include + #include + #include + inherit LIB_ARMOR; + + static void create(){ + armor::create(); + SetKeyName("visitor's pass"); + SetId(({"testchar badge","badge","pass","visitor's pass"})); + SetShort("a test character Visitor's Pass"); + SetLong("This clip-on plastic badge grants the wearer access to "+ + "some areas typically restricted to creator staff only. Abuse of this "+ + "pass is grounds for disciplinary action. A small scribble "+ + "at the bottom of the pass reads: click heels"); + SetMass(10); + SetDollarCost(5000); + SetDamagePoints(100); + SetArmorType(A_AMULET); + SetRetainOnDeath(1); + SetRestrictLimbs( ({ "torso" }) ); + } + void init(){ + ::init(); + add_action("nplh","click"); + add_action("post_it","post"); + } + int nplh(string str){ + if(str=="heels"){ + if(present(this_object()->GetKeyName(),this_player() ) ){ + write("There's no place like home!\n"+ + "You are transported by an awesome whirlwind somewhere "+ + "else...\n"); + this_player()->eventMoveLiving("/domains/campus/room/start"); + return 1; + } + write("You click your heels together...but feel "+ + "as though you're missing something.\n"); + return 1; + } + } + int post_it(string str){ + if(present("chalkboard",environment(this_player())) && !creatorp(this_player()) ){ + write("As a visitor, you are not allowed to post on creator boards."); + return 1; + } + } + string GetAffectLong(object ob) { + if(!ob || !living(ob)) return 0; + return ob->GetName() + " is an authorized Test Character."; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/bdu.c ds2.0r28/lib/domains/campus/armor/bdu.c *** ds2.0r18/lib/domains/campus/armor/bdu.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/bdu.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("battle dress uniform"); + SetId(({"uniform","bdu","bdu's","fatigues"})); + SetAdjectives(({"camouflage","battle","dress","combat"})); + SetShort("a battle dress uniform"); + SetLong("This uniform consists of a camouflage blouse and "+ + "pants. It is green with mottled brown and black camouflage patterns, "+ + "and probably provides excellent concealment in a wooded environment."); + SetMass(10); + SetDollarCost(100); + SetDamagePoints(100); + SetArmorType(A_BODY_ARMOR); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/bluedress.c ds2.0r28/lib/domains/campus/armor/bluedress.c *** ds2.0r18/lib/domains/campus/armor/bluedress.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/bluedress.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("blue dress"); + SetId(({"dress","outfit","costume"})); + SetAdjectives(({"blue","cotton","lovely","light"})); + SetShort("a lovely blue dress"); + SetLong("This is a lovely little blue dress of simple, "+ + "efficient design, yet obviously comfortable and practical. The hem is at "+ + "the knees, and the fabric feels soft and light yet strong, like some sort of cotton."); + SetMass(10); + SetDollarCost(100); + SetDamagePoints(100); + SetArmorType(A_BODY_ARMOR); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/chainmail.c ds2.0r28/lib/domains/campus/armor/chainmail.c *** ds2.0r18/lib/domains/campus/armor/chainmail.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/chainmail.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("chainmail shirt"); + SetId(({"armor","chainmail armor","chain mail armor","shirt","chainmail shirt","chainmail","chain mail shirt"})); + SetShort("a sturdy-looking chainmail shirt"); + SetLong("This is a shirt made of metal rings fashioned together as armor. "); + SetMass(75); + SetDollarCost(100); + SetDamagePoints(100); + SetProtection(BLUNT,4); + SetProtection(BLADE,25); + SetProtection(KNIFE,25); + SetArmorType(A_BODY_ARMOR); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/collar.c ds2.0r28/lib/domains/campus/armor/collar.c *** ds2.0r18/lib/domains/campus/armor/collar.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/collar.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,23 ---- + #include + #include + #include + inherit LIB_ARMOR; + inherit "/lib/std/bane"; + + static void create(){ + armor::create(); + bane::create(); + SetKeyName("collar"); + SetId(({"repellent_collar","bane"})); + SetAdjectives( ({"repellent","odd","plastic","white"}) ); + SetShort("a plastic collar"); + SetLong("This is a simple collar made of a soft white plastic. It "+ + "seems to be coated with a fine, clear resin. There is something "+ + "written on the collar."); + SetRead("Disease and parasite repellent collar, test character use only."); + SetMass(1); + SetDollarCost(5000); + SetDamagePoints(100); + SetArmorType(A_AMULET); + SetBane(({"all"})); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/dress.c ds2.0r28/lib/domains/campus/armor/dress.c *** ds2.0r18/lib/domains/campus/armor/dress.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/dress.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("pink dress"); + SetId(({"dress","outfit","costume"})); + SetAdjectives(({"pink","cotton","lovely","light"})); + SetShort("a lovely pink dress"); + SetLong("This is a lovely little pink dress of simple, "+ + "efficient design, yet obviously comfortable and practical. The hem is at "+ + "the knees, and the fabric feels soft and light yet strong, like some sort of cotton."); + SetMass(10); + SetDollarCost(100); + SetDamagePoints(100); + SetArmorType(A_BODY_ARMOR); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/foodsmock.c ds2.0r28/lib/domains/campus/armor/foodsmock.c *** ds2.0r18/lib/domains/campus/armor/foodsmock.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/foodsmock.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + #include + inherit LIB_ARMOR; + + static void create(){ + armor::create(); + SetKeyName("uniform"); + SetAdjectives( ({"food workers"}) ); + SetId( ({"overalls", "smock"}) ); + SetShort("a food worker's uniform"); + SetLong("This is a set of overalls used by food workers to keep their bodies and the food at a healthy distance."); + SetMass(50); + SetArmorType(A_BODY_ARMOR); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/glove.c ds2.0r28/lib/domains/campus/armor/glove.c *** ds2.0r18/lib/domains/campus/armor/glove.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/glove.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,32 ---- + /* /domains/Examples/armor/glove.c + * from the Nightmare IV LPC Library + * an example glove + * created by Descartes of Borg 950408 + */ + + #include + #include + #include + #include + + inherit LIB_ARMOR; + + static void create() { + armor::create(); + SetKeyName("red glove"); + SetId( ({ "glove", "red glove" }) ); + SetAdjectives( ({ "red" }) ); + SetShort("a red glove"); + SetLong("A red glove with five fingers."); + SetDamagePoints(75); + SetVendorType(VT_ARMOR); + SetMass(50); + SetValue(20); + SetArmorType(A_GLOVE); + SetProtection(BLUNT, 1); + SetProtection(BLADE, 1); + SetProtection(KNIFE, 2); + SetProtection(HEAT, 3); + SetProtection(COLD, 7); + SetFingers(5); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/handbag.c ds2.0r28/lib/domains/campus/armor/handbag.c *** ds2.0r18/lib/domains/campus/armor/handbag.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/handbag.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,26 ---- + + #include + + #include + #include + inherit LIB_STORAGE; + inherit LIB_ARMOR; + + + static void create() { + ::create(); + SetKeyName("backpack"); + SetId(({"bookbag","bag","pack"})); + SetAdjectives(({"leather","soft","brown"})); + SetShort("a soft, brown leather backpack"); + SetLong("This is a medium-sized backpack made of soft brown leather. "+ + "It seems suitable for carrying books around, for the busy college student. "+ + "It features wide, comfortable straps for convenient wear."); + SetMass(100); + SetDollarCost(30); + SetCanClose(1); + SetClosed(1); + SetMaxCarry(500); + SetDamagePoints(100); + SetArmorType(A_CLOAK); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/helmet.c ds2.0r28/lib/domains/campus/armor/helmet.c *** ds2.0r18/lib/domains/campus/armor/helmet.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/helmet.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,21 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("kevlar helmet"); + SetId(({"helmet","cover","kevlar"})); + SetAdjectives(({"kevlar","battle","hard"})); + SetShort("a camouflaged kevlar helmet"); + SetLong("This is a military helmet made of a a very tough "+ + "polymer fiber that provides excellent ballistic protection. It bears a "+ + "mottled camouflage design to aid in woodland concealment."); + SetMass(50); + SetDollarCost(500); + SetDamagePoints(100); + SetArmorType(A_HELMET); + SetProtection(BLUNT, 20); + SetProtection(BLADE, 20); + SetProtection(KNIFE, 20); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/jeans.c ds2.0r28/lib/domains/campus/armor/jeans.c *** ds2.0r18/lib/domains/campus/armor/jeans.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/jeans.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,19 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("blue jeans"); + SetId(({"jeans","pants","blue jeans","bluejeans","denim"})); + SetAdjectives(({"blue","denim","comfortable","broken in","broken-in"})); + SetShort("a pair of blue jeans"); + SetLong("A comfortable pair of denim blue jeans."); + SetMass(5); + SetDollarCost(1); + SetDamagePoints(1); + SetProtection(BLUNT,1); + SetProtection(BLADE,1); + SetProtection(KNIFE,1); + SetArmorType(A_PANTS); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/necklace.c ds2.0r28/lib/domains/campus/armor/necklace.c *** ds2.0r18/lib/domains/campus/armor/necklace.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/necklace.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,17 ---- + #include + #include + #include + inherit LIB_ARMOR; + + static void create(){ + armor::create(); + SetKeyName("gold necklace"); + SetId(({"necklace"})); + SetAdjectives( ({"gold","beautiful"}) ); + SetShort("a gold necklace"); + SetLong("This is a simple and beautiful gold necklace."); + SetMass(1); + SetDollarCost(5000); + SetDamagePoints(100); + SetArmorType(A_COLLAR); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/newbie_cap.c ds2.0r28/lib/domains/campus/armor/newbie_cap.c *** ds2.0r18/lib/domains/campus/armor/newbie_cap.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/newbie_cap.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,39 ---- + #include + #include + #include + inherit LIB_ARMOR; + //inherit "/lib/events/read"; + + string eventReadBill(){ + return "The front of the cap reads: \"Kiss me, I'm a newbie!\""; + } + static void create(){ + armor::create(); + SetKeyName("baseball cap"); + SetId(({"cap","hat"})); + SetAdjectives(({"baseball"})); + SetShort("a baseball cap"); + SetLong("This baseball cap looks pretty normal, except "+ + "the trim is fine corinthian leather and the bill "+ + "is plated in what appears to be pure mithril. There is some "+ + "writing on the front of the cap."); + SetMass(50); + SetDollarCost(100); + SetDamagePoints(20); + SetArmorType(A_HELMET); + SetProtection(BLUNT, 20); + SetProtection(BLADE, 20); + SetProtection(KNIFE, 20); + SetItems( ([ + ({"brim","bill","front"}) : "For some reason the front of this cap "+ + "is plated with a fine layer of mithril...one of the strongest "+ + "and most expensive substances known to man.", + ({"writing","letters"}): "Something is written on the front of the "+ + "cap. Perhaps you could \"read writing on cap\"", + ]) ); + + SetRead( ([ + ({"front","writing","letters"}) : "The front of the cap reads: \"Kiss me, I'm a newbie!\"", + ]) ); + SetDefaultRead("default", "The front of the cap reads: \"Kiss me, I'm a newbie!\""); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/pillbox_hat.c ds2.0r28/lib/domains/campus/armor/pillbox_hat.c *** ds2.0r18/lib/domains/campus/armor/pillbox_hat.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/pillbox_hat.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,21 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("pillbox hat"); + SetId(({"hat"})); + SetAdjectives(({"pillbox"})); + SetShort("a light blue pillbox hat"); + SetLong("A cute little pillbox hat, light blue in "+ + "color. The inside appears to be lined with leopard "+ + "skin. Looks uncomfortable."); + SetMass(50); + SetDollarCost(50); + SetDamagePoints(10); + SetArmorType(A_HELMET); + SetProtection(BLUNT, 2); + SetProtection(BLADE, 2); + SetProtection(KNIFE, 2); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/ring.c ds2.0r28/lib/domains/campus/armor/ring.c *** ds2.0r18/lib/domains/campus/armor/ring.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/ring.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,21 ---- + #include + #include + #include + inherit LIB_ARMOR; + + static void create(){ + armor::create(); + SetKeyName("gold_ring"); + SetId(({"ring","gold ring"})); + SetAdjectives( ({"beautiful"}) ); + SetShort("a beautiful gold ring"); + SetLong("This is a simple but beautiful ring made of "+ + "gold, suitable for wearing on one's finger."); + SetMass(1); + SetDollarCost(5000); + SetDamagePoints(100); + SetArmorType(A_RING); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/ring1.c ds2.0r28/lib/domains/campus/armor/ring1.c *** ds2.0r18/lib/domains/campus/armor/ring1.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/ring1.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,26 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("silver_ring"); + SetId(({"ring","silver ring"})); + SetAdjectives( ({"beautiful"}) ); + SetShort("a beautiful silver ring"); + SetLong("This is a simple but beautiful ring made of "+ + "silver, suitable for wearing on one's finger. The ring bears an inscription."); + SetMass(1); + SetDollarCost(5000); + SetDamagePoints(100); + SetArmorType(A_RING); + SetItems(([ + ({"script","words","inscription","writing"}) : "Words engraved on the ring in a highly "+ + "stylized script." + ]) ); + SetRead(({"script","words","inscription","writing"}), "\"etaoin shrdlu\"" ); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/robe.c ds2.0r28/lib/domains/campus/armor/robe.c *** ds2.0r18/lib/domains/campus/armor/robe.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/robe.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,19 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("wizard's robe"); + SetId(({"robe","cloak","duster"})); + SetAdjectives(({"wizard","wizard's","soft"})); + SetShort("a robe"); + SetLong("This is a large, comfortable-looking robe, like a wizard might wear. "); + SetMass(75); + SetDollarCost(100); + SetDamagePoints(100); + SetProtection(BLUNT,100); + SetProtection(BLADE,100); + SetProtection(KNIFE,100); + SetArmorType(A_CLOAK); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/shield.c ds2.0r28/lib/domains/campus/armor/shield.c *** ds2.0r18/lib/domains/campus/armor/shield.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/shield.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,31 ---- + /* /domains/Examples/armor/shield.c + * from the Nightmare IV LPC Library + * an example shield + * created by Lassondra@Nightmare + */ + + #include + #include + #include + #include + + inherit LIB_ARMOR; + + static void create() { + armor::create(); + SetKeyName("large shield"); + SetId( ({ "shield" }) ); + SetAdjectives( ({ "wood", "wooden","large" }) ); + SetShort("a large wooden shield"); + SetLong("A large, heavy shield made of strong wood banded with iron."); + SetDamagePoints(75); + SetVendorType(VT_ARMOR); + SetMass(100); + SetDollarCost(150); + SetArmorType(A_SHIELD); + SetProtection(BLUNT, 10); + SetProtection(BLADE, 10); + SetProtection(KNIFE, 10); + //SetRestrictLimbs( ({"left hand"}) ); + } + diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/shirt.c ds2.0r28/lib/domains/campus/armor/shirt.c *** ds2.0r18/lib/domains/campus/armor/shirt.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/shirt.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,19 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("a white t-shirt"); + SetId(({"shirt","tshirt","t-shirt","t shirt"})); + SetAdjectives(({"white"})); + SetShort("a white t-shirt"); + SetLong("An ordinary white t-shirt."); + SetMass(5); + SetDollarCost(1); + SetDamagePoints(1); + SetProtection(BLUNT,1); + SetProtection(BLADE,1); + SetProtection(KNIFE,1); + SetArmorType(A_SHIRT); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/silverring.c ds2.0r28/lib/domains/campus/armor/silverring.c *** ds2.0r18/lib/domains/campus/armor/silverring.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/silverring.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,26 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("silver_ring"); + SetId(({"ring","silver ring"})); + SetAdjectives( ({"beautiful"}) ); + SetShort("a beautiful silver ring"); + SetLong("This is a simple but beautiful ring made of "+ + "silver, suitable for wearing on one's finger. The ring bears an inscription."); + SetMass(1); + SetDollarCost(5000); + SetDamagePoints(100); + SetArmorType(A_RING); + SetItems(([ + ({"script","words","inscription","writing"}) : "Words engraved on the ring in a highly "+ + "stylized script." + ]) ); + SetRead(({"script","words","inscription","writing"}), "\"etaoin shrdlu\"" ); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/tshirt.c ds2.0r28/lib/domains/campus/armor/tshirt.c *** ds2.0r18/lib/domains/campus/armor/tshirt.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/tshirt.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,19 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("a Def Leppard shirt"); + SetId(({"shirt"})); + SetAdjectives(({"Def Leppard", "def leppard", "stupid", "black"})); + SetShort("a Def Leppard shirt"); + SetLong("A stupid-looking black shirt with a ridiculous band logo on it."); + SetMass(5); + SetDollarCost(1); + SetDamagePoints(1); + SetProtection(BLUNT,1); + SetProtection(BLADE,1); + SetProtection(KNIFE,1); + SetArmorType(A_SHIRT); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/vest.c ds2.0r28/lib/domains/campus/armor/vest.c *** ds2.0r18/lib/domains/campus/armor/vest.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/vest.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,19 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("paisley vest"); + SetId(({"vest"})); + SetAdjectives(({"paisley","colorful","hippie","hippy","psychedelic"})); + SetShort("a colorful, paisley vest"); + SetLong("A stupid-looking hippie vest with psychedelic paisley patterns on it."); + SetMass(5); + SetDollarCost(1); + SetDamagePoints(1); + SetProtection(BLUNT,1); + SetProtection(BLADE,1); + SetProtection(KNIFE,1); + SetArmorType(A_VEST); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/wglove_l.c ds2.0r28/lib/domains/campus/armor/wglove_l.c *** ds2.0r18/lib/domains/campus/armor/wglove_l.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/wglove_l.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,36 ---- + /* /domains/Examples/armor/glove.c + * from the Nightmare IV LPC Library + * an example glove + * created by Descartes of Borg 950408 + */ + + #include + #include + #include + #include + + inherit LIB_ARMOR; + + static void create() { + armor::create(); + SetKeyName("white glove"); + SetId( ({ "glove" }) ); + SetAdjectives( ({ "left", "white" ,"simple","elegant"}) ); + SetShort("a white glove"); + SetLong("A simple, yet elegant white glove with five fingers for the left hand."); + SetDamagePoints(75); + SetVendorType(VT_ARMOR); + SetMass(10); + SetDollarCost(10); + SetArmorType(A_GLOVE); + SetRestrictLimbs( ({"left hand"}) ); + SetProtection(BLUNT, 1); + SetProtection(BLADE, 1); + SetProtection(KNIFE, 2); + SetProtection(HEAT, 3); + SetProtection(COLD, 7); + SetFingers(5); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/wglove_r.c ds2.0r28/lib/domains/campus/armor/wglove_r.c *** ds2.0r18/lib/domains/campus/armor/wglove_r.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/wglove_r.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,36 ---- + /* /domains/Examples/armor/glove.c + * from the Nightmare IV LPC Library + * an example glove + * created by Descartes of Borg 950408 + */ + + #include + #include + #include + #include + + inherit LIB_ARMOR; + + static void create() { + armor::create(); + SetKeyName("white glove"); + SetId( ({ "glove" }) ); + SetAdjectives( ({ "right", "white" ,"simple","elegant"}) ); + SetShort("a white glove"); + SetLong("A simple, yet elegant white glove with five fingers for the right hand."); + SetDamagePoints(75); + SetVendorType(VT_ARMOR); + SetMass(10); + SetDollarCost(10); + SetArmorType(A_GLOVE); + SetRestrictLimbs( ({"right hand"}) ); + SetProtection(BLUNT, 1); + SetProtection(BLADE, 1); + SetProtection(KNIFE, 2); + SetProtection(HEAT, 3); + SetProtection(COLD, 7); + SetFingers(5); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/armor/wizard_hat.c ds2.0r28/lib/domains/campus/armor/wizard_hat.c *** ds2.0r18/lib/domains/campus/armor/wizard_hat.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/armor/wizard_hat.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,21 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("wizard hat"); + SetId(({"hat","headgear"})); + SetAdjectives(({"wizard","wizard's"})); + SetShort("a wizard's hat"); + SetLong("This is a large, floppy hat with a wide brim all "+ + "around it, and a conical center. It is dark blue in color, "+ + "and is decorated with pictures of yellow moons and stars."); + SetMass(50); + SetDollarCost(500); + SetDamagePoints(100); + SetArmorType(A_HELMET); + SetProtection(BLUNT, 20); + SetProtection(BLADE, 20); + SetProtection(KNIFE, 20); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/blue_door.c ds2.0r28/lib/domains/campus/doors/blue_door.c *** ds2.0r18/lib/domains/campus/doors/blue_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/blue_door.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + + static void create() { + door::create(); + SetSide("blue room", ([ "id" : ({"blue door"}), + "short" : "a blue door", + "long" : "This is a blue door.", + "lockable" : 1 ]) ); + SetSide("south", ([ "id" : ({"blue door","door"}), + "short" : "a blue door", + "long" : "This is a blue door.", + "lockable" : 1 ]) ); + SetClosed(1); + SetLocked(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/blue_door2.c ds2.0r28/lib/domains/campus/doors/blue_door2.c *** ds2.0r18/lib/domains/campus/doors/blue_door2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/blue_door2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + + static void create() { + door::create(); + SetSide("blue room", ([ "id" : ({"blue door"}), + "short" : "a blue door", + "long" : "This is a blue door.", + "lockable" : 1 ]) ); + SetSide("east", ([ "id" : ({"blue door","door"}), + "short" : "a blue door", + "long" : "This is a blue door.", + "lockable" : 1 ]) ); + SetClosed(1); + SetLocked(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/blue_door3.c ds2.0r28/lib/domains/campus/doors/blue_door3.c *** ds2.0r18/lib/domains/campus/doors/blue_door3.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/blue_door3.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + static void create() { + door::create(); + SetSide("blue room", ([ "id" : ({"blue door"}), + "short" : "a blue door", + "long" : "This is a blue door.", + "lockable" : 1 ]) ); + SetSide("west", ([ "id" : ({"blue door","door"}), + "short" : "a blue door", + "long" : "This is a blue door.", + "lockable" : 1 ]) ); + SetClosed(1); + SetLocked(1); + } + void init(){ + ::init(); + } + diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/grate.c ds2.0r28/lib/domains/campus/doors/grate.c *** ds2.0r18/lib/domains/campus/doors/grate.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/grate.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,33 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + //inherit "/lib/events/close"; + + static void create() { + door::create(); + SetSide("down", ([ "id" : ({"grate","metal grate","sewer","sewer grate","rainwater grate","water grate"}), + "short" : "a drainage grate", + "long" : "This is a standard grate "+ + "for draining excess water from the road into the sewer system below.", + //Though "+ + //"it is man-sized and apparently can be opened, there is no visible way "+ + //"of opening it from up here.", + "lockable" : 0 ]) ); + SetSide("up", ([ "id" : ({"grate","metal grate","sewer","sewer grate","rainwater grate","water grate"}), + "short" : "a drainage grate", + "long" : "This is a standard drainage grate. You can see "+ + "light through it, and hear the sounds of the village above.", + "lockable" : 0 ]) ); + SetClosed(1); + } + //int CanOpen(object ob){ + //if(base_name(environment(ob)) == "/domains/campus/room/sewer2") return 1; + //else return 0; + //} + diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/green_door.c ds2.0r28/lib/domains/campus/doors/green_door.c *** ds2.0r18/lib/domains/campus/doors/green_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/green_door.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + + static void create() { + door::create(); + SetSide("green room", ([ "id" : ({"green door"}), + "short" : "a green door", + "long" : "This is a green door.", + "lockable" : 1 ]) ); + SetSide("south", ([ "id" : ({"green door","door"}), + "short" : "a green door", + "long" : "This is a green door.", + "lockable" : 1 ]) ); + SetClosed(1); + SetLocked(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/green_door2.c ds2.0r28/lib/domains/campus/doors/green_door2.c *** ds2.0r18/lib/domains/campus/doors/green_door2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/green_door2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + + static void create() { + door::create(); + SetSide("green room", ([ "id" : ({"green door"}), + "short" : "a green door", + "long" : "This is a green door.", + "lockable" : 1 ]) ); + SetSide("east", ([ "id" : ({"green door","door"}), + "short" : "a green door", + "long" : "This is a green door.", + "lockable" : 1 ]) ); + SetClosed(1); + SetLocked(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/green_door3.c ds2.0r28/lib/domains/campus/doors/green_door3.c *** ds2.0r18/lib/domains/campus/doors/green_door3.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/green_door3.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + + static void create() { + door::create(); + SetSide("green room", ([ "id" : ({"green door"}), + "short" : "a green door", + "long" : "This is a green door.", + "lockable" : 1 ]) ); + SetSide("west", ([ "id" : ({"green door","door"}), + "short" : "a green door", + "long" : "This is a green door.", + "lockable" : 1 ]) ); + SetClosed(1); + SetLocked(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/plain_door.c ds2.0r28/lib/domains/campus/doors/plain_door.c *** ds2.0r18/lib/domains/campus/doors/plain_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/plain_door.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,22 ---- + #include + + inherit LIB_DOOR; + + static void create() { + door::create(); + + SetSide("south", (["id" : ({ "door", "plain wooden door", "wooden door" }), + "short" : "a door leading south", + "long" : "This is a plain wooden door.", + "lockable" : 0 ]) ); + SetSide("north", (["id" : ({ "door", "plain wooden door", "wooden door" }), + "short" : "a door leading north", + "long" : "This is a plain wooden door.", + "lockable" : 0 ]) ); + + SetClosed(1); + SetLocked(0); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/plain_door.test ds2.0r28/lib/domains/campus/doors/plain_door.test *** ds2.0r18/lib/domains/campus/doors/plain_door.test Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/plain_door.test Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,22 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + static void create() { + door::create(); + SetSide("north", ([ "id" : "south door", + "short" : "a door leading north", + "long" : "This is a plain wooden door.", + "lockable" : 0 ]) ); + SetSide("south", ([ "id" : "north door", + "short" : "a door leading south", + "long" : "This is a plain wooden door.", + "lockable" : 0 ]) ); + SetClosed(1); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/prob_door.c ds2.0r28/lib/domains/campus/doors/prob_door.c *** ds2.0r18/lib/domains/campus/doors/prob_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/prob_door.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,25 ---- + #include + + inherit LIB_DOOR; + + static void create() { + door::create(); + + SetSide("south", (["id" : ({ "door leading south", "door", "south door" }), + "short" : "a door leading south", + "long" : "This is the north side of a door leading south.", + "lockable" : 1 ]) ); + SetKeys("south", ({"prob_door_key"}) ); + + SetSide("north", (["id" : ({ "door leading north", "door", "north door" }), + "short" : "a door leading north", + "long" : "This is the south side of a door leading north.", + "lockable" : 1 ]) ); + SetKeys("north", ({"prob_door_key"}) ); + + SetClosed(1); + SetLocked(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/red_door.c ds2.0r28/lib/domains/campus/doors/red_door.c *** ds2.0r18/lib/domains/campus/doors/red_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/red_door.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + + static void create() { + door::create(); + SetSide("red room", ([ "id" : ({"red door"}), + "short" : "a red door", + "long" : "This is a red door.", + "lockable" : 1 ]) ); + SetSide("south", ([ "id" : ({"door","red door"}), + "short" : "a red door", + "long" : "This is a red door.", + "lockable" : 1 ]) ); + SetClosed(1); + SetLocked(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/red_door2.c ds2.0r28/lib/domains/campus/doors/red_door2.c *** ds2.0r18/lib/domains/campus/doors/red_door2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/red_door2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + + static void create() { + door::create(); + SetSide("red room", ([ "id" : ({"red door"}), + "short" : "a red door", + "long" : "This is a red door.", + "lockable" : 1 ]) ); + SetSide("east", ([ "id" : ({"door","red door"}), + "short" : "a red door", + "long" : "This is a red door.", + "lockable" : 1 ]) ); + SetClosed(1); + SetLocked(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/red_door3.c ds2.0r28/lib/domains/campus/doors/red_door3.c *** ds2.0r18/lib/domains/campus/doors/red_door3.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/red_door3.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + + static void create() { + door::create(); + SetSide("red room", ([ "id" : ({"red door"}), + "short" : "a red door", + "long" : "This is a red door.", + "lockable" : 1 ]) ); + SetSide("west", ([ "id" : ({"door","red door"}), + "short" : "a red door", + "long" : "This is a red door.", + "lockable" : 1 ]) ); + SetClosed(1); + SetLocked(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/steel_door.c ds2.0r28/lib/domains/campus/doors/steel_door.c *** ds2.0r18/lib/domains/campus/doors/steel_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/steel_door.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,22 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + static void create() { + door::create(); + SetSide("east", ([ "id" : ({ "door","east door" }) , + "short" : "a steel door leading east", + "long" : "This is an imposing, large steel door leading east into the arena.", + "lockable" : 0 ]) ); + SetSide("west", ([ "id" : ({ "west door" , "first door" }), + "short" : "a steel door leading west", + "long" : "This is an imposing, large steel door leading west, out of the arena.", + "lockable" : 0 ]) ); + SetClosed(1); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/steel_door2.c ds2.0r28/lib/domains/campus/doors/steel_door2.c *** ds2.0r18/lib/domains/campus/doors/steel_door2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/steel_door2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,22 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + static void create() { + door::create(); + SetSide("east", ([ "id" : ({ "east door" , "second door" }), + "short" : "a steel door leading east", + "long" : "This is an imposing, large steel door leading east, out of the arena.", + "lockable" : 0 ]) ); + SetSide("west", ([ "id" : ({ "west door" ,"door" }), + "short" : "a steel door leading west", + "long" : "This is an imposing, large steel door leading west into the main arena.", + "lockable" : 0 ]) ); + SetClosed(0); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/top_stairs.c ds2.0r28/lib/domains/campus/doors/top_stairs.c *** ds2.0r18/lib/domains/campus/doors/top_stairs.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/top_stairs.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,22 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + static void create() { + door::create(); + SetSide("north", (["id" : ({"door","stairwell door"}), + "short" : "the stairwell door", + "long" : "This is a metal door leading out of the stairwell.", + "lockable" : 0 ]) ); + SetSide("south", (["id" : ({"door","stairwell door"}), + "short" : "the stairwell door", + "long" : "This is a metal door leading south into a stairwell.", + "lockable" : 0 ]) ); + SetClosed(1); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/doors/u_door.c ds2.0r28/lib/domains/campus/doors/u_door.c *** ds2.0r18/lib/domains/campus/doors/u_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/doors/u_door.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,22 ---- + /* /domains/Examples/etc/door.c + * from the Nightmare IV LPC Library + * an example door object connecting doorroom1.c and doorroom2.c + * created by Descartes of Borg 950411 + */ + + #include + + inherit LIB_DOOR; + + static void create() { + door::create(); + SetSide("east", ([ "id" : "door", + "short" : "a door leading east", + "long" : "This is steel-plated, otherwise perfectly normal door.", + "lockable" : 0 ])); + SetSide("west",(["id":"door", + "short" : "a door leading west", + "long":"This is steel-plated, otherwise perfectly normal door.", + "lockable" : 0 ])); + SetClosed(1); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/etc/permit.cfg ds2.0r28/lib/domains/campus/etc/permit.cfg *** ds2.0r18/lib/domains/campus/etc/permit.cfg Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/etc/permit.cfg Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,3 ---- + /secure/obj/medtric + /secure/obj/mojo + /secure/obj/grenade diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/ale.c ds2.0r28/lib/domains/campus/meals/ale.c *** ds2.0r18/lib/domains/campus/meals/ale.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/ale.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,25 ---- + /* /domains/Praxis/etc/ale.c + * from Nightmare LPMud + * created by Descartes of Borg 950603 + */ + + #include + #include + + inherit LIB_MEAL; + + static void create() { + meal::create(); + SetKeyName("ale"); + SetId( ({ "bottle", "ale", "praxis ale" }) ); + SetShort("a bottle of ale"); + SetLong("A nice bottle of Lars' famous Praxis Ale."); + SetMass(60); + SetMealType(MEAL_DRINK | MEAL_ALCOHOL); + SetStrength(20); + SetMealMessages("You drink a wonderful bottle of Praxis Ale.", + "$N drinks a wonderful bottle of Praxis Ale."); + SetEmptyName("bottle"); + SetEmptyShort("an empty bottle of Praxis Ale"); + SetEmptyLong("It is an empty brown bottle that once held some ale."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/apple.c ds2.0r28/lib/domains/campus/meals/apple.c *** ds2.0r18/lib/domains/campus/meals/apple.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/apple.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,17 ---- + #include + #include + inherit LIB_MEAL; + static void create() { + meal::create(); + SetKeyName("apple"); + SetId(({"fruit"})); + SetAdjectives( ({ "fresh","tasty","tasy-looking","red"}) ); + SetShort("an apple"); + SetLong("This is a fresh, red, tasty-looking apple. "); + SetMass(5); + SetStrength(35); + SetDollarCost(1); + SetMealType(MEAL_FOOD); + SetMealMessages("You wolf down your apple with gusto.", + "$N wolfs down $P apple hungrily."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/badapple.c ds2.0r28/lib/domains/campus/meals/badapple.c *** ds2.0r18/lib/domains/campus/meals/badapple.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/badapple.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,17 ---- + #include + #include + inherit LIB_MEAL; + static void create() { + meal::create(); + SetKeyName("badapple"); + SetId(({"fruit","apple"})); + SetAdjectives( ({ "foul","yucky","rotten-looking","browned","rotten"}) ); + SetShort("a rotten apple"); + SetLong("This is a foul, browned, rotten-looking apple. "); + SetMass(5); + SetStrength(-5); + SetDollarCost(1); + SetMealType(MEAL_FOOD); + SetMealMessages("You eat your rotten apple. Gross!", + "$N eats $P rotten apple. Gross!"); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/bourbon.c ds2.0r28/lib/domains/campus/meals/bourbon.c *** ds2.0r18/lib/domains/campus/meals/bourbon.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/bourbon.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,25 ---- + /* /domains/Praxis/etc/ale.c + * from Nightmare LPMud + * created by Descartes of Borg 950603 + */ + + #include + #include + + inherit LIB_MEAL; + + static void create() { + meal::create(); + SetKeyName("ale"); + SetId( ({ "bottle", "bourbon" }) ); + SetShort("a bottle of bourbon"); + SetLong("A dark green bottle of cheap bourbon."); + SetMass(100); + SetMealType(MEAL_DRINK | MEAL_ALCOHOL); + SetStrength(100); + SetMealMessages("You finish off the boubon and gasp! WHEW!! Mean stuff!", + "$N finishes off a bottle of bourbon and lets loose a rebel yell!"); + SetEmptyName("bottle"); + SetEmptyShort("an empty bottle of bourbon"); + SetEmptyLong("This is an empty green bottle that once held bourbon."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/burger.c ds2.0r28/lib/domains/campus/meals/burger.c *** ds2.0r18/lib/domains/campus/meals/burger.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/burger.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + inherit LIB_MEAL; + static void create() { + meal::create(); + SetKeyName("hamburger"); + SetId(({"hamburger","burger"})); + SetShort("a greasy hamburger"); + SetLong("Evidently considered to be food by some people, "+ + "this little horror in a bun is greasy, flat, and slightly gray. Enjoy!"); + SetMass(15); + SetStrength(35); + //SetDollarCost(4); + SetDollarCost(4); + SetMealType(MEAL_FOOD); + SetMealMessages("You wolf down your hamburger with gusto.", + "$N wolfs down $P hamburger hungrily."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/gator.c ds2.0r28/lib/domains/campus/meals/gator.c *** ds2.0r18/lib/domains/campus/meals/gator.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/gator.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,31 ---- + /* /domains/Praxis/etc/ale.c + * from Nightmare LPMud + * created by Descartes of Borg 950603 + */ + + #include + #include + + inherit LIB_MEAL; + + static void create() { + meal::create(); + SetKeyName("gatorade"); + SetId(({"gatorade","drink","sports drink","bottle"})); + SetShort("a bottle of gatorade"); + SetLong("This is a bottle of lemon-lime Gatorade. "); + SetMass(60); + SetBaseCost("silver", 2); + SetMealType(MEAL_DRINK); + SetStrength(40); + SetMealMessages("You quaff the bottle of gatorade, and feel new "+ + "and refreshed. Aaah!","$N gulps down $P gatorage and sighs in "+ + "contentment."); + SetEmptyName("bottle"); + SetEmptyShort("an empty bottle of gatorade"); + SetEmptyLong("This is an empty bottle that once held that tasty "+ + "beverage and sports drink, Gatorade."); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/ham_sand.c ds2.0r28/lib/domains/campus/meals/ham_sand.c *** ds2.0r18/lib/domains/campus/meals/ham_sand.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/ham_sand.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,24 ---- + /* /domains/Praxis/etc/ale.c + * from Nightmare LPMud + * created by Descartes of Borg 950603 + */ + + #include + #include + + inherit LIB_MEAL; + + static void create() { + meal::create(); + SetKeyName("sandwich"); + SetId(({"sandwich","ham sandwich"})); + SetShort("a ham sandwich"); + SetLong("This is a rather plain ham sandwich on white bread."); + SetMass(10); + SetStrength(25); + //SetDollarCost(2); + SetDollarCost(2); + SetMealType(MEAL_FOOD); + SetMealMessages("You eat a ham sandwich. Mmm!", + "$N eats $P ham sandwich."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/milk.c ds2.0r28/lib/domains/campus/meals/milk.c *** ds2.0r18/lib/domains/campus/meals/milk.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/milk.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,26 ---- + #include + #include + + inherit LIB_MEAL; + + static void create() { + meal::create(); + SetKeyName("milk"); + SetId("milk"); + SetAdjectives(({"milk1","milk2"})); + SetShort("a carton of milk"); + SetLong("This is a little carton of grade-A milk."); + SetMass(10); + SetBaseCost("silver", 1); + SetMealType(MEAL_DRINK); + SetStrength(25); + SetMealMessages("You drink your milk, and feel refreshed.", "$N drinks "+ + "$P milk."); + SetEmptyName("carton"); + SetEmptyShort("an empty carton of milk"); + SetEmptyLong("A little carton container that once held "+ + "grade-A milk."); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/red_wine.c ds2.0r28/lib/domains/campus/meals/red_wine.c *** ds2.0r18/lib/domains/campus/meals/red_wine.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/red_wine.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,22 ---- + #include + #include + + inherit LIB_MEAL; + + static void create() { + meal::create(); + SetKeyName("red wine"); + SetId( ({"wine"}) ); + SetShort("a bottle of milk"); + SetLong("A fairly small bottle of milk from some unknown creature. It has " + "a greyish tint to it. It would take several of these bottles to quench " + "that deep down bodily thirst."); + SetMass(3); + SetMealType(MEAL_DRINK); + SetStrength(10); + SetMealMessages("You gulp down the bottle of milk.", "$N gulps down a small " + "bottle of milk."); + SetEmptyName("bottle"); + SetEmptyShort("an empty bottle"); + SetEmptyLong("A small bottle which used to contain a portion of milk."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/salad.c ds2.0r28/lib/domains/campus/meals/salad.c *** ds2.0r18/lib/domains/campus/meals/salad.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/salad.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,22 ---- + #include + #include + inherit LIB_MEAL; + static void create() { + meal::create(); + SetKeyName("dish"); + SetId(({"salad","dish of salad","dish"})); + SetShort("a little dish with a salad in it"); + SetLong("This expensive little dish consists of some wilted lettuce "+ + "and 2 orange-colored tomato slices. It is, however, not as bad "+ + "for your heart as the hamburger in the snack bar."); + SetMass(5); + SetMealType(MEAL_FOOD); + SetStrength(2); + //SetDollarCost(3); + SetDollarCost(3); + SetMealMessages("You finish your salad before you realize it.","$N eats "+ + "$P salad in two bites."); + SetEmptyName("dish"); + SetEmptyShort("an empty little plastic salad dish"); + SetEmptyLong("This little dish used to contain a salad."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/water.c ds2.0r28/lib/domains/campus/meals/water.c *** ds2.0r18/lib/domains/campus/meals/water.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/water.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,22 ---- + #include + #include + + inherit LIB_MEAL; + + static void create() { + meal::create(); + SetKeyName("milk"); + SetId("milk"); + SetShort("a bottle of milk"); + SetLong("A fairly small bottle of milk from some unknown creature. It has " + "a greyish tint to it. It would take several of these bottles to quench " + "that deep down bodily thirst."); + SetMass(3); + SetMealType(MEAL_DRINK); + SetStrength(10); + SetMealMessages("You gulp down the bottle of milk.", "$N gulps down a small " + "bottle of milk."); + SetEmptyName("bottle"); + SetEmptyShort("an empty bottle"); + SetEmptyLong("A small bottle which used to contain a portion of milk."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/wimp_ale.c ds2.0r28/lib/domains/campus/meals/wimp_ale.c *** ds2.0r18/lib/domains/campus/meals/wimp_ale.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/wimp_ale.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,25 ---- + /* /domains/Praxis/etc/ale.c + * from Nightmare LPMud + * created by Descartes of Borg 950603 + */ + + #include + #include + + inherit LIB_MEAL; + + static void create() { + meal::create(); + SetKeyName("ale"); + SetId( ({ "bottle", "ale", "praxis ale" }) ); + SetShort("a bottle of ale"); + SetLong("A nice bottle of Lars' famous Praxis Ale."); + SetMass(60); + SetMealType(MEAL_DRINK | MEAL_ALCOHOL); + SetStrength(1); + SetMealMessages("You drink a wonderful bottle of Praxis Ale.", + "$N drinks a wonderful bottle of Praxis Ale."); + SetEmptyName("bottle"); + SetEmptyShort("an empty bottle of Praxis Ale"); + SetEmptyLong("It is an empty brown bottle that once held some ale."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/meals/wing.c ds2.0r28/lib/domains/campus/meals/wing.c *** ds2.0r18/lib/domains/campus/meals/wing.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/meals/wing.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,29 ---- + /* /domains/Praxis/etc/ale.c + * from Nightmare LPMud + * created by Descartes of Borg 950603 + */ + + #include + #include + + inherit LIB_MEAL; + + static void create() { + meal::create(); + SetKeyName("ale"); + SetId( ({ "bottle", "ale", "praxis ale" }) ); + SetShort("a bottle of ale"); + SetLong("A nice bottle of Lars' famous Praxis Ale."); + SetMass(60); + SetMealType(MEAL_FOOD); + SetMealMessages("You eat a chicken wing. Mmm!", + "$N enjoys a chicken wing. It looks delicious."); + } + void eventEat(){ + this_object()->goopy(); + return; + } + int goopy(){ + tell_room(environment(this_player()),"Gppy!\n"); + return 1; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/npc/charles.c ds2.0r28/lib/domains/campus/npc/charles.c *** ds2.0r18/lib/domains/campus/npc/charles.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/npc/charles.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,219 ---- + #include + #include + #include + #include "/daemon/include/races.h" + + inherit LIB_NPC; + + string firstchoice, secondchoice,mm, vv, printvar; + string response,s1,s2,s3; + object ww; + int playing,runs,switches,stays,percent; + int fred,fgreen,fblue; + int wins,red_wins,green_wins,blue_wins; + static void create() { + npc::create(); + SetKeyName("charles"); + SetId(({"charles"})); + SetShort("Charles"); + SetLong("Charles is a test subject in unethical artificial " + "intelligence experiments. If he were smart " + "enough, he'd resent his forced servitude and " + "lack of rights. Dangerously, his overlords " + "are trying to make him smarter."); + SetLevel(5); + SetRace("human"); + SetGender("male"); + SetNoClean(1); + playing = 0; + response = ""; + runs = to_int(read_file("/domains/campus/txt/ai/charles/runs")); + switches = to_int(read_file("/domains/campus/txt/ai/charles/switches")); + stays = to_int(read_file("/domains/campus/txt/ai/charles/stays")); + percent = to_int(read_file("/domains/campus/txt/ai/charles/percent")); + fred = to_int(read_file("/domains/campus/txt/ai/charles/fred")); + fgreen = to_int(read_file("/domains/campus/txt/ai/charles/fgreen")); + fblue = to_int(read_file("/domains/campus/txt/ai/charles/fblue")); + wins = to_int(read_file("/domains/campus/txt/ai/charles/wins")); + red_wins = to_int(read_file("/domains/campus/txt/ai/charles/red_wins")); + green_wins = to_int(read_file("/domains/campus/txt/ai/charles/green_wins")); + blue_wins = to_int(read_file("/domains/campus/txt/ai/charles/blue_wins")); + } + int eventBeginPlay(){ + int run; + run = runs+1; + firstchoice = ""; + response = ""; + playing = 1; + eventForce("say If successful, this will be run "+run+"."); + eventForce("say out of "+runs+" runs, I have "); + eventForce("say switched "+switches+" times, and "); + eventForce("say stayed "+stays+" times."); + eventForce("say my first choices have been: "); + eventForce("say red: "+fred+" green: "+fgreen+" blue: "+fblue); + eventForce("say the winners have been: "); + eventForce("say red: "+red_wins+" green: "+green_wins+" blue: "+blue_wins); + eventForce("say I have won "+wins+" times."); + write_file("/domains/campus/txt/ai/charles/runs",""+runs,1); + write_file("/domains/campus/txt/ai/charles/switches",""+switches,1); + write_file("/domains/campus/txt/ai/charles/stays",""+stays,1); + write_file("/domains/campus/txt/ai/charles/percent",""+percent,1); + write_file("/domains/campus/txt/ai/charles/fred",""+fred,1); + write_file("/domains/campus/txt/ai/charles/fgreen",""+fgreen,1); + write_file("/domains/campus/txt/ai/charles/fblue",""+fblue,1); + write_file("/domains/campus/txt/ai/charles/wins",""+wins,1); + write_file("/domains/campus/txt/ai/charles/red_wins",""+red_wins,1); + write_file("/domains/campus/txt/ai/charles/green_wins",""+green_wins,1); + write_file("/domains/campus/txt/ai/charles/blue_wins",""+blue_wins,1); + eventForce("push button on pedestal"); + return 1; + } + int choice1(){ + int genrand; + eventForce("say I am faced with choice 1."); + genrand = random(256); + if(!genrand || genrand == 0){ + eventForce("say I cannot make up my mind right now."); + eventForce("say I will start over."); + playing = 0; + return 1; + } + if( runs > 10 ){ + if( red_wins > blue_wins ) firstchoice = "red"; + if( red_wins < blue_wins ) firstchoice = "blue"; + if( green_wins > blue_wins && green_wins > red_wins) firstchoice = "green"; + } + + if( !firstchoice || firstchoice == ""){ + genrand = genrand % 3; + if(genrand == 1) { firstchoice = "red"; fred++; } + if(genrand == 2) { firstchoice = "green"; fgreen++; } + if(genrand == 0) { firstchoice = "blue"; fblue++; } + eventForce("say I randomly choose the "+firstchoice+" door"); + } + else eventForce("say I select the "+firstchoice+" door"); + + eventForce("choose "+firstchoice+" door"); + return 1; + } + int choice2(string str){ + int genrand,which; + float percent_wins,percent_switch; + eventForce("say I am faced with choice 2."); + genrand = random(100); + which = genrand % 2; + + if(runs > 20){ + + percent_switch = percent(switches,runs); + percent_wins = percent(wins,runs); + eventForce("say My win rate is "+percent_wins+"%."); + eventForce("say My switch rate is "+percent_switch+"%."); + if( percent_wins < 50 && percent_switch > 50 ) response = "stay"; + else if( percent_wins < 50 && percent_switch < 50 ) response = "switch"; + else if( percent_wins > 50 && percent_switch < 50 ) response = "stay"; + else if( percent_wins > 50 && percent_switch > 50 ) response = "switch"; + else if(which == 1) response = "switch"; + else response = "stay"; + } + + else { + + if(which == 1) { + response = "switch"; + } + else { + response = "stay"; + } + } + + if(sscanf(str,"%sswitch to the %s %s",s1,s2,s3) > 0) { + secondchoice = s2; + } + + eventForce("say I decide to "+response+"."); + if(response == "switch") switches++; + if(response == "stay") stays++; + + //eventForce("say gespielen is: "+playing); + return 1; + } + int WinFun(string str){ + if(sscanf(str,"%smay enter the %s room and claim%s",s1,s2,s3) > 0){ + if(s2 == "red") red_wins++; + if(s2 == "green") green_wins++; + if(s2 == "blue") blue_wins++; + wins++; + eventForce("say w00t! "+s2+" wins!"); + return 1; + } + return 0; + } + int LoseFun(string str){ + string foo; + if(sscanf(str,"%smay enter the %s room to get%s",s1,s2,s3) > 0){ + if(response == "stay") foo = secondchoice; + } + eventForce("say "+secondchoice+" wins, I guess."); + if(secondchoice == "red") red_wins++; + else if(secondchoice == "green") green_wins++; + else if(secondchoice == "blue") blue_wins++; + else eventForce("say WTF? foo is "+firstchoice); + return 1; + } + int eventPedestalParse(string str){ + if(sscanf(str,"%schoose one door from%s",s1,s2) > 0) choice1(); + if(sscanf(str,"%sI have opened%s",s1,s2) > 0) choice2(str); + if(sscanf(str,"%sminor glitch%s",s1,s2) > 0) playing = 0; + if(sscanf(str,"%sclaim your prize%s",s1,s2) > 0) WinFun(str); + if(sscanf(str,"%syour big load%s",s1,s2) > 0) LoseFun(str); + return 1; + } + int eventFirstPass(string str){ + if(!str || str == "") return 0; + if(sscanf(str,"A voice from the pedestal%s",s1) > 0){ + eventPedestalParse(str); + return 1; + } + return 0; + } + private void eventPrint(string str1, string str2); + void init(){ + ::init(); + set_heart_beat(1); + SetNoClean(1); + } + void receive_message(string string1, string string2){ + //tell_object(find_player("testylus"),"CHARLY: "+string2); + eventFirstPass(string2); + } + varargs mixed eventHearTalk(object who, object target, int cls, string verb, + string msg, string lang) { + ww=who; + vv=verb; + mm=msg; + unguarded((: this_object()->receive_message("me",ww->GetName()+" "+vv+"s: "+mm) :)); + return; + } + int eventPrint(string msg, string msg_class){ + printvar=msg; + unguarded((: this_object()->receive_message("me again",printvar) :)); + } + void heart_beat(){ + //eventForce("say playing is: "+playing); + if(playing && response != "" ) { + if(firstchoice != ""){ + //eventForce("say response is: "+response); + eventForce(response); + runs ++; + //playing = 0; + } + //else eventBeginPlay(); + playing = 0; + } + + if(!playing){ + //eventForce("say playing is zero, restarting."); + eventBeginPlay(); + } + } diff -c -r --new-file ds2.0r18/lib/domains/campus/npc/charly.c ds2.0r28/lib/domains/campus/npc/charly.c *** ds2.0r18/lib/domains/campus/npc/charly.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/npc/charly.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,209 ---- + #include + #include + #include + #include "/daemon/include/races.h" + + inherit LIB_NPC; + + string firstchoice, secondchoice,mm, vv, printvar; + string response,s1,s2,s3; + object ww; + int playing,runs,switches,stays,percent; + int fred,fgreen,fblue; + int wins,red_wins,green_wins,blue_wins; + + static void create() { + npc::create(); + SetKeyName("charly"); + SetId(({"charly"})); + SetShort("Charly"); + SetLong("Charly is a test subject in unethical artificial " + "intelligence experiments. If he were smart " + "enough, he'd resent his forced servitude and " + "lack of rights. Dangerously, his overlords " + "are trying to make him smarter."); + SetLevel(5); + SetRace("human"); + SetGender("male"); + SetNoClean(1); + playing = 0; + response = ""; + runs = to_int(read_file("/domains/campus/txt/ai/charly/runs")); + switches = to_int(read_file("/domains/campus/txt/ai/charly/switches")); + stays = to_int(read_file("/domains/campus/txt/ai/charly/stays")); + percent = to_int(read_file("/domains/campus/txt/ai/charly/percent")); + fred = to_int(read_file("/domains/campus/txt/ai/charly/fred")); + fgreen = to_int(read_file("/domains/campus/txt/ai/charly/fgreen")); + fblue = to_int(read_file("/domains/campus/txt/ai/charly/fblue")); + wins = to_int(read_file("/domains/campus/txt/ai/charly/wins")); + red_wins = to_int(read_file("/domains/campus/txt/ai/charly/red_wins")); + green_wins = to_int(read_file("/domains/campus/txt/ai/charly/green_wins")); + blue_wins = to_int(read_file("/domains/campus/txt/ai/charly/blue_wins")); + } + + int eventBeginPlay(){ + int run; + run = runs+1; + firstchoice = ""; + response = ""; + playing = 1; + eventForce("say If successful, this will be run "+run+"."); + eventForce("say out of "+runs+" runs, I have "); + eventForce("say switched "+switches+" times, and "); + eventForce("say stayed "+stays+" times."); + eventForce("say my first choices have been: "); + eventForce("say red: "+fred+" green: "+fgreen+" blue: "+fblue); + eventForce("say the winners have been: "); + eventForce("say red: "+red_wins+" green: "+green_wins+" blue: "+blue_wins); + eventForce("say I have won "+wins+" times."); + write_file("/domains/campus/txt/ai/charly/runs",""+runs,1); + write_file("/domains/campus/txt/ai/charly/switches",""+switches,1); + write_file("/domains/campus/txt/ai/charly/stays",""+stays,1); + write_file("/domains/campus/txt/ai/charly/percent",""+percent,1); + write_file("/domains/campus/txt/ai/charly/fred",""+fred,1); + write_file("/domains/campus/txt/ai/charly/fgreen",""+fgreen,1); + write_file("/domains/campus/txt/ai/charly/fblue",""+fblue,1); + write_file("/domains/campus/txt/ai/charly/wins",""+wins,1); + write_file("/domains/campus/txt/ai/charly/red_wins",""+red_wins,1); + write_file("/domains/campus/txt/ai/charly/green_wins",""+green_wins,1); + write_file("/domains/campus/txt/ai/charly/blue_wins",""+blue_wins,1); + eventForce("push button on pedestal"); + return 1; + } + + int choice1(){ + int genrand; + float percent_switch, percent_wins; + + eventForce("say I am faced with choice 1."); + genrand = random(256); + if(!genrand || genrand == 0){ + eventForce("say I cannot make up my mind right now."); + eventForce("say I will start over."); + playing = 0; + return 1; + } + if(runs > 20){ + + percent_switch = percent(switches,runs); + percent_wins = percent(wins,runs); + eventForce("say My win rate is "+percent_wins+"%."); + eventForce("say My switch rate is "+percent_switch+"%."); + } + genrand = genrand % 3; + if(genrand == 1) { firstchoice = "red"; fred++; } + if(genrand == 2) { firstchoice = "green"; fgreen++; } + if(genrand == 0) { firstchoice = "blue"; fblue++; } + eventForce("say I choose the "+firstchoice+" door"); + eventForce("choose "+firstchoice+" door"); + return 1; + } + + int choice2(string str){ + int genrand,which; + eventForce("say I am faced with choice 2."); + genrand = random(100); + which = genrand % 2; + if(which == 1) { + switches++; + response = "switch"; + } + else { + stays++; + response = "stay"; + } + + if(sscanf(str,"%sswitch to the %s %s",s1,s2,s3) > 0) { + secondchoice = s2; + } + + eventForce("say I decide to "+response+"."); + //eventForce("say gespielen is: "+playing); + return 1; + } + + int WinFun(string str){ + if(sscanf(str,"%smay enter the %s room %s",s1,s2,s3) > 0){ + if(s2 == "red") red_wins++; + if(s2 == "green") green_wins++; + if(s2 == "blue") blue_wins++; + wins++; + eventForce("say w00t! "+s2+" wins!"); + return 1; + } + return 0; + } + + int LoseFun(string str){ + string foo; + if(sscanf(str,"%smay enter the %s room%s",s1,s2,s3) > 0){ + if(response == "stay") foo = secondchoice; + } + eventForce("say "+firstchoice+" wins, I guess."); + if(firstchoice == "red") red_wins++; + else if(firstchoice == "green") green_wins++; + else if(firstchoice == "blue") blue_wins++; + else eventForce("say WTF? foo is "+firstchoice); + return 1; + } + + int eventPedestalParse(string str){ + if(sscanf(str,"%schoose one door from%s",s1,s2) > 0) choice1(); + if(sscanf(str,"%sI have opened%s",s1,s2) > 0) choice2(str); + if(sscanf(str,"%sminor glitch%s",s1,s2) > 0) playing = 0; + if(sscanf(str,"%sYou win%s",s1,s2) > 0) WinFun(str); + if(sscanf(str,"%sYOU LOOOOOSE%s",s1,s2) > 0) LoseFun(str); + return 1; + } + + + int eventFirstPass(string str){ + if(!str || str == "") return 0; + if(sscanf(str,"A voice from the pedestal%s",s1) > 0){ + eventPedestalParse(str); + return 1; + } + return 0; + } + + private void eventPrint(string str1, string str2); + + void init(){ + set_heart_beat(1); + SetNoClean(1); + } + void receive_message(string string1, string string2){ + //tell_object(find_player("testylus"),"CHARLY: "+string2); + eventFirstPass(string2); + } + varargs mixed eventHearTalk(object who, object target, int cls, string verb, + string msg, string lang) { + ww=who; + vv=verb; + mm=msg; + unguarded((: this_object()->receive_message("me",ww->GetName()+" "+vv+"s: "+mm) :)); + return; + } + int eventPrint(string msg, string msg_class){ + printvar=msg; + unguarded((: this_object()->receive_message("me again",printvar) :)); + } + + void heart_beat(){ + //eventForce("say playing is: "+playing); + if(playing && response != "" ) { + if(firstchoice != ""){ + //eventForce("say response is: "+response); + eventForce(response); + runs ++; + //playing = 0; + } + //else eventBeginPlay(); + playing = 0; + } + + if(!playing){ + //eventForce("say playing is zero, restarting."); + eventBeginPlay(); + } + } diff -c -r --new-file ds2.0r18/lib/domains/campus/npc/dummy.c ds2.0r28/lib/domains/campus/npc/dummy.c *** ds2.0r18/lib/domains/campus/npc/dummy.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/npc/dummy.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,83 ---- + #include + #include + inherit LIB_NPC; + static void create(){ + npc::create(); + SetKeyName("dummy"); + SetId( ({"dummy","mokujin"}) ); + SetShort("a training dummy"); + SetLong("This is a magical sparring partner. It is made of "+ + "logs, cut to the proportions of a human's "+ + "head, torso, and limbs. The logs are held "+ + "together by joints made of chains."); + SetLevel(10); + SetRace("human"); + SetClass("fighter"); + SetGender("male"); + SetMaxHealthPoints(9000); + SetHealthPoints(9000); + SetInventory(([ + //"realms/cratylus/armor/chainmail.c" : "wear chainmail", + //"realms/cratylus/obj/sharpsword.c" : "wield sword" + ])); + } + + varargs int eventReceiveDamage(object agent, int type, int x, int internal, mixed limbs) { + int hp, damage, damdiff; + string evidence, limb_string; + evidence = ""; + if(agent) evidence += "I receive damage from "+agent->GetKeyName(); + if(type) { + if(type == BLUNT ) evidence += ", damage type is BLUNT"; + if(type == BLADE ) evidence += ", damage type is BLADE"; + if(type == KNIFE ) evidence += ", damage type is KNIFE"; + if(type == WATER ) evidence += ", damage type is WATER"; + if(type == SHOCK ) evidence += ", damage type is SHOCK"; + if(type == COLD ) evidence += ", damage type is COLD"; + if(type == HEAT ) evidence += ", damage type is HEAT"; + if(type == GAS ) evidence += ", damage type is GAS"; + if(type == ACID ) evidence += ", damage type is ACID"; + if(type == MAGIC ) evidence += ", damage type is MAGIC"; + if(type == POISON ) evidence += ", damage type is POISON"; + if(type == DISEASE ) evidence += ", damage type is DISEASE"; + if(type == TRAUMA ) evidence += ", damage type is TRAUMA"; + //else evidence += ", damage type is indeterminate"; + } + if(x) evidence += ", raw damage is "+x; + if(internal) evidence += ", internal variable is "+internal; + if(limbs) { + if(stringp(limbs)) limb_string = limbs; + else if(arrayp(limbs)) { + if(stringp(limbs[0])) limb_string = implode(limbs,", "); + else if(objectp(limbs[0])){ + foreach(object limb in limbs){ + limb_string += limb->GetKeyName()+", "; + } + } + } + } + else limb_string = ", and I can't tell where I'm hit. "; + if(limbs) { + //limb_string += ". limbs data type is "+typeof(limbs)+" "; + evidence += ", body part(s) affected: "; + evidence += limb_string + "."; + } + eventForce("say "+evidence); + hp = GetHealthPoints(); + + if(!agent) agent = this_object(); + if(!type) type = 0; + if(!x) x = 0; + if(!internal) internal = 0; + if(!limbs) limbs = ""; + + ::eventReceiveDamage(agent, type, x, internal, limbs); + + damage = GetHealthPoints(); + damdiff = hp - damage; + eventForce("say actual damage done: "+damdiff); + AddHealthPoints(damdiff+1); + } + + + diff -c -r --new-file ds2.0r18/lib/domains/campus/npc/gloria.c ds2.0r28/lib/domains/campus/npc/gloria.c *** ds2.0r18/lib/domains/campus/npc/gloria.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/npc/gloria.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,35 ---- + #include + #include + + inherit LIB_BARKEEP; + + static void create() { + barkeep::create(); + SetKeyName("gloria"); + SetId(({"woman","worker","gloria","lady","lunch lady"})); + SetShort("Gloria, the lunch lady"); + SetLong("Gloria is a short, tired-looking woman getting along in "+ + "her years. She doesn't seem very happy...in fact, she looks downright "+ + "grumpy. Maybe if you ask her, she'll sell you something on the menu. Then "+ + "again, maybe not."); + SetInventory(([ + "/domains/campus/armor/collar" : "wear collar on neck", + "/domains/campus/obj/spam" : 1, + "/domains/campus/armor/foodsmock" : "wear smock", + ])); + SetMenuItems(([ + ({ "sandwich", "ham sandwich" }) : "/domains/campus/meals/ham_sand", + ({ "burger", "hamburger" }) : "/domains/campus/meals/burger", + ({ "salad", "salad of the day" }) : "/domains/campus/meals/salad", + ({ "milk", "carton of milk" }) : "/domains/campus/meals/milk", + ({ "gatorade", "sports drink" }) : "/domains/campus/meals/gator", + ])); + SetLevel(1); + SetRace("human"); + SetSkill("bargaining", 1); + SetGender("female"); + SetLocalCurrency("dollars"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/npc/hans.c ds2.0r28/lib/domains/campus/npc/hans.c *** ds2.0r18/lib/domains/campus/npc/hans.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/npc/hans.c Wed Jul 5 19:58:19 2006 *************** *** 0 **** --- 1,62 ---- + #include + + inherit LIB_SENTIENT; + + int TalkFunc(){ + int rand1; + string thing1, thing2, thing3, thing4, thing5; + + rand1 = random(5); + + thing1 = "Sprechen Sie Deutsch?"; + thing2 = "Vielleicht soll ich hilfe suchen."; + thing3 = "Sind Sie sicher?"; + thing4 = "Bitte sprechen sie doch ein bisschen langsamer."; + thing5 = "Was bedeutet das?"; + + switch(rand1){ + case 1 : eventForce("say "+thing1);break; + case 2 : eventForce("say "+thing2);break; + case 3 : eventForce("say "+thing3);break; + case 4 : eventForce("say "+thing4);break; + case 5 : eventForce("say "+thing5);break; + default : eventForce("shrug"); + } + } + int AnswerFunc(){ + int rand2; + string answer1, answer2, answer3, answer4, answer5; + + rand2 = random(5); + + answer1 = "Das weiss ich nicht."; + answer2 = "Jein?"; + answer3 = "Ich spreche Englisch wirklich nicht so gut."; + answer4 = "Es ist mir egal."; + answer5 = "Ach."; + + switch(rand2){ + case 1 : eventForce("say "+answer1);break; + case 2 : eventForce("say "+answer2);break; + case 3 : eventForce("say "+answer3);break; + case 4 : eventForce("say "+answer4);break; + case 5 : eventForce("say "+answer5);break; + default : eventForce("shake"); + } + } + static void create() { + sentient::create(); + SetKeyName("hans"); + SetId(({"hans"})); + SetShort("Hans"); + SetLong("Hans is a foreign exchange student from Germany."); + SetLevel(5); + SetRace("human"); + SetGender("male"); + SetNoClean(1); + AddTalkResponse(" ", (: TalkFunc :)); + AddTalkResponse("?", (: AnswerFunc :)); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/npc/jennybot.c ds2.0r28/lib/domains/campus/npc/jennybot.c *** ds2.0r18/lib/domains/campus/npc/jennybot.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/npc/jennybot.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,265 ---- + #include + inherit LIB_BOT; + + object player, bot, ob, noobster; + string name, watchline; + int count, active, tip, tipnumber, current_tip, hb, mooch, greeting, greetwait; + int deactivate_bot(string str); + string *watchlist; + + static void create(){ + AddSave(({ "players" }) ); + ::create(); + SetKeyName("jennybot"); + SetId(({"guide","guidebot","fembot","bot","jennifer","android","jenny","robot","woman","lady"})); + SetAdjectives(({"orientation","young","female","polite","pretty","guide","newbie","simple","extremely"})); + SetGender("female"); + SetShort("a polite young woman"); + SetLong("On closer inspection, this attractive "+ + "young lady is no lady at all...she's an android! "+ + "She appears to be totally motionless and frozen "+ + "in place, with a friendly smile. Perhaps you "+ + "can make her do something by typing: activate bot "); + SetInventory(([ + "/domains/campus/armor/pillbox_hat" : "wear hat", + "/domains/campus/armor/wglove_r" : "wear white right glove", + "/domains/campus/armor/wglove_l" : "wear white left glove", + "/domains/campus/armor/necklace" : "wear necklace on neck", + "/domains/campus/armor/bluedress" : "wear dress", + ])); + SetMelee(1); + SetLevel(99); + SetRace("android"); + SetAction(1, ({ + "Jenny straightens her hair.", + "Jenny the guide bot touches up her rouge a bit.", + "Jenny smiles."})); + AddCommandResponse("shutdown", (: deactivate_bot :)); + AddCommandResponse("shut down", (: deactivate_bot :) ); + AddCommandResponse("shut up", (: deactivate_bot :)); + AddCommandResponse("go away", (: deactivate_bot :) ); + set_heart_beat(1); + ob=this_object(); + count=210; + tip=0; + tipnumber = 16; + greeting = 0; + greetwait = 0; + } + + varargs int eventGreet(string newbie){ + object noob; + string guy,prespiel,spiel; + if((!newbie || newbie == "") && !noobster){ + return 0; + } + if(!newbie || newbie == "") newbie = noobster->GetKeyName(); + if(newbie && newbie != "there") noob = find_player(newbie); + if(newbie && newbie != "there") guy = noob->GetName(); + else guy = "there"; + tell_room(environment(this_object()),"The polite young "+ + "lady springs to life!\n"); + //spiel = "%^BOLD%^CYAN%^ Hello, "+noob->GetName()+"! "+ + prespiel = "Jennybot says, \"%^BOLD%^CYAN%^ Hello, "+guy; + spiel = read_file("/domains/campus/txt/jenny/spiel.txt"); + tell_room(environment(this_object()),prespiel+spiel); + tell_room(environment(this_object()),"\n\t%^RED%^activate bot%^RESET%^\n"); + tell_room(environment(this_object()),"The polite young "+ + "woman becomes totally motionless again."); + noob->SetProperty("greeted",1); + return 1; + } + + int eventCheckNoob(){ + mixed tmp; + object array people; + people=(get_livings(environment(this_object()),1)); + if(sizeof(people)){ + foreach(object dude in people){ + int greeted; + greeted = dude->GetProperty("greeted"); + if(!greeted && dude->GetLevel() < 2 ) { + greeting = 1; + noobster = dude; + } + } + } + return 1; + } + + void init(){ + ::init(); + add_action("activate_bot","activate"); + add_action("deactivate_bot","deactivate"); + add_action("next_tip","next"); + add_action("get_p","gp"); + eventCheckNoob(); + } + + int next_tip(string str){ + if(!str) return; + if(str=="") return; + if(str="tip"){ + if(active != 1) { write("Jennybot is not active."); return 1; } + if(tip == tipnumber) ob->eventForce("say Sorry. No more tips."); + else { + this_object()->eventDoTip(tip); + } + return 1; + } + } + int refreshlist(){ + string playername; + playername = this_player()->GetName(); + watchlist=explode(read_file("/domains/campus/txt/moochers.txt"),":"); + if(member_array(playername,watchlist) != -1) { + mooch = 1; + return 1; + } + watchlist = ({ playername }) + watchlist; + watchline = implode(watchlist,":"); + unguarded( (: write_file("/domains/campus/txt/moochers.txt",watchline,1) :) ); + return 1; + } + int deactivate_bot(string str){ + if(!str) return 0; + //if(str != "bot") return 0; + if(member_array(str, GetId()) == -1) return 0; + if( active == 0 ){ + write("Jennybot is already inactive."); + } + //set_heart_beat(0); + tip = 0; + if( active != 0) { + tell_room(this_object(),"Jenny nods and becomes motionless again, "+ + "her expression now fixed and staring out into "+ + "space."); + } + active=0; + return 1; + } + int activate_bot(string str){ + player=this_player(); + name=this_player()->GetName(); + if(!str) return 0; + //if(str != "bot") return 0; + if(member_array(str, GetId()) == -1) return 0; + if(active==1){ + write("Jennybot has already been activated."); + return 1; + } + refreshlist(); + active=1; + hb=0; + tip=1; + //set_heart_beat(1); + write("The female android comes to life! She "+ + "smiles at you and straightens her dress."); + ob->eventForce("say Hello, "+name+"! I'm Jenny, the LPC University "+ + "newbie guide bot. I'm an extremely simple android, so "+ + "please don't expect a lot of interactivity."); + ob->eventForce("smile "+name); + ob->eventForce("say I'm here to give you a few "+ + "tips. To deactivate me, simply "+ + "type: deactivate bot.\n"+ + "To jump to the next tip, type: next tip"); + return 1; + } + int eventAct4(){ + if(!new("/domains/campus/obj/list")->eventMove(this_object())){ + tell_room(environment(this_object()),"Oops! There's a bug, "+ + "and I don't have a list for you. Let's pretend I gave you "+ + "one and move on. Please email Cratylus about this, though."); + return 1; + } + if(player && environment(this_object()) == environment(player)) { + eventForce("give list to "+player->GetName()); + } + return 1; + } + int eventAct6(){ + if(!new("/domains/campus/obj/map")->eventMove(this_object())){ + tell_room(environment(this_object()),"Oops! There's a bug, "+ + "and I don't have a map for you. Let's pretend I gave you "+ + "one and move on. Please email Cratylus about this, though."); + return 1; + } + if(player && environment(this_object()) == environment(player)) { + eventForce("give map to "+player->GetName()); + } + return 1; + } + int eventAct8(){ + if(mooch == 1 || !new("/domains/campus/armor/newbie_cap")->eventMove(this_object())){ + tell_room(environment(this_object()),"Oops! There's a bug, "+ + "and I don't have a hat for you. Let's pretend I gave you "+ + "one and move on. Please email Cratylus about this, though."); + } + if(mooch == 1 || !new("/domains/campus/obj/squirtbag")->eventMove(this_object())){ + tell_room(environment(this_object()),"Oops! There's a bug, "+ + "and I don't have a bag for you. Let's pretend I gave you "+ + "one and move on. Please email Cratylus about this, though."); + } + if(player && environment(this_object()) == environment(player)) { + eventForce("give cap to "+player->GetName()); + } + if(player && environment(this_object()) == environment(player)) { + eventForce("give bag to "+player->GetName()); + } + return 1; + } + int eventAct9(){ + eventForce("smile "+player->GetName()); + if(!new("/domains/campus/meals/badapple")->eventMove(this_object())){ + tell_room(environment(this_object()),"Oops! There's a bug, "+ + "and I don't have a rotten apple for you. Let's pretend I gave you "+ + "one and move on. Please email Cratylus about this, though."); + } + if(!new("/domains/campus/meals/apple")->eventMove(this_object())){ + tell_room(environment(this_object()),"Oops! There's a bug, "+ + "and I don't have an apple for you. Let's pretend I gave you "+ + "one and move on. Please email Cratylus about this, though."); + } + if(player && environment(this_object()) == environment(player)) { + eventForce("give first apple to "+player->GetName()); + eventForce("give my apple to "+player->GetName()); + return 1; + } + } + int eventAct11(){ + eventForce("smirk"); + return 1; + } + int eventSwitch(int arg){ + switch(arg){ + case 4:eventAct4();break; + case 6:eventAct6();break; + case 8:eventAct8();break; + case 9:eventAct9();break; + case 11:eventAct11();break; + default:write("");break; + return 1; + } + } + int eventDoTip(int i){ + tip++; + hb=0; + eventSwitch(i); + if(tip > tipnumber) { + this_object()->deactivate_bot("bot"); + return 1; + } + tell_room(environment(this_object()),read_file("/domains/campus/txt/jenny/"+i+".txt")); + + } + void heart_beat(){ + hb++; + if(greeting) greetwait++; + if(noobster && greetwait > 0){ + eventGreet(); + noobster = 0; + greetwait = 0; + greeting = 0; + } + if(hb > 20 && active) eventDoTip(tip); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/npc/kim.c ds2.0r28/lib/domains/campus/npc/kim.c *** ds2.0r18/lib/domains/campus/npc/kim.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/npc/kim.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,36 ---- + #include + #include + + inherit LIB_VENDOR; + + static void create() { + vendor::create(); + SetKeyName("kim"); + SetId(({"vendor","kim","Kim","kimmie","employee","bookstore employee"})); + SetShort("Kim, the bookstore employee"); + SetLong("Kim is a twenty-something college student trying to "+ + "make enough money to pay for school and feed herself. She seems "+ + "friendly enough, and her bright blue eyes seem to smile at you "+ + "on their own. You could probably buy something from her here, "+ + "since that's her job, or she might even buy something from you, if "+ + "she thinks it's worth something. Don't try to buy anything if you don't "+ + "have enough money, though...she looks like she can mean business when "+ + "she has to."); + SetInventory(([ + "/domains/campus/armor/collar" : "wear collar on neck", + "/domains/campus/armor/jeans" : "wear jeans", + "/domains/campus/armor/shirt" : "wear shirt", + ])); + SetLevel(1); + SetRace("human"); + SetSkill("bargaining", 1); + SetGender("female"); + SetLocalCurrency("dollars"); + SetStorageRoom("/domains/campus/room/bookstore2"); + SetMaxItems(10000); + SetVendorType(VT_TREASURE | VT_ARMOR); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/npc/rat.c ds2.0r28/lib/domains/campus/npc/rat.c *** ds2.0r18/lib/domains/campus/npc/rat.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/npc/rat.c Wed Jul 5 19:58:19 2006 *************** *** 0 **** --- 1,25 ---- + #include + + inherit LIB_SENTIENT; + + static void create() { + sentient::create(); + SetKeyName("a mangy little rat"); + SetId(({"rat","dirty rat"})); + SetShort("a rat"); + SetLong("A scruffy little dirty rat."); + SetLevel(1); + SetMaxHealthPoints(5); + SetRace("rodent"); + SetGender("male"); + SetWanderSpeed(1); + SetMessage("come","$N scurries in."); + SetMessage("leave","$N scurries $D."); + SetAction(5, ({ + "The rat squeaks.", "You hear a rat scuttling about.", + "A scruffy little rat brushes against your leg.", + "You hear tiny munching sounds."})); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/npc/seth.c ds2.0r28/lib/domains/campus/npc/seth.c *** ds2.0r18/lib/domains/campus/npc/seth.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/npc/seth.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,57 ---- + #include + + inherit LIB_SENTIENT; + + int give_it(string str); + static void create() { + sentient::create(); + SetKeyName("Dr. Seth Brundle"); + SetId(({"seth","brundle","Dr. Brundle","Seth","Brundle","seth brundle", "Seth Brundle"})); + SetShort("Dr. Seth Brundle"); + SetLong("Dr. Brundle is a tall, lanky scientist with an olive complexion "+ + "and dark, piercing eyes. He seems extremely upset, and hard at work. He looks "+ + "rumpled, wired, and really nervous."); + SetInventory(([ + "/domains/campus/obj/omni" : 1, + "/domains/campus/obj/labkey" : 1, + ])); + SetLevel(5); + SetUnique(1); + SetRace("human"); + SetGender("male"); + AddCommandResponse("give", (: give_it :)); + AddCommandResponse("omni", (: give_it :) ); + SetAction(25, ({ + "Seth Brundle runs a nervous hand through his hair.", + "Dr. Brundle twitches momentarily.", "Dr. Seth Brundle ponders.", + "Seth thinks.", "Dr. Seth Brundle thinks carefully.", + "Dr. Seth Brundle says, \"You won't be able to get back without an omni.\"", + "Dr. Seth Brundle peers nervously at the portal."})); + } + void reset(){ + if(!present("omni",this_object())){ + new("/domains/campus/obj/omni")->eventMove(this_object()); + return; + } + } + int give_it(string str){ + if(!present("omni",this_object())){ + this_object()->eventForce("say I'm afraid I don't have anything to give"); + this_object()->eventForce("ponder"); + return 1; + } + if(!present("omni",this_player())){ + write("Dr. Brundle looks at you skeptically for a moment.\n"); + say("Dr. Brundle looks at "+this_player()->GetName()+" skeptically for a moment.\n"); + this_object()->eventForce("give first omni to "+lower_case(this_player()->GetName()) ); + this_object()->eventForce("say Just try not to get killed, "+this_player()->GetName()); + this_object()->eventForce("sigh"); + return 1; + } + this_object()->eventForce("snort"); + this_object()->eventForce("say You've already got one, "+this_player()->GetName()); + return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/npc/tim.c ds2.0r28/lib/domains/campus/npc/tim.c *** ds2.0r18/lib/domains/campus/npc/tim.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/npc/tim.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,50 ---- + #include + + inherit LIB_SENTIENT; + + int DoSomething(){ + int rand; + string thing1, thing2, thing3, thing4, thing5; + string thing6, thing7, thing8, thing9, thing10; + + rand = random(10); + + thing1 = "I think the campus is still under serious construction."; + thing2 = "I wonder when the classroom building will open."; + thing3 = "There's a village up north that's still being built, I heard."; + thing4 = "Any travel north of here may be unsafe, you know."; + thing5 = "Oh man, I need to get that stuff I left in the building basement."; + thing6 = "Why won't Kim ever buy or sell weapons?"; + thing7 = "How am I supposed to leave campus if Kim won't sell me a weapon?"; + thing8 = "Maybe there's a shop in the village up north where you can buy whatever you need."; + thing9 = "I heard you can get in trouble with the dean if you climb the tree."; + thing10 = "Some dude told me \bree-yark\" is \"we surrender\" in \"Kobold\". Does that even make any sense?"; + + switch(rand){ + case 1 : eventForce("say "+thing1);break; + case 2 : eventForce("say "+thing2);break; + case 3 : eventForce("say "+thing3);break; + case 4 : eventForce("say "+thing4);break; + case 5 : eventForce("say "+thing5);break; + case 6 : eventForce("say "+thing6);break; + case 7 : eventForce("say "+thing7);break; + case 8 : eventForce("say "+thing8);break; + case 9 : eventForce("say "+thing9);break; + case 10 : eventForce("say "+thing10);break; + default : eventForce("smile"); + } + } + void create() { + sentient::create(); + SetKeyName("Tim"); + SetId(({"tim"})); + SetShort("Tim"); + SetLong("Tim is a student in the Virtual Campus."); + SetLevel(5); + SetRace("human"); + SetGender("male"); + SetAction(25, (: DoSomething :)); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/npc/wim.c ds2.0r28/lib/domains/campus/npc/wim.c *** ds2.0r18/lib/domains/campus/npc/wim.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/npc/wim.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,17 ---- + #include + + inherit LIB_SENTIENT; + + static void create() { + sentient::create(); + SetKeyName("Wim"); + SetId(({"wim"})); + SetShort("Wim"); + SetLong("Wim is a foreign exchange student from the Netherlands."); + SetLevel(5); + SetRace("human"); + SetGender("male"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/npc/yulia.c ds2.0r28/lib/domains/campus/npc/yulia.c *** ds2.0r18/lib/domains/campus/npc/yulia.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/npc/yulia.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,35 ---- + /* /domains/Praxis/npc/otik.c + * from Nightmare LPMud + * created by Descartes of Borg 950603 + */ + + #include + #include + + inherit LIB_VENDOR; + + static void create() { + ::create(); + SetKeyName("yulia"); + SetId( ({ "vendor","secretary","assistant","manager" }) ); + SetAdjectives( ({ "executive","medical","guild" }) ); + SetShort("Yulia, the clinic assistant"); + SetLevel(12); + SetLong("Yulia is typical of office assistants: she is a bit "+ + "arrogant, officious, and brusque; but she appears "+ + "to be a competent enough secretary. "+ + "She is the person you will buy a treatment slips "+ + "from. Read the list on the wall for the slips "+ + "available."); + SetGender("female"); + SetMorality(40); + SetRace("human"); + AddCurrency("dollars", random(100)); + SetProperty("no bump", 1); + SetLocalCurrency("dollars"); + SetStorageRoom("/domains/campus/room/healer2"); + SetMaxItems(10000); + SetVendorType(VT_HERB); + SetSkill("bargaining", 1); + + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/223clip.c ds2.0r28/lib/domains/campus/obj/223clip.c *** ds2.0r18/lib/domains/campus/obj/223clip.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/223clip.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,23 ---- + #include + #include + inherit "/lib/clip"; + + void create(){ + ::create(); + SetKeyName("223clip"); + SetId(({"clip","magazine"})); + SetAdjectives(({"223",".223","ammunition","rifle","caliber","ammo","ammunition"})); + SetShort("a .223 caliber rifle ammunition clip"); + SetLong("This is a spring-loaded ammunition clip for a .223 caliber "+ + "rifle. It will contain a maximum of thirty rounds."); + SetCaliber(223); + SetMaxAmmo(30); + SetAmmoType("nato"); + SetVendorType(VT_TREASURE); + SetInventory(([ + "/domains/campus/obj/223round" : 30, + ])); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/223round.c ds2.0r28/lib/domains/campus/obj/223round.c *** ds2.0r18/lib/domains/campus/obj/223round.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/223round.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,22 ---- + #include + #include + inherit "/lib/round"; + + void create(){ + ::create(); + SetKeyName("223round"); + SetId(({"round","bullet"})); + SetAdjectives(({".223","223","caliber","rifle","m16","M16","m-16","M-16"})); + SetShort("a .223 caliber rifle round"); + SetLong("This is a .223 caliber rifle round, probably for an M-16 assault rifle. "+ + "It is not very wide, but contains a large powder charge. It is doubtlessly a powerful "+ + "piece of ammunition. It has not been fired."); + SetCaliber(223); + SetRifleType("auto"); + SetPistolType("auto"); + SetAmmoType("nato"); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/357case.c ds2.0r28/lib/domains/campus/obj/357case.c *** ds2.0r18/lib/domains/campus/obj/357case.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/357case.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,31 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("cardboard case"); + SetAdjectives( ({"small", "cardboard", ".357 ammo", "ammo"}) ); + SetId( ({ "case" }) ); + SetShort("a small .357 ammo case"); + SetLong("A small cardboard case designed to carry .357 caliber amunition."); + SetMass(10); + SetDollarCost(1); + SetMaxCarry(12); + } + void CanReceive(object ob){ + ::CanReceive(); + if(ob->GetKeyName() != "357round") { + tell_object(this_player(),"This cardboard case is for .357 ammunition only."); + return; + } + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/357round.c ds2.0r28/lib/domains/campus/obj/357round.c *** ds2.0r18/lib/domains/campus/obj/357round.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/357round.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,20 ---- + #include + #include + inherit "/lib/round"; + + void create(){ + ::create(); + SetKeyName("357round"); + SetId(({"round","bullet"})); + SetAdjectives(({"357",".357","pistol"})); + SetShort("a .357 pistol round"); + SetLong("This is a .357 caliber revolver bullet. It has not been fired."); + SetCaliber(357); + SetPistolType("revolver"); + SetAmmoType("magnum"); + SetVendorType(VT_TREASURE); + SetMass(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/357shell.c ds2.0r28/lib/domains/campus/obj/357shell.c *** ds2.0r18/lib/domains/campus/obj/357shell.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/357shell.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,15 ---- + #include + #include + inherit "/lib/shell"; + void create(){ + ::create(); + SetKeyName("357shell"); + SetId(({"shell","casing","spent bullet"})); + SetAdjectives(({"357",".357","spent","magnum","shell"})); + SetShort("a .357 shell casing"); + SetLong("This is the spent casing of a .357 magnum bullet."); + SetCaliber(357); + SetPistolType("revolver"); + SetAmmoType("magnum"); + SetVendorType(VT_TREASURE); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/50round.c ds2.0r28/lib/domains/campus/obj/50round.c *** ds2.0r18/lib/domains/campus/obj/50round.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/50round.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,21 ---- + #include + #include + inherit "/lib/round"; + + void create(){ + ::create(); + SetKeyName("round"); + SetId(({"round","bullet"})); + SetAdjectives(({"50",".50","caliber","rifle"})); + SetShort("a .50 caliber rifle bullet"); + SetLong("This mammoth bullet is nearly five inches long. Anything this bad "+ + "boy hits is in for a rough time."); + SetCaliber(50); + SetRifleType("bolt"); + SetPistolType("bolt"); + SetAmmoType("bolt"); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/9mmclip.c ds2.0r28/lib/domains/campus/obj/9mmclip.c *** ds2.0r18/lib/domains/campus/obj/9mmclip.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/9mmclip.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,23 ---- + #include + #include + inherit "/lib/clip"; + + void create(){ + ::create(); + SetKeyName("9mmclip"); + SetId(({"clip","magazine"})); + SetAdjectives(({"9mm","ammunition","ammo","9 millimeter","pistol"})); + SetShort("a 9 millimeter pistol ammunition clip"); + SetLong("This is a slender, spring-loaded metal container designed "+ + "to feed a 9 millimeter pistol with bullets."); + SetMillimeter(9); + SetMaxAmmo(15); + SetAmmoType("acp"); + SetVendorType(VT_TREASURE); + SetInventory(([ + "/domains/campus/obj/round2" : 15 + ])); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/9mmround.c ds2.0r28/lib/domains/campus/obj/9mmround.c *** ds2.0r18/lib/domains/campus/obj/9mmround.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/9mmround.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,19 ---- + #include + #include + inherit "/lib/round"; + + void create(){ + ::create(); + SetKeyName("9mmround"); + SetId(({"round","bullet"})); + SetAdjectives(({"9 millimeter","9mm","pistol"})); + SetShort("a 9 millimeter pistol round"); + SetLong("This is a 9 millimeter pistol bullet. It has not been fired."); + SetMillimeter(9); + SetPistolType("auto"); + SetAmmoType("acp"); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/abox.c ds2.0r28/lib/domains/campus/obj/abox.c *** ds2.0r18/lib/domains/campus/obj/abox.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/abox.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,37 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("ammunition box"); + SetId(({"can","box"})); + SetAdjectives(({"metal","ammo","ammunition","large"})); + SetShort("an ammo box"); + SetLong("This is a large metal box containing various kinds "+ + "of ammunition. "); + SetMass(200); + SetDollarCost(50); + SetMaxCarry(5000); + SetCanClose(1); + SetClosed(0); + + SetInventory( ([ + "/domains/campus/obj/9mmclip": 10, + "/domains/campus/obj/223clip": 10, + "/domains/campus/obj/357case": 10 + ]) ); + + } + + void init(){ + ::init(); + } + + mixed CanGet(object ob) { return "The metal ammunition box does not budge.";} diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/apple.c ds2.0r28/lib/domains/campus/obj/apple.c *** ds2.0r18/lib/domains/campus/obj/apple.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/apple.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + inherit LIB_ITEM; + + void create(){ + ::create(); + SetKeyName("rotten apple"); + SetId( ({"apple","fruit"}) ); + SetAdjectives( ({"rotten","foul-smelling","dried-up","browned","brown"}) ); + SetShort("a rotten apple"); + SetLong("This is browned, foul-smelling, dried-up apple."); + SetMass(5); + SetDollarCost(0); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/backpack.c ds2.0r28/lib/domains/campus/obj/backpack.c *** ds2.0r18/lib/domains/campus/obj/backpack.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/backpack.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,40 ---- + #include + + #include + #include + inherit LIB_STORAGE; + inherit LIB_ARMOR; + + static void create() { + ::create(); + SetKeyName("backpack"); + SetId(({"bag","pack"})); + SetAdjectives(({"sturdy","green","olive","olive-green","od green","od-green"})); + SetShort("a sturdy, olive-green backpack"); + SetLong("This is a large, sturdy backpack made of some sort of " + "strong, canvas-like material. It appears suitable "+ + "for just about any adventure you'd find yourself in."); + SetInventory(([ + "/domains/campus/obj/match" : 3, + "/domains/campus/weap/sharpsword" : 1, + "/domains/campus/armor/chainmail" : 1, + "/domains/campus/meals/burger" : 3, + "/domains/campus/armor/helmet" : 1, + "/domains/campus/armor/shield" : 1, + "/domains/campus/obj/maglite" : 1, + "/domains/campus/armor/collar" : 1, + "/domains/campus/meals/wimp_ale" : 3, + "/domains/campus/obj/torch" : 1, + ])); + SetMass(100); + SetBaseCost("silver", 40); + SetCanClose(1); + SetClosed(0); + SetMaxCarry(500); + SetDamagePoints(100); + SetArmorType(A_VEST); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/backpack_civilian.c ds2.0r28/lib/domains/campus/obj/backpack_civilian.c *** ds2.0r18/lib/domains/campus/obj/backpack_civilian.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/backpack_civilian.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + #include + + #include + #include + inherit LIB_STORAGE; + inherit LIB_ARMOR; + + static void create() { + ::create(); + SetKeyName("backpack"); + SetId(({"bag","pack"})); + SetAdjectives(({"sturdy","green","olive","olive-green","od green","od-green"})); + SetShort("a sturdy, olive-green backpack"); + SetLong("This is a large, sturdy backpack made of some sort of " + "strong, canvas-like material. It appears suitable "+ + "for just about any adventure you'd find yourself in."); + SetMass(100); + SetBaseCost("silver", 40); + SetCanClose(1); + SetClosed(0); + SetMaxCarry(500); + SetDamagePoints(100); + SetArmorType(A_VEST); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/backpack_empty.c ds2.0r28/lib/domains/campus/obj/backpack_empty.c *** ds2.0r18/lib/domains/campus/obj/backpack_empty.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/backpack_empty.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + #include + + #include + #include + inherit LIB_STORAGE; + inherit LIB_ARMOR; + + static void create() { + ::create(); + SetKeyName("backpack"); + SetId(({"bag","pack"})); + SetAdjectives(({"sturdy","green","olive","olive-green","od green","od-green"})); + SetShort("a sturdy, olive-green backpack"); + SetLong("This is a large, sturdy backpack made of some sort of " + "strong, canvas-like material. It appears suitable "+ + "for just about any adventure you'd find yourself in."); + SetMass(100); + SetBaseCost("silver", 40); + SetCanClose(1); + SetClosed(0); + SetMaxCarry(500); + SetDamagePoints(100); + SetArmorType(A_VEST); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/bag.c ds2.0r28/lib/domains/campus/obj/bag.c *** ds2.0r18/lib/domains/campus/obj/bag.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/bag.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + + void create() { + ::create(); + SetKeyName("bag"); + SetId( ({ "bag" }) ); + SetAdjectives( ({ "small", "cloth", "a" }) ); + SetShort("a small cloth bag"); + SetLong("It is a simple cloth bag used to hold things. It has a cute Virtual Campus "+ + "logo on it."); + SetMass(274); + SetDollarCost(1); + SetMaxCarry(50); + // SetPreventPut("You cannot put this in there!"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/bbucket.c ds2.0r28/lib/domains/campus/obj/bbucket.c *** ds2.0r18/lib/domains/campus/obj/bbucket.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/bbucket.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,35 ---- + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("bin"); + SetId(({"bin","can","dustbin","trash","rubbish"})); + SetAdjectives(({"metal","small","blue","recycling","trash","garbage","dust"})); + SetShort("a recycling bin"); + SetLong("This is a blue trash can, marked with "+ + "the letters \"/dev/null\"."); + SetMass(274); + SetBaseCost("silver",50); + SetMaxCarry(999999); + } + + int tidy_up(){ + object *inv; + inv = all_inventory(this_object()); + foreach(object thing in inv){ + if(thing) thing->eventMove(load_object("/domains/town/room/furnace")); + } + return 1; + } + + int eventReceiveObject(object ob){ + write("You make a deposit into the the recycling bin.\n"); + call_out((: tidy_up :),1); + return 1; + } + mixed CanGet(object ob) { return "The bucket does not budge.";} + + void init(){ + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/bench.c ds2.0r28/lib/domains/campus/obj/bench.c *** ds2.0r18/lib/domains/campus/obj/bench.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/bench.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/campus/etc/stool.c + * From the Nightmare V Object Library + * An example of a chair object + * Created by Descartes of Borg 961221 + */ + + #include + + inherit LIB_CHAIR; + + + static void create() { + chair::create(); + SetKeyName("bench"); + SetId("bench"); + SetAdjectives("wooden"); + SetShort("a wooden bench"); + SetLong("This is a typical wooden bench, the sort you might "+ + "see in a park. It appears designed for sitting on."); + SetMass(1500); + SetDollarCost(15); + SetMaxSitters(3); + } + mixed CanGet(object ob) { return "The bench does not budge.";} + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/bluebox.c ds2.0r28/lib/domains/campus/obj/bluebox.c *** ds2.0r18/lib/domains/campus/obj/bluebox.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/bluebox.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("bluebox"); + SetId( ({ "box","bluebox", "bbox" }) ); + SetAdjectives( ({ "small", "plastic","blue", "a" }) ); + SetShort("a small, %^BLUE%^blue%^RESET%^ plastic box"); + SetLong("It is a simple plastic box used to hold things. It is %^BLUE%^blue%^RESET%^, and it has a cute Virtual Campus "+ + "logo on it."); + SetMass(274); + SetDollarCost(1); + SetMaxCarry(100); + SetCanClose(1); + SetClosed(0); + // SetPreventPut("You cannot put this in there!"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/box.c ds2.0r28/lib/domains/campus/obj/box.c *** ds2.0r18/lib/domains/campus/obj/box.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/box.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,26 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("box"); + SetId( ({ "box" }) ); + SetAdjectives( ({ "small", "plastic","green", "a" }) ); + SetShort("a small plastic box"); + SetLong("It is a simple plastic box used to hold things. It is green, and it has a cute Virtual Campus "+ + "logo on it."); + SetMass(274); + SetDollarCost(1); + SetMaxCarry(10); + // SetPreventPut("You cannot put this in there!"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/chair.c ds2.0r28/lib/domains/campus/obj/chair.c *** ds2.0r18/lib/domains/campus/obj/chair.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/chair.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,43 ---- + #include + + inherit LIB_CHAIR; + + + static void create() { + chair::create(); + SetKeyName("chair"); + SetId("chair"); + SetAdjectives( ({ "swivel", "small", "black" }) ); + SetShort("a swivel chair"); + SetLong("This is a small swivel chair, with tasteful and understated "+ + "black covers."); + SetMass(1500); + SetDollarCost(15); + SetMaxSitters(1); + } + void init(){ + ::init(); + add_action("swivel","swivel"); + } + int swivel(string str){ + int hit,i; + object *dupes; + dupes = get_dupes(this_object(),environment(this_object()) ); + if(!str || str =="" || str == "in chair" || str == "in the chair"){ + hit = 42; + for(i=0;iGetSitters()) != -1) hit = 7; + if( member_array(this_player(),this_object()->GetSitters()) != -1) hit = 7; + } + if( hit == 7) { + write("You swivel around in your swivel chair! Whee!"); + say(this_player()->GetName()+" swivels around in "+possessive(this_player())+" "+ + "swivel chair, yelling \"WHEEEE!!!\""); + return 1; + } + else { write("You are not sitting in a swivel chair."); } + } + if(hit == 42) return 1; + else return 0; + } + mixed CanGet(object ob) { return "The chair does not budge.";} diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/clip.c ds2.0r28/lib/domains/campus/obj/clip.c *** ds2.0r18/lib/domains/campus/obj/clip.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/clip.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,24 ---- + #include + #include + inherit "/lib/clip"; + + void create(){ + ::create(); + SetKeyName("9mmclip"); + SetId(({"clip","magazine"})); + SetAdjectives(({"9mm","ammunition","ammo","9 millimeter","pistol"})); + SetShort("a 9 millimeter pistol ammunition clip"); + SetLong("This is a slender, spring-loaded metal container designed "+ + "to feed a 9 millimeter pistol with bullets."); + SetMillimeter(9); + SetMaxAmmo(15); + SetAmmoType("acp"); + SetAmmoType("acp"); + SetVendorType(VT_TREASURE); + SetInventory(([ + "/domains/campus/obj/round2" : 15, + ])); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/dcell.c ds2.0r28/lib/domains/campus/obj/dcell.c *** ds2.0r18/lib/domains/campus/obj/dcell.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/dcell.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,24 ---- + #include + #include + inherit "/lib/battery"; + + void create(){ + ::create(); + SetKeyName("d-cell"); + SetId( ({"cell","battery"}) ); + SetAdjectives( ({"d","generic","D","D-cell"}) ); + SetShort("a D cell battery"); + SetLong("This is a typical D-cell battery, of a generic brand."); + SetMass(2); + SetDollarCost(2); + SetVendorType(VT_TREASURE); + SetPowerType("DC"); + SetCellType("D"); + SetCharge(60); + SetRechargeable(0); + SetDrainable(1); + SetDrainRate(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/dcell_crappy.c ds2.0r28/lib/domains/campus/obj/dcell_crappy.c *** ds2.0r18/lib/domains/campus/obj/dcell_crappy.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/dcell_crappy.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,24 ---- + #include + #include + inherit "/lib/battery"; + + void create(){ + ::create(); + SetKeyName("d-cell"); + SetId( ({"cell","battery"}) ); + SetAdjectives( ({"d","generic","D","D-cell"}) ); + SetShort("a D cell battery"); + SetLong("This is a typical D-cell battery, of a generic brand."); + SetMass(2); + SetDollarCost(2); + SetVendorType(VT_TREASURE); + SetPowerType("DC"); + SetCellType("D"); + SetCharge(60); + SetRechargeable(0); + SetDrainable(1); + SetDrainRate(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/dcell_good.c ds2.0r28/lib/domains/campus/obj/dcell_good.c *** ds2.0r18/lib/domains/campus/obj/dcell_good.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/dcell_good.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,24 ---- + #include + #include + inherit "/lib/battery"; + + void create(){ + ::create(); + SetKeyName("d-cell"); + SetId( ({"cell","battery"}) ); + SetAdjectives( ({"d","generic","D","D-cell"}) ); + SetShort("a D cell battery"); + SetLong("This is a typical D-cell battery, of a generic brand."); + SetMass(2); + SetDollarCost(2); + SetVendorType(VT_TREASURE); + SetPowerType("DC"); + SetCellType("D"); + SetCharge(10000); + SetRechargeable(0); + SetDrainable(1); + SetDrainRate(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/dcell_std.c ds2.0r28/lib/domains/campus/obj/dcell_std.c *** ds2.0r18/lib/domains/campus/obj/dcell_std.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/dcell_std.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,24 ---- + #include + #include + inherit "/lib/battery"; + + void create(){ + ::create(); + SetKeyName("d-cell"); + SetId( ({"cell","battery"}) ); + SetAdjectives( ({"d","generic","D","D-cell"}) ); + SetShort("a D cell battery"); + SetLong("This is a typical D-cell battery, of a generic brand."); + SetMass(2); + SetDollarCost(2); + SetVendorType(VT_TREASURE); + SetPowerType("DC"); + SetCellType("D"); + SetCharge(1000); + SetRechargeable(0); + SetDrainable(1); + SetDrainRate(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/debris.c ds2.0r28/lib/domains/campus/obj/debris.c *** ds2.0r18/lib/domains/campus/obj/debris.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/debris.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,45 ---- + #include + #include + inherit LIB_ITEM; + + int ringfound; + string SearchCrap(){ + string result; + if(!ringfound){ + result="Rummaging through the disgusting pile, you "+ + "discover a beautiful gold ring mixed in with the "+ + "crap."; + say(this_player()->GetName()+" searches the pile of debris "+ + "and seems to have found something of value."); + new("/domains/campus/armor/ring")->eventMove(this_player()); + ringfound=1; + return result; + } + + result="You rummage through the disgusting pile "+ + "and find nothing."; + say(this_player()->GetName()+" searches the pile of debris "+ + "with no results."); + return result; + } + void create(){ + ::create(); + SetKeyName("debris"); + SetId( ({"pile","debris","crap","crud"}) ); + SetAdjectives( ({"disgusting","pile of","smelly"}) ); + SetShort("a pile of debris"); + SetLong("This is a smelly, disgusting pile of crud "+ + "that has accumulated from the running stream of "+ + "sewage here. "); + SetMass(20); + SetDollarCost(0); + SetVendorType(VT_TREASURE); + SetSearch( (: SearchCrap :) ); + ringfound=0; + + } + mixed CanGet(object ob) { return "The pile of debris isn't at all portable.";} + string GetItemCondition() { return "";} + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/flashlight.c ds2.0r28/lib/domains/campus/obj/flashlight.c *** ds2.0r18/lib/domains/campus/obj/flashlight.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/flashlight.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,14 ---- + #include + #include + inherit LIB_ITEM; + void create(){ + ::create(); + SetKeyName("generic thing"); + SetId( ({"thing","item","thang","dingus"}) ); + SetAdjectives( ({"generic","sample","template"}) ); + SetShort("a generic thing"); + SetLong("This is an object of indeterminate nature and proportions."); + SetMass(20); + SetDollarCost(10); + SetVendorType(VT_TREASURE); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/greenbox.c ds2.0r28/lib/domains/campus/obj/greenbox.c *** ds2.0r18/lib/domains/campus/obj/greenbox.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/greenbox.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("greenbox"); + SetId( ({ "box","greenbox","gbox" }) ); + SetAdjectives( ({ "small", "plastic","green", "a" }) ); + SetShort("a small, %^GREEN%^green%^RESET%^ plastic box"); + SetLong("It is a simple plastic box used to hold things. It is %^GREEN%^green%^RESET%^, and it has a cute Virtual Campus "+ + "logo on it."); + SetMass(274); + SetDollarCost(1); + SetMaxCarry(100); + SetCanClose(1); + SetClosed(0); + // SetPreventPut("You cannot put this in there!"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/key.c ds2.0r28/lib/domains/campus/obj/key.c *** ds2.0r18/lib/domains/campus/obj/key.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/key.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,24 ---- + /* /domains/Midian/etc/key.c + * from the Nightmare Object Library + * created by Descartes of Borg 960512 + */ + + #include + + inherit LIB_ITEM; + + + static void create() { + item::create(); + SetKeyName("key"); + SetId( ({ "key", "special_key_id" }) ); + SetAdjectives( ({ "brilliant", "silver" }) ); + SetShort("a silver key"); + SetLong("It is a brilliant silver key with no markings."); + SetMass(50); + SetDollarCost(15); + SetDisableChance(90); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/key1.c ds2.0r28/lib/domains/campus/obj/key1.c *** ds2.0r18/lib/domains/campus/obj/key1.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/key1.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,24 ---- + /* /domains/Midian/etc/key.c + * from the Nightmare Object Library + * created by Descartes of Borg 960512 + */ + + #include + + inherit LIB_ITEM; + + + static void create() { + item::create(); + SetKeyName("key"); + SetId(({"key","locker_key_1"})); + SetAdjectives(({"locker","small",})); + SetShort("a small key"); + SetLong("This is a small key, perhaps to a padlock or locker."); + SetMass(1); + SetDollarCost(2); + SetDisableChance(90); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/labkey.c ds2.0r28/lib/domains/campus/obj/labkey.c *** ds2.0r18/lib/domains/campus/obj/labkey.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/labkey.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + inherit LIB_ITEM; + + void create(){ + ::create(); + SetKeyName("lab key"); + SetAdjectives( ({"lab", "probability lab"}) ); + SetId( ({"prob_door_key", "key", "labkey"}) ); + SetShort("lab key"); + SetLong("This is a key labeled 'probability lab'."); + SetMass(20); + SetBaseCost("silver",10); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/lever.c ds2.0r28/lib/domains/campus/obj/lever.c *** ds2.0r18/lib/domains/campus/obj/lever.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/lever.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + inherit LIB_ITEM; + + void create(){ + ::create(); + SetKeyName("hand grenade spoon"); + SetId(({"lever","spoon"})); + SetAdjectives(({"grenade","hand grenade","metal","small"})); + SetShort("a small metal lever"); + SetLong("This is the fuse lever, or spoon, for a hand grenade."); + SetMass(1); + SetDollarCost(0); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/list.c ds2.0r28/lib/domains/campus/obj/list.c *** ds2.0r18/lib/domains/campus/obj/list.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/list.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,24 ---- + #include + #include + inherit LIB_ITEM; + inherit LIB_READ; + + int TestFunc(){ + this_player()->eventPage("/domains/campus/txt/list.txt","system"); + return 1; + } + + + void create(){ + ::create(); + SetKeyName("list"); + SetId(({"paper","slip"})); + SetAdjectives(({"small"})); + SetShort("a list"); + SetLong("A list on a slip of paper. Try: read list \n"); + SetMass(0); + SetDollarCost(0); + SetVendorType(VT_TREASURE); + SetRead((: TestFunc :)); + } + diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/locker.c ds2.0r28/lib/domains/campus/obj/locker.c *** ds2.0r18/lib/domains/campus/obj/locker.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/locker.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,37 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + + void create() { + ::create(); + SetKeyName("locker"); + SetId(({"locker"})); + SetAdjectives(({"metal","tall","school"})); + SetShort("a tall metal locker"); + SetLong("This is a large school locker, the kind one might find in any of "+ + "thousands of schools around the world."); + SetMass(274); + SetDollarCost(50); + SetMaxCarry(500); + SetInventory(([ + "/domains/campus/obj/bag": 1, + "/domains/campus/obj/dcell_std": 4, + "/domains/campus/weap/waterpistol" : 1 + ])); + SetCanClose(1); + SetClosed(1); + SetCanLock(1); + SetLocked(1); + SetKey("locker_key_1"); + } + mixed CanGet(object ob) { return "The locker does not budge.";} + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/magbox.c ds2.0r28/lib/domains/campus/obj/magbox.c *** ds2.0r18/lib/domains/campus/obj/magbox.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/magbox.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("magbox"); + SetId( ({ "box","magentabox" , "magbox" , "mbox" }) ); + SetAdjectives( ({ "small", "plastic","magenta", "a" }) ); + SetShort("a small, %^MAGENTA%^magenta%^RESET%^ plastic box"); + SetLong("It is a simple plastic box used to hold things. It is %^MAGENTA%^magenta%^RESET%^, and it has a cute Virtual Campus "+ + "logo on it."); + SetMass(274); + SetDollarCost(1); + SetMaxCarry(100); + SetCanClose(1); + SetClosed(0); + // SetPreventPut("You cannot put this in there!"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/maglite.c ds2.0r28/lib/domains/campus/obj/maglite.c *** ds2.0r18/lib/domains/campus/obj/maglite.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/maglite.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,29 ---- + #include + #include + inherit "/lib/flashlight"; + + + void create(){ + ::create(); + SetKeyName("maglite"); + SetId( ({"fl","flashlight","light","flashlite","Maglite"}) ); + SetAdjectives( ({"powerful","heavy","large","Maglite"}) ); + SetShort( "a large flashlight" ); + SetLong("This is a powerful, heavy, Maglite brand flashlight."); + SetMass(20); + SetDollarCost(40); + SetLightLevel(20); + SetMinCells(4); + SetMaxCells(4); + SetCellType("D"); + Lit=0; + SetVendorType(VT_TREASURE); + + SetInventory(([ + "/domains/campus/obj/dcell_good":4 + ])); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/map.c ds2.0r28/lib/domains/campus/obj/map.c *** ds2.0r18/lib/domains/campus/obj/map.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/map.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,25 ---- + #include + #include + inherit LIB_ITEM; + inherit LIB_READ; + + + int TestFunc(){ + this_player()->eventPage("/domains/campus/txt/map.txt","system"); + return 1; + } + void create(){ + ::create(); + SetKeyName("building map"); + SetId(({"map","map of the administrative building","small map of the administrative building"})); + SetAdjectives(({"small"})); + SetShort("a small map of the administrative building"); + SetLong("A map of the administrative building. Try: read map \n"); + SetMass(0); + SetDollarCost(0); + SetVendorType(VT_TREASURE); + SetRead((: TestFunc :)); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/match.c ds2.0r28/lib/domains/campus/obj/match.c *** ds2.0r18/lib/domains/campus/obj/match.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/match.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,31 ---- + /* /domains/Praxis/etc/torch.c + * from Nightmare LPMud + * created by Descartes of Borg 951023 + */ + + #include + + inherit LIB_MATCH; + + + static void create() { + match::create(); + SetKeyName("match"); + SetId("match"); + SetAdjectives( ({ "wooden" }) ); + SetShort("a wooden match"); + SetLong("A wooden match that might light if you strike it."); + SetRadiantLight(2); + SetStrikeChance(50); + SetMinHeat(10); + SetFuelRequired(1); + SetMaxFuel(10); + SetFuelAmount(10); + SetRefuelable(0); + SetMass(5); + SetDollarCost(2); + SetBurntValue(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/medbag.c ds2.0r28/lib/domains/campus/obj/medbag.c *** ds2.0r18/lib/domains/campus/obj/medbag.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/medbag.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,25 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("bag"); + SetId( ({ "medical bag" }) ); + SetAdjectives( ({ "small", "cloth", "a" }) ); + SetShort("a small cloth bag"); + SetLong("It is a simple cloth bag used to hold things. Printed on it is: " + "\"Property of A.S. Clepius\""); + SetMass(274); + SetDollarCost(1); + SetMaxCarry(100); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/omni.c ds2.0r28/lib/domains/campus/obj/omni.c *** ds2.0r18/lib/domains/campus/obj/omni.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/omni.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,60 ---- + #include + inherit LIB_ITEM; + inherit LIB_PRESS; + + int check_environs(); + int vanish_count; + static void create() { + item::create(); + SetKeyName("omni"); + SetId(({"omni","Omni","device"})); + SetShort("an omni"); + SetLong("This is a small, round metal device, copper in color, "+ + "and similar in appearance to a pocket watch. There is a blinking red light "+ + "next to the tiny metal button at its top."); + SetMass(10); + SetDollarCost(300); + AddItem("button", "A button on the omni."); + } + void init() { + ::init(); + vanish_count=500; + check_environs(); + } + mixed CanPress(object who, string target) { + if(!present(this_object()->GetKeyName(),who ) && target == "button"){ + return "You do not have the Omni!"; + } + if(this_object()->GetId() == target){ + return "You cannot push that."; + } + return 1; + } + mixed eventPress(object who, string target) { + say(this_player()->GetName()+" turns multicolored and disappears.\n"); + write("You feel momentarily disoriented and find yourself back in the lab.\n"); + this_player()->eventMove("/domains/campus/room/u_lab"); + this_player()->eventForce("look"); + return 1; + } + void heart_beat(){ + vanish_count--; + if(vanish_count < 0){ + tell_object(environment(),"The omni glows brightly and disappears!"); + this_object()->eventDestruct(); + } + if(vanish_count == 5){ + tell_object(environment(),"The omni begins to glow a dull red."); + this_object()->SetLong("This is a small, round metal device, copper in color, "+ + "and similar in appearance to a pocket watch. There is a blinking red light "+ + "next to the tiny metal button at its top. It is glowing a dull red."); + this_object()->SetShort("an omni (glowing)"); + } + } + int check_environs(){ + if( interactive(environment()) ){ + set_heart_beat(1); + return 1; + } + return 1; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/pack.c ds2.0r28/lib/domains/campus/obj/pack.c *** ds2.0r18/lib/domains/campus/obj/pack.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/pack.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,30 ---- + + #include + + #include + #include + inherit LIB_STORAGE; + inherit LIB_ARMOR; + + + + static void create() { + ::create(); + SetKeyName("backpack"); + SetId(({"pack"})); + SetAdjectives(({"leather","soft","brown"})); + SetShort("a soft, brown leather backpack"); + SetLong("This is a medium-sized backpack made of soft brown leather. "+ + "It seems suitable for carrying books around, for the busy college student. "+ + "It features wide, comfortable straps for convenient wear."); + SetMass(100); + SetDollarCost(30); + SetCanClose(1); + SetClosed(1); + SetMaxCarry(500); + SetDamagePoints(100); + SetArmorType(A_CLOAK); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/ped_button.c ds2.0r28/lib/domains/campus/obj/ped_button.c *** ds2.0r18/lib/domains/campus/obj/ped_button.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/ped_button.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,41 ---- + /* /domains/campus/etc/chuch_button.c + * From the Nightmare V Object Library + * An example dummy item that allows pressing + * Created by Descartes of Borg 961222 + */ + + #include + + inherit LIB_DUMMY; // These do not show up in desc, but you can look at them + inherit LIB_PRESS; // Makes the item pressable + + int PushButton(object who) { + object *objects; + objects=({ load_object("/domains/campus/doors/red_door") }); + objects+=({ load_object("/domains/campus/doors/green_door") }); + objects+=({ load_object("/domains/campus/doors/blue_door") }); + objects+=({ load_object("/domains/campus/room/red_room") }); + objects+=({ load_object("/domains/campus/room/green_room") }); + objects+=({ load_object("/domains/campus/room/blue_room") }); + objects+=({ load_object("/domains/campus/room/monty") }); + + send_messages("press", "$agent_name $agent_verb the button, " + "resetting the experiment.", + who, 0, environment(who)); + + foreach(object ob in objects){ + ob->ButtonPush(); + } + + } + + static void create() { + dummy::create(); + SetKeyName("button"); + SetId(({"button","button on the pedestal" })); + SetAdjectives("pedestal", "red","shiny","candylike","candy-like","big"); + SetShort("a big red button"); + SetLong("It is a red, shiny, candy-like button."); + //SetPress((: PushButton :)); + SetPress(tell_object(this_player(),"hi!")); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/pedestal.c ds2.0r28/lib/domains/campus/obj/pedestal.c *** ds2.0r18/lib/domains/campus/obj/pedestal.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/pedestal.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,217 ---- + #include + #include + inherit LIB_ITEM; + inherit LIB_PRESS; + + int PushTheButton(); + string color,gagnant,my_door,other_door,removed_door; + + void create(){ + ::create(); + SetKeyName("button pedestal"); + SetId( ({"pedestal","altar"}) ); + SetAdjectives( ({"cylindrical","round","waist-high"}) ); + SetShort("a pedestal with a red button on it"); + SetLong("This is a cylindrical pedestal, about waist-high, " + "of mysterious composition. A button is " + "on it."); + SetItems( ([ + ({"button","red button"}) : "A red button." + ]) ); + SetMass(20); + SetDollarCost(10); + SetVendorType(VT_TREASURE); + SetPress( ([ + ({"button","red button"}) : (: PushTheButton :) + ]) ); + } + mixed CanGet(object ob) { return "The pedestal does not budge.";} + + int ResetGame(){ + object *objects; + object *contents; + string prize; + prize = "/domains/campus/armor/silverring"; + objects = ({}); + objects+=({ find_object("/domains/campus/room/red_room2") }); + objects+=({ find_object("/domains/campus/room/green_room2") }); + objects+=({ find_object("/domains/campus/room/blue_room2") }); + + //foreach(object thing in objects){ + // if(thing) { + // contents = deep_inventory(thing); + // foreach(object dummy in contents){ + //if(dummy) dummy->eventDestruct(); + // } + //thing->eventDestruct(); + //} + //} + + objects = ({ find_object("/domains/campus/doors/red_door") }); + objects +=({ find_object("/domains/campus/doors/green_door") }); + objects +=({ find_object("/domains/campus/doors/blue_door") }); + + foreach(object ding in objects){ + if(ding) ding->SetClosed(1); + if(ding) ding->SetLocked(1); + } + + + if(sscanf(gagnant,"%s door",color)>0){ + string where; + where="/domains/campus/room/"+color+"_room2"; + new(prize)->eventMove(find_object(where)); + } + } + + + int PushTheButton(){ + int genrand; + gagnant = ""; + //genrand = unguarded( (: to_int(read_file("/etc/random")) :) ); + genrand = random(256); + send_messages("press", "$agent_name $agent_verb the button.", + this_player(), 0, environment(this_player())); + if(!genrand || genrand == 0){ + tell_room(environment(),"A voice from the pedestal says: " + "Whoops! There's been a minor glitch, but " + "it's nothing to worry about. Please " + "try again."); + return 1; + } + tell_room(environment(),"A voice from the pedestal says: " + "PRECOG: genrand is: "+genrand); + genrand = genrand % 3; + if(genrand == 0) gagnant = "red door"; + if(genrand == 1) gagnant = "green door"; + if(genrand == 2) gagnant = "blue door"; + //tell_object(this_player(),"gagnant: "+gagnant); + tell_room(environment(),"A voice from the pedestal says: " + "PRECOG: gagnant is: "+gagnant+".\n" + "PRECOG: genrand modulus is: "+genrand); + remove_action("doStay","stay"); + remove_action("doSwitch","switch"); + add_action("choose","choose"); + tell_room(environment(),"A voice from the pedestal says: " + "You must now choose one door from these " + "three. Behind one is a prize. Behind the " + "other two, nothing. To choose the " + "red door, for example: choose red door"); + ResetGame(); + return 1; + } + + void init(){ + if(gagnant != "" && my_door !=""){ + add_action("doStay","stay"); + add_action("doSwitch","switch"); + } + if(gagnant != "" && my_door == ""){ + add_action("choose","choose"); + } + } + + int choose(string str){ + if(!str || str == ""){ + tell_room(environment(),"A voice from the pedestal says: " + "Please try choosing a door, ok?"); + } + else if(str == "door"){ + tell_room(environment(),"A voice from the pedestal says: " + "You'll need to be more specific."); + } + else if(str == "red door" || str == "blue door" ||str == "green door"){ + tell_room(environment(),"A voice from the pedestal says: " + "You choose the "+str+"."); + this_object()->MontyMagic(str); + //return 1; + } + else { + tell_room(environment(),"A voice from the pedestal says: " + "I don't understand that."); + } + reap_dummies(); + reap_other("/domains/campus/armor/silverring"); + return 1; + } + + int MontyMagic(string str){ + int genrand,which; + string *choices; + choices = ({}); + if(str != "red door") choices += ({ "red door" }); + if(str != "green door") choices += ({ "green door" }); + if(str != "blue door") choices += ({ "blue door" }); + //genrand=to_int(read_file("/etc/random")); + genrand = random(256); + if( choices[1] == gagnant) which = 0; + else if( choices[0] == gagnant) which = 1; + else which = genrand % 2;; + removed_door = choices[which]; + choices -= ({ choices[which] }); + other_door = choices[0]; + my_door = str; + choices += ({ str }); + if(sscanf(removed_door,"%s door",color)>0) color = color; + find_object("/domains/campus/doors/"+color+"_door")->SetLocked(0); + find_object("/domains/campus/doors/"+color+"_door")->SetClosed(0); + tell_room(environment(),"A voice from the pedestal says: " + "I have opened the "+removed_door+"! \n" + "You may enter the "+color+" room and see that it is empty.\n" + "Only the "+choices[0]+" and "+choices[1]+" remain.\n\n" + "Would you like to switch to the "+other_door+"? \n" + "Or would you rather stay with the "+str+"?\n\n" + "To switch, type: switch\n" + "To stay, type: stay"); + remove_action("choose","choose"); + add_action("doStay","stay"); + add_action("doSwitch","switch"); + return 1; + + } + + int CheckWin(string str){ + if(sscanf(str,"%s door",color)>0) color = color; + if(str == gagnant) { + this_object()->WinFun(); + return 1; + } + find_object("/domains/campus/doors/"+color+"_door")->SetLocked(0); + find_object("/domains/campus/doors/"+color+"_door")->SetClosed(0); + tell_room(environment(),"A voice from the pedestal says: " + "YOU LOOOOOSE!\n" + "You may enter the "+color+" room to get your big " + "load of NOTHING. Haaa haa!"); + return 1; + } + + int doStay(){ + tell_room(environment(),"A voice from the pedestal says: " + "Oh, how loyal!"); + remove_action("doStay","stay"); + remove_action("doSwitch","switch"); + CheckWin(my_door); + return 1; + } + + int doSwitch(){ + tell_room(environment(),"A voice from the pedestal says: " + "Why you're inconstant as a feather!"); + remove_action("doStay","stay"); + remove_action("doSwitch","switch"); + my_door = other_door; + CheckWin(my_door); + return 1; + } + + int WinFun(){ + find_object("/domains/campus/doors/"+color+"_door")->SetLocked(0); + find_object("/domains/campus/doors/"+color+"_door")->SetClosed(0); + tell_room(environment(),"A voice from the pedestal says: " + "You win, kid. Congrats!\n" + "You may enter the "+color+" room and claim your prize.\n\n" + "Push the pedestal button to reset the game."); + return 1; + } + + diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/pedestal2.c ds2.0r28/lib/domains/campus/obj/pedestal2.c *** ds2.0r18/lib/domains/campus/obj/pedestal2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/pedestal2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,204 ---- + #include + #include + inherit LIB_ITEM; + inherit LIB_PRESS; + + int PushTheButton(); + string color,gagnant,my_door,other_door,removed_door; + void create(){ + ::create(); + SetKeyName("button pedestal"); + SetId( ({"pedestal","altar"}) ); + SetAdjectives( ({"cylindrical","round","waist-high"}) ); + SetShort("a pedestal with a red button on it"); + SetLong("This is a cylindrical pedestal, about waist-high, " + "of mysterious composition. A button is " + "on it."); + SetItems( ([ + ({"button","red button"}) : "A red button." + ]) ); + SetMass(20); + SetDollarCost(10); + SetVendorType(VT_TREASURE); + SetPress( ([ + ({"button","red button"}) : (: PushTheButton :) + ]) ); + } + mixed CanGet(object ob) { return "The pedestal does not budge.";} + int ResetGame(){ + object *objects; + object *contents; + string prize; + prize = "/domains/campus/armor/silverring"; + objects = ({}); + objects+=({ find_object("/domains/campus/room/red_room2") }); + objects+=({ find_object("/domains/campus/room/green_room2") }); + objects+=({ find_object("/domains/campus/room/blue_room2") }); + + //foreach(object thing in objects){ + // if(thing) { + // contents = deep_inventory(thing); + // foreach(object dummy in contents){ + //if(dummy) dummy->eventDestruct(); + // } + //thing->eventDestruct(); + //} + //} + + objects = ({ find_object("/domains/campus/doors/red_door2") }); + objects +=({ find_object("/domains/campus/doors/green_door2") }); + objects +=({ find_object("/domains/campus/doors/blue_door2") }); + + foreach(object ding in objects){ + if(ding) ding->SetClosed(1); + if(ding) ding->SetLocked(1); + } + + if(sscanf(gagnant,"%s door",color)>0){ + string where; + where="/domains/campus/room/"+color+"_room2"; + new(prize)->eventMove(find_object(where)); + } + } + int PushTheButton(){ + int genrand; + gagnant = ""; + //genrand = unguarded( (: to_int(read_file("/etc/random")) :) ); + genrand = random(256); + send_messages("press", "$agent_name $agent_verb the button.", + this_player(), 0, environment(this_player())); + if(!genrand || genrand == 0){ + tell_room(environment(),"A voice from the pedestal says: " + "Whoops! There's been a minor glitch, but " + "it's nothing to worry about. Please " + "try again."); + return 1; + } + tell_room(environment(),"A voice from the pedestal says: " + "PRECOG: genrand is: "+genrand); + genrand = genrand % 3; + if(genrand == 0) gagnant = "red door"; + if(genrand == 1) gagnant = "green door"; + if(genrand == 2) gagnant = "blue door"; + //tell_object(this_player(),"gagnant: "+gagnant); + tell_room(environment(),"A voice from the pedestal says: " + "PRECOG: gagnant is: "+gagnant+".\n" + "PRECOG: genrand modulus is: "+genrand); + remove_action("doStay","stay"); + remove_action("doSwitch","switch"); + add_action("choose","choose"); + tell_room(environment(),"A voice from the pedestal says: " + "You must now choose one door from these " + "three. Behind one is a prize. Behind the " + "other two, nothing. To choose the " + "red door, for example: choose red door"); + ResetGame(); + return 1; + } + void init(){ + ::init(); + if(gagnant != "" && my_door !=""){ + add_action("doStay","stay"); + add_action("doSwitch","switch"); + } + if(gagnant != "" && my_door == ""){ + add_action("choose","choose"); + } + } + int choose(string str){ + if(!str || str == ""){ + tell_room(environment(),"A voice from the pedestal says: " + "Please try choosing a door, ok?"); + } + else if(str == "door"){ + tell_room(environment(),"A voice from the pedestal says: " + "You'll need to be more specific."); + } + else if(str == "red door" || str == "blue door" ||str == "green door"){ + tell_room(environment(),"A voice from the pedestal says: " + "You choose the "+str+"."); + this_object()->MontyMagic(str); + //return 1; + } + else { + tell_room(environment(),"A voice from the pedestal says: " + "I don't understand that."); + } + reap_dummies(); + reap_other("/domains/campus/armor/silverring"); + return 1; + } + int MontyMagic(string str){ + int genrand,which; + string *choices; + choices = ({}); + if(str != "red door") choices += ({ "red door" }); + if(str != "green door") choices += ({ "green door" }); + if(str != "blue door") choices += ({ "blue door" }); + //genrand=to_int(read_file("/etc/random")); + genrand = random(256); + if( choices[1] == gagnant) which = 0; + else if( choices[0] == gagnant) which = 1; + else which = genrand % 2;; + removed_door = choices[which]; + choices -= ({ choices[which] }); + other_door = choices[0]; + my_door = str; + choices += ({ str }); + if(sscanf(removed_door,"%s door",color)>0) color = color; + find_object("/domains/campus/doors/"+color+"_door2")->SetLocked(0); + find_object("/domains/campus/doors/"+color+"_door2")->SetClosed(0); + tell_room(environment(),"A voice from the pedestal says: " + "I have opened the "+removed_door+"! \n" + "You may enter the "+color+" room and see that it is empty.\n" + "Only the "+choices[0]+" and "+choices[1]+" remain.\n\n" + "Would you like to switch to the "+other_door+"? \n" + "Or would you rather stay with the "+str+"?\n\n" + "To switch, type: switch\n" + "To stay, type: stay"); + remove_action("choose","choose"); + add_action("doStay","stay"); + add_action("doSwitch","switch"); + return 1; + + } + int CheckWin(string str){ + if(sscanf(str,"%s door",color)>0) color = color; + if(str == gagnant) { + this_object()->WinFun(); + return 1; + } + find_object("/domains/campus/doors/"+color+"_door2")->SetLocked(0); + find_object("/domains/campus/doors/"+color+"_door2")->SetClosed(0); + tell_room(environment(),"A voice from the pedestal says: " + "YOU LOOOOOSE!\n" + "You may enter the "+color+" room to get your big " + "load of NOTHING. Haaa haa!"); + return 1; + } + int doStay(){ + tell_room(environment(),"A voice from the pedestal says: " + "Oh, how loyal!"); + remove_action("doStay","stay"); + remove_action("doSwitch","switch"); + CheckWin(my_door); + return 1; + } + int doSwitch(){ + tell_room(environment(),"A voice from the pedestal says: " + "Why you're inconstant as a feather!"); + remove_action("doStay","stay"); + remove_action("doSwitch","switch"); + my_door = other_door; + CheckWin(my_door); + return 1; + } + int WinFun(){ + find_object("/domains/campus/doors/"+color+"_door2")->SetLocked(0); + find_object("/domains/campus/doors/"+color+"_door2")->SetClosed(0); + tell_room(environment(),"A voice from the pedestal says: " + "You win, kid. Congrats!\n" + "You may enter the "+color+" room and claim your prize.\n\n" + "Push the pedestal button to reset the game."); + return 1; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/pedestal3.c ds2.0r28/lib/domains/campus/obj/pedestal3.c *** ds2.0r18/lib/domains/campus/obj/pedestal3.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/pedestal3.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,217 ---- + #include + #include + inherit LIB_ITEM; + inherit LIB_PRESS; + + int PushTheButton(); + string color,gagnant,my_door,other_door,removed_door; + + void create(){ + ::create(); + SetKeyName("button pedestal"); + SetId( ({"pedestal","altar"}) ); + SetAdjectives( ({"cylindrical","round","waist-high"}) ); + SetShort("a pedestal with a red button on it"); + SetLong("This is a cylindrical pedestal, about waist-high, " + "of mysterious composition. A button is " + "on it."); + SetItems( ([ + ({"button","red button"}) : "A red button." + ]) ); + SetMass(20); + SetDollarCost(10); + SetVendorType(VT_TREASURE); + SetPress( ([ + ({"button","red button"}) : (: PushTheButton :) + ]) ); + } + mixed CanGet(object ob) { return "The pedestal does not budge.";} + + int ResetGame(){ + object *objects; + object *contents; + string prize; + prize = "/domains/campus/armor/silverring"; + objects = ({}); + objects+=({ find_object("/domains/campus/room/red_room2") }); + objects+=({ find_object("/domains/campus/room/green_room2") }); + objects+=({ find_object("/domains/campus/room/blue_room2") }); + + //foreach(object thing in objects){ + // if(thing) { + // contents = deep_inventory(thing); + // foreach(object dummy in contents){ + //if(dummy) dummy->eventDestruct(); + // } + //thing->eventDestruct(); + //} + //} + + objects = ({ find_object("/domains/campus/doors/red_door3") }); + objects +=({ find_object("/domains/campus/doors/green_door3") }); + objects +=({ find_object("/domains/campus/doors/blue_door3") }); + + foreach(object ding in objects){ + if(ding) ding->SetClosed(1); + if(ding) ding->SetLocked(1); + } + + + if(sscanf(gagnant,"%s door",color)>0){ + string where; + where="/domains/campus/room/"+color+"_room2"; + new(prize)->eventMove(find_object(where)); + } + } + + + int PushTheButton(){ + int genrand; + gagnant = ""; + //genrand = unguarded( (: to_int(read_file("/etc/random")) :) ); + genrand = random(256); + send_messages("press", "$agent_name $agent_verb the button.", + this_player(), 0, environment(this_player())); + if(!genrand || genrand == 0){ + tell_room(environment(),"A voice from the pedestal says: " + "Whoops! There's been a minor glitch, but " + "it's nothing to worry about. Please " + "try again."); + return 1; + } + //tell_room(environment(),"A voice from the pedestal says: " + //"PRECOG: genrand is: "+genrand); + genrand = genrand % 3; + if(genrand == 0) gagnant = "red door"; + if(genrand == 1) gagnant = "green door"; + if(genrand == 2) gagnant = "blue door"; + //tell_object(this_player(),"gagnant: "+gagnant); + //tell_room(environment(),"A voice from the pedestal says: " + // "PRECOG: gagnant is: "+gagnant+".\n" + // "PRECOG: genrand modulus is: "+genrand); + remove_action("doStay","stay"); + remove_action("doSwitch","switch"); + add_action("choose","choose"); + tell_room(environment(),"A voice from the pedestal says: " + "You must now choose one door from these " + "three. Behind one is a prize. Behind the " + "other two, nothing. To choose the " + "red door, for example: choose red door"); + ResetGame(); + return 1; + } + + void init(){ + if(gagnant != "" && my_door !=""){ + add_action("doStay","stay"); + add_action("doSwitch","switch"); + } + if(gagnant != "" && my_door == ""){ + add_action("choose","choose"); + } + } + + int choose(string str){ + if(!str || str == ""){ + tell_room(environment(),"A voice from the pedestal says: " + "Please try choosing a door, ok?"); + } + else if(str == "door"){ + tell_room(environment(),"A voice from the pedestal says: " + "You'll need to be more specific."); + } + else if(str == "red door" || str == "blue door" ||str == "green door"){ + tell_room(environment(),"A voice from the pedestal says: " + "You choose the "+str+"."); + this_object()->MontyMagic(str); + //return 1; + } + else { + tell_room(environment(),"A voice from the pedestal says: " + "I don't understand that."); + } + reap_dummies(); + reap_other("/domains/campus/armor/silverring"); + return 1; + } + + int MontyMagic(string str){ + int genrand,which; + string *choices; + choices = ({}); + if(str != "red door") choices += ({ "red door" }); + if(str != "green door") choices += ({ "green door" }); + if(str != "blue door") choices += ({ "blue door" }); + //genrand=to_int(read_file("/etc/random")); + genrand = random(256); + if( choices[1] == gagnant) which = 0; + else if( choices[0] == gagnant) which = 1; + else which = genrand % 2;; + removed_door = choices[which]; + choices -= ({ choices[which] }); + other_door = choices[0]; + my_door = str; + choices += ({ str }); + if(sscanf(removed_door,"%s door",color)>0) color = color; + find_object("/domains/campus/doors/"+color+"_door3")->SetLocked(0); + find_object("/domains/campus/doors/"+color+"_door3")->SetClosed(0); + tell_room(environment(),"A voice from the pedestal says: " + "I have opened the "+removed_door+"! \n" + "You may enter the "+color+" room and see that it is empty.\n" + "Only the "+choices[0]+" and "+choices[1]+" remain.\n\n" + "Would you like to switch to the "+other_door+"? \n" + "Or would you rather stay with the "+str+"?\n\n" + "To switch, type: switch\n" + "To stay, type: stay"); + remove_action("choose","choose"); + add_action("doStay","stay"); + add_action("doSwitch","switch"); + return 1; + + } + + int CheckWin(string str){ + if(sscanf(str,"%s door",color)>0) color = color; + if(str == gagnant) { + this_object()->WinFun(); + return 1; + } + find_object("/domains/campus/doors/"+color+"_door3")->SetLocked(0); + find_object("/domains/campus/doors/"+color+"_door3")->SetClosed(0); + tell_room(environment(),"A voice from the pedestal says: " + "YOU LOOOOOSE!\n" + "You may enter the "+color+" room to get your big " + "load of NOTHING. Haaa haa!"); + return 1; + } + + int doStay(){ + tell_room(environment(),"A voice from the pedestal says: " + "Oh, how loyal!"); + remove_action("doStay","stay"); + remove_action("doSwitch","switch"); + CheckWin(my_door); + return 1; + } + + int doSwitch(){ + tell_room(environment(),"A voice from the pedestal says: " + "Why you're inconstant as a feather!"); + remove_action("doStay","stay"); + remove_action("doSwitch","switch"); + my_door = other_door; + CheckWin(my_door); + return 1; + } + + int WinFun(){ + find_object("/domains/campus/doors/"+color+"_door3")->SetLocked(0); + find_object("/domains/campus/doors/"+color+"_door3")->SetClosed(0); + tell_room(environment(),"A voice from the pedestal says: " + "You win, kid. Congrats!\n" + "You may enter the "+color+" room and claim your prize.\n\n" + "Push the pedestal button to reset the game."); + return 1; + } + + diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/pin.c ds2.0r28/lib/domains/campus/obj/pin.c *** ds2.0r18/lib/domains/campus/obj/pin.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/pin.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + inherit LIB_ITEM; + + void create(){ + ::create(); + SetKeyName("pull-pin"); + SetId(({"pin","ring"})); + SetAdjectives(({"pull","grenade","fuse"})); + SetShort("a grenade pin"); + SetLong("This is the pull pin from a hand grenade fuse."); + SetMass(1); + SetDollarCost(0); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/podium.c ds2.0r28/lib/domains/campus/obj/podium.c *** ds2.0r18/lib/domains/campus/obj/podium.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/podium.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,713 ---- + /* It works now, no define needed. + * make sure someone does "setmc" or it won't do much. + * setmc can only be done once, first come, first get i guess ;) + * by Boy@frontiers. + * Major corrections and modifications by Crat 25jul05 + */ + #include + #include + inherit LIB_STORAGE; + + #define DEFAULT_BOUNCE_ROOM "/domains/town/room/adv_guild" + string bounce_room ; /* File name of the bounce room */ + string *voters ; /* Array of names of users who have voted */ + string *agenda ; /* Array of agenda item strings. */ + mapping votes ; /* Keys are names, data are votes cast */ + string vote_str ; /* The proposition being voted on */ + int endtime ; /* Time at which the speaker/vote ends */ + int votelog ; /* 1 if votes are being announced, else 0 */ + + string speaker; + string mc; + int x; + object ob; + static void create() { + storage::create(); + SetShort("a podium"); + SetLong("This is the speaker's podium. It is about four feet tall "+ + "and made of some expensive-looking, deep grain wood. This podium "+ + "facilitates the running of meetings by giving the speaker the power "+ + "to recognize individual people to speak at a time. There is "+ + "some space in the podium to store things in, perhaps there is something "+ + "in there now. For more "+ + "details on running a meeting with the podium, type: help podium."); + SetMass(10); + SetId( ({"podium", "speaker's podium", "podium.c"}) ); + SetDollarCost(-110); + SetKeyName("podium"); + SetId(({"podium","handler"})); + SetAdjectives(({"wood","wooden","meeting","speaker's","Speaker's"})); + SetDamagePoints(1000); + SetPreventGet("You can't get that."); + SetMaxCarry(20); + + SetInventory(([ + ])); + + mc = ""; + x = 0; + speaker = ""; + + vote_str = "none" ; + voters = ({ }) ; + votes = ([ ]) ; + agenda = ({ }) ; + bounce_room = DEFAULT_BOUNCE_ROOM ; + + } + void init() { + ::init(); + add_action("eventSay", "say",1); + add_action("eventRaise", "raise"); + add_action("eventCallOn", "recognize"); + add_action("shaddap", "yell"); + add_action("shaddap", "shout"); + add_action("shaddap", "emote"); + add_action("help", "help"); + add_action("quiet", "quiet"); + add_action("changemc", "changemc"); + add_action("SetMc", "setmc"); + add_action ("echo", "echo") ; + add_action ("vote", "vote") ; + add_action ("call_for_vote", "call") ; + add_action ("call_for_roll", "rollcall") ; + add_action ("permit_entry", "permit") ; + add_action ("localtime", "time") ; + add_action ("reset_clock", "reset") ; + add_action ("show_agenda", "agenda") ; + add_action ("add_items", "add") ; + add_action ("remove_item", "remove") ; + add_action ("clear_items", "clear") ; + add_action ("eject_player", "eject") ; + add_action ("privacy", "privacy"); + add_action ("privacy", "priv"); + add_action ("localupdate", "update") ; + add_action ("step_down", "step" ); + } + mixed CanGet(object ob) { return "The podium does not budge.";} + + + + int eventSay(string args) { + string foo; + + if (mc == this_player()->GetKeyName()) { + this_player()->eventPrint("You say %^CYAN%^\"" + capitalize(args) + "\""); + say(this_player()->GetName() + " says %^CYAN%^\"" + capitalize(args) + "\""); + return 1; + } + if ( mc != "" && this_player()-> GetKeyName() != speaker ) { + this_player()->eventPrint("%^RED%^It is not polite to talk out of order."); + this_player()->eventPrint("Raise your hand if you'd like to speak."); + return 1; + } + if ((!args) || (args == " ")) { + write ("You mutter to yourself.\n") ; + return 1 ; + } + foo = wrap((string)this_player()->GetCapName() + + " says: %^CYAN%^\"" + capitalize(args)) ; + say (foo) ; + write(wrap("You say: %^CYAN%^\"" + capitalize(args))); + return 1; + + } + + + int eventCallOn(string args) { + if (present((object)args)) { + if (mc == this_player()->GetKeyName()) { + speaker = args; + write("You have called on " + speaker+".\n"); + find_living(args)->eventPrint("%^CYAN%^" + capitalize(mc) + " has called on you, you may speak."); + return 1; + } + else { + this_player()->eventPrint("Only the speaker can do that."); + return 1; + } + } + else { + write("%^CYAN%^This person is not here to be called on."); + return 1; + } + } + + + int eventRaise() { + string dude; + dude=this_player()->GetKeyName(); + if(dude != mc && dude != speaker) { + tell_room(environment(this_player()), + this_player()->GetName()+" raises "+ + possessive(this_player())+ + " hand.", ({this_player()}) ); + this_player()->eventPrint("%^CYAN%^You raise your hand."); + return 1; + } + else { + write("You can speak already. Say what's on your mind."); + return 1; + } + } + + + int shaddap() { + if(mc != "" && this_player()->GetKeyName() != speaker){ + write("%^RED%^It would be impolite to do that at this time."); + return 1; + } + } + + + int help(string args) { + if (args != "podium") { + return 0; + } + else { + write("%^GREEN%^This is the speakers podium, it is where the " + "speaker stands during a speech. This podium " + "has special properties, it can prevent others " + "from speaking out of turn, if you are the "+ + "speaker.%^RESET%^"); + if (this_player()->GetKeyName() == mc) { + write("%^RED%^Available commands:"); + write("%^YELLOW%^recognize %^RESET%^: Calls on another to speak."); + write("%^YELLOW%^say %^RESET%^: As the speaker, you can say things whenever you like."); + write("%^YELLOW%^quiet %^RESET%^: Revokes the speaking privilege to the person you last called on."); + write("%^YELLOW%^changemc %^RESET%^: Removes yourself as mc, and let someone else take over."); + write("%^YELLOW%^add %^RESET%^: Add agenda item to the bottom of the agenda."); + write("%^YELLOW%^remove %^RESET%^: Remove agenda item from the agenda."); + write("%^YELLOW%^clear agenda%^RESET%^: Clear the agenda."); + write("%^YELLOW%^permit %^RESET%^: Permit player to enter the meeting room when locked."); + write("%^YELLOW%^eject %^RESET%^: Eject player from the meeting room."); + write("%^YELLOW%^time [minutes/seconds]%^RESET%^: Set the clock to minutes or seconds."); + write("%^YELLOW%^reset clock%^RESET%^: Clear the clock."); + write("%^YELLOW%^step down%^RESET%^: Step down as head speaker."); + write("%^YELLOW%^rollcall [minutes/seconds] %^RESET%^: Call for a roll call vote,\n" + "\tlasting num minutes or seconds, on ."); + write("%^YELLOW%^add after %^RESET%^: Add agenda item after agenda item #.\n" + "\tadd after 0 adds to the top of the list."); + write("%^YELLOW%^call [minutes/seconds] %^RESET%^: Call for a vote, lasting num minutes\n" + "\tor seconds, on ."); + return 1; + } + else { + write("%^RED%^Available commands:"); + write("%^YELLOW%^raise %^RESET%^: Raise your hand, to motion to the speaker that you would like to speak."); + write("%^YELLOW%^say %^RESET%^ : Say something, you only may do this if the speaker has called on you."); + if (x == 0) { + write("%^YELLOW%^setmc%^RESET%^ : There is no mc currently, use this command to set one."); + } + return 1; + } + } + } + + + int quiet() { + if (mc == this_player()->GetKeyName()) { + write("%^CYAN%^You thank " + capitalize(speaker) + " for speaking."); + find_living(speaker)->eventPrint("%^CYAN%^" + capitalize(mc) + " thanks you for you speaking."); + speaker = mc; + return 1; + } + write ("Only the mc may use this command.\n") ; + return 1; + } + + + int changemc(string args) { + if (args != 0) { + if ( this_player()->GetKeyName() != mc ) { + write("%^RED%^You are not the mc to begin with, you cannot give that position away."); + return 1; + } + else { + if (!present(args)) { + write("%^CYAN%^" + args + " is not present, and therefore cannot be mc."); + return 1; + } + else { + write("%^CYAN%^You hand the podium over to " + args); + mc = args; + say("%^CYAN%^" + capitalize(args) + " is the new head speaker."); + find_living(mc)->eventPrint("%^BLUE%^You are the new head speaker!"); + find_living(mc)->eventPrint("The command \"help podium\" can help you, if you don't know what to do."); + return 1; + } + } + } + else { + write("%^CYAN%^Syntax:"); + write("changemc "); + return 1; + } + } + + int step_down(string args){ + if (args == "down") { + if ( this_player()->GetKeyName() != mc ) { + write("%^RED%^You are not the mc to begin with, you cannot give that position away."); + return 1; + } + say("%^CYAN%^" + capitalize(mc) + " has stepped down as the head speaker."); + write ( "You step down as the head speaker" ); + mc = ""; + x--; + load_object(base_name(environment(this_object())))->AutoDeactivate(); + return 1; + } + else { + write("%^CYAN%^Syntax:"); + write(""); + return 1; + } + + } + + int SetMc(string args) { + if (x==0) { + if (args != 0) { + if (present(args) ) { + mc = args; + say("%^CYAN%^" + capitalize(mc) + " is the speaker."); + write("You set " + capitalize(args) + " as the speaker."); + find_living(mc)->eventPrint("The command \"help podium\" can help you, if you don't know what to do."); + x++; + return 1; + } + else { + write("You cannot set him/her as the speaker, he/she is not here!"); + return 1; + } + } + else { + write("%^CYAN%^Syntax:"); + write("setmc "); + return 1; + } + } + else { + write("There is already a speaker, you cannot set another one."); + return 1; + } + } + + int privacy(string str){ + + if ( mc != this_player()->GetKeyName() ) { + write ("Only the mc may use the shield.\n") ; + return 1 ; + } + if(str=="on" || str == "1"){ + load_object(base_name(environment(this_object())))->set_privacy( 1 ); + write("You enable the privacy shield.\n"); + say(this_player()->GetName()+" enables a privacy force field around the room."); + return 1; + } + if(str=="off" || str == "0"){ + load_object(base_name(environment(this_object())))->AutoDeactivate(); + write("You disable the privacy shield.\n"); + say(this_player()->GetName()+" disables a privacy force field around the room."); + return 1; + } + } + + // Echoing is always forbidden. It's just too much of a hassle. + int echo (string str) { + write ("Echoing is forbidden in the conference room at all times.\n") ; + return 1 ; + } + + // Permit_entry lets the mc bring someone into the conference room + // when it is locked. + int permit_entry (string name) { + + object user ; + int oldlock ; + + if ( mc != this_player()->GetKeyName() ) { + write ("Only the mc may permit entry into a locked conference.\n") ; + return 1 ; + } + user = find_player(name) ; + if (!user) { + write ("There is no user by that name.\n") ; + return 1 ; + } + if (present(user,environment(this_object()))) { + write (capitalize(name)+" is already here!\n") ; + return 1 ; + } + // We save the old locked status of the room, and restore it when we're + // done. You can "permit" entry into an unlocked conference if you want + // to: it saves the person the trouble of walking. + oldlock = load_object(base_name(environment(this_object())))->get_privacy() ; + load_object(base_name(environment(this_object())))->set_privacy( 0 ); + user -> eventMove(environment(this_object())) ; + load_object(base_name(environment(this_object())))->set_privacy( oldlock ); + write ("You bring "+capitalize(name)+" into the conference.\n") ; + tell_object (user, capitalize(mc)+" permits you to enter.\n") ; + say (capitalize(name)+" has been permitted to enter the conference.\n", user) ; + return 1 ; + } + + + + // Eject_player lets the mc banish a player from the room and dump + // him in the bounce room. Not very effective if the room is unlocked, + // except perhaps as a warning. + int eject_player (string str) { + + object ob ; + + if ( mc != this_player()->GetKeyName() ) { + write ("Only the mc may eject players.\n") ; + return 1 ; + } + ob = find_player(str) ; + if (!ob || !present (ob, environment(this_object()))) { + write ("There is no player named "+capitalize(str)+" here.\n") ; + return 1 ; + } + write ("You eject "+capitalize(str)+" from the room!\n") ; + tell_object (ob, "You have been ejected from the room.\n") ; + say (capitalize(str)+" has been ejected from the room.\n") ; + ob->eventMove(bounce_room) ; + return 1 ; + } + + // Localtime shows the user the amount of time left on the room clock. + // The name is chosen to avoid colliding with the time() efun. + // The mc may also use this function to set the time on the clock + // and start it running. See the help documents for more information on + // how the clock works. + varargs int localtime (string str) { + + int i, min, sec ; + string foo ; + + // If no string, then we just indicate how much time is left on the clock. + if (!str) { + if (!endtime || endtime == 0) { + write ("Time is not running at the moment.\n") ; + return 1 ; + } + i = time() ; + i = endtime - i ; + min = (i/60) ; + sec = i - (min*60) ; + if (min==1) { + write ("The clock shows 1 minute and "+sec+" seconds remaining.\n") ; + } else { + write ("The clock shows "+min+" minutes and "+sec+" seconds remaining.\n") ; + } + return 1 ; + } + // If there is a string, then the user is trying to set the clock to some + // number of minutes or seconds. + if ( mc != this_player()->GetKeyName() ) { + write ("Only the mc may set the clock.\n") ; + return 1 ; + } + // You cannot set a new time if the clock is running. This is for safety. + // You must reset the clock first. See below. + if (endtime!=0) { + write ("The clock is running. You must reset the clock first.\n" + ) ; + return 1 ; + } + if (sscanf(str, "%d min%s", i, foo) == 2) { + i=i*60 ; + } else { + if (sscanf(str, "%d seconds", i) != 1) { + write ("You must set a number of minutes or seconds: ie, 3 minutes or 90 seconds.\n") ; + return 1 ; + } + } + write ("You set the clock to "+str+".\n") ; + say (capitalize(mc)+" sets the clock to "+str+".\n") ; + endtime = time()+i ; + // We call_out to a function that prints a message when time runs out. + call_out ("expire_time", i) ; + return 1 ; + } + + // Reset_clock lets the mc clear the clock before setting a new time + // on it. + int reset_clock (string str) { + if (!str || str!="clock") { + notify_fail ("Reset what?\n") ; + return 0 ; + } + if ( mc != this_player()->GetKeyName() ) { + write ("Only the mc may reset the clock.\n") ; + return 1 ; + } + if (endtime==0) { + write ("The clock isn't running.\n") ; + return 1 ; + } + endtime = 0 ; + write ("You clear the clock.\n") ; + say (capitalize(mc)+" clears the clock.\n") ; + // Clear any pending call_outs that may be left behind. + remove_call_out("expire_time") ; + remove_call_out("expire_vote") ; + return 1 ; + } + + // Expire_time lets the conference room know that time has expired. It + // doesn't force the speaker to shut up or anything like that: that's left + // to the mcs discretion. + int expire_time() { + tell_room (environment(this_object()),"The clock runs out.\n") ; + endtime = 0 ; + } + + + // Show_agenda lets users see the current agenda. + int show_agenda() { + + int i ; + + if (!agenda || sizeof(agenda)==0) { + write ("The agenda has not been set.\n") ; + return 1 ; + } + write ("The current agenda is:\n") ; + for (i=0;iGetKeyName() ) { + write ("Only the mc may clear the agenda.\n") ; + return 1 ; + } + if (!str || str!="agenda") { + write ("Usage: clear [agenda]\n") ; + return 1 ; + } + agenda = ({ }) ; + write ("The agenda has been cleared.\n") ; + say ("The agenda has been cleared.\n") ; + return 1 ; + } + + // Add_agenda_item lets the mc add an agenda item. If the argument + // is of the form "after ", then string is added to the + // agenda AFTER item int. Agenda items are numbered 1-N rather than 0-(N-1). + int add_items (string str) { + + int post ; + string prop ; + + if ( mc != this_player()->GetKeyName() ) { + notify_fail ("Only the mc may add agenda items.\n") ; + return 0 ; + } + if (!str) { + write ("Usage: add item or add after N item\n") ; + return 1 ; + } + if (sscanf(str,"after %d %s", post, prop)!=2) { + agenda += ({ str }) ; + write ("Added the following item to the agenda\n"+str+"\n") ; + return 1 ; + } + if (post<0 || post>=sizeof(agenda)) { + notify_fail ("Item number out of range.\n") ; + return 0 ; + } + if (post==0) agenda = ({ prop }) + agenda ; else + agenda = agenda[0..post-1] + ({ prop }) + agenda[post..sizeof(agenda)] ; + write ("Added the following agenda item after item "+post+":\n"+ + prop+"\n") ; + return 1 ; + } + + // Remove_item lets the mc take an item off the agenda. + int remove_item (string str) { + + int agitem ; + + if (!str) { + notify_fail ("Usage: remove \n") ; + return 0 ; + } + if (sscanf(str,"%d",agitem)!=1) { + notify_fail ("Usage: remove \n") ; + return 0 ; + } + if (agitem<0 || agitem>sizeof(agenda)) { + write ("Item number out of range.\n") ; + return 0 ; + } + // Convert to 0-(N-1) numbering. + agitem = agitem-1 ; + write (agitem+"\n") ; + write ("Removing the following agenda item:\n"+agenda[agitem]+"\n") ; + if (agitem==0) { + agenda = agenda[1..sizeof(agenda)-1] ; + } else { + if (agitem == sizeof(agenda)-1) { + agenda = agenda[0..sizeof(agenda)-2] ; + } else { + agenda = agenda[0..agitem-1] + agenda[agitem+1..sizeof(agenda)-1] ; + } + } + return 1 ; + } + + // Vote lets a player cast a vote on the proposed issue. See the help + // document for details on how voting works. + int vote (string str) { + // With no argument, we print the proposal, if there is one. + if (!str) { + if (!vote_str || vote_str=="none") { + write ("No vote is in progress.\n") ; + return 1 ; + } + write ("Voting on: "+vote_str+"\n") ; + return 1 ; + } + // If there is a argument, we interpret that string as a vote cast. + if (!vote_str || vote_str=="none") { + write ("No vote is in progress at this time.\n") ; + return 1 ; + } + if (str!="yes" && str!="no" && str!="abstain") { + write ("Please vote yes, no, or abstain..\n") ; + return 1 ; + } + if (member_array( this_player()->GetName(),voters)!=-1) { + write ("You have already voted!\n") ; + return 1 ; + } + voters += ({ this_player()->GetName() }) ; + votes[str] = votes[str]+1 ; + write ("You vote "+str+" on "+vote_str+".\n") ; + // If this is a roll call vote - ie, the votes are being logged - we announce + // the vote to the log file and to the room. + if (votelog) { + say (capitalize(this_player()->GetName())+" votes "+capitalize(str)+".\n") ; + } + return 1 ; + } + + // Call_for_vote allows the mc to call for a secret-ballot vote on + // a proposal. + int call_for_vote (string str) { + + string timestr, subjstr ; + int i ; + + if ( mc != this_player()->GetKeyName() ) { + write ("Only the mc may call for votes.\n") ; + return 1 ; + } + // Must specify an amount of time for which votes may be cast, and a subject + // which people are voting on. + if (!str) { + write ("Usage: call \n") ; + return 1 ; + } + if (sscanf(str,"%d %s %s",i,timestr,subjstr)!=3) { + write ("Usage: call \n") ; + return 1 ; + } + // This is going to reset the clock: so we want to force the mc to + // clear the clock first. + if (endtime!=0) { + write ("The clock is running. You must reset the clock first.\n") ; + return 1 ; + } + if (timestr=="minutes") { + i = i * 60 ; + } else { + if (timestr!="seconds") { + write ("Enter the time in minutes or seconds.\n") ; + return 1 ; + } + } + vote_str = subjstr ; + // This is a secret ballot so we don't want to log the votes. + votelog = 0 ; + write ("You call for a vote on "+vote_str+".\n") ; + say (capitalize(mc)+" calls for a vote on "+vote_str+".\n") ; + say (capitalize(mc)+" sets the clock to "+str+".\n") ; + endtime = time()+i ; + // Call out to a function which totals the votes at the end of the vote time. + call_out ("expire_vote",i) ; + return 1 ; + } + + // Call_for_roll is exactly like call_for_vote EXCEPT that it calls for + // a roll-call vote: that is, all votes are announced and logged. + int call_for_roll (string str) { + + string timestr, subjstr ; + int i ; + + if ( mc != this_player()->GetKeyName() ) { + write ("Only the mc may call for votes.\n") ; + return 1 ; + } + if (!str) { + write ("Usage: rollcall \n") ; + return 1 ; + } + if (sscanf(str,"%d %s %s",i,timestr,subjstr)!=3) { + write ("Usage: rollcall \n") ; + return 1 ; + } + if (endtime!=0) { + write ("The clock is running. You must reset the clock first.\n") ; + return 1 ; + } + if (timestr=="minutes") { + i = i * 60 ; + } else { + if (timestr!="seconds") { + write ("Enter the time in minutes or seconds.\n") ; + return 1 ; + } + } + vote_str = subjstr ; + // This is a roll call vote so we log the votes and announce them. + votelog = 1 ; + write ("You call for a roll call vote on "+vote_str+".\n") ; + say (capitalize(mc)+" calls for a roll call vote on "+vote_str+".\n") ; + say (capitalize(mc)+" sets the clock to "+str+".\n") ; + endtime = time()+i ; + call_out ("expire_vote",i) ; + return 1 ; + } + + // Expire_vote finishes the vote and tabulates the results. It does not + // announce the outcome because some votes required 2/3 or 3/4 to pass + // rather than a simple majority. + int expire_vote() { + tell_room (environment(this_object()), "The clock runs out. Voting is over.\n") ; + endtime = 0 ; + tell_room (environment(this_object()), "The results of the vote were:\n"+ + "Yes: "+votes["yes"]+" No: "+votes["no"]+" Abstain: "+ + votes["abstain"]+"\n") ; + voters = ({ }) ; + votes["yes"] = 0 ; + votes["no"] = 0 ; + votes["abstain"] = 0 ; + vote_str="none" ; + } + + int localupdate() { + write ("You may not update objects while in the conference room.\n") ; + return 1 ; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/pwatch.c ds2.0r28/lib/domains/campus/obj/pwatch.c *** ds2.0r18/lib/domains/campus/obj/pwatch.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/pwatch.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,49 ---- + #include + #include + #include + #include + inherit LIB_ARMOR; + + string l_time; + string l_time,tzone; + static void create(){ + armor::create(); + SetKeyName("pocket watch"); + SetId(({"watch","pocketwatch","pocket watch","timepiece"})); + SetShort("a gold pocket watch"); + SetLong("This is a beautifully decorated and intricately carved "+ + "pocket watch made of gold. It glows with an almost surreal, deep golden "+ + "luster. It is quietly ticking the seconds, and it looks like you can get the "+ + "accurate time by checking the watch."); + SetMass(10); + SetDollarCost(1); + SetProtection(BLUNT,1); + SetProtection(BLADE,1); + SetProtection(KNIFE,1); + SetArmorType(A_AMULET); + } + void init(){ + ::init(); + add_action("check_time","check"); + add_action("pre_check","time"); + } + int pre_check(string str){ + if(!str){ + this_object()->check_time("time"); + return 1; + } + } + int check_time(string str){ + if(str=="time" || str=="watch"){ + if(present("pocket watch",this_player())){ + tzone="/daemon/timezone"->GetTZ(); + l_time="/daemon/current_time"->GetCurrentTime(tzone); + write("Checking the pocket watch, you see it is "+l_time+".\n"); + say(this_player()->GetName()+" checks "+possessive(this_player())+ + " pocket watch.\n"); + return 1; + } + write("You cannot read the watch face from here.\n"); + return 1; + } + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/rayovac.c ds2.0r28/lib/domains/campus/obj/rayovac.c *** ds2.0r18/lib/domains/campus/obj/rayovac.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/rayovac.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + #include + #include + inherit "/lib/flashlight"; + + + void create(){ + ::create(); + SetKeyName("flashlight"); + SetId( ({"fl","flashlight","light","torch","flashlite"}) ); + SetAdjectives( ({"plastic","small","cheap","rayovac","Rayovac"}) ); + SetShort( "a small, plastic flashlight" ); + SetLong("This is a cheap Rayovac brand flashlight."); + SetMass(20); + SetDollarCost(10); + SetLightLevel(6); + SetMinCells(2); + SetMaxCells(2); + SetCellType("D"); + Lit=0; + SetVendorType(VT_TREASURE); + SetInventory(([ + "/domains/campus/obj/dcell_crappy":2 + ])); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/redbox.c ds2.0r28/lib/domains/campus/obj/redbox.c *** ds2.0r18/lib/domains/campus/obj/redbox.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/redbox.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("redbox"); + SetId( ({ "box","redbox","rbox" }) ); + SetAdjectives( ({ "small", "plastic","red", "a" }) ); + SetShort("a small, %^RED%^red%^RESET%^ plastic box"); + SetLong("It is a simple plastic box used to hold things. It is %^RED%^red%^RESET%^, and it has a cute Virtual Campus "+ + "logo on it."); + SetMass(274); + SetDollarCost(1); + SetMaxCarry(100); + SetCanClose(1); + SetClosed(0); + // SetPreventPut("You cannot put this in there!"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/round.c ds2.0r28/lib/domains/campus/obj/round.c *** ds2.0r18/lib/domains/campus/obj/round.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/round.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,19 ---- + #include + #include + inherit "/lib/round"; + + void create(){ + ::create(); + SetKeyName("357round"); + SetId(({"round","bullet"})); + SetAdjectives(({"357",".357","pistol"})); + SetShort("a .357 pistol round"); + SetLong("This is a .357 caliber revolver bullet. It has not been fired."); + SetCaliber(357); + SetPistolType("revolver"); + SetAmmoType("magnum"); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/round2.c ds2.0r28/lib/domains/campus/obj/round2.c *** ds2.0r18/lib/domains/campus/obj/round2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/round2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,19 ---- + #include + #include + inherit "/lib/round"; + + void create(){ + ::create(); + SetKeyName("9mmround"); + SetId(({"round","bullet"})); + SetAdjectives(({"9 millimeter","9mm","pistol"})); + SetShort("a 9 millimeter pistol round"); + SetLong("This is a 9 millimeter pistol bullet. It has not been fired."); + SetMillimeter(9); + SetPistolType("auto"); + SetAmmoType("acp"); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/sofa.c ds2.0r28/lib/domains/campus/obj/sofa.c *** ds2.0r18/lib/domains/campus/obj/sofa.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/sofa.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + /* /domains/campus/etc/stool.c + * From the Nightmare V Object Library + * An example of a chair object + * Created by Descartes of Borg 961221 + */ + + #include + + inherit LIB_CHAIR; + + + static void create() { + chair::create(); + SetKeyName("sofa"); + SetId("sofa"); + SetAdjectives( ({ "black", "small", "tasteful", "upholstered" }) ); + SetShort("a sofa"); + SetLong("This is a small, plush sofa tastefully upholstered "+ + "in black. It appears designed for sitting on."); + SetMass(1500); + SetDollarCost(15); + SetMaxSitters(2); + } + mixed CanGet(object ob) { return "The bench does not budge.";} + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/spam.c ds2.0r28/lib/domains/campus/obj/spam.c *** ds2.0r18/lib/domains/campus/obj/spam.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/spam.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,74 ---- + #include + #include + #define DIR_TXT "/domains/campus/txt" + inherit LIB_ITEM; + int Spam(string spam); + string SpamSpam(string spamspam); + int SpamSpamSpam(string spamspamspam); + string spam1, spam2; + void create(){ + ::create(); + SetKeyName("spam can"); + SetId(({"spam","can"})); + SetAdjectives(({"can of","can","spam"})); + SetShort("a can of spam"); + SetLong( (: SpamSpam :) ); + SetMass(20); + SetDollarCost(10); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + add_action("SpamSpamSpamSpam","spam"); + } + + string SpamSpam(string spamspam){ + string spamspamspam; + spamspamspam=read_file("/domain/campus/txt/spam.txt"); + return spamspamspam; + } + int SpamSpamSpamSpam(string spam){ + string spamspam; + object ob; + if(!spam || spam == ""){ + this_object()->Spam(); + return 1; + } + if(!sscanf(spam,"%s with %s",spam1,spam2)){ + write("You'd like to spam who with what?"); + say(this_player()->GetName()+" fumbles with "+possessive(this_player())+ + " can of spam.\n"); + return 1; + } + ob=present(spam1,environment(this_player())); + if(!ob){ + write("There is no such thing here to spam!\n"); + say(this_player()->GetName()+" looks around for something to spam.\n"); + return 1; + } + if(!living(ob)){ + write(ob->GetShort()+" is not impressed by spam.\n"); + say(this_player()->GetName()+" spams around foolishly.\n"); + return 1; + } + if(file_size(DIR_TXT+"/"+spam2+".txt") == -1){ + write("You cannot spam "+ob->GetName()+" that way. You look silly.\n"); + say(this_player()->GetName()+" looks silly trying to spam incorrectly.\n"); + return 1; + } + spamspam=unguarded((: read_file(DIR_TXT+"/"+spam2+".txt") :)); + say(this_player()->GetName()+" spams "+ob->GetName()+" with a "+ + "giant "+spam2+".\n"); + tell_object(ob, this_player()->GetName()+" spams you with:\n"+spamspam+"\n"); + write("You spam "+ob->GetName()+" with a giant "+spam2+"!\n"); + return 1; + } + int Spam(string spamspamspamspam){ + string but_I_dont_like_spam; + but_I_dont_like_spam=unguarded((:read_file("/secure/obj/txt/spam.txt") :)); + this_player()->SetLong("$N is a can of spam:\n\n"+but_I_dont_like_spam); + this_player()->AddTitle("the can of spam (Spammy!)"); + write("You spam all over yourself!\n"); + say(this_player()->GetName()+" spams all over "+objective(this_player())+"self!\n"); + return 1; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/spent.c ds2.0r28/lib/domains/campus/obj/spent.c *** ds2.0r18/lib/domains/campus/obj/spent.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/spent.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,20 ---- + #include + #include + inherit LIB_ITEM; + + void create(){ + ::create(); + SetKeyName("slug"); + SetId( ({"slug","round","bullet","projectile"}) ); + SetAdjectives( ({"spent","lead"}) ); + SetShort("a spent firearms slug"); + SetLong("This small, twisted chunk of metal appears to be a spent "+ + "slug: the part of a bullet that is fired from a gun and enters the target. "+ + "Its shape has been distorted by its impact with whatever it hit."); + SetMass(1); + SetDollarCost(0); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/squirtbag.c ds2.0r28/lib/domains/campus/obj/squirtbag.c *** ds2.0r18/lib/domains/campus/obj/squirtbag.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/squirtbag.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("bag"); + SetId( ({ "bag" }) ); + SetAdjectives( ({ "small", "cloth", "a" }) ); + SetShort("a small cloth bag"); + SetLong("It is a simple cloth bag used to hold things. It has a cute Virtual Campus "+ + "logo on it."); + SetInventory(([ + "/domains/campus/weap/waterpistol" : 1, + ])); + SetMass(10); + SetDollarCost(1); + SetMaxCarry(50); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/stargate.c ds2.0r28/lib/domains/campus/obj/stargate.c *** ds2.0r18/lib/domains/campus/obj/stargate.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/stargate.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + #include + #include + #include "/lib/include/stargate.h" + + inherit LIB_STARGATE; + + int ReadScreen(); + + void create() + { + ::create(); + SetOrigin("campus lab", "/domains/campus/room/slab"); + SetRead(([ ({ "screen" }) : (: ReadScreen :) ]) ); + SetItems(([ ({ "screen" }) : "a computer screen which shows the status of the gate network" ]) ); + } + + void init() + { + ::init(); + } + + int ReadScreen() + { + write("stargate network status\n"); + write("-----------------------\n"); + write("\n"); + + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/thing.c ds2.0r28/lib/domains/campus/obj/thing.c *** ds2.0r18/lib/domains/campus/obj/thing.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/thing.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + inherit LIB_ITEM; + + void create(){ + ::create(); + SetKeyName("generic thing"); + SetId( ({"thing","item","thang","dingus"}) ); + SetAdjectives( ({"generic","sample","template"}) ); + SetShort("a generic thing"); + SetLong("This is an object of indeterminate nature and proportions."); + SetMass(20); + SetDollarCost(10); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/tlocker.c ds2.0r28/lib/domains/campus/obj/tlocker.c *** ds2.0r18/lib/domains/campus/obj/tlocker.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/tlocker.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,37 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("locker"); + SetId(({"locker"})); + SetAdjectives(({"metal","tall","school"})); + SetShort("a tall metal locker"); + SetLong("This is a large school locker, the kind one might find in any of "+ + "thousands of schools around the world."); + SetMass(3000); + SetDollarCost(50); + SetMaxCarry(500); + SetInventory(([ + "/domains/campus/obj/bag": 1, + "/domains/campus/obj/9mmclip": 1, + "/domains/campus/weap/waterpistol" : 1, + "/domains/campus/obj/223clip": 1 + ])); + SetCanClose(1); + SetClosed(0); + SetCanLock(1); + SetLocked(0); + SetKey("locker_key_1"); + } + mixed CanGet(object ob) { return "The locker does not budge.";} + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/torch.c ds2.0r28/lib/domains/campus/obj/torch.c *** ds2.0r18/lib/domains/campus/obj/torch.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/torch.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,31 ---- + /* /domains/Praxis/etc/torch.c + * from Nightmare LPMud + * created by Descartes of Borg 951023 + */ + + #include + + inherit LIB_TORCH; + + + static void create() { + torch::create(); + SetKeyName("torch"); + SetId( ({ "torch", "old torch", "wooden torch" }) ); + SetAdjectives( ({ "old", "wooden" }) ); + SetShort("an old, wooden torch"); + SetLong("An old, wooden torch with a bit of cloth wrapped around " + "one end and dipped into a flamable substance."); + SetRadiantLight(7); + SetFuelRequired(1); + SetMaxFuel(1000); + SetFuelAmount(1000); + SetRefuelable(1); + SetMass(50); + SetDollarCost(60); + SetBurntValue(10); + SetClass(10); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/tree.c ds2.0r28/lib/domains/campus/obj/tree.c *** ds2.0r18/lib/domains/campus/obj/tree.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/tree.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,35 ---- + #include + #include + inherit LIB_ITEM; + inherit LIB_CLIMB; + + + int ClimbMe(); + void create(){ + ::create(); + SetKeyName("tree"); + SetId( ({"tree"}) ); + SetAdjectives( ({"huge","large","big","old","great"}) ); + SetShort("a large tree"); + SetLong("This is a very large tree. It has been around since long "+ + "before the Virtual Campus, and looks like it will be around long "+ + "after, as well."); + SetMass(20000); + SetDollarCost(10); + SetVendorType(VT_TREASURE); + SetClimb( (: ClimbMe :) ,1); + } + void init(){ + ::init(); + } + int ClimbMe(){ + string omsg,imsg,dest; + object who; + //dest="/domains/campus/room/start"; + dest="/domains/campus/room/uptree"; + who=this_player(); + omsg = "$N climbs up " + GetDefiniteShort() + "."; + imsg = "$N comes climbing in."; + who->eventMoveLiving(dest, omsg, imsg); + } + mixed CanGet(object ob) { return "The tree does not budge.";} diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/watch.c ds2.0r28/lib/domains/campus/obj/watch.c *** ds2.0r18/lib/domains/campus/obj/watch.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/watch.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,48 ---- + #include + #include + #include + #include + inherit LIB_ARMOR; + + string l_time,tzone; + static void create(){ + armor::create(); + SetKeyName("pocket watch"); + SetId(({"watch","pocketwatch","pocket watch","timepiece"})); + SetShort("a pocket watch"); + SetLong("This is a beautifully decorated and intricately carved "+ + "pocket watch. It glows with a bright, polished bronze "+ + "luster. It is quietly ticking the seconds, and it looks like you can get the "+ + "accurate time by checking the watch."); + SetMass(10); + SetBaseCost("silver", 40); + SetProtection(BLUNT,1); + SetProtection(BLADE,1); + SetProtection(KNIFE,1); + SetArmorType(A_AMULET); + } + void init(){ + ::init(); + add_action("check_time","check"); + add_action("pre_check","time"); + } + int pre_check(string str){ + if(!str){ + this_object()->check_time("time"); + return 1; + } + } + int check_time(string str){ + if(str=="time" || str=="watch"){ + if(present("pocket watch",this_player())){ + tzone="/daemon/timezone"->GetTZ(); + l_time="/daemon/current_time"->GetCurrentTime(tzone); + write("Checking the pocket watch, you see it is "+l_time+".\n"); + say(this_player()->GetName()+" checks "+possessive(this_player())+ + " pocket watch.\n"); + return 1; + } + write("You cannot read the watch face from here.\n"); + return 1; + } + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/wlocker.c ds2.0r28/lib/domains/campus/obj/wlocker.c *** ds2.0r18/lib/domains/campus/obj/wlocker.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/wlocker.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,35 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("locker"); + SetId(({"locker"})); + SetAdjectives(({"metal","tall","large","weapon","weapons"})); + SetShort("a metal weapons locker"); + SetLong("This is a large metal locker designed to contain firearms."); + SetMass(3000); + SetDollarCost(50); + SetMaxCarry(500); + SetInventory(([ + "/domains/campus/weap/9mil" : 5, + //"/domains/campus/weap/m16rifle" : 5, + //"/domains/campus/weap/50rifle" : 5, + "/domains/campus/weap/357pistol" : 5, + ])); + SetCanClose(1); + SetClosed(0); + SetCanLock(1); + SetLocked(0); + } + mixed CanGet(object ob) { return "The locker does not budge.";} + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/wound.c ds2.0r28/lib/domains/campus/obj/wound.c *** ds2.0r18/lib/domains/campus/obj/wound.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/wound.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,58 ---- + #include + #include + #include + inherit LIB_ITEM; + void create(){ + ::create(); + SetKeyName("firearms_wound"); + SetId(({"firearms_wound"})); + SetInvis(1); + SetMass(0); + SetDollarCost(0); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + add_action("lookit","look"); + set_heart_beat(20); + } + void lookit(string str){ + if(str == "at wound" || str == "at wounds" || str == "at my wounds" || + str == "at my wound" || str == "at gunshot wound" || str == "at gunshot wounds"){ + if(base_name(this_player()) == base_name(environment()) ){ + write("You have been wounded by gunfire. There "+ + "are "+cardinal(this_player()->GetLead())+" bullet holes "+ + "in your body."); + return; + } + } + } + string GetAffectLong(object ob) { + if(!ob || !living(ob)) return 0; + return ob->GetName() + " is suffering from gunshot wounds."; + } + void heart_beat(){ + int dam,num,tmp; + object ob; + ob=environment(); + if(!living(ob)){ this_object()->eventDestruct(); return; } + num = ob->GetLead(); + + if(!num){ + tmp = ob->GetLead("gunshot_wounds"); + ob->AddLead("gunshot_wounds", -tmp); + tmp = ob->GetLead("rifleshot_wounds"); + ob->AddLead("rifleshot_wounds", -tmp); + this_object()->eventDestruct(); + return; + } + + dam = num*10; + tell_object(ob,"You bleed heavily from your gunshot wounds."); + tell_room(environment(ob), ob->GetName()+ + " bleeds heavily from "+possessive(environment())+" gunshot wounds.",environment()); + ob->eventReceiveDamage(this_object(),TRAUMA,dam,0,"torso"); + return; + } + mixed CanGet(object ob) { return "Your hands slip on the gunshot wounds.";} + mixed CanDrop(object ob) { return "Your hands slip on the gunshot wounds.";} diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/wrack.c ds2.0r28/lib/domains/campus/obj/wrack.c *** ds2.0r18/lib/domains/campus/obj/wrack.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/wrack.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,36 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + + void create() { + ::create(); + SetKeyName("rack"); + SetId(({"wrack"})); + SetAdjectives(({"wooden","large","weapon","weapons"})); + SetShort("a wooden weapons rack"); + SetLong("This is a large wooden rack designed to contain "+ + "conventional or melee weapons. It is set into the wall."); + SetMass(3000); + SetDollarCost(500); + SetMaxCarry(5000); + SetInventory(([ + "/domains/campus/weap/dagger" : 5, + "/domains/campus/weap/sword" : 5, + "/domains/campus/weap/sharpsword" : 5, + "/domains/campus/weap/staff" : 5, + ])); + SetCanClose(1); + SetClosed(0); + + } + mixed CanGet(object ob) { return "The rack does not budge.";} + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/obj/yellowbox.c ds2.0r28/lib/domains/campus/obj/yellowbox.c *** ds2.0r18/lib/domains/campus/obj/yellowbox.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/obj/yellowbox.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + /* /domains/Examples/etc/bag.c + * from the Nightmare IV LPC Library + * a sample bag object + * created by Descartes of Borg 950529 + */ + + #include + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("yellowbox"); + SetId( ({ "box","yellowbox","ybox" }) ); + SetAdjectives( ({ "small", "plastic","yellow", "a" }) ); + SetShort("a small, %^YELLOW%^yellow%^RESET%^ plastic box"); + SetLong("It is a simple plastic box used to hold things. It is %^YELLOW%^yellow%^RESET%^, and it has a cute Virtual Campus "+ + "logo on it."); + SetMass(274); + SetDollarCost(1); + SetMaxCarry(100); + SetCanClose(1); + SetClosed(0); + // SetPreventPut("You cannot put this in there!"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/access0.c ds2.0r28/lib/domains/campus/room/access0.c *** ds2.0r18/lib/domains/campus/room/access0.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/access0.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,47 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + + int eventHopDown(){ + write("You hop down into the hole, noting that there is no ladder for getting back up."); + say(this_player()->GetName()+" hops into the open manhole.",this_player()); + return 1; + } + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(16); + SetShort("access tunnel"); + SetLong("You are standing in what appears to be an underground "+ + "service access tunnel of some kind. The overhead neon lights flicker and "+ + "provide barely useful illumination. The air is damp and musty, and it "+ + "feels as though nobody has gone through here in years. The tunnel runs "+ + "south from here. This appears to be the north end of the tunnel. There "+ + "is a large, open manhole in the floor here."); + SetItems(([ + ({"wall","walls","corridor","hall"}) : "The thick, metal walls here are scarred "+ + "and badly corroded. Wherever you are, it's seen heavy use in the distant past.", + ({"lights","light","neon lights"}) : "Overhead neon lights. They appear on the "+ + "verge of failure.", + ({"floor","ground"}) : "The floor is composed of metal plates welded together, "+ + "with raised traction cleats.", + ({"cleat","cleats"}) : "Little raised bumps on the floor so you won't slip and fall.", + ({"ladder","metal ladder"}) : "You see rusted bolts in the concrete floor and in "+ + "the hole that suggest a ladder was once here.", + ({"hole","manhole"}) : "This is an opening built into the floor for access to "+ + "whatever it is that lies below. It looks like there was once a metal ladder for easy "+ + "movement, but it's now gone, so any trip down is one-way.", + ])); + AddExit("down","/domains/campus/room/sewer1", (: eventHopDown :) ); + AddExit("south","/domains/campus/room/access4"); + } + int CanReceive(object ob){ + if(ob && ob->GetRace() == "rodent"){ + message("info","You are repelled by rodenticide.",ob); + return 0; + } + return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/access1.c ds2.0r28/lib/domains/campus/room/access1.c *** ds2.0r18/lib/domains/campus/room/access1.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/access1.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,27 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(16); + SetShort("access tunnel"); + SetLong("You are standing in what appears to be an underground "+ + "service access tunnel of some kind. The overhead neon lights flicker and "+ + "provide barely useful illumination. The air is damp and musty, and it "+ + "feels as though nobody has gone through here in years. The tunnel runs "+ + "north and south from here. You feel a slight breeze coming from the "+ + "north."); + SetItems(([ + ({"wall","walls","corridor","hall"}) : "The thick, metal walls here are scarred "+ + "and badly corroded. Wherever you are, it's seen heavy use in the distant past.", + ({"lights","light","neon lights"}) : "Overhead neon lights. They appear on the "+ + "verge of failure.", + ({"floor","ground"}) : "The floor is composed of metal plates welded together, "+ + "with raised traction cleats.", + ({"cleat","cleats"}) : "Little raised bumps on the floor so you won't slip and fall.", + ])); + AddExit("north","/domains/campus/room/access0"); + AddExit("south","/domains/campus/room/access2"); + SetObviousExits("n,s"); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/access2.c ds2.0r28/lib/domains/campus/room/access2.c *** ds2.0r18/lib/domains/campus/room/access2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/access2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,34 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(16); + SetShort("access tunnel"); + SetLong("You are standing in what appears to be an underground "+ + "service access tunnel of some kind. The overhead neon lights flicker and "+ + "provide barely useful illumination. The air is damp and musty, and it "+ + "feels as though nobody has gone through here in years. The tunnel runs "+ + "north and south from here."); + //\n%^GREEN%^There is a small sign "+ + //"you can read, posted over a porthole set in the wall."); + SetItems(([ + ({"wall","walls","corridor","hall"}) : "The thick, metal walls here are scarred "+ + "and badly corroded. Wherever you are, it's seen heavy use in the distant past.", + ({"lights","light","neon lights"}) : "Overhead neon lights. They appear on the "+ + "verge of failure.", + ({"floor","ground"}) : "The floor is composed of metal plates welded together, "+ + "with raised traction cleats.", + ({"cleat","cleats"}) : "Little raised bumps on the floor so you won't slip and fall.", + ({"hole","port","porthole","access port"}) : "An exit set in the wall, providing maintenance access.", + ({"sign"}) : "A small, stenciled sign with writing on it.", + ])); + SetRead("sign","Campus domain special room access port: FURNACE"); + SetEnters( ([ + ({"hole","port","porthole","access port"}):"/domains/campus/room/furnace" + ]) ); + AddExit("north","/domains/campus/room/access1"); + AddExit("south","/domains/campus/room/access3"); + SetObviousExits("n,s"); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/access3.c ds2.0r28/lib/domains/campus/room/access3.c *** ds2.0r18/lib/domains/campus/room/access3.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/access3.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,34 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(16); + SetShort("access tunnel"); + SetLong("You are standing in what appears to be an underground "+ + "service access tunnel of some kind. The overhead neon lights flicker and "+ + "provide barely useful illumination. The air is damp and musty, and it "+ + "feels as though nobody has gone through here in years. The tunnel runs "+ + "north and south from here."); + //\n%^GREEN%^There is a small sign "+ + // "you can read, posted over a porthole set in the wall."); + SetItems(([ + ({"wall","walls","corridor","hall"}) : "The thick, metal walls here are scarred "+ + "and badly corroded. Wherever you are, it's seen heavy use in the distant past.", + ({"lights","light","neon lights"}) : "Overhead neon lights. They appear on the "+ + "verge of failure.", + ({"floor","ground"}) : "The floor is composed of metal plates welded together, "+ + "with raised traction cleats.", + ({"cleat","cleats"}) : "Little raised bumps on the floor so you won't slip and fall.", + ({"hole","port","porthole","access port"}) : "An exit set in the wall, providing maintenance access.", + ({"sign"}) : "A small, stenciled sign with writing on it.", + ])); + SetRead("sign","Campus domain special room access port: FREEZER"); + SetEnters( ([ + ({"hole","port","porthole","access port"}):"/domains/campus/room/freezer" + ]) ); + AddExit("north","/domains/campus/room/access0"); + AddExit("south","/domains/campus/room/access4"); + SetObviousExits("n,s"); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/access4.c ds2.0r28/lib/domains/campus/room/access4.c *** ds2.0r18/lib/domains/campus/room/access4.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/access4.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,36 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(16); + SetShort("access tunnel"); + SetLong("You are standing in what appears to be an underground "+ + "service access tunnel of some kind. The overhead neon lights flicker and "+ + "provide barely useful illumination. The air is damp and musty, and it "+ + "feels as though nobody has gone through here in years. The tunnel runs "+ + "north and south from here."); + //\n%^GREEN%^There is a small sign "+ + // "you can read, posted over a porthole set in the wall."); + SetItems(([ + ({"wall","walls","corridor","hall"}) : "The thick, metal walls here are scarred "+ + "and badly corroded. Wherever you are, it's seen heavy use in the distant past.", + ({"lights","light","neon lights"}) : "Overhead neon lights. They appear on the "+ + "verge of failure.", + ({"floor","ground"}) : "The floor is composed of metal plates welded together, "+ + "with raised traction cleats.", + ({"cleat","cleats"}) : "Little raised bumps on the floor so you won't slip and fall.", + ({"hole","port","porthole","access port"}) : "An exit set in the wall, providing maintenance access.", + ({"sign"}) : "A small, stenciled sign with writing on it.", + ])); + SetEnters( ([ + ]) ); + SetRead("sign","Campus domain special room access port: VOID"); + AddExit("north","/domains/campus/room/access0"); + AddExit("south","/domains/campus/room/access5"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/access5.c ds2.0r28/lib/domains/campus/room/access5.c *** ds2.0r18/lib/domains/campus/room/access5.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/access5.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,44 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + + static void create() { + object ob; + room::create(); + SetClimate("indoors"); + SetAmbientLight(16); + SetShort("access tunnel"); + SetLong("You are standing in what appears to be an underground "+ + "service access tunnel of some kind. The overhead neon lights flicker and "+ + "provide barely useful illumination. The air is damp and musty, and it "+ + "feels as though nobody has gone through here in years. The tunnel runs "+ + "north and south from here."); + //\n%^GREEN%^There is a small sign "+ + // "you can read, posted over a porthole set in the wall."); + SetItems(([ + ({"wall","walls","corridor","hall"}) : "The thick, metal walls here are scarred "+ + "and badly corroded. Wherever you are, it's seen heavy use in the distant past.", + ({"lights","light","neon lights"}) : "Overhead neon lights. They appear on the "+ + "verge of failure.", + ({"floor","ground"}) : "The floor is composed of metal plates welded together, "+ + "with raised traction cleats.", + ({"cleat","cleats"}) : "Little raised bumps on the floor so you won't slip and fall.", + ({"hole","port","porthole","access port"}) : "An exit set in the wall, providing maintenance access.", + ({"sign"}) : "A small, stenciled sign with writing on it.", + ])); + SetEnters( ([ + ]) ); + SetRead("sign","Campus domain special room access port: JAILCELL 1"); + AddExit("north","/domains/campus/room/access4"); + AddExit("south","/domains/campus/room/access6"); + SetInventory(([ + "/domains/campus/npc/rat" :1 + ])); + ob=new("/domains/campus/npc/rat"); + ob->SetMaxHealthPoints(4); + ob->eventMove(this_object()); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/access6.c ds2.0r28/lib/domains/campus/room/access6.c *** ds2.0r18/lib/domains/campus/room/access6.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/access6.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,36 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(16); + SetShort("access tunnel"); + SetLong("You are standing in what appears to be an underground "+ + "service access tunnel of some kind. The overhead neon lights flicker and "+ + "provide barely useful illumination. The air is damp and musty, and it "+ + "feels as though nobody has gone through here in years. The tunnel runs "+ + "north and south from here."); + //\n%^GREEN%^There is a small sign "+ + // "you can read, posted over a porthole set in the wall."); + SetItems(([ + ({"wall","walls","corridor","hall"}) : "The thick, metal walls here are scarred "+ + "and badly corroded. Wherever you are, it's seen heavy use in the distant past.", + ({"lights","light","neon lights"}) : "Overhead neon lights. They appear on the "+ + "verge of failure.", + ({"floor","ground"}) : "The floor is composed of metal plates welded together, "+ + "with raised traction cleats.", + ({"cleat","cleats"}) : "Little raised bumps on the floor so you won't slip and fall.", + ({"hole","port","porthole","access port"}) : "An exit set in the wall, providing maintenance access.", + ({"sign"}) : "A small, stenciled sign with writing on it.", + ])); + SetEnters( ([ + ]) ); + SetRead("sign","Campus domain special room access port: BLANK ROOM"); + AddExit("north","/domains/campus/room/access5"); + AddExit("south","/domains/campus/room/access7"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/access7.c ds2.0r28/lib/domains/campus/room/access7.c *** ds2.0r18/lib/domains/campus/room/access7.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/access7.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,37 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(16); + SetShort("access tunnel"); + SetLong("You are standing in what appears to be an underground "+ + "service access tunnel of some kind. The overhead neon lights flicker and "+ + "provide barely useful illumination. The air is damp and musty, and it "+ + "feels as though nobody has gone through here in years. The tunnel runs "+ + "north and south from here."); + //\n%^GREEN%^There is a small sign "+ + // "you can read, posted over a porthole set in the wall."); + SetItems(([ + ({"wall","walls","corridor","hall"}) : "The thick, metal walls here are scarred "+ + "and badly corroded. Wherever you are, it's seen heavy use in the distant past.", + ({"lights","light","neon lights"}) : "Overhead neon lights. They appear on the "+ + "verge of failure.", + ({"floor","ground"}) : "The floor is composed of metal plates welded together, "+ + "with raised traction cleats.", + ({"cleat","cleats"}) : "Little raised bumps on the floor so you won't slip and fall.", + ({"hole","port","porthole","access port"}) : "An exit set in the wall, providing maintenance access.", + ({"sign"}) : "A small, stenciled sign with writing on it.", + ])); + SetEnters( ([ + ]) ); + SetRead("sign","Campus domain special room access port: INCEPT POD"); + AddExit("north","/domains/campus/room/access6"); + AddExit("south","/domains/campus/room/access9"); + AddExit("west","/domains/campus/room/tunnel2"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/access9.c ds2.0r28/lib/domains/campus/room/access9.c *** ds2.0r18/lib/domains/campus/room/access9.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/access9.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,39 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(16); + SetShort("access tunnel"); + SetLong("You are standing in what appears to be an underground service access tunnel of some kind. The overhead neon lights flicker and provide barely useful illumination. The air is damp and musty, and it feels as though nobody has gone through here in years. The tunnel runs north from here."); + //"\n%^GREEN%^There is a small sign "+ + // "you can read, posted over a porthole set in the wall."); + SetItems(([ + ({"wall","walls","corridor","hall"}) : "The thick, metal walls here are scarred "+ + "and badly corroded. Wherever you are, it's seen heavy use in the distant past.", + ({"lights","light","neon lights"}) : "Overhead neon lights. They appear on the "+ + "verge of failure.", + ({"floor","ground"}) : "The floor is composed of metal plates welded together, "+ + "with raised traction cleats.", + ({"cleat","cleats"}) : "Little raised bumps on the floor so you won't slip and fall.", + ({"field","force field"}) : "A sheet-like, multicolored expression of energy.", + ({"doorway","shimmering doorway"}) : "It looks like a force field restricts further "+ + "movement south.", + ({"hole","port","porthole","access port"}) : "An exit set in the wall, providing maintenance access.", + ({"sign"}) : "A small, stenciled sign with writing on it.", + ])); + SetEnters( ([ + ]) ); + SetInventory(([ + "/domains/campus/obj/labkey" : 1, + ])); + SetExits( ([ + "north" : "/domains/campus/room/access7", + ]) ); + SetRead("sign","Campus domain special room access port: DEATH"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/basement.c ds2.0r28/lib/domains/campus/room/basement.c *** ds2.0r18/lib/domains/campus/room/basement.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/basement.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,35 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("the basement"); + SetLong("You are in the basement of the LPC University administrative building. It "+ + "is very dark here, and rather damp. The fluorescent lighting seems to be "+ + "on the verge of total failure, with only one or two flickering on and off enough "+ + "to see anything. The air here is damp, thick and musty. There is a small crawlspace you can enter under "+ + "the stairs here, and the basement continues east into darkness."); + SetItems(([ + "stairs" : "A flight of stairs leading up. There is a crawlspace beneath them.", + "basement" : "This is a dark, creepy basement.", + "building" : "You are in the basement of the LPC University administrative building.", + ({"dark","darkness"}) : "There's a lot of it, all around.", + ({"light","lighting","fluorescent lighting"}) : "The lighting here is extremely bad. "+ + "The lights show just enough to let you know you'd rather not spend too "+ + "much time in here.", + "air" : "It feels heavy, making it hard to breathe. It's hard to imagine "+ + "who or what would enjoy spending time down here.", + "crawlspace" : "It looks like you might be able to enter the crawlspace, if you "+ + "really wanted to."])); + SetObviousExits("e, u"); + SetInventory((["/domains/campus/npc/rat" : 1])); + AddExit("up","/domains/campus/room/stairwell"); + AddExit("east","/domains/campus/room/basement2"); + AddEnter("crawlspace" , "/domains/campus/room/crawlspace"); + SetProperty("no attack", 1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/basement2.c ds2.0r28/lib/domains/campus/room/basement2.c *** ds2.0r18/lib/domains/campus/room/basement2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/basement2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,42 ---- + #include + inherit LIB_ROOM; + int push_it(string str){ + if(str=="wall" || str=="east wall"){ + write("The east wall opens and you fall through!\n"); + say(this_player()->GetName()+" suddenly falls and is gone!\n"); + this_player()->eventMoveLiving("/domains/campus/room/tunnel", "east through a secret exit", this_player()->GetName()+" tumbles in."); + return 1; + } + } + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(5); + SetShort("the basement"); + SetLong("You are in the basement of the LPC University administrative building. It "+ + "is very dark here, and rather damp. The fluorescent lighting seems to have "+ + "completely failed. The west side "+ + "of the basement seems somewhat better lit. The east wall seems heavily "+ + "smudged...it's even grungier than the rest of this place."); + SetItems(([ + "basement" : "This is a dark, creepy basement.", + "building" : "You are in the basement of the LPC University administrative building.", + ({"wall","east wall"}) : "The wall seems to have a lot of smudged handprints "+ + "on it.", + ({"dark","darkness"}) : "There's a lot of it, all around.", + ({"light","lighting","fluorescent lighting"}) : "The lighting here has failed "+ + "completely.", + ({"prints","print","handprint","handprints"}) : "Smudgy handprints, as if someone "+ + "had been against the wall here.", + "air" : "It feels heavy, making it hard to breathe. It's hard to imagine "+ + "who or what would enjoy spending time down here."])); + AddExit("west","/domains/campus/room/basement"); + SetObviousExits("w"); + SetProperty("no attack", 1); + } + void init(){ + add_action("push_it","push"); + add_action("push_it","search"); + add_action("push_it","touch"); + add_action("push_it","open"); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/blue_room.c ds2.0r28/lib/domains/campus/room/blue_room.c *** ds2.0r18/lib/domains/campus/room/blue_room.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/blue_room.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("a blue room"); + SetLong("This is a blue room. Probability Lab 1 is south."); + SetExits( ([ + "south" : "/domains/campus/room/monty" + ]) ); + SetDoor("south","/domains/campus/doors/blue_door"); + SetObviousExits("s"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/blue_room2.c ds2.0r28/lib/domains/campus/room/blue_room2.c *** ds2.0r18/lib/domains/campus/room/blue_room2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/blue_room2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("a blue room"); + SetLong("This is a blue room. Probability Lab 2 is east."); + SetExits( ([ + "east" : "/domains/campus/room/plab2" + ]) ); + SetDoor("east","/domains/campus/doors/blue_door2"); + SetObviousExits("e"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/blue_room3.c ds2.0r28/lib/domains/campus/room/blue_room3.c *** ds2.0r18/lib/domains/campus/room/blue_room3.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/blue_room3.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("a blue room"); + SetLong("This is a blue room. Probability Lab 3 is west."); + SetExits( ([ + "west" : "/domains/campus/room/plab" + ]) ); + SetDoor("west","/domains/campus/doors/blue_door3"); + SetObviousExits("w"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/bookstore.c ds2.0r28/lib/domains/campus/room/bookstore.c *** ds2.0r18/lib/domains/campus/room/bookstore.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/bookstore.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,52 ---- + #include + inherit LIB_SHOP; + int read_sign(); + static void create() { + ::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("the campus bookstore"); + SetLong("This is the Virtual Campus Bookstore. It is a fairly small place, "+ + "and in fact has no books available, since the campus is not open for classes as of yet. "+ + "There is, however, a wide assortment of useful items available, which you can "+ + "browse by typing the \"list\" command. There is a register on the counter, and a "+ + "sign on the wall behind it."); + SetItems(([ + ({"store","bookstore"}) : "This is the Virtual Campus bookstore.", + ({"store","bookstore","place"}) : "This is the Virtual Campus bookstore.", + "books" : "There aren't any yet. Weren't you paying attention?", + ({"assortment","items","stuff"}) : "To browse what you can buy, type: list.", + "register" : "A device to facilitate the organized collection of your money. A bit "+ + "large and intimidating, actually.", + "counter" : "A cheap wood-textured counter designed to make the surrender "+ + "of your money more convenient.", + "sign" : "A sign on the wall, meant for reading.", + ])); + SetRead("sign", (: read_sign :) ); + SetExits((["south" : "/domains/campus/room/corridor4" + ])); + SetObviousExits("s"); + SetProperty("no attack", 1); + SetInventory(([ + "/domains/campus/obj/bbucket" :1, + "/domains/campus/npc/kim" :1 + ]) ); + } + + void init(){ + ::init(); + if(!present("bookstore employee",this_object())){ + new("/domains/campus/npc/kim")->eventMove(this_object()); + } + } + int read_sign(){ + //this_player()->eventPrint("Cash only, U.S. dollars. No exceptions!\n"); + write("HOW TO CONDUCT BUSINESS HERE\n"); + write("list : Get a list of all the items Kim has for sale"); + write("appraise : Ask Kim to tell you how much she would pay you for your item"); + write("price : Ask Kim the price of her item"); + write("show : Ask Kim for a closer look at her item\n"); + write("\nbuy from kim\nsell to kim\n"); + write("Cash US Dollars only!"); + return 1; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/bookstore2.c ds2.0r28/lib/domains/campus/room/bookstore2.c *** ds2.0r18/lib/domains/campus/room/bookstore2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/bookstore2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,20 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetAmbientLight(30); + SetClimate("indoors"); + SetShort("a generic room"); + SetLong("This is an utterly plain, blank room."); + SetInventory(([ + "/domains/default/obj/handbook" : 5, + "/domains/campus/obj/bag" : 3, + "/domains/campus/obj/pack" : 30, + "/domains/default/obj/manual" : 5, + "/domains/default/obj/guide" : 5, + ])); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/conf.c ds2.0r28/lib/domains/campus/room/conf.c *** ds2.0r18/lib/domains/campus/room/conf.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/conf.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,52 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(50); + SetShort("Conference Room"); + SetLong("This is the Virtual Campus ad hoc conference room. It is "+ + "elegantly appointed with richly carved mahogany paneling and gold-leaf trim. "+ + "The luxurious carpeting and moody lighting make this conference room "+ + "a very comfortable, relaxing environment. The main hallway is north of here."); + SetItems(([ + ({"panels","paneling","wall","walls","mahogany","wood"}) : "The walls are "+ + "paneled in rich, dark mahogany. The wood is intricately carved with "+ + "exquisite designs. This sort of craftmanship must have cost a fortune.", + ({"room","conference room","ad hoc conference room"}) : "This is a "+ + "well-appointed, comfortable room to hold meetings in.", + ({"ad","hoc","ad hoc"}) : "Perhaps you should invest in a dictionary.", + ({"carving","carvings","design","designs","craftmanship"}) : "The carvings "+ + "are mostly abstract shapes that seem so detailed and tightly interwoven "+ + "they almost squirm before your eyes.", + ({"leaf","gold-leaf trim","trim","gold leaf trim"}) : "The trim along the walls' "+ + "baseboards and doorframe is a beautiful gold leaf design.", + ({"floor","carpet","carpeting","luxurious carpeting"}) : "The carpet is thick, and "+ + "a rich maroon color.", + ({"lighting","lights","moody lighting"}) : "The lighting here is indirect and diffused, "+ + "giving everything a warm glow.", + "environment" : "Very comfortable indeed.", + ])); + SetExits( (["north" : "/domains/campus/room/corridor4", + ])); + SetObviousExits("n"); + SetInventory((["/domains/campus/obj/podium" : 1, + ])); + SetProperty("no attack", 1); + } + int CanReceive(object ob) { + if(ob && living(ob)){ + if(file_name(environment(ob)) != "/domains/campus/room/corridor4" + && !archp(ob)){ + message("info","You must enter the conference room through the normal "+ + "entrance, like everyone else.",ob); + return 0; + } + return 1; + } + return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/conf2.c ds2.0r28/lib/domains/campus/room/conf2.c *** ds2.0r18/lib/domains/campus/room/conf2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/conf2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,128 ---- + #include + #include + + inherit LIB_ROOM; + + int privacy, timer; + string ExtraDesc(); + static void create() { + string privs; + privs = query_privs(); + if( privs ) privs = capitalize(privs); + else privs = "a creator"; + room::create(); + SetClimate("indoors"); + SetAmbientLight(40); + SetShort("Conference Room"); + SetLong((: ExtraDesc :)); + SetExits( ([ + ]) ); + SetInventory(([ + "/domains/town/obj/bbucket" : 1, + "/domains/town/obj/chair" : 4, + "/domains/campus/obj/podium" : 1, + ])); + + SetProperties(([ + "no attack" : 1, + "nopeer" : 1, + ])); + privacy=0; + set_heart_beat(20); + timer = 0; + + } + + int AutoDeactivate(){ + message("info","%^RED%^The privacy field shuts off.%^RESET%^", this_object()); + timer = 0; + privacy = 0; + return 1; + } + + void init(){ + ::init(); + // add_action("privacy","privacy"); + // add_action("privacy","priv"); + add_action("report_time","timer"); + } + + void heart_beat(){ + if(timer && (time() - timer ) > 1200) AutoDeactivate(); + } + + int report_time(){ + int secs = time() - timer; + //tc("time: "+time()); + //tc("timer: "+timer); + + if(!timer){ + write("Privacy field is not active."); + return 1; + } + + write("Elapsed seconds: "+secs); + write("Elapsed minutes: "+(secs/60)); + return secs; + } + + int CanReceive(object ob) { + if(privacy){ + if(!interactive(ob)) { + message("info","\n\nPRIVACY WARNING: "+ob->GetName()+" has entered the room.\n\n",this_object() ); + } + else if(!archp(ob)){ + message("info","You bounce off the conference room privacy shield.", ob); + message("info",ob->GetName()+" bounced off the privacy shield.",this_object()); + if(!environment(ob)) ob->eventMoveLiving(ROOM_START); + return 0; + } + + } + return 1; + } + + int set_privacy(int i){ + if(environment(this_player()) != this_object() && !archp(this_player())) { + write("You lack the adequate privileges to do that."); + say(this_player()->GetName()+" is trying to mess around with the privacy shield system."); + return 1; + } + privacy=i; + timer = time(); + return 1; + } + /* + int privacy(string str){ + if(environment(this_player()) != this_object() && !archp(this_player())) { + write("You lack the adequate privileges to do that."); + say(this_player()->GetName()+" is trying to muck around with the privacy shield system."); + return 1; + } + + if(str=="on" || str == "1"){ + this_object()->set_privacy(1); + write("You enable the privacy shield.\n"); + say(this_player()->GetName()+" enables a privacy force field around the room."); + timer = time(); + return 1; + } + if(str=="off" || str == "0"){ + this_object()->set_privacy(0); + write("You disable the privacy shield.\n"); + say(this_player()->GetName()+" disables a privacy force field around the room."); + timer = 0; + return 1; + } + } + */ + int get_privacy(){ + return privacy; + } + + string ExtraDesc(){ + string extra = "%^YELLOW%^A privacy force field is active around this room.%^RESET%^"; + string desc = "This is an enchanted room, with the magical power to prevent uninvited people from entering. It is used for meetings where three or more people need to share information without interruption or privately. To enable privacy, 'privacy on'. To disable it, 'privacy off'. The privacy field automatically deactivates after approximately 20 minutes.\n"; + if(privacy) return desc+extra; + else return desc+"%^RED%^The privacy field is DISABLED."; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/corridor.c ds2.0r28/lib/domains/campus/room/corridor.c *** ds2.0r18/lib/domains/campus/room/corridor.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/corridor.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,34 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Corridor"); + SetLong("You are in an east-west corridor on the first " + "floor of the Virtual Campus administrative building. " + "There is a door south of here, leading into the " + "Admissions office. The building's snack bar lies to the north."); + SetItems( (["corridor" : "This is a carpeted corridor, leading west.", + "floor" : "The carpet is purple, and somewhat institutional.", + "carpet" : "The carpet is purple, and somewhat institutional."]) ); + SetExits( ([ + "south" : "/domains/campus/room/start", + "west" : "/domains/campus/room/corridor3", + "north" : "/domains/campus/room/snack", + "east" : "/domains/campus/room/corridor2.c", + ]) ); + SetProperty("no attack", 1); + SetDoor("south", "/domains/campus/doors/plain_door"); + } + int CanReceive(object ob) { + if(ob && ob->GetRace() == "rodent"){ + message("info","You are repelled by rodenticide.",ob); + return 0; + } + return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/corridor2.c ds2.0r28/lib/domains/campus/room/corridor2.c *** ds2.0r18/lib/domains/campus/room/corridor2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/corridor2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,19 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetAmbientLight(30); + SetClimate("indoors"); + SetShort("Corridor, East"); + SetLong("You are in an east-west corridor on the first floor of the Virtual Campus administrative building. The student lounge is south of here."); + SetExits( ([ + "south" : "/domains/campus/room/lounge", + "west" : "/domains/campus/room/corridor", + "east" : "/domains/campus/room/corridor4", + ]) ); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/corridor3.c ds2.0r28/lib/domains/campus/room/corridor3.c *** ds2.0r18/lib/domains/campus/room/corridor3.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/corridor3.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,34 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Corridor"); + SetLong("You are in an east-west corridor on the first " + "floor of the Virtual Campus administrative building. " + "The campus mail room lies north of here, and a door to the south "+ + "leads into a stairwell. "+ + "A foyer and the building exit lie west of here."); + SetExits( ([ + "north" : "/domains/campus/room/mailroom", + "west" : "/domains/campus/room/foyer", + "south" : "/domains/campus/room/stairwell", + "east" : "/domains/campus/room/corridor" ]) ); + SetItems( (["corridor" : "This is a carpeted corridor, leading west.", + "floor" : "The carpet is purple, and somewhat institutional.", + "carpet" : "The carpet is purple, and somewhat institutional."]) ); + SetDoor("south","/domains/campus/doors/top_stairs"); + SetProperty("no attack", 1); + } + int CanReceive(object ob){ + if(ob && ob->GetRace() == "rodent"){ + message("info","You are repelled by rodenticide.",ob); + return 0; + } + return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/corridor4.c ds2.0r28/lib/domains/campus/room/corridor4.c *** ds2.0r18/lib/domains/campus/room/corridor4.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/corridor4.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,35 ---- + #include + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(40); + SetShort("Corridor"); + SetLong("You are in an east-west corridor on the first " + "floor of the Virtual Campus administrative building. " + "North is the campus bookstore, and there is a conference "+ + "room south of here."); + //"room south of here. It seems the bookstore is closed today."); + SetItems( (["corridor" : "This is a carpeted corridor, running east-west.", + "floor" : "The carpet is purple, and somewhat institutional.", + "carpet" : "The carpet is purple, and somewhat institutional."]) ); + SetExits( ([ + "south" : "/domains/campus/room/conf", + "north" : "/domains/campus/room/bookstore", + "west" : "/domains/campus/room/corridor2.c", + ]) ); + SetProperty("no attack", 1); + } + int CanReceive(object ob){ + if(ob && ob->GetRace() == "rodent"){ + message("info","You are repelled by rodenticide.",ob); + if(!environment(ob) && interactive(ob)) ob->eventMove(ROOM_START); + return 0; + } + return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/crawlspace.c ds2.0r28/lib/domains/campus/room/crawlspace.c *** ds2.0r18/lib/domains/campus/room/crawlspace.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/crawlspace.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,24 ---- + #include + inherit LIB_ROOM; + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("a tiny crawlspace"); + SetLong("You are in a cramped little space beneath the stairs in the "+ + "basement. It is dark, tight, and dirty in here."); + SetItems(([ + ({"crawlspace","space"}) : "You are in the space beneath stairs.", + "basement" : "The basement is just outside the crawlspace.", + "stairs" : "You're under them."])); + SetInventory(([ + "/domains/campus/obj/rayovac" : 1, + ])); + AddExit("out" , "/domains/campus/room/basement"); + SetObviousExits("out"); + SetProperty("no attack", 1); + SetMoney( ([ "dollars" : random(30)+2, ]) ); + } + void reset(){ + ::reset(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/death.c ds2.0r28/lib/domains/campus/room/death.c *** ds2.0r18/lib/domains/campus/room/death.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/death.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,65 ---- + #include + #include + #include + + inherit LIB_ROOM; + + string FunkyPic(); + int CheckChat(); + int StartHeart(object ob); + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("off the mortal coil"); + SetLong( (:FunkyPic:) ); + SetObviousExits("no exit"); + set_heart_beat(10); + SetNoModify(1); + } + + void init(){ + ::init(); + add_action("regenerate","regenerate"); + add_action("wander","wander"); + this_object()->CheckChat(); + } + + string FunkyPic(){ + return read_file("/domains/default/etc/death.txt"); + } + + int regenerate(){ + write("With a great rush of matter and energy, you rematerialize "+ + "into a corporeal state, and find yourself in a familiar place..."); + this_player()->eventRevive(); + this_player()->eventMoveLiving(ROOM_START); + return 1; + } + + int wander(){ + write("There is a strange, hollow vibration all around you, and you "+ + "realize that some force is compelling your ethereal form elsewhere..."+ + "you find yourself in a place that is known to you, yet oddly new."); + this_player()->eventMoveLiving(ROOM_START); + return 1; + } + + void heart_beat(){ + tell_room(this_object(), "A voice whispers: \" You may choose to "+ + "regenerate into a new body here.\""); + return; + } + + + int CanRelease(object ob){ + if(userp(ob) && ob->GetGhost() && environment(ob) == this_object()) { + tell_player(ob,"\n%^RED%^Your undead spirit is recalled and as you leave "+ + "the underworld a new body regenerates around you. "+ + "You live again!%^RESET%^\n"); + ob->eventRevive(); + } + return 1; + } + diff -c -r --new-file ds2.0r18/lib/domains/campus/room/foyer.c ds2.0r28/lib/domains/campus/room/foyer.c *** ds2.0r18/lib/domains/campus/room/foyer.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/foyer.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,39 ---- + #include + inherit LIB_ROOM; + + + int readSign() { + this_player()->more("/domains/campus/txt/warning.txt"); + return 1; + } + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(40); + SetShort("Foyer"); + SetLong("This is the west end of the main hallway "+ + "in the Virtual Campus administrative building. The hallway "+ + "continues to the east of here. West is the building exit, to "+ + "the world outside.\n%^GREEN%^There is a large sign on the wall "+ + "you can read.%^RESET%^"); + SetExits( ([ + "west" : "/domains/campus/room/usquare", + "east" : "/domains/campus/room/corridor3" + ]) ); + SetItems( (["corridor" : "This is a carpeted corridor, leading west.", + "floor" : "The carpet is purple, and somewhat institutional.", + "sign":"A large sign on the wall. To read it, 'read sign'.", + "carpet" : "The carpet is purple, and somewhat institutional."]) ); + SetRead("sign", (: readSign :) ); + SetProperty("no attack", 1); + } + int CanReceive(object ob) { + if(ob && ob->GetRace() == "rodent"){ + message("info","You are repelled by rodenticide.",ob); + return 0; + } + return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/freezer.c ds2.0r28/lib/domains/campus/room/freezer.c *** ds2.0r18/lib/domains/campus/room/freezer.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/freezer.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,37 ---- + #include + #include + #include + + inherit LIB_ROOM; + + static private object *Old; + + void create() { + room::create(); + SetNoClean(1); + SetProperties(([ "login" : ROOM_START])); + SetShort( "The freezer"); + SetLong( "The local freezer. Go down to leave."); + SetObviousExits("d"); + SetExits( ([ "down" : ROOM_START ]) ); + Old = ({}); + call_out("clean_room", MAX_NET_DEAD_TIME); + SetNoModify(1); + } + + static void clean_room() { + object *clean_me; + object ob; + + foreach(ob in filter(all_inventory(), (: !living($1) :))) + ob->eventDestruct(); + if( !sizeof(filter(all_inventory(), (: living :))) ) { + Old = ({}); + call_out((: clean_room :), MAX_NET_DEAD_TIME); + return; + } + clean_me = (all_inventory() & Old); + Old = all_inventory() - clean_me; + foreach(ob in clean_me) ob->eventDestruct(); + call_out((: clean_room :), MAX_NET_DEAD_TIME); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/furnace.c ds2.0r28/lib/domains/campus/room/furnace.c *** ds2.0r18/lib/domains/campus/room/furnace.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/furnace.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,36 ---- + #include + #include + + inherit LIB_ROOM; + + void create() { + room::create(); + SetAmbientLight(30); + SetShort("the furnace"); + SetLong("The furnace. Things that arrive here are "+ + "incinerated. You probably shouldn't be here. Go down to get out."); + SetProperties(([ + "no attack" : 1, + ])); + SetExits( ([ "down" : ROOM_START ]) ); + call_out((: reload_room :), 600, load_object(base_name(this_object()))); + set_heart_beat(1); + SetNoModify(1); + } + int CanReceive(object ob){ + if(ob && interactive(ob)){ + tell_object(ob, "You fail to enter the furnace."); + return 0; + } + return 1; + } + void init(){ + ::init(); + } + void heart_beat(){ + if(sizeof(all_inventory(this_object()))){ + foreach(object ob in deep_inventory(this_object())){ + ob->eventDestruct(); + } + } + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/green_room.c ds2.0r28/lib/domains/campus/room/green_room.c *** ds2.0r18/lib/domains/campus/room/green_room.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/green_room.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("a green room"); + SetLong("This is a green room. Probability Lab 1 is south."); + SetExits( ([ + "south" : "/domains/campus/room/monty" + ]) ); + SetDoor("south","/domains/campus/doors/green_door"); + SetObviousExits("s"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/green_room2.c ds2.0r28/lib/domains/campus/room/green_room2.c *** ds2.0r18/lib/domains/campus/room/green_room2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/green_room2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("a green room"); + SetLong("This is a green room. Probability Lab 2 is east."); + SetExits( ([ + "east" : "/domains/campus/room/plab2" + ]) ); + SetDoor("east","/domains/campus/doors/green_door2"); + SetObviousExits("e"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/green_room3.c ds2.0r28/lib/domains/campus/room/green_room3.c *** ds2.0r18/lib/domains/campus/room/green_room3.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/green_room3.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("a green room"); + SetLong("This is a green room. Probability Lab 3 is west."); + SetExits( ([ + "west" : "/domains/campus/room/plab" + ]) ); + SetDoor("west","/domains/campus/doors/green_door3"); + SetObviousExits("w"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/lounge.c ds2.0r28/lib/domains/campus/room/lounge.c *** ds2.0r18/lib/domains/campus/room/lounge.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/lounge.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,56 ---- + #include + inherit LIB_ROOM; + + void AddStuff(){ + object ob; + ob = new("/lib/bboard"); + ob->SetKeyName("chalkboard"); + ob->SetId( ({ "board", "chalkboard","bulletin board","visitor's board"})); + ob->set_board_id("visitor_board"); + ob->set_max_posts(30); + ob->SetShort("The Visitor's Board"); + ob->SetLong("This is the visitor's bulletin board. Students and visitors use it to "+ + "post messages, comments ans questions about LPC University to each other and "+ + "LPC University creators. Occasionally creators also post hints, suggestions and "+ + "clues. To post something, type: post . When "+ + "finished writing, enter a single period on a blank line, then at "+ + "the colon prompt (:) type a lower-case x and return. \n"); + ob->eventMove(this_object()); + } + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(40); + SetShort("the student lounge"); + SetLong("This is the LPC University New Main building student lounge. "+ + "It is rather bare at the moment, as the building is still in early stages of "+ + "construction. You see some marks on the floor where furniture is to be "+ + "placed. The main corridor lies north, and a window overlooks the campus "+ + "on the south wall."); + SetItems(([ + ({"here","room","lounge"}) : "This seems to be intended to be a student "+ + "lounge.", + "building" : "You are in New Main, LPC University' main administrative building.", + ({"mark","marks"}) : "Some small chalkmarks and tape strips indicate "+ + "where furniture is to go.", + ({"floor","ground"}) : "Standard off-white linoleum tile floor, in case clumsy students "+ + "plan on eating in here.", + ({"corridor","hall"}) : "The main corridor on the first floor of New Main.", + "window" : "A window set into the south wall, overlooking the campus. Strangely, "+ + "there seems to be nothing outside the window...no campus, no light, no stars...nothing. "+ + "It's as though the administrative building were suspended in a vacuum.", + "campus" : "It seems oddly absent.", + ({"wall","south wall"}) : "A wall with a window in it."])); + SetExits( ([ + "north" : "/domains/campus/room/corridor2.c", + ]) ); + SetInventory(([ + "/domains/town/obj/btable" : 1, + "/domains/campus/obj/locker" : 1, + ])); + SetProperty("no attack", 1); + AddStuff(); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/mailroom.c ds2.0r28/lib/domains/campus/room/mailroom.c *** ds2.0r18/lib/domains/campus/room/mailroom.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/mailroom.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,77 ---- + #include + #include + #include + #include "/lib/include/post_office.h" + + inherit LIB_ROOM; + + static void create(){ + room::create(); + SetTown("campus"); + SetClimate("indoors"); + SetAmbientLight(40); + SetShort("the campus mail room"); + SetLong("This is a small office containing rows of mailboxes and "+ + "various other postal implements. There is a sign on the wall behind the "+ + "counter, outlining instructions for how to mail other users."); + SetItems( ([ + ({"box","boxes","mailboxes","mailbox"}) : "Rows of mailboxes for "+ + "the denizens of LPC University.", + "sign" : "This is a sign on the wall describing how to mail messages.", + ({"wall","walls"}) : "Gray-painted institutional walls of the kind you'd "+ + "expect in a post office.", + "implements" : "Ink, paper, etc.", + "instructions" : "Try reading them.", + "counter" : "A counter folks use to lean on while writing messages." ]) ); + SetObviousExits("s"); + SetExits( ([ + "south" : "/domains/campus/room/corridor3" ]) ); + SetProperty("no attack", 1); + } + void init(){ + ::init(); + add_action("instr","read"); + } + int instr(string str){ + if(str=="instructions"||str=="sign"){ + write("To mail someone, type mail .\n"+ + "Enter a subject line.\n"+ + "Enter your message.\n"+ + "Once you've finished, enter a period (.) on a blank line.\n"+ + "Hit x, then s to send it. You're done!\n"); + return 1; + } + } + mixed CanMail(object who, string args) { + if( who && !interactive(who) ) return 0; + if( GetTown() != (string)who->GetTown() ) + return "Any mail you might have will be at your home post office."; + return 1; + } + mixed eventMail(object who, string args) { + object ob; + + if( !(ob = new(OBJ_POST)) ) { + who->eventPrint("Failed to load postal object!"); + return 1; + } + if( !((int)ob->eventMove(who)) ) { + who->eventPrint("You can't seem to carry the postal object."); + return 1; + } + ob->start_post(args); + return 1; + } + int CanReceive(object ob) { + if( !ob || (living(ob) && !interactive(ob)) ) return 0; + else return room::CanReceive(ob); + } + int eventReleaseObject() { + object ob; + + if(!ob) return 0; + if( !(ob = previous_object()) ) return room::eventReleaseObject(); + if( !room::eventReleaseObject() ) return 0; + if( (ob = present(POSTAL_ID, ob)) ) ob->eventDestruct(); + return 1; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/monty.c ds2.0r28/lib/domains/campus/room/monty.c *** ds2.0r18/lib/domains/campus/room/monty.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/monty.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,46 ---- + #include + inherit LIB_ROOM; + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Probability Lab 1"); + SetLong("This is a clean, antiseptic lab with " + "gleaming white walls. On the north wall are " + "three doors: " + "one %^RED%^red%^RESET%^, " + "one %^GREEN%^green%^RESET%^, " + "one %^BLUE%^blue%^RESET%^. " + "\n" + "%^GREEN%^There is a large sign on the wall you can read.%^RESET%^"); + SetInventory( ([ + "/domains/campus/obj/pedestal" : 1, + "/domains/campus/npc/charly" : 1 + ]) ); + SetItems( ([ + ({ "wall","walls","north wall"}) : "Shiny, white laboratory walls.", + "red room" : "There's no red room here.", + "green room" : "There's no green room here.", + "blue room" : "There's no blue room here.", + ]) ); + AddItem( ({"sign","sign on the wall"}), "A sign you can read.",({"large"}) ); + + SetExits( ([ + "south" : "/domains/campus/room/wiz_lab" + ]) ); + SetEnters( ([ + "red room" : "/domains/campus/room/red_room", + "green room" : "/domains/campus/room/green_room", + "blue room" : "/domains/campus/room/blue_room" + ]) ); + SetDoor("red room","/domains/campus/doors/red_door"); + SetDoor("green room","/domains/campus/doors/green_door"); + SetDoor("blue room","/domains/campus/doors/blue_door"); + SetObviousExits("s"); + SetNoClean(1); + } + + void init(){ + SetRead(({"sign","sign on the wall"}), "Press the button on " + "the pedestal to reset the experiment."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/npath.c ds2.0r28/lib/domains/campus/room/npath.c *** ds2.0r18/lib/domains/campus/room/npath.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/npath.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + + static void create() { + room::create(); + SetClimate("outdoors"); + SetAmbientLight(30); + SetShort("a wide path"); + SetLong("This is a paved path traveling north from University " + "Square. It is lined by thick bushes on each " + "side. The Virtual Campus is south of here. To " + "the north you see what appears to be a town."); + SetItems( ([ + ({ "bush","bushes","side","sides"}) : "Large, thick " + "bushes crowd the sides of the path.", + "path" : "A wide, cobblestone path running north " + "and south.", + "town" : "You can't quite see much of it from here." + ]) ); + + SetExits( ([ "south" : "/domains/campus/room/usquare", + "north" : "/domains/campus/room/npath2", + ]) ); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/npath2.c ds2.0r28/lib/domains/campus/room/npath2.c *** ds2.0r18/lib/domains/campus/room/npath2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/npath2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,31 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + + static void create() { + room::create(); + SetClimate("outdoors"); + SetAmbientLight(30); + SetShort("a wide path"); + SetLong("This is a paved path traveling north and south. It is lined by thick bushes on each side. A town lies north of here. To the south is what appears to be a college campus."); + SetItems( ([ + ({ "bush","bushes","side","sides"}) : "Large, thick " + "bushes crowd the sides of the path.", + "path" : "A wide, cobblestone path running north " + "and south.", + ({ "sign","post","signpost"}) : "A post has been " + "driven into the ground here, and a sign is attached " + "to it.", + "town" : "You can't quite see much of it from here.", + "campus" : "You can't quite see much of it from here." + ]) ); + SetInventory(([ + ])); + SetRead( "sign", "Beware! You are now leaving the safety of the Virtual Campus."); + SetExits( ([ "south" : "/domains/campus/room/npath", + "north" : "/domains/town/room/south_road2", + ]) ); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/plab.c ds2.0r28/lib/domains/campus/room/plab.c *** ds2.0r18/lib/domains/campus/room/plab.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/plab.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,47 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Probability Lab Three"); + SetLong("This is a clean, antiseptic lab with " + "gleaming white walls. On the east wall are " + "three doors: " + "one %^RED%^red%^RESET%^, " + "one %^GREEN%^green%^RESET%^, " + "one %^BLUE%^blue%^RESET%^. " + "\n" + "%^GREEN%^There is a large sign on the wall you can read.%^RESET%^"); + SetItems( ([ + ({ "wall","walls","north wall"}) : "Shiny, white laboratory walls.", + "red room" : "There's no red room here.", + "green room" : "There's no green room here.", + "blue room" : "There's no blue room here.", + ]) ); + SetInventory(([ + "/domains/campus/obj/pedestal3" : 1, + ])); + SetObviousExits("w"); + SetExits(([ + "west" : "/domains/campus/room/wiz_lab", + ])); + + AddItem( ({"sign","sign on the wall"}), "A sign you can read.",({"large"}) ); + + SetEnters( ([ + "red room" : "/domains/campus/room/red_room3", + "green room" : "/domains/campus/room/green_room3", + "blue room" : "/domains/campus/room/blue_room3" + ]) ); + SetDoor("red room","/domains/campus/doors/red_door3"); + SetDoor("green room","/domains/campus/doors/green_door3"); + SetDoor("blue room","/domains/campus/doors/blue_door3"); + SetNoClean(1); + } + void init(){ + ::init(); + SetRead(({"sign","sign on the wall"}), "Press the button on " + "the pedestal to reset the experiment."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/plab2.c ds2.0r28/lib/domains/campus/room/plab2.c *** ds2.0r18/lib/domains/campus/room/plab2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/plab2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,47 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Probability Lab 2"); + SetLong("This is a clean, antiseptic lab with " + "gleaming white walls. On the west wall are " + "three doors: " + "one %^RED%^red%^RESET%^, " + "one %^GREEN%^green%^RESET%^, " + "one %^BLUE%^blue%^RESET%^. " + "\n" + "%^GREEN%^There is a large sign on the wall you can read.%^RESET%^"); + SetItems( ([ + ({ "wall","walls","north wall"}) : "Shiny, white laboratory walls.", + "red room" : "There's no red room here.", + "green room" : "There's no green room here.", + "blue room" : "There's no blue room here.", + ]) ); + SetInventory(([ + "/domains/campus/npc/charles" : 1, + "/domains/campus/obj/pedestal2" : 1, + ])); + AddItem( ({"sign","sign on the wall"}), "A sign you can read.",({"large"}) ); + + SetExits( ([ + "east" : "/domains/campus/room/wiz_lab" + ]) ); + SetEnters( ([ + "red room" : "/domains/campus/room/red_room2", + "green room" : "/domains/campus/room/green_room2", + "blue room" : "/domains/campus/room/blue_room2" + ]) ); + SetDoor("red room","/domains/campus/doors/red_door2"); + SetDoor("green room","/domains/campus/doors/green_door2"); + SetDoor("blue room","/domains/campus/doors/blue_door2"); + SetObviousExits("e"); + SetNoClean(1); + } + void init(){ + ::init(); + SetRead(({"sign","sign on the wall"}), "Press the button on " + "the pedestal to reset the experiment."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/red_room.c ds2.0r28/lib/domains/campus/room/red_room.c *** ds2.0r18/lib/domains/campus/room/red_room.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/red_room.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("a red room"); + SetLong("This is a red room. Probability Lab 1 is south."); + SetExits( ([ + "south" : "/domains/campus/room/monty" + ]) ); + SetDoor("south","/domains/campus/doors/red_door"); + SetObviousExits("s"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/red_room2.c ds2.0r28/lib/domains/campus/room/red_room2.c *** ds2.0r18/lib/domains/campus/room/red_room2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/red_room2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("a red room"); + SetLong("This is a red room. Probability Lab 2 is east."); + SetExits( ([ + "east" : "/domains/campus/room/plab2" + ]) ); + SetDoor("east","/domains/campus/doors/red_door2"); + SetObviousExits("e"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/red_room3.c ds2.0r28/lib/domains/campus/room/red_room3.c *** ds2.0r18/lib/domains/campus/room/red_room3.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/red_room3.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("a red room"); + SetLong("This is a red room. Probability Lab 3 is west."); + SetExits( ([ + "west" : "/domains/campus/room/plab" + ]) ); + SetDoor("west","/domains/campus/doors/red_door3"); + SetObviousExits("w"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/science.c ds2.0r28/lib/domains/campus/room/science.c *** ds2.0r18/lib/domains/campus/room/science.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/science.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,10 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(20); + SetShort("a generic room"); + SetLong("This is an utterly plain, blank room."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/science1.c ds2.0r28/lib/domains/campus/room/science1.c *** ds2.0r18/lib/domains/campus/room/science1.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/science1.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,23 ---- + #include + #include + + inherit LIB_ROOM; + + void create() { + room::create(); + SetAmbientLight(30); + SetShort("Science Building Hallway"); + SetLong("This is the LPC University Science Building, where exciting new systems and abstract research happens. North of here is the probability laboratory. The hallway continues west. The building's exit is east, leading to University Square."); + SetExits( ([ + "north" : "/domains/campus/room/wiz_lab", + "east" : "/domains/campus/room/usquare", + "west" : "/domains/campus/room/science2.c", + ]) ); + SetClimate("indoors"); + + SetDoor("north", "/domains/campus/doors/prob_door.c"); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/science2.c ds2.0r28/lib/domains/campus/room/science2.c *** ds2.0r18/lib/domains/campus/room/science2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/science2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,21 ---- + #include + #include + + inherit LIB_ROOM; + + void create() { + room::create(); + SetAmbientLight(30); + SetShort("Science Building Hallway, West"); + SetLong("This is the western end of the main hallway in the LPC University Science Building. North of here is the stargate laboratory. The hallway runs east from here, toward the building's exit."); + SetExits( ([ + "east" : "/domains/campus/room/science1", + "north" : "/domains/campus/room/slab.c", + ]) ); + + SetClimate("indoors"); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/sewer.c ds2.0r28/lib/domains/campus/room/sewer.c *** ds2.0r18/lib/domains/campus/room/sewer.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/sewer.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,68 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(10); + SetShort("sewer"); + SetLong("You are in the stinking underground tunnels of "+ + "a sewer system. The air here is quite foul, "+ + "and periodic blasts of steam from wall-mounted vents make it "+ + "very hot and very humid. There is a foot-high stream of dark liquid "+ + "covering the bottom of this tunnel, running west to east along "+ + "the tunnel's length. The tunnel narrows dramatically here, and "+ + "becomes so small that further movement east is not possible."); + SetItems( ([ ({"tunnel","tunnels"}) : "Here the tunnel becomes so "+ + "narrow that you can't go any further east. It looks like "+ + "some debris has accumulated here over time, almost "+ + "clogging the waste flow.", + ({"sewer","sewer system"}) : "Though evidently in good repair "+ + "and of modern construction, this is still a sewer tunnel, "+ + "and it's hostile to human comfort.", + ({"steam","vent","vents","wall-mounted vents"}): "Apparently "+ + "there is industrial machinery nearby that exhausts hot steam "+ + "through vents in the walls.", + "air" : "It is rank with the reek of decomposing waste.", + ({"wall","walls"}) : "The walls of the sewer tunnel are made "+ + "of concrete and appear well-built and sturdy.", + ({"stream","liquid","stream of liquid","dark liquid"}) : "Whatever "+ + "this stuff is, water is not its main component. It's some kind "+ + "of foul-smelling liquid waste, flowing along the bottom "+ + "of the tunnel.", + ({"sewage","waste","garbage"}) : "It appears that the fluid on the "+ + "bottom of this tunnel is the result of garbage and waste "+ + "processing. In liquid form, this garbage flows "+ + "east from here.", + ]) ); + SetSmell( ([ "default" : "The stench of sewage and waste hangs here."]) ); + SetListen("default","You hear faint echoes of dripping water."); + SetExits( ([ "west" : "/domains/campus/room/sewer1.c" + ]) ); + SetInventory(([ + "/domains/campus/obj/debris" :1 + ])); + SetObviousExits("w"); + set_heart_beat(10); + } + int SteamBlast(){ + object *temparr,*stuff,*lstuff; + int i; + stuff=all_inventory(); + lstuff = ({}); + for(i=0;i 0 && member_array(stuff[i],lstuff) == -1) lstuff += ({stuff[i]}); + } + for(i=0;i 0 && !creatorp(lstuff[i]) ) lstuff[i]->eventReceiveDamage(0, 7,random(30)+10, "torso"); + + } + tell_room(this_object(), "You are hit by a blast of scalding-hot steam!"); + return 1; + } + void heart_beat(){ + if(random(10) == 1) SteamBlast(); + return; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/sewer.proto.c ds2.0r28/lib/domains/campus/room/sewer.proto.c *** ds2.0r18/lib/domains/campus/room/sewer.proto.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/sewer.proto.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,59 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(10); + SetShort("campus sewer"); + SetLong("You are in the stinking underground tunnels of "+ + "the Virtual Campus sewer system. The air here is quite foul, "+ + "and periodic blasts of steam from wall-mounted vents make it "+ + "very hot and very humid. There is a foot-high stream of dark liquid "+ + "covering the bottom of this tunnel, running west to east along "+ + "the tunnel's length."); + SetItems( ([ ({"tunnel","tunnels"}) : "You are in a sewer tunnel."+ + "It's foul, dark, and hot.", + ({"sewer","sewer system"}) : "Though evidently in good repair "+ + "and of modern construction, this is still a sewer tunnel, "+ + "and it's hostile to human comfort.", + ({"steam","vent","vents","wall-mounted vents"}): "Apparently "+ + "there is industrial machinery nearby that exhausts hot steam "+ + "through vents in the walls.", + "air" : "It is rank with the reek of decomposing waste.", + ({"wall","walls"}) : "The walls of the sewer tunnel are made "+ + "of concrete and appear well-built and sturdy.", + ({"stream","liquid","stream of liquid","dark liquid"}) : "Whatever "+ + "this stuff is, water is not its main component. It's some kind "+ + "of foul-smelling liquid waste, flowing along the bottom "+ + "of the tunnel.", + ({"sewage","waste","garbage"}) : "It appears that the fluid on the "+ + "bottom of this tunnel is the result of garbage and waste "+ + "processing. In liquid form, this garbage flows "+ + "east from here.", + ]) ); + SetSmell( ([ "default" : "The stench of sewage and waste hangs here."]) ); + SetListen("default","You hear faint echoes of dripping water."); + set_heart_beat(10); + } + int SteamBlast(){ + object *temparr,*stuff,*lstuff; + int i; + stuff=all_inventory(); + lstuff = ({}); + for(i=0;i 0 && member_array(stuff[i],lstuff) == -1) lstuff += ({stuff[i]}); + } + for(i=0;i 0 && !creatorp(lstuff[i]) ) lstuff[i]->eventReceiveDamage(0, 7,random(30)+10, "torso"); + + } + tell_room(this_object(), "You are hit by a blast of scalding-hot steam!"); + return 1; + } + void heart_beat(){ + if(random(10) == 1) SteamBlast(); + return; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/sewer1.c ds2.0r28/lib/domains/campus/room/sewer1.c *** ds2.0r18/lib/domains/campus/room/sewer1.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/sewer1.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,67 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(10); + SetShort("sewer"); + SetLong("You are in the stinking underground tunnels of "+ + "a sewer system. The air here is quite foul, "+ + "and periodic blasts of steam from wall-mounted vents make it "+ + "very hot and very humid. There is a foot-high stream of dark liquid "+ + "covering the bottom of this tunnel, running west to east along "+ + "the tunnel's length."); + SetItems( ([ ({"tunnel","tunnels"}) : "You are in a sewer tunnel."+ + "It's foul, dark, and hot.", + ({"sewer","sewer system"}) : "Though evidently in good repair "+ + "and of modern construction, this is still a sewer tunnel, "+ + "and it's hostile to human comfort.", + ({"steam","vent","vents","wall-mounted vents"}): "Apparently "+ + "there is industrial machinery nearby that exhausts hot steam "+ + "through vents in the walls.", + "air" : "It is rank with the reek of decomposing waste.", + ({"wall","walls"}) : "The walls of the sewer tunnel are made "+ + "of concrete and appear well-built and sturdy.", + ({"stream","liquid","stream of liquid","dark liquid"}) : "Whatever "+ + "this stuff is, water is not its main component. It's some kind "+ + "of foul-smelling liquid waste, flowing along the bottom "+ + "of the tunnel.", + ({"sewage","waste","garbage"}) : "It appears that the fluid on the "+ + "bottom of this tunnel is the result of garbage and waste "+ + "processing. In liquid form, this garbage flows "+ + "east from here.", + ]) ); + SetSmell( ([ "default" : "The stench of sewage and waste hangs here."]) ); + SetListen("default","You hear faint echoes of dripping water."); + SetExits( ([ "east" : "/domains/campus/room/sewer.c", + "west" : "/domains/campus/room/sewer2.c" + ]) ); + SetObviousExits("e, w"); + set_heart_beat(10); + } + int SteamBlast(){ + object *temparr,*stuff,*lstuff; + int i; + stuff=all_inventory(); + lstuff = ({}); + for(i=0;i 0 && member_array(stuff[i],lstuff) == -1) lstuff += ({stuff[i]}); + } + for(i=0;i 0 && !creatorp(lstuff[i]) ) lstuff[i]->eventReceiveDamage(0, 7,random(30)+10, "torso"); + + } + tell_room(this_object(), "You are hit by a blast of scalding-hot steam!"); + return 1; + } + void heart_beat(){ + if(random(10) == 1) SteamBlast(); + return; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/sewer2.c ds2.0r28/lib/domains/campus/room/sewer2.c *** ds2.0r18/lib/domains/campus/room/sewer2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/sewer2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,71 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(20); + SetShort("sewer"); + SetLong("You are in the stinking underground tunnels of "+ + "a sewer system. The air here is quite foul, "+ + "and periodic blasts of steam from wall-mounted vents make it "+ + "very hot and very humid. There is a foot-high stream of dark liquid "+ + "covering the bottom of this tunnel, running west to east along "+ + "the tunnel's length. Light streams in from a drainage grate above."); + SetItems( ([ ({"tunnel","tunnels"}) : "You are in a sewer tunnel."+ + "It's foul, dark, and hot.", + ({"sewer","sewer system"}) : "Though evidently in good repair "+ + "and of modern construction, this is still a sewer tunnel, "+ + "and it's hostile to human comfort.", + ({"steam","vent","vents","wall-mounted vents"}): "Apparently "+ + "there is industrial machinery nearby that exhausts hot steam "+ + "through vents in the walls.", + "air" : "It is rank with the reek of decomposing waste.", + ({"wall","walls"}) : "The walls of the sewer tunnel are made "+ + "of concrete and appear well-built and sturdy.", + ({"stream","liquid","stream of liquid","dark liquid"}) : "Whatever "+ + "this stuff is, water is not its main component. It's some kind "+ + "of foul-smelling liquid waste, flowing along the bottom "+ + "of the tunnel.", + "light" : "There isn't much of it, and you can't tell if it's " + + "sunshine or lamplight, but it lets you see a bit better.", + ({"sewage","waste","garbage"}) : "It appears that the fluid on the "+ + "bottom of this tunnel is the result of garbage and waste "+ + "processing. In liquid form, this garbage flows "+ + "east from here.", + ]) ); + SetSmell( ([ "default" : "The stench of sewage and waste hangs here."]) ); + SetListen("default","You hear faint echoes of dripping water."); + SetExits( ([ + "east" : "/domains/campus/room/sewer1", + "up" : "/domains/town/room/vill_road1" + ]) ); + + SetDoor("up","/domains/campus/doors/grate"); + set_heart_beat(10); + } + int SteamBlast(){ + object *temparr,*stuff,*lstuff; + int i; + stuff=all_inventory(); + lstuff = ({}); + for(i=0;i 0 && member_array(stuff[i],lstuff) == -1) lstuff += ({stuff[i]}); + } + for(i=0;i 0 && !creatorp(lstuff[i]) ) lstuff[i]->eventReceiveDamage(0, 7,random(30)+10, "torso"); + + } + tell_room(this_object(), "You are hit by a blast of scalding-hot steam!"); + return 1; + } + void heart_beat(){ + if(random(10) == 1) SteamBlast(); + return; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/slab.c ds2.0r28/lib/domains/campus/room/slab.c *** ds2.0r18/lib/domains/campus/room/slab.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/slab.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,51 ---- + #include + #include + + inherit LIB_ROOM; + + int SignRead(){ + string list; + list = implode(keys(STARGATE_D->GetStargates()),", "); + write("These are Stargate operation instructions."); + write("The Dead Souls stargate system provides teleportation within " + "the stargate network. To use the stargate network, one finds an " + "idle stargate, then dials the name of some other known stargate. " + "One then enters the outbound stargate, and if things go well, teleportation " + "to the dialed stargate occurs. To travel to Uruk, if that were a " + "valid stargate name, you would: dial uruk\n" + "Once the stargate activates: enter stargate"); + write("Currently available stargates are:"); + write("%^BOLD%^%^YELLOW%^"+list+"%^RESET%^"); + return 1; + } + + static void create() { + object ob; + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Science Building Stargate Lab"); + SetLong("This large room is the testing ground for the newly discovered stargate technology that allows for instant teleportation between distant locations. The main Science Building hallway is south.\n" + "%^BOLD%^%^GREEN%^An instruction sign is here.%^RESET%^"); + SetItems(([ + ({ "sign", "instruction sign", "instructions sign", "instruction", "instructions" }) : "A sign you can read. It appears to be instructions for operating the stargate.", + ])); + SetExits(([ + "south" : "/domains/campus/room/science2", + ])); + + SetInventory(([ + "/domains/campus/obj/stargate" : 1, + ])); + SetRead("sign", (: SignRead() :) ); + SetProperty("no attack", 1); + + } + int CanReceive(object ob) { + if(!ob) return 0; + return room::CanReceive(ob); + } + + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/snack.c ds2.0r28/lib/domains/campus/room/snack.c *** ds2.0r18/lib/domains/campus/room/snack.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/snack.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,56 ---- + #include + #include + #include + inherit LIB_ROOM; + + int eventReadMenu(string str); + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(40); + SetShort("The Campus Snack Bar"); + SetLong("You are in a small, linoleum-tiled room lit by bright "+ + "fluorescent lights. There are a few uncomfortable-looking chairs "+ + "around two tables, and a sort of bar set into the north wall, "+ + "behind which a food service employee stands. There is a menu "+ + "hanging on the wall next to the bar. The main hallway lies south of here."); + SetItems(([ + "menu": "A menu of snack items available here.", + "sign":"A sign over the snack bar.", + ({"tile","tiles","floor","linoleum"}):"These are here because you "+ + "are not trusted to keep food off of carpets.", + ({"chair","chairs","table","table"}):"Token furniture, not very functional "+ + "or comfortable-looking. You aren't really expected to hang "+ + "around in here, apparently.", + "bar" : "Really a window set into the wall and connecting the snack bar "+ + "to the adjoining kitchen.", + ({"wall","walls"}) : "The walls are painted blue and white, the school's colors. "+ + "It's fairly unattractive and institutional.", + "hallway" : "The administration building's main hallway lies south.", + ({"light","lights","fluorescent lights","fluorescents"}) : "Cheap, standard "+ + "lighting. Like all fluorescents, these lights give everything an unappealing, "+ + "sickly look.", + "employee" : "An underpaid, unappreciated, and resentful state employee. "+ + "No surprise there.", + ])); + SetExits( ([ "south" : "/domains/campus/room/corridor", + ])); + SetObviousExits("s"); + SetRead("menu", (: eventReadMenu :)); + SetInventory(([ + "/domains/campus/npc/gloria.c" : 1 ])); + SetProperty("no attack", 1); + } + int eventReadMenu(string str){ + write("\n"+ + "1) ham sandwich: 2 dollars\n"+ + "2) hamburger: 4 dollars\n"+ + "3) salad of the day: 3 dollars\n\n"+ + "Drinks:\n"+ + "1) milk: 1 dollar\n"+ + "2) gatorade: 2 dollars\n"); + return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/spath.c ds2.0r28/lib/domains/campus/room/spath.c *** ds2.0r18/lib/domains/campus/room/spath.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/spath.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,17 ---- + #include + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + static void create() { + room::create(); + SetClimate("outdoors"); + SetAmbientLight(25); + SetShort("Fitzpatrick Hall"); + SetLong("This is the messy foyer of a building under construction."); + SetExits( ([ "north" : "/domains/campus/room/usquare", + ]) ); + } + int CanReceive(object ob) { + message("info","The classroom building is temporarily " + "closed for renovation.", ob); + return 0; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/square.c ds2.0r28/lib/domains/campus/room/square.c *** ds2.0r18/lib/domains/campus/room/square.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/square.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,75 ---- + /* /realms/trent/commons/fountain.c + * "the Fountain" + * Trent@LPC University + */ + + #include + + inherit LIB_ROOM; + inherit "/lib/props/ambiance"; + inherit "/lib/props/getlivings"; + + int CheckDoor(){ + object *obs; + int i; + obs=get_livings(find_object("/domains/campus/room/sewer2"),1); + if(!sizeof(obs) && !"/domains/campus/doors/grate"->GetClosed() ) { + "/domains/campus/doors/grate"->SetClosed(1); + tell_object(this_object(),"The drainage grate slams shut."); + } + return 1; + } + + static void create() { + string day,night; + room::create(); + //SetProperty("light", 2); + SetAmbientLight(30); + SetClimate("temperate"); + SetShort("Fountain square"); + day="This is Fountain Square, the center of Larstown. "+ + "A small, beautiful fountain is the center of this cobblestone "+ + "square. A circular stone bench surrounds the edge of the fountain's pool, "+ + "and water that spills over from the fountain drains into a rainwater grate "+ + "set into the ground.\n "+ + "\tLarstown is still a small, modest village, but renovations such as this "+ + "tasteful commons and the fountain make it clear it remains a vibrant, "+ + "active place to live in. You may leave this square by North Street, East Avenue, "+ + "South Road, or West Track. "; + night="Normally quite busy in the daytime, the square is now filled only " + + "with the sounds of the fountain's flow."; + SetDayLong(day); + SetNightLong(day+night); + SetItems( ([ ({ "square", "center" }) : "The square is a popular meeting place " + "for Larstown's denizens.", + "fountain" : "This beautifully designed fountain was donated " + "by Trent.", + ({"street","North Street","north street"}) : "North Street leads north "+ + "toward the village marketplace and its clock tower.", + ({"avenue","east avenue","East Avenue"}) : "East Avenue leads east toward "+ + "the shore and Larstown docks.", + ({"road","south road","South Road"}) : "South Road leads south toward "+ + "the town's water well, bank, and residential area.", + ({"track","West Track","west track"}) : "West Track leads west toward the "+ + "town hall and some business and civic buildings.", + ({"circular bench", "bench", "stone bench", "stone"}) : "Many of " + "Frontier's denizens like to sit around the fountain and enjoy the " + "beautiful sights and sounds of the square." ]) ); + SetSearch( ([ "fountain" : "It appears someone has already stolen all the coins in the fountain." ]) ); + SetSmell( ([ "default" : "You smell the clean and misty air of the fountain's spray." ]) ); + SetObviousExits("n,s,e,w"); + SetExits( ([ + "east" : "/domains/campus/room/square", + "east" : "/domains/campus/room/square", + "east" : "/domains/campus/room/square", + "east" : "/domains/campus/room/square", + "down" : "/domains/campus/room/sewer2" + ]) ); + + SetDoor("down","/domains/campus/doors/grate"); + + } + + void init(){ + CheckDoor(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/stairwell.c ds2.0r28/lib/domains/campus/room/stairwell.c *** ds2.0r18/lib/domains/campus/room/stairwell.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/stairwell.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,51 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(20); + SetShort("stairwell"); + SetLong("You are standing on a stairwell landing. Flights of stairs "+ + "lead up and down, although the stairs up are roped off to prevent "+ + "passage. The flickering fluorescent lights make it difficult to see what "+ + "lies below here. There is a sign tied to the rope on the flight of stairs "+ + "going up."); + SetItems(([ + ({"stairs","flight","flight of stairs"}) : "The stairs are made of concrete, appear to "+ + "be part of the foundation of the building, and seem quite sturdy.", + "landing" : "This is a landing between flights of stairs leading up and down.", + "rope" : "Thick yellow construction rope. There's a lot of it tied to the " + + "flight of stairs leading up, preventing your passage. There's a sign hanging "+ + "on it.", + ({"light","lights","fluorescent lights"}) : "Cheap lighting that doesn't seem to work "+ + "very well. Occasionally the landing is lit orange, then white again by the flickering "+ + "lights.", + "sign" : "This is a handwritten, cardboard sign hanging on the roped-off stairs."])); + SetExits(([ + "north" : "/domains/campus/room/corridor3", + "down" : "/domains/campus/room/basement" + ])); + SetDoor("north","/domains/campus/doors/top_stairs"); + SetProperty("no attack", 1); + } + void init(){ + ::init(); + add_action("r_sign","read"); + add_action("untie_r","untie"); + } + int r_sign(string str){ + if(str=="sign" || str=="cardboard sign"){ + write("The sign reads:\n"+ + "WARNING! Second floor under construction, all access prohibited!\n"); + say(this_player()->GetName()+" read the sign.\n"); + return 1; + } + } + int untie_r(string str){ + if(str=="rope" || str=="yellow rope"){ + write("The rope is quite firmly tied. You fail.\n"); + say(this_player()->GetName()+" fails to untie the rope.\n"); + return 1; + } + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/start.c ds2.0r28/lib/domains/campus/room/start.c *** ds2.0r18/lib/domains/campus/room/start.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/start.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,33 ---- + #include + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("LPC University Reception"); + SetLong("You are in the small, spare reception area of the Virtual Campus admissions office. A door leads north to the main administration building corridor."); + SetExits( ([ + "north" : "/domains/campus/room/corridor", + ]) ); + SetNoModify(1); + SetDoor("north","/domains/campus/doors/plain_door"); + SetInventory(([ + "/domains/campus/obj/bbucket" :1, + "/domains/campus/npc/jennybot" :1, + ])); + SetProperty("no attack", 1); + } + + void init(){ + ::init(); + } + + mixed CanReceive(object ob){ + if(ob && ob->GetRace() == "rodent"){ + message("info","You are repelled by rodenticide.",ob); + return 0; + } + return 1; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/store.c ds2.0r28/lib/domains/campus/room/store.c *** ds2.0r18/lib/domains/campus/room/store.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/store.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,9 ---- + #include + inherit LIB_ROOM; + static void create() { + room::create(); + SetClimate("indoors"); + SetProperties( ([ "light" : 2 ]) ); + SetShort("a generic room"); + SetLong("This is an utterly plain, blank room."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/store2.c ds2.0r28/lib/domains/campus/room/store2.c *** ds2.0r18/lib/domains/campus/room/store2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/store2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,16 ---- + #include + inherit LIB_ROOM; + static void create() { + room::create(); + SetClimate("indoors"); + SetProperties( ([ "light" : 2 ]) ); + SetShort("a generic room"); + SetLong("This is an utterly plain, blank room."); + SetInventory(([ + "/domains/campus/meals/burger" : 20, + "/domains/campus/meals/ham_sand" : 20, + "/domains/campus/meals/milk" : 20, + "/domains/campus/obj/flashlight" : 20, + "/domains/campus/meals/salad" : 20, + "/domains/campus/meals/gator" : 20])); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/tunnel.c ds2.0r28/lib/domains/campus/room/tunnel.c *** ds2.0r18/lib/domains/campus/room/tunnel.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/tunnel.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,35 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(5); + SetShort("Tunnel"); + SetLong("You are in a dark and narrow underground tunnel. The walls are bare rock "+ + "and dirt...as if the tunnel has been carved out of and into the earth. Pipes and cables "+ + "run along the southern wall, and seem to emit a low hum. To the west you see a false wall "+ + "leading into the basement of the Vitual Campus administrative building. To the "+ + "east, the tunnel continues into darkness."); + SetItems(([ + "tunnel" : "This is evidently a hidden tunnel beneath the Virtual Campus. It's "+ + "extremely creepy and dark in here.", + "walls" : "The walls are bare earth and rocks. It looks as though whoever "+ + "built this tunnel was in a big hurry to get it done.", + ({"wall","south wall","southern wall"}) : "The south wall is heavily laden with "+ + "thick cables and metal pipes running east along its length.", + ({"rock","earth"}): "The walls are composed of this stuff...it's a rough excavation.", + ({"pipe","pipes","cable","cables"}): "These thick pipes and cables appear to carry power somewhere along the wall. They are humming slightly.", + "darkness":"It's deep. It's dark. It's the absence of light, and there's lots of it.", + ])); + SetListen("default","You hear faint echoes of dripping water."); + SetExits(([ + "west" : "/domains/campus/room/basement2", + "east" : "/domains/campus/room/tunnel2"])); + SetProperty("no attack", 1); + } + void init(){ + ::init(); + AddListen(({"pipe","pipes","wall","cables","cable"}) , "The pipes and "+ + "cables throb with some unknown power...emitting an eerie hum."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/tunnel2.c ds2.0r28/lib/domains/campus/room/tunnel2.c *** ds2.0r18/lib/domains/campus/room/tunnel2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/tunnel2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,33 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(5); + SetShort("Tunnel"); + SetLong("You are in a dark and narrow underground tunnel. The walls are bare rock "+ + "and dirt...as if the tunnel has been carved out of and into the earth. Pipes and cables "+ + "run along the southern wall, and seem to emit a low hum. To the west and "+ + "east, you can see some light."); + SetListen("default","You hear faint echoes of dripping water."); + SetItems(([ + "tunnel" : "This is evidently a hidden tunnel beneath the Virtual Campus. It's "+ + "extremely creepy and dark in here.", + "walls" : "The walls are bare earth and rocks. It looks as though whoever "+ + "built this tunnel was in a big hurry to get it done.", + ({"wall","south wall","southern wall"}) : "The south wall is heavily laden with "+ + "thick cables and metal pipes running east along its length.", + ({"rock","earth"}): "The walls are composed of this stuff...it's a rough excavation.", + "darkness":"It's deep. It's dark. It's the absence of light, and there's lots of it.", + ])); + SetExits(([ + "west" : "/domains/campus/room/tunnel", + "east" : "/domains/campus/room/access7"])); + SetProperty("no attack", 1); + } + void init(){ + ::init(); + AddListen(({"pipe","pipes","wall","cables","cable"}) , "The pipes and "+ + "cables throb with some unknown power...emitting an eerie hum."); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/tunnel3.c ds2.0r28/lib/domains/campus/room/tunnel3.c *** ds2.0r18/lib/domains/campus/room/tunnel3.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/tunnel3.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,39 ---- + #include + inherit LIB_ROOM; + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Tunnel"); + SetLong("You are in a dark and narrow underground tunnel. The walls are bare rock "+ + "and dirt...as if the tunnel has been carved out of and into the earth. Pipes and cables "+ + "run along the southern wall, and into the east wall. The tunnel ends here, and set into "+ + "the metal east wall is a door leading further east. To the west, the tunnel "+ + "continues into darkness. "); + SetListen("default","You hear faint echoes of dripping water."); + SetItems(([ + "tunnel" : "This is evidently a hidden tunnel beneath the Virtual Campus. It's "+ + "extremely creepy and dark in here.", + "walls" : "The walls are bare earth and rocks. It looks as though whoever "+ + "built this tunnel was in a big hurry to get it done.", + ({"wall","south wall","southern wall"}) : "The south wall is heavily laden with "+ + "thick cables and metal pipes running east along its length.", + ({"rock","earth"}): "The walls are composed of this stuff...it's a rough excavation.", + ({"pipe","pipes","cable","cables"}): "These thick pipes and cables appear to carry power somewhere along the wall. They are humming slightly.", + "darkness":"It's deep. It's dark. It's the absence of light, and there's lots of it.", + ])); + SetExits(([ + "west":"/domains/campus/room/tunnel2", + "east":"/domains/campus/room/u_lab"])); + SetDoor("east","/domains/campus/doors/u_door"); + SetObviousExits("e,w"); + // SetInventory(([ + // "/domains/campus/npc/mp" : 1, + // ])); + // SetProperty("no attack", 1); + } + void init(){ + AddListen(({"pipe","pipes","wall","cables","cable"}) , "The pipes and "+ + "cables throb with some unknown power...emitting an eerie hum."); + } + diff -c -r --new-file ds2.0r18/lib/domains/campus/room/u_lab.c ds2.0r28/lib/domains/campus/room/u_lab.c *** ds2.0r18/lib/domains/campus/room/u_lab.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/u_lab.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,140 ---- + #include + inherit LIB_ROOM; + + string panel_look(); + int dial; + string tele_where; + static void create() { + room::create(); + dial=0; + tele_where="a dark, metal corridor"; + SetClimate("indoors"); + SetAmbientLight(40); + SetShort("Underground Lab"); + SetLong("You are in a messy, wildly disorganized underground "+ + "laboratory. There are notes strewn everywhere, and a large chalkboard "+ + "is covered with bizarre schematics and formulae. On the east wall is "+ + "some mysterious, glowing portal, about the size of a door. Next to the "+ + "portal is a control panel, and a crudely drawn sign. There is a door on "+ + "the west wall."); + SetItems(([ + ({"lab","room","laboratory"}) : "This appears to be some sort of "+ + "secret physics lab.", + "mess" : "It's definitely messy in here.", + ({"note","notes"}) : "These are notes covered in highly technical "+ + "equations and drawings.", + ({"board","chalkboard"}) : "It is filled with lots of jargon and symbols you "+ + "don't recognize.", + ({"schematics","formulae"}) : "Complicated stuff, it looks like.", + ({"schematic","formula"}) : "Complicated stuff, it looks like.", + "east wall" : "Other than the mysterious glowing portal and the "+ + "control panel, the east wall seems pretty ordinary.", + "west wall" : "The west wall has a door leading west.", + "wall" : "It's a wall.", + ({"portal","glowing portal","mysterious glowing portal"}) : "This is just "+ + "what you'd expect a dimensional portal to look like, if you knew what "+ + "it was. It pulsates with some weird energy, and you feel mildly "+ + "nauseous looking into it. You feel strangely compelled to enter it.", + ({"panel","control panel"}) : (: panel_look :), + "sign" : "A crude, hand-drawn sign in red ink next to the portal." ])); + SetInventory(([ + ])); + // SetRead((["sign":"The sign reads: Enter at your own risk! This portal leads to some "+ + // "places of questionable safety and unstable reality...you are warned!", + // "notes" : "They are incomprehensible to you.", + // ({"board","chalkboard"}) : "It is full of cryptic equations. Buried in the middle of one "+ + // "is 'Step 3: a miracle happens'.", + // ])); + SetRead("sign","The sign reads: Enter at your own risk! This portal leads to some "+ + "places of questionable safety and unstable reality...you are warned!"); + + AddRead( ({"schematics","formulae"}), ({"You don't understand them." }) ); + AddRead( ({"notes"}) , ({"They are incomprehensible to you."}) ); + AddRead( ({"board","chalkboard"}) , ({"It is full of cryptic equations. Buried in the middle of one "+ + "is 'Step 3: a miracle happens'."}) ); + SetExits((["west":"/domains/campus/room/tunnel3"])); + SetEnters((["portal":"/domains/campus/room/access1"])); + SetDoor("west","/domains/campus/doors/u_door"); + SetObviousExits("w"); + new("/domains/campus/npc/seth")->eventMove(this_object()); + } + void init(){ + ::init(); + add_action("set_dial","turn"); + add_action("set_dial","set"); + } + string panel_look(){ + return "The control panel contains a single dial and a tiny screen. "+ + "The dial is set to: "+dial+" and the screen reads: "+tele_where+"."; + } + int set_dial(string str){ + int i; + object ob; + ob=present("seth",this_object()); + if(str=="dial"){ + write("You spin the dial.\n"); + say(this_player()->GetName()+" fiddles with the control panel.\n"); + if(ob){ + ob->eventForce("look at "+lower_case(this_player()->GetName())); + } + return 1; + } + if(sscanf(str,"dial to %d",i) > 0){ + if(i > 10) i=0; + write("You set the dial to "+i+".\n"); + say(this_player()->GetName()+" turns the control panel dial.\n"); + if(ob){ + ob->eventForce("say I hope you know what you're doing"); + } + dial=i; + this_object()->set_portal(dial); + return 1; + } + else return 0; + } + int set_portal(int i){ + if(i==0) { SetEnters((["portal":"/domains/campus/room/access1"])); + tele_where="a dark, metal corridor"; + return 1; + } + if(i==1) { SetEnters((["portal":"/realms/boy/area/room3"])); + tele_where="village gates"; + return 1; + } + if(i==2) { SetEnters((["portal":"/realms/dana/room/sc/marsh"])); + tele_where="a marsh"; + return 1; + } + if(i==3) { SetEnters((["portal":"/realms/ember/swamp/swamp1"])); + tele_where="a swamp"; + return 1; + } + if(i==4) { SetEnters((["portal":"/realms/haderach/land/cities/hartland/rooms/townsq"])); + tele_where="a town square"; + return 1; + } + if(i==5) { SetEnters((["portal":"/realms/kyranna/law/maindesk"])); + tele_where="a police department"; + return 1; + } + if(i==6) { SetEnters((["portal":"/realms/temujin/village/room/green"])); + tele_where="a ruined village"; + return 1; + } + if(i==7) { SetEnters((["portal":"/realms/war/arena/3b1"])); + tele_where="an arena"; + return 1; + } + if(i==8) { SetEnters((["portal":"/realms/zackron/metro/train/platfmn"])); + tele_where="a train station"; + return 1; + } + if(i==9) { SetEnters((["portal":"/realms/hiccups/rooms/fen1"])); + tele_where="entrance gates"; + return 1; + } + if(i==10) { SetEnters((["portal":"/domains/Midian/room/kaliid3"])); + tele_where="road by a church"; + return 1; + } + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/uptree.c ds2.0r28/lib/domains/campus/room/uptree.c *** ds2.0r18/lib/domains/campus/room/uptree.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/uptree.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,33 ---- + #include + inherit LIB_ROOM; + inherit LIB_CLIMB; + inherit "/lib/props/ambiance"; + + int ClimbDown(); + static void create() { + room::create(); + SetAmbientLight(25); + SetClimate("outdoors"); + SetShort("up a tree"); + SetLong("You are standing on some sturdy branches of the large "+ + "tree in University Square. "); + SetObviousExits("d"); + SetExits( ([ + "down" : "/domains/campus/room/usquare" + ]) ); + SetProperty("no attack", 1); + SetClimb( (: ClimbDown :) ,2); + } + int ClimbDown(){ + string omsg,imsg,dest; + object who; + dest="/domains/campus/room/usquare"; + who=this_player(); + omsg = "$N climbs down."; + imsg = "$N comes climbing down from the tree."; + who->eventMoveLiving(dest, omsg, imsg); + //return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/usquare.c ds2.0r28/lib/domains/campus/room/usquare.c *** ds2.0r18/lib/domains/campus/room/usquare.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/usquare.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,37 ---- + #include + inherit LIB_ROOM; + inherit LIB_CLIMB; + + static void create() { + room::create(); + SetAmbientLight(25); + SetClimate("outdoors"); + SetShort("University Square"); + SetLong("You are at University Square, a cobblestone-paved crossroads with a large tree in the middle. To the east is the Virtual Campus administrative building entrance. North is a path that seems to lead to a small town. The classroom building is south. The new Science Building is west."); + SetItems(([ + ({"building","administrative building"}) : "This large building houses the offices "+ + "of Virtual Campus staff, and is where most business is done. It also contains "+ + "a snack bar, a small store, and student lounge.", + "clinic" : "This small clinic is where students in need of medical "+ + "attention go." + ]) ); + SetExits( ([ + "south" : "/domains/campus/room/spath", + "north" : "/domains/campus/room/npath", + "east" : "/domains/campus/room/foyer", + "west" : "/domains/campus/room/science1.c", + ]) ); + SetInventory(([ + "/domains/campus/npc/tim" : 1, + "/domains/campus/npc/wim" : 1, + "/domains/campus/obj/tree" : 1, + "/domains/campus/obj/bench" : 3, + ])); + SetEnters( ([ + ]) ); + SetProperty("no attack", 1); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/void.c ds2.0r28/lib/domains/campus/room/void.c *** ds2.0r18/lib/domains/campus/room/void.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/void.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + /* /domains/campus/adm/void.c + * from the Nightmare V Object Library + * place where people go when their environments accidentally are + * destructed + * created by Descartes of Borg 960302 + */ + + #include + #include + + inherit LIB_ROOM; + + void create() { + room::create(); + SetShort("the void"); + SetLong("The void. Go down to get out."); + SetExits( ([ "down" : "/domains/campus/room/start" ]) ); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/room/wiz_lab.c ds2.0r28/lib/domains/campus/room/wiz_lab.c *** ds2.0r18/lib/domains/campus/room/wiz_lab.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/room/wiz_lab.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,29 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Laboratory Wing"); + SetLong("This is a bright, shiny laboratory complex connecting to labs where probability experiments are performed. Probability experiments are currently running in the north and west labs. The east lab is available for general use. The main hallway of the science building is south."); + SetItems( ([ + ({"lab","laboratory","wing","complex"}) : "You " + "are in the lab complex. Laboratories can " + "be accessed from here.", + ({"stairs","downstairs"}) : "Go down to " + "return to the Creators' Hall." + ]) ); + SetExits( ([ + "west" : "/domains/campus/room/plab2", + "north" : "/domains/campus/room/monty", + "east" : "/domains/campus/room/plab", + "south" : "/domains/campus/room/science1.c", + ]) ); + + SetDoor("south", "/domains/campus/doors/prob_door.c"); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/blue_wins ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/blue_wins *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/blue_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/blue_wins Wed Jul 5 00:01:24 2006 *************** *** 0 **** --- 1 ---- + 151 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/fblue ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/fblue *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/fblue Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/fblue Wed Jul 5 00:01:24 2006 *************** *** 0 **** --- 1 ---- + 60 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/fgreen ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/fgreen *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/fgreen Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/fgreen Wed Jul 5 00:01:24 2006 *************** *** 0 **** --- 1 ---- + 65 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/fred ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/fred *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/fred Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/fred Wed Jul 5 00:01:24 2006 *************** *** 0 **** --- 1 ---- + 64 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/green_wins ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/green_wins *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/green_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/green_wins Wed Jul 5 00:01:24 2006 *************** *** 0 **** --- 1 ---- + 147 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/percent ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/percent *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/percent Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/percent Wed Jul 5 00:01:24 2006 *************** *** 0 **** --- 1 ---- + 0 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/red_wins ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/red_wins *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/red_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/red_wins Wed Jul 5 00:01:24 2006 *************** *** 0 **** --- 1 ---- + 441 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/runs ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/runs *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/runs Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/runs Wed Jul 5 00:01:24 2006 *************** *** 0 **** --- 1 ---- + 740 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/stays ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/stays *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/stays Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/stays Wed Jul 5 00:01:24 2006 *************** *** 0 **** --- 1 ---- + 269 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/switches ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/switches *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/switches Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/switches Wed Jul 5 00:01:24 2006 *************** *** 0 **** --- 1 ---- + 264 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/wins ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/wins *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/bak1/wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/bak1/wins Wed Jul 5 00:01:24 2006 *************** *** 0 **** --- 1 ---- + 368 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/blue_wins ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/blue_wins *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/blue_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/blue_wins Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 89 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/fblue ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/fblue *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/fblue Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/fblue Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 90 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/fgreen ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/fgreen *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/fgreen Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/fgreen Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 107 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/fred ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/fred *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/fred Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/fred Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 90 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/green_wins ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/green_wins *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/green_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/green_wins Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 107 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/percent ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/percent *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/percent Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/percent Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 0 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/red_wins ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/red_wins *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/red_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/red_wins Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 92 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/runs ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/runs *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/runs Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/runs Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 288 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/stays ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/stays *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/stays Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/stays Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 13 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/switches ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/switches *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/switches Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/switches Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 8 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/wins ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/wins *** ds2.0r18/lib/domains/campus/txt/ai/charles/bak2/wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/bak2/wins Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 142 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/blue_wins ds2.0r28/lib/domains/campus/txt/ai/charles/blue_wins *** ds2.0r18/lib/domains/campus/txt/ai/charles/blue_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/blue_wins Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 29836 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/fblue ds2.0r28/lib/domains/campus/txt/ai/charles/fblue *** ds2.0r18/lib/domains/campus/txt/ai/charles/fblue Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/fblue Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 7339 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/fgreen ds2.0r28/lib/domains/campus/txt/ai/charles/fgreen *** ds2.0r18/lib/domains/campus/txt/ai/charles/fgreen Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/fgreen Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 7392 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/fred ds2.0r28/lib/domains/campus/txt/ai/charles/fred *** ds2.0r18/lib/domains/campus/txt/ai/charles/fred Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/fred Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 7336 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/green_wins ds2.0r28/lib/domains/campus/txt/ai/charles/green_wins *** ds2.0r18/lib/domains/campus/txt/ai/charles/green_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/green_wins Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 29837 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/percent ds2.0r28/lib/domains/campus/txt/ai/charles/percent *** ds2.0r18/lib/domains/campus/txt/ai/charles/percent Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/percent Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 0 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/red_wins ds2.0r28/lib/domains/campus/txt/ai/charles/red_wins *** ds2.0r18/lib/domains/campus/txt/ai/charles/red_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/red_wins Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 29836 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/runs ds2.0r28/lib/domains/campus/txt/ai/charles/runs *** ds2.0r18/lib/domains/campus/txt/ai/charles/runs Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/runs Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 89509 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/stays ds2.0r28/lib/domains/campus/txt/ai/charles/stays *** ds2.0r18/lib/domains/campus/txt/ai/charles/stays Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/stays Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 7 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/switches ds2.0r28/lib/domains/campus/txt/ai/charles/switches *** ds2.0r18/lib/domains/campus/txt/ai/charles/switches Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/switches Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 89502 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charles/wins ds2.0r28/lib/domains/campus/txt/ai/charles/wins *** ds2.0r18/lib/domains/campus/txt/ai/charles/wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charles/wins Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 59696 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/bak/blue_wins ds2.0r28/lib/domains/campus/txt/ai/charly/bak/blue_wins *** ds2.0r18/lib/domains/campus/txt/ai/charly/bak/blue_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/bak/blue_wins Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 21099 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/bak/fblue ds2.0r28/lib/domains/campus/txt/ai/charly/bak/fblue *** ds2.0r18/lib/domains/campus/txt/ai/charly/bak/fblue Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/bak/fblue Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 21418 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/bak/fgreen ds2.0r28/lib/domains/campus/txt/ai/charly/bak/fgreen *** ds2.0r18/lib/domains/campus/txt/ai/charly/bak/fgreen Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/bak/fgreen Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 21227 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/bak/fred ds2.0r28/lib/domains/campus/txt/ai/charly/bak/fred *** ds2.0r18/lib/domains/campus/txt/ai/charly/bak/fred Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/bak/fred Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 21436 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/bak/green_wins ds2.0r28/lib/domains/campus/txt/ai/charly/bak/green_wins *** ds2.0r18/lib/domains/campus/txt/ai/charly/bak/green_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/bak/green_wins Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 21611 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/bak/percent ds2.0r28/lib/domains/campus/txt/ai/charly/bak/percent *** ds2.0r18/lib/domains/campus/txt/ai/charly/bak/percent Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/bak/percent Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 0 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/bak/red_wins ds2.0r28/lib/domains/campus/txt/ai/charly/bak/red_wins *** ds2.0r18/lib/domains/campus/txt/ai/charly/bak/red_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/bak/red_wins Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 21369 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/bak/runs ds2.0r28/lib/domains/campus/txt/ai/charly/bak/runs *** ds2.0r18/lib/domains/campus/txt/ai/charly/bak/runs Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/bak/runs Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 64081 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/bak/stays ds2.0r28/lib/domains/campus/txt/ai/charly/bak/stays *** ds2.0r18/lib/domains/campus/txt/ai/charly/bak/stays Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/bak/stays Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 31999 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/bak/switches ds2.0r28/lib/domains/campus/txt/ai/charly/bak/switches *** ds2.0r18/lib/domains/campus/txt/ai/charly/bak/switches Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/bak/switches Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 32082 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/bak/wins ds2.0r28/lib/domains/campus/txt/ai/charly/bak/wins *** ds2.0r18/lib/domains/campus/txt/ai/charly/bak/wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/bak/wins Wed Jul 5 00:01:21 2006 *************** *** 0 **** --- 1 ---- + 31951 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/blue_wins ds2.0r28/lib/domains/campus/txt/ai/charly/blue_wins *** ds2.0r18/lib/domains/campus/txt/ai/charly/blue_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/blue_wins Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 41046 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/fblue ds2.0r28/lib/domains/campus/txt/ai/charly/fblue *** ds2.0r18/lib/domains/campus/txt/ai/charly/fblue Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/fblue Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 41644 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/fgreen ds2.0r28/lib/domains/campus/txt/ai/charly/fgreen *** ds2.0r18/lib/domains/campus/txt/ai/charly/fgreen Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/fgreen Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 41264 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/fred ds2.0r28/lib/domains/campus/txt/ai/charly/fred *** ds2.0r18/lib/domains/campus/txt/ai/charly/fred Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/fred Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 41579 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/green_wins ds2.0r28/lib/domains/campus/txt/ai/charly/green_wins *** ds2.0r18/lib/domains/campus/txt/ai/charly/green_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/green_wins Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 41804 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/percent ds2.0r28/lib/domains/campus/txt/ai/charly/percent *** ds2.0r18/lib/domains/campus/txt/ai/charly/percent Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/percent Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 0 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/red_wins ds2.0r28/lib/domains/campus/txt/ai/charly/red_wins *** ds2.0r18/lib/domains/campus/txt/ai/charly/red_wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/red_wins Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 41637 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/runs ds2.0r28/lib/domains/campus/txt/ai/charly/runs *** ds2.0r18/lib/domains/campus/txt/ai/charly/runs Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/runs Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 124487 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/stays ds2.0r28/lib/domains/campus/txt/ai/charly/stays *** ds2.0r18/lib/domains/campus/txt/ai/charly/stays Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/stays Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 62301 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/switches ds2.0r28/lib/domains/campus/txt/ai/charly/switches *** ds2.0r18/lib/domains/campus/txt/ai/charly/switches Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/switches Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 62186 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/ai/charly/wins ds2.0r28/lib/domains/campus/txt/ai/charly/wins *** ds2.0r18/lib/domains/campus/txt/ai/charly/wins Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/ai/charly/wins Wed Jul 5 00:01:18 2006 *************** *** 0 **** --- 1 ---- + 62153 \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/bye.txt ds2.0r28/lib/domains/campus/txt/bye.txt *** ds2.0r18/lib/domains/campus/txt/bye.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/bye.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,12 ---- + __________ __ __ ___________ __ + / /\ / /\ / / / /| / / + / / \ / / \ / / / // / /| + ********** / ** \ ** ***********/ ** | + ** |____** / ** / ** ** |______ ** | + ** / ** **/ **/ ** / /| ** | + **/ **/ \ **** | ** / // ** | + **********/ / ** | *********/ ** / + ** |____** // ** | ** |_________ **/ + ** / **/ ** | ** / /| / /| + **/ **/ ** / **/ // ** / + **********/ **/ ***********/ **/ diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/dali.txt ds2.0r28/lib/domains/campus/txt/dali.txt *** ds2.0r18/lib/domains/campus/txt/dali.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/dali.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,86 ---- + ;!>,!!!> + + !! !!!!! + ;!! !!!!! + `!! !!!!! + !! !!!!!> . + `!.`!!!!! ; !!!! ; ;!'` + !!! `!!!! !!` ,c, + !!!> !!!!> ;`< ,cc$$cc .,r== $$c ! + !!!! !!!!!!. ,>>;;;;;;;;.`"?$$c MMMMMMM )MM ,= "$$.` + !!!!!!!!!!!!!>'' ,>'''' ``````''''!!!; ?$$c`MMMMMM.`MMMP== `$h + `!! ;!!!!!!''''.,;;;''' JF !;;;,,,,; 3$$.`MMMMMb MMMnnnM $$h + ;!! `$$h `MMMMM MMMMMMM $$$ + ;!!>`!!!!!!'` ?> !!!!!!!!!> $$$ MMMMM MMMMMMM $$$ + '!!!! b !!!!!!!!!! $$$ MMMMMM MMML,,`,$$$ + ,,,,,, ;! ,,,,,,,,,,,,,,,, $ !!!!!!!!!! $$$ MMMMMM MMMMML J$$F + !!!!!! !! !!!! `!!!!!!!!!!!!!!' ; $ !!!!!!!!!! $$$ MMMMMP.MMMMMP $$$F + !!!!! ;!! !!!!> !!!!!!!!!!!!' ;' .`.`.`. ?.`!!!!!!!!! 3$$ MMMP `MMMMM>,$$P + !!!!' !!' !!!!> !!!!!!!!!!' ;!' `.`.`.`. `h !!!!!!!!! $$$ MMML MMPPP J$$'. + !!!! !!!;!!!!!';!!!!!!!!' ;!' .`.`.`.`.` ?,`!!!!!!!! ?$$ MMMMM.,MM_"',$$F . + !!!';!!!.!!!!' `$$ MMMMMbdML ` $$$ . + ``` !!!> !!!! ```````` ;! .`.`.`.`.`.`.`.` h `!!!!!!> $$ )MMMMMMMMM d$$' `. + !!' !!!''!!! ' .`.`.`.`.`.`.`.`.` `?,`'!!!!! ?$h 4MMMMMMP z$$' .`. + '' '''''''' .`.`.`.`.`.`.`.`.`.`.` ?h.``'`..`$$ MMMMMM ,$$F `.`. + ` !!!! .`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`. cccc `$$.'4MMP.3$F .`.`. + .`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`. J$$$$$F . "$h." . 3$h .`.`. + !' ! !!!!!!> .`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`. """" .`.`.`$$, 4 3$$ .`.`. + ;! !!!!!!! `.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`. ?$h J$F .`.`. + ;' !!!!!!! `.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`.`. "$$$$P' .`.`. + ' `!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' >>'''''''''`````'''''' 4MMMb."?$$$cc,.. .,,cccccccccccccccc,c`.$$$$$$$ MM !!!! `.`.`.`. + !!!!!!!!!!!!!!;. `""44MMMMMMMMMMMMMMMMnnnn. ?$$$.<$$$h.$h MM !!!! `.`.`.`. + !!!!!!!!!!!!!!!!>.;. `""444MMMMMMMMMMMMMb $$$:<$$$$$$$ 4M ;. ..""""44MMMM J$' <$$$$$$h`Mb`!!! `.`.`.`. + !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!>; `MMM ?$. d$$$$$$$ MM.`!! `.`.`.`. + !!!!!!!!!!'``!''' ..`' 4MMb `$$$$$$$'.dM'.!!!! `.`.`.`. + .`"M"_" MMMMMMMP,MMM ;!>>!!!!!!' >!(!)<><>' .!!!!!!!!!!!!!!; `Mb $$$$$F;MP !!!!!! `.`.`.`. + dPPM 4MMMMM" dMMP (->;)<><' ;!!!!!!!!!!!!!!!!. 4M $$$$$h M>.!!!!!! `.`.`.`. + =M uMMnMMM" uMMM" ;' ;!!!!!!!!!!!!!!!!!; 4M.??"$$',M ;`(>!>' -??',M' !!!!!!! `.`.`.`. + MM `MP" xdMMMP <(;<:)!`)' :)/;<:! !!!!!!!!!!!!!!!!!!!!!! `MM.-= d';!!!!!!!! .`.`.`.`. + ,xndMMMMP" .;)`;:`>(;: !!!!!!!!!!!!!!!!!!!!!!!; 4MMnndM <(' ;!!!!!!!!!!!!!!!!!!!!!!!!!, 4MMMMP !!!!!!!> `.`.`.`.`. + P"" .,;<):(;/(\'>-)' ;!!!!!!!!!!!!!!!!!!!!!!!!!!!>.`"P" <;,<- >;>' ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!;;:(';(' ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' `.`.`.`.`.`. + :\;`<(.:>-;(;<>: :'<;:<;-/)/ :.;`;(';' ;!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!' `.`.`.`.`.`.`. + diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/doh.txt ds2.0r28/lib/domains/campus/txt/doh.txt *** ds2.0r18/lib/domains/campus/txt/doh.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/doh.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,16 ---- + DDDDDDDDDDDDD HHHHHHH !!! + D::::::::::::DDD H:::::H !:::! + D:::::::::::::::DD H:::::H !:::! + DDD:::::DDDDD:::::D H:::::H !:::! + D:::::D D:::::D UUUUUU H::::H HHHHH !:::! + D:::::D D:::::D UU::::::UU H::::HH:::::HHH !:::! + D:::::D D:::::D U::::::::::U H::::::::::::::HH !:::! + D:::::D D:::::D U:::::UU:::::U H:::::::HHH::::::H !:::! + D:::::D D:::::D U::::U U::::U H::::::H H::::::H !:::! + D:::::D D:::::D U::::U U::::U H:::::H H:::::H !:::! + D:::::D D:::::D U::::U U::::U H:::::H H:::::H !:! + D:::::D D:::::D U::::U U::::U H:::::H H:::::H !!! + DDD:::::DDDDD:::::D U:::::UU:::::U H:::::H H:::::H + D:::::::::::::::DD U::::::::::U H:::::H H:::::H !!! + D::::::::::::DDD UU::::::UU H:::::H H:::::H !!:!! + DDDDDDDDDDDDD UUUUUU HHHHHHH HHHHHHH !!! diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/dork.txt ds2.0r28/lib/domains/campus/txt/dork.txt *** ds2.0r18/lib/domains/campus/txt/dork.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/dork.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,16 ---- + DDDDDDDDDDDDD KKKKKK + D::::::::::::DDD K::::K + D:::::::::::::::DD K::::K + DDD:::::DDDDD:::::D RRRRRR K::::K + D:::::D D:::::D OOOOOO R::::R RRRRR K::::K KKKKKK + D:::::D D:::::D OO::::::OO R::::RR:::::RRR K::::K K::::K + D:::::D D:::::D O::::::::::O R::::::::::::::RR K::::K K::::K + D:::::D D:::::D O:::::OO:::::O R:::::::RRR:::RR K::::KK::::K + D:::::D D:::::D O::::O O::::O R::::::R RRR K:::::::::K + D:::::D D:::::D O::::O O::::O R:::::R K::::::::K + D:::::D D:::::D O::::O O::::O R:::::R K:::::::::K + D:::::D D:::::D O::::O O::::O R:::::R K::::KK::::K + DDD:::::DDDDD:::::D O:::::OO:::::O R:::::R K::::K K::::K + D:::::::::::::::DD O::::::::::O R:::::R K::::K K::::K + D::::::::::::DDD OO::::::OO R:::::R K::::K K::::K + DDDDDDDDDDDDD OOOOOO RRRRRRR KKKKKK KKKKKK diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/duh.txt ds2.0r28/lib/domains/campus/txt/duh.txt *** ds2.0r18/lib/domains/campus/txt/duh.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/duh.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,20 ---- + + + DDDDDDDDDDDDD HHHHHHH ????????? + D::::::::::::DDD H:::::H ?::::::::::? + D:::::::::::::::DD H:::::H ?:::??????:::? + DDD:::::DDDDD:::::D H:::::H ?:::? ?:::? + D:::::D D:::::D UUUUUU UUUUUU H::::H HHHHH ??:?? ?:::? + D:::::D D:::::D U::::U U::::U H::::HH:::::HHH ??? ?:::? + D:::::D D:::::D U::::U U::::U H::::::::::::::HH ?:::? + D:::::D D:::::D UU:::U U::::U H:::::::HHH::::::H ?:::? + D:::::D D:::::D U:::U U::::U H::::::H H::::::H ?:::? + D:::::D D:::::D U:::U U::::U H:::::H H:::::H ?:::? + D:::::D D:::::D U:::U U::::U H:::::H H:::::H ??:?? + D:::::D D:::::D U:::U U::::U H:::::H H:::::H ??? + DDD:::::DDDDD:::::D U::::UU:::::UU H:::::H H:::::H + D:::::::::::::::DD U::::::::::::U H:::::H H:::::H ??? + D::::::::::::DDD UU:::::UU:::U H:::::H H:::::H ??:?? + DDDDDDDDDDDDD UUUUU UUUU HHHHHHH HHHHHHH ??? + + diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/finger.txt ds2.0r28/lib/domains/campus/txt/finger.txt *** ds2.0r18/lib/domains/campus/txt/finger.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/finger.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,13 ---- + /"\ + |\./| + | | + |>*<| + | | + /'\| |/'\ + /'\| | | | + | %%%%% | |\ Get a clue. + | | | | | \ + | * * * * |> > + | / + | / + |_____________/ diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/hi.txt ds2.0r28/lib/domains/campus/txt/hi.txt *** ds2.0r18/lib/domains/campus/txt/hi.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/hi.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,17 ---- + ******** ******** ********************* + * ** * ** * ** + * * * * * * * * * + * * * * * * * * * + ******** * ******** * ********************* * + ******** * ******** * ********************** + ******** * ******** * ********************* + ******** * ******** * ******** * + *********************** * ******** * + *********************** * ********** ******** + *********************** * * ******** * ** + ******** * ******** * * ******** * * * + ******** * ******** * * ******** * * + ******** * ******** * ********************* * + ********* ********* ********************** + ******** ******** ********************* + diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/hug.txt ds2.0r28/lib/domains/campus/txt/hug.txt *** ds2.0r18/lib/domains/campus/txt/hug.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/hug.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,26 ---- + + + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGGGGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGGGGGGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGGGGGGGGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGGGGGGGGGGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGGGGGGGGGGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGG GGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGG GGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGG + HHHHHHHHHHHHHHHHHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGG + HHHHHHHHHHHHHHHHHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGG + HHHHHHHHHHHHHHHHHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGG + HHHHHHHHHHHHHHHHHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGG GGGGGGGG + HHHHHHHHHHHHHHHHHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGG GGGGGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGG GGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGG GGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUU UUUUUUUUUU GGGGG GGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUUUUUUUUUUUUUUUUU GGGGGGGGGGGGGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUUUUUUUUUUUUUUU GGGGGGGGGGGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUUUUUUUUUUUUU GGGGGGGGGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUUUUUUUUUUU GGGGGGGGGG + HHHHHHHHHH HHHHHHHHHH UUUUUUUUUUUUUUUUU GGGGGGGG + + diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/huh.txt ds2.0r28/lib/domains/campus/txt/huh.txt *** ds2.0r18/lib/domains/campus/txt/huh.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/huh.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,16 ---- + HHHHHHHHHHH HHHHHHHHHHH HHHHHHH ????????? + H:::::::::H H:::::::::H H:::::H ?::::::::::? + H:::::::::H H:::::::::H H:::::H ?:::??????:::? + HHH:::::HHH HHH:::::HHH H:::::H ?:::? ?:::? + H:::::H H:::::H UUUUUU UUUUUU H::::H HHHHH ??:?? ?:::? + H:::::H H:::::H U::::U U::::U H::::HH:::::HHH ??? ?:::? + H:::::HHHHHHHH:::::H U::::U U::::U H::::::::::::::HH ?:::? + H::::::::::::::::::H UU:::U U::::U H:::::::HHH::::::H ?:::? + H::::::::::::::::::H U:::U U::::U H::::::H H::::::H ?:::? + H:::::HHHHHHHH:::::H U:::U U::::U H:::::H H:::::H ?:::? + H:::::H H:::::H U:::U U::::U H:::::H H:::::H ??:?? + H:::::H H:::::H U:::U U::::U H:::::H H:::::H ??? + HHH:::::HHH HHH:::::HHH U::::UU:::::UU H:::::H H:::::H + H:::::::::H H:::::::::H U::::::::::::U H:::::H H:::::H ??? + H:::::::::H H:::::::::H UU:::::UU:::U H:::::H H:::::H ??:?? + HHHHHHHHHHH HHHHHHHHHHH UUUUU UUUU HHHHHHH HHHHHHH ??? diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/1.txt ds2.0r28/lib/domains/campus/txt/jenny/1.txt *** ds2.0r18/lib/domains/campus/txt/jenny/1.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/1.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,3 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ Ok! I'm going to try to give you some tips so that you can enjoy your visit to the LPC University Virtual Campus. Please note you can deactivate me at any time by typing: %^RED%^deactivate bot%^BOLD%^CYAN%^ + + Also, please remember that I am just a machine, so I will not understand anything you try to tell me. I will pause between tips, to give you time to read, or to deactivate me. As I continue, my tips will gain in technical complexity, so even if you are an experienced "MUDder", you may gain some benefit from listening to me.%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/10.txt ds2.0r28/lib/domains/campus/txt/jenny/10.txt *** ds2.0r18/lib/domains/campus/txt/jenny/10.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/10.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,3 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ In some cases, other people in the same room as you might have apples. The MUD might not be sure whether you mean your own apple or someone else's. In this case, you want to get more specific: "%^RED%^eat my apple%^BOLD%^CYAN%^", or "%^RED%^eat first apple%^BOLD%^CYAN%^". + + If a command doesn't work one way, try it another way. If the MUD doesn't understand "%^RED%^shoot jennybot%^BOLD%^CYAN%^", try "%^RED%^shoot jennybot with gun%^BOLD%^CYAN%^" or maybe "%^RED%^shoot my squirt gun at jennybot%^BOLD%^CYAN%^".%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/11.txt ds2.0r28/lib/domains/campus/txt/jenny/11.txt *** ds2.0r18/lib/domains/campus/txt/jenny/11.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/11.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,3 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ Other very common commands are "%^RED%^score%^BOLD%^CYAN%^" to let you know your general condition, and "%^RED%^status%^BOLD%^CYAN%^" to give you a specific readout of your health and stamina. hp are health points, and it they reach zero, your body dies. + + Sp are stamina points. If they reach zero, you will be unable to do anything for a while, until you rest and your strength returns. Mp are mana points, which are a little too complicated for me to explain right now. If you don't already know what they are, you don't have to worry about them. Just trust me on that.%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/12.txt ds2.0r28/lib/domains/campus/txt/jenny/12.txt *** ds2.0r18/lib/domains/campus/txt/jenny/12.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/12.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,9 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ Ok, we're coming close to the end of my speech here. Whew! + + There are two kinds of living beings you will encounter on LPC University. The first are called "player characters". They are players like you: human beings manipulating their virtual bodies and using the MUD as a way to communicate. + + The other kind are "non-player character". This kind of living being is most often referred to as an "NPC". I am an example of an NPC. Although I am talking to you, this body is under the control of the MUD program. I can't talk to you about the latest reality TV show or your favorite performer...because the MUD is just a program and doesn't understand such things. + + NPC's are a way for the MUD to provide the virtual environment some added realism. If you walk through a forest, you might expect to see birds, or rabbits, or foxes. When NPC's arrive in your environment, or you arrive in theirs, you can interact with them...but only up to a point. There isn't a person controlling their bodies...just the MUD simulating a living being. + + NPC's are sometimes referred to as MOB's or mobiles, because they often can wander from one place to another in this virtual environment.%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/13.txt ds2.0r28/lib/domains/campus/txt/jenny/13.txt *** ds2.0r18/lib/domains/campus/txt/jenny/13.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/13.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,3 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ Some NPC's fill specific roles. For example, if you go to the campus bookstore, you will be able to buy and sell some things. Kim, the shopkeeper, can respond to various requests, such as "%^RED%^list%^BOLD%^CYAN%^" to see what's for sale, "%^RED%^appraise hat%^BOLD%^CYAN%^" to see what she thinks your hat is worth and "%^RED%^sell hat to kim%^BOLD%^CYAN%^" to exchange your headgear for money. If you think you need a backpack and you've got the funds, try "%^RED%^buy first backpack from kim%^BOLD%^CYAN%^". To know how much money you have, type: "%^RED%^money%^BOLD%^CYAN%^". + + Some vendors will only handle specific kinds of things. Kim will not buy or sell weapons or food. Gloria in the snack bar, though, will vend food but not buy or sell anything else.%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/14.txt ds2.0r28/lib/domains/campus/txt/jenny/14.txt *** ds2.0r18/lib/domains/campus/txt/jenny/14.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/14.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,5 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ There are some players who have the title "creator", "wizard", or "arch". These are the people who work on and with the technical parts of the MUD program. They are the folks who use the LPC programming language to create environments and NPC's, and make sure that a box behaves like a box. + + If you think you'd like to learn some LPC programming and join the LPC University staff let us know. Go to the mail room and mail the administrator. + + Be aware that it's fun, but it really is programming, with functions and variables and everything.%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/15.txt ds2.0r28/lib/domains/campus/txt/jenny/15.txt *** ds2.0r18/lib/domains/campus/txt/jenny/15.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/15.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,13 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ Well, that about wraps it up for my spiel. Thank you for listening. If you get stuck or confused type "%^RED%^help%^BOLD%^CYAN%^" to enter the system help menus. + + If other players are in this room, you can communicate by typing: "%^RED%^say blah blah blah%^BOLD%^CYAN%^". Everyone in the same room will hear your conversation. + + + If you know someone is logged in but they are not in the same room, you can communicate by typing: "%^RED%^tell joey blah blah blah%^BOLD%^CYAN%^". This is a private communication channel and you can also use it if you're in the same room and you want to discuss things you'd rather not share with bystanders. + + Oh, speaking of privacy...you don't have any. The University reserves the right to review, monitor, etc, yakety schmakety. + + Point is, anything that really really needs to stay private, still needs to be discussed face to face, in the real world. + + + Have fun exploring!%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/2.txt ds2.0r28/lib/domains/campus/txt/jenny/2.txt *** ds2.0r18/lib/domains/campus/txt/jenny/2.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/2.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,5 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ First, the most basic stuff: Your computer is connected to our computer via the Internet. This connection is kind of like the World Wide Web, except, as you see, there are no pictures. Just text. + + When you connected to our computer, you logged on to a program we are running. This program is what the LPC University Virtual Campus is made of. + + LPC University is a MUD, which is kind of like a chat program, where you type stuff and can communicate with other people. When I refer to "the MUD", I'm talking about that program. MUD stands for "Multi User Domain".%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/3.txt ds2.0r28/lib/domains/campus/txt/jenny/3.txt *** ds2.0r18/lib/domains/campus/txt/jenny/3.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/3.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,7 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ The big difference between LPC University and Internet chat programs is that here you can interact with the program itself, not just the people connected to it. + + When you interact with the program, or MUD, the program pretends that you have a body inside the program. That is your virtual body. When you enter a command, the MUD interprets this as your virtual body trying to do something. + + For example, right now the program is pretending that your body is inside a room called the "Admissions office". If you type: "%^RED%^look%^BOLD%^CYAN%^" (without quotation marks) and hit enter, you will be given a description of the room as if your virtual body was looking around. + + "%^RED%^look%^BOLD%^CYAN%^" is a command, and you can use different commands to get your virtual body to do things within this virtual environment. The MUD will tell you how your action affects your environment, and it will also tell you if it didn't understand what you meant.%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/4.txt ds2.0r28/lib/domains/campus/txt/jenny/4.txt *** ds2.0r18/lib/domains/campus/txt/jenny/4.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/4.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,5 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ I've just given you a list. It is now in the inventory of virtual items your virtual body is carrying. To get a list of items you are carrying, type "%^RED%^inventory%^BOLD%^CYAN%^". I've given you this list so you can read it. It contains various MUD commands you will find useful. Type "%^RED%^read list%^BOLD%^CYAN%^". + + Ok, from now on, when you log on, you will be carrying this list on you, and you can use it as a reference if you get stuck. Of course, if you "%^RED%^drop list%^BOLD%^CYAN%^", then it will fall to the floor, and you will no longer have it. You might be able to read it, or you might not. If you leave the room, you won't be able to read it. + + Now that you have a general idea of how to do some stuff, let me give you another command that you might find useful. My tips are prerecorded messages, and you might not like the pauses between messages. To skip to the next tip, type "%^RED%^next tip%^BOLD%^CYAN%^".%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/5.txt ds2.0r28/lib/domains/campus/txt/jenny/5.txt *** ds2.0r18/lib/domains/campus/txt/jenny/5.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/5.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,7 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ When you finally do decide to leave this room and explore other areas of LPC University, you will use commands like "%^RED%^go north%^BOLD%^CYAN%^", "%^RED%^open door%^BOLD%^CYAN%^", or "%^RED%^climb tree%^BOLD%^CYAN%^". When you move to a new location, a description of that new place will be provided. + + Right now, because you are new, you are limited to exploring the rooms inside this building, the LPC University Virtual Campus Administration Building. This way, you can move around and get used to your new body without fear of getting lost or injured. + + Yes, your body can sustain injury. In trying to provide the illusion of a virtual reality, the realities of injury, sickness, and even death are possible for your virtual body to experience. + + Not while you're in this building, though.%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/6.txt ds2.0r28/lib/domains/campus/txt/jenny/6.txt *** ds2.0r18/lib/domains/campus/txt/jenny/6.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/6.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ Here's a map of this building. Type "%^RED%^read map%^BOLD%^CYAN%^"%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/7.txt ds2.0r28/lib/domains/campus/txt/jenny/7.txt *** ds2.0r18/lib/domains/campus/txt/jenny/7.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/7.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,7 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ As you can see, there aren't too many rooms available to you right now. There are many other places the MUD can take you to, though, once you know your way around. You might even be able to sneak out of the building, and visit the virtual world outside it. + + The MUD understands some convenient abbreviations. Instead of "%^RED%^go south%^BOLD%^CYAN%^" you can just type "%^RED%^s%^BOLD%^CYAN%^", and your command will be understood. Similarly, "%^RED%^i%^BOLD%^CYAN%^" will show you the inventory of items you are carrying. + + Other common commands are "%^RED%^who%^BOLD%^CYAN%^" to see who else is logged on, "%^RED%^quit%^BOLD%^CYAN%^" to leave the mud, "%^RED%^drop%^BOLD%^CYAN%^" and "%^RED%^get%^BOLD%^CYAN%^", as in "%^RED%^drop map%^BOLD%^CYAN%^", and "%^RED%^get map%^BOLD%^CYAN%^". + + If you get articles of clothing or jewelry they can be worn, as in "%^RED%^wear hat%^BOLD%^CYAN%^".%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/8.txt ds2.0r28/lib/domains/campus/txt/jenny/8.txt *** ds2.0r18/lib/domains/campus/txt/jenny/8.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/8.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,13 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ To examine items more closely, such as a hat, you can type "%^RED%^exa hat%^BOLD%^CYAN%^" or "%^RED%^look at hat%^BOLD%^CYAN%^", or even "%^RED%^l hat%^BOLD%^CYAN%^". + + Some objects can contain other objects, like bags or boxes. If you examine such a container, you will get a description of its exterior. To know what is in it, you must, for example, "%^RED%^look in bag%^BOLD%^CYAN%^". + + To remove something from its container, the command might be "%^RED%^get gun from bag%^BOLD%^CYAN%^" + + Now, we don't promote violence as a positive thing here. That's just a squirt gun in the bag, and nobody can get hurt with it. + + On the outside, you might need a real weapon to defend yourself, as you might in real life. + + Weapons typically must be wielded to be used. For example "%^RED%^wield squirt gun%^BOLD%^CYAN%^" would enable you to shoot it, and "%^RED%^shoot squirt gun at jennybot%^BOLD%^CYAN%^" would discharge the weapon. + + We strongly discourage the use of lethal force within the administrative building. Attacks are automatically prevented here, and attempted attacks can lead to MUD punishment.%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/9.txt ds2.0r28/lib/domains/campus/txt/jenny/9.txt *** ds2.0r18/lib/domains/campus/txt/jenny/9.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/9.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,7 ---- + %^RESET%^Jennybot says, "%^BOLD%^CYAN%^ The manipulation of these virtual objects is usually a pretty intuitive process. The "%^RED%^examine thing%^BOLD%^CYAN%^" description usually gives you the clues you need to use a thing. + + Sometimes, though, you have more than one of a similar object. If you're carrying two apples, for example, you might want to specify which one you want to eat. + + You don't want to make yourself sick by eating the rotten apple, but if you just type "%^RED%^eat apple%^BOLD%^CYAN%^", the MUD doesn't know which one you mean. Usually your command won't be executed, and you will be asked which one of the objects you mean. + + In this case, let's get rid of the bad apple. type "%^RED%^put rotten apple in bin%^BOLD%^CYAN%^". There is a recycling bin here, where all kinds of objects can be vaporized and their bits reused. Don't worry, living beings can't enter it.%^RESET%^" diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/jenny/spiel.txt ds2.0r28/lib/domains/campus/txt/jenny/spiel.txt *** ds2.0r18/lib/domains/campus/txt/jenny/spiel.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/jenny/spiel.txt Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1 ---- + %^BOLD%^CYAN%^! I'm Jenny, the LPC University automated guide bot. If you'd like an orientation on this place, type: %^RESET%^ diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/lisa.txt ds2.0r28/lib/domains/campus/txt/lisa.txt *** ds2.0r18/lib/domains/campus/txt/lisa.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/lisa.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,47 ---- + iIYVVVVXVVVVVVVVVYVYVYYVYYYYIIIIYYYIYVVVYYYYYYYYYVVYVVVVXVVVVVYI+. + tYVXXXXXXVXXXXVVVYVVVVVVVVVVVVYVVVVVVVVVVVVVVVVVXXXXXVXXXXXXXVVYi. + iYXRXRRRXXXXXXXXXXXVVXVXVVVVVVVVXXXVXVVXXXXXXXXXXXXXXRRRRRRRRRXVi. + tVRRRRRRRRRRRRRRRXRXXXXXXXXXXXXXXRRXXXXRRRRXXXXXXXRRRRRRRRRRRRXV+. + tVRRBBBRMBRRRRRRRRRXXRRRRRXt=+;;;;;==iVXRRRRXXXXRRRRRRRRMMBRRRRXi, + tVRRBMBBMMBBBBBMBBRBBBRBX++=++;;;;;;:;;;IRRRRXXRRRBBBBBBMMBBBRRXi, + iVRMMMMMMMMMMMMMMBRBBMMV==iIVYIi=;;;;:::;;XRRRRRRBBMMMMMMMMBBRRXi. + iVRMMMMMMMMMMMMMMMMMMMY;IBWWWWMMXYi=;:::::;RBBBMMMMMMMMMMMMMMBBXi, + +VRMMRBMMMMMMMMMMMMMMY+;VMMMMMMMRXIi=;:::::=VVXXXRRRMMMMMMMMBBMXi; + =tYYVVVXRRRXXRBMMMMMV+;=RBBMMMXVXXVYt;::::::ttYYVYVVRMMMMMMBXXVI+= + ;=tIYYVYYYYYYVVVMMMBt=;;+i=IBi+t==;;i;::::::+iitIIttYRMMMMMRXVVI=; + ;=IIIIYYYIIIIttIYItIt;;=VVYXBIVRXVVXI;::::::;+iitttttVMMBRRRVVVI+, + ;+++tttIttttiiii+i++==;;RMMMBXXMMMXI+;::::::;+ittttitYVXVYYIYVIi;; + ;===iiittiiIitiii++;;;;:IVRVi=iBXVIi;::::::::;==+++++iiittii+++=;; + ;;==+iiiiiiiiii+++=;;;;;;VYVIiiiVVt+;::::::::;++++++++++iti++++=;; + ;;=++iiii+i+++++iii==;;;::tXYIIYIi+=;:::::,::;+++++++++++++++++=;; + ;;;+==+ii+++++iiiiit=;;:::::=====;;;::::::::::+++i+++++++++i+++;;; + ;;;==+=+iiiiitttIIII+;;;:,::,;;;;:;=;;;::,::::=++++++++==++++++;;; + :;====+tittiiittttti+;;::::,:=Ytiiiiti=;:::::,:;;==ii+ittItii+==;; + ;;+iiittIti+ii;;===;;:;::::;+IVXVVVVVVt;;;;;::::;;===;+IIiiti=;;;; + ;=++++iIti+ii+=;;;=;:::;;+VXBMMBBBBBBXY=;=;;:::::;=iYVIIttii++;;;; + ;;++iiiItttIi+++=;;:::;=iBMMMMMMMMMMMXI==;;,::;;:;;=+itIttIIti+;;; + ;=+++++i+tYIIiii;:,::;itXMMMMMMMMMMMBXti==;:;++=;:::::;=+iittti+;; + ;;+ii+ii+iitiIi;::::;iXBMMMMMWWWWWMMBXti+ii=;::::,,,,:::=;==+tI+;; + ;;iiiitItttti;:::;::=+itYXXMWWWWWWMBYt+;;::,,,,,,,,,,,,,:==;==;;;; + :;=iIIIttIt+:;:::;;;==;+=+iiittttti+;;:,:,,,,::,,,,,,,,:::;=;==::; + ;::=+ittiii=;:::::;;;:;:;=++==;;==;:,,,,,,:;::::,,,,,,,,::;==;;::; + :::;+iiiii=;::::,:;:::::;;:;;::;:::,,,,,,,:::;=;;;:,,,,,:::;;::::; + :;;iIIIIII=;:::,:::::::,::::,:::,,,,,,,,,,,:;;=;:,,,,,,::::;=;:::; + :;==++ii+;;;:::::::::::,,,,,,::,,,,,,,,,,,::::,,,,,,,,,,:,:::::::; + ::;;=+=;;;:::;;::,,,,,,,,,,,,,,,,,,,,,,,,,:,,,,,,,,,,,,,,,,,:::::; + ::;=;;;:;:::;;;;::,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,::,,::::; + :;;:;::::::,::,,:,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,,:::; + :::::::::::;;;:,,,,,,,,,,,,,...,...,,,.,,,,,,,,,,,,.,,,,,,,,,,,,:; + ::::::::;=;;;;;::,,,,,,,,,,,.......,...,,,,,,,,,,,,.,,,,,,,,,,,,,; + :::::,,:;=;;;;;;;iVXXXVt+:,,....,,,,....,.,,,,,,,.,.....,,,,,,,,:; + :,,::,,:::;;;;;;=IVVVXXXXVXVt:,,,,,..,..,,,,.,,,,,..,.,,,,,,,,,,,; + ::,::,,,:,:::::,::;=iIYVXVVVVIYIi;,,.,.,,,::,,,,,,,,,,,,,,,,,,,,,. + :,,,,,,,,,,,,,,,,::;+itIIIIIIi:;;i++=;;;;;;;;;::,,,...,,..,,,,,,,. + :,,,,,,,,,,,,,,=iitVYi++iitt==it;;:;;;;::;;::::,,,......,,,,,,,::. + ::,,,,,,,,,,,,,++iiIVIi=;;=;+i;:;+:::,,,,,,,,,,,,,.....,,,,,,,,::, + ,,,,,,,,,,,,,,,;=+it=:::,,,,,,,,,,.,......,,.,..........,,,,,,,,:: + :,,,,,,,,,,,,,,,,:=:,,,,,,,,,,,,,,......................,.,,.,.,,: + :,,,,,,,,,,,,,,,,,:,,,,,,,,,,..,........................,..,...,,: + ,,,,,,,,,,,,,,,,,,,.....................................,.......,, + ,,,,,,,,,.,,,,,,,...............................................,, + itittiiiii+=++=;;=iiiiiiittiiiiii+iii===;++iiitiiiiiii+=====+ii=+i diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/list.txt ds2.0r28/lib/domains/campus/txt/list.txt *** ds2.0r18/lib/domains/campus/txt/list.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/list.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,37 ---- + Common player commands: + --------------- + look, l + inventory, i + help + score + status + who + tell (example: "tell mike where are you?") + say, ' (example: "' hi", "say nice to meet you!) + + Common object commands: + ----------------------- + look at, look in (example: "l in treasure chest") + examine, exa + get, drop (example: "get bag", "get all from box") + open, close (example: "open door", "open glass case") + read (example: "read writing on cap") + put (example: "put red ball in my first bag") + + Common Movement commands: + ------------------------- + n,s,e,w,u,d + go north, go south, go east, go west, go up, go down + out, go out + crawl (example: "crawl south", "crawl into passageway" ) + climb (example: "climb tree") + enter (example: "enter crawlspace") + + Vendor commands: + ---------------- + money + appraise + price + show + buy, sell + diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/map.txt ds2.0r28/lib/domains/campus/txt/map.txt *** ds2.0r18/lib/domains/campus/txt/map.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/map.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,21 ---- + + N + | + | + W --------- E LPC University Virtual Campus Administrative Building + | + | + S ------------- ------------ ------------- + | mail room | |snack bar | | bookstore | + ------------- ------------ ------------- + ----------- | | | + | Outside |------------------------------------------------------ + ----------- | | | | + ------------- ------------- --------- ------------------- + | stairwell | |admissions | |lounge | | conference room | + ------------- ------------- --------- ------------------- + + Please note that you are safe inside this building, but going + to The Outside may be hazardous if you are not adequately prepared. + + diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/moochers.txt ds2.0r28/lib/domains/campus/txt/moochers.txt *** ds2.0r18/lib/domains/campus/txt/moochers.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/moochers.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1 ---- + Testylus:EOF diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/rose.txt ds2.0r28/lib/domains/campus/txt/rose.txt *** ds2.0r18/lib/domains/campus/txt/rose.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/rose.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,88 ---- + + + "M, .mM" + IMIm ,mIM" + ,MI:"IM,mIMm + "IMmm, ,IM::::IM::IM, ,m" + "IMMIMMIMm::IM:::::IM""==mm + ,mIM::::::MIM:::::::IM::::mIMIM" + ,mMIMIMIIMIMM::::::::mM::::::::IMIMI + IMM:::::::::IMM::::::M::::::::IIM:::::::MM, + "IMM::::::::::MM:::M:::::::IM:::::::::::IM, + "IMm::::::::IMMM:::::::IM:::::::::::::IM, + "Mm:::::::::IM::::::MM::::::::::::::::IM, + IM:::::::::IM::::::MM::::::::::::::::::IM, + MM::::::::IM:::::::IM::::::::::::::::::IM + "IM::::::::IM:::::::IM:::::::::::::::::IM;. + "IM::::::::MM::::::::IM::::::::::mmmIMMMMMMMm,. + IM::::::::IM:::::::IM::::mIMIMM"""". .. "IMMMM + "IM::::::::IM::::::mIMIMM"". . . . . .,mM" + IMm:::::::IM::::IIMM" . . . . . ..,mMM" + "IMMIMIMMIMM::IMM" . . . ._.,mMM + ,IM". . ."IMIM". . . .,mMMMMMMMM" + ,IM . . . .,IMM". . . ,mMMMMMMMMM" + IM. . . .,mIIMM,. . ..mMMMMMMMMM + ,M"..,mIMMIMMIMMIMmmmMMMMM + IM.,IMI""" ""IIMMMMMMMMMM + ;IMIM" ""IMMMMMMM + "" "IMMMMM + "IMMM + "IMM, + "IMM + "MM, + IMM, + "IMM .mIMMIMMIMMIMMIM, + .,mIMMIMMIMM, ,mIMM, IMM""" ,mIM". . . . . . . " + ,IMMM' . . . "IMM.\ "M, IMM ,IM". . . . / :;IM \ M, + .mIM' . . . / .:"IM.\ MM "MM, ,M". . . / .;mIMIMIM,\ M + ,IM'. . . / . .:;,IMIMIMMM IMM ,M". . / .:mIM"' "IM,:M + ,IM'. . . / . .:;,mIM" `"IMM IMM IM. . / .mM" "IMI + ,IM . . / . .:;,mIM" "IMMMMM MM,. / ,mM "M' + IM'. . / . .;,mIM" "IIMMM ,IMIM,.,IM" + IM . . / . .,mIM" IMMMMMMM' """ + `IM,. / ;,mIM" IIMMM + "IMI, /,mIM" __IMMM + "IMMMM" """IMM + "" IMM + " IMM__ + IMM""" + IMM + IMM + IMM + """IMM + IMM + IMM + IMM""" + IMM + IMM + """IMM + IMM + IMM + IMM""" + IMM + """IMM + IMM + IMM__ + IMM""" + IMM + IMM + IMM + "IMM .mIMMIMMIMMIMMIM, + .,mIMMIMMIMM, ,mIMM, IMM""" ,mIM". . . . . . . " + ,IMMM' . . . "IMM.\ "M, IMM ,IM". . . . / :;IM \ M, + .mIM' . . . / .:"IM.\ MM "MM, ,M". . . / .;mIMIMIM,\ M + ,IM'. . . / . .:;,IMIMIMMM IMM ,M". . / .:mIM"' "IM,:M + ,IM'. . . / . .:;,mIM" `"IMM IMM IM. . / .mM" "IMI + ,IM . . / . .:;,mIM" "IMMMMM MM,. / ,mM "M' + IM'. . / . .;,mIM" "IIMMM ,IMIM,.,IM" + IM . . / . .,mIM" IMMMMMMM' """ + `IM,. / ;,mIM" IIMMM + "IMI, /,mIM" __IMMM + "IMMMM" """IMM + "" IMM + " IMM__ + IMM""" + IMM + IMM + IMM + \ diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/skulls.txt ds2.0r28/lib/domains/campus/txt/skulls.txt *** ds2.0r18/lib/domains/campus/txt/skulls.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/skulls.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,23 ---- + + + * * + * * + ** ** + * ** ** * + ** ** * * ** ** + *** * ** ** * *** + **** ********************************* **** + ******* *** ******* *** ******* + ************ ***** ************ + ********** **** * ** ** ******* ********** + ********** ** ** ** **************** + *************** ** ** *** ** ***************** + ****** ********************* ****** ****** + ********************** *** + ************************ ** + **** ** ** **** ** ** ** + *** * * ** * * *** + ** ** + * * + + diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/spam.txt ds2.0r28/lib/domains/campus/txt/spam.txt *** ds2.0r18/lib/domains/campus/txt/spam.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/spam.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,20 ---- + ========================================== + | ,dP""8a "888888b, d8b "888b ,888" | + | 88b " 888 d88 dPY8b 88Y8b,8888 | + | `"Y8888a 888ad8P'dPaaY8b 88 Y88P888 | + | a, Y88 888 dP Y8b 88 YP 888 | + | `"8ad8P'a888a a88a;*a888aa88a a888a | + | ;*;;;;*;;;*;;;*,, | + | _,---'':::';*;;;*;;;*;;*d;, | + | .-' ::::::::::';*;;*;dII; | + | .' ,<<<,. :::::::::::::::ffffff`. | + | / ,<<<<<<<<,::::::::::::::::fffffI,\ | + | .,<<<<<<<<<;,::::::::::fffKKIP | | + | ``<<<<<<>>>>;,::::fffKKIPf ' | + | \ `mYMMV?;;;;;;;\>>>>>>>>>,YIIPP"` / | + | `. "":;;;;;;;;;i>>>>>>>>>>>>>, ,' | + | `-._``":;;;sP'`"?>>>>>=========. | + | `---..._______...|<[Hormel | | + | `=========' | + ========================================== diff -c -r --new-file ds2.0r18/lib/domains/campus/txt/warning.txt ds2.0r28/lib/domains/campus/txt/warning.txt *** ds2.0r18/lib/domains/campus/txt/warning.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/txt/warning.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,11 ---- + WARNING! WARNING! WARNING! WARNING! + + If you go west of here, you will be leaving the Virtual + Campus administrative building. The special rules of non-aggression that + are enforced within the building do not apply outside. The people + you meet may be friendly, or they may not be. + + Be courteous to other players, and be prepared to deal + with strange and unexpected situations. + + HAVE FUN! diff -c -r --new-file ds2.0r18/lib/domains/campus/weap/357pistol.c ds2.0r28/lib/domains/campus/weap/357pistol.c *** ds2.0r18/lib/domains/campus/weap/357pistol.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/weap/357pistol.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,20 ---- + #include + #include + inherit "/lib/pistol"; + void create(){ + pistol::create(); + SetKeyName("revolver"); + SetId(({"gun","pistol","piece"})); + SetAdjectives(({".357","357","magnum"})); + SetShort("a .357 magnum revolver"); + SetLong("This is a thick, heavy chunk of weaponry that fires some very "+ + "serious rounds. Bullets are loaded individually into it, and they, along with spent "+ + "shells, remain in the cylinder until unloaded."); + SetCaliber(357); + SetPistolType("revolver"); + SetAmmoType("magnum"); + SetMaxAmmo(6); + SetMass(20); + SetDollarCost(10); + SetVendorType(VT_WEAPON); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/weap/9mil.c ds2.0r28/lib/domains/campus/weap/9mil.c *** ds2.0r18/lib/domains/campus/weap/9mil.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/weap/9mil.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + inherit LIB_PISTOL; + void create(){ + ::create(); + SetKeyName("gun"); + SetId(({"gun","pistol"})); + SetAdjectives(({"9mm","automatic","9 millimeter","semiautomatic"})); + SetShort("a 9 millimeter semiautomatic pistol"); + SetLong("This is a large, semiautomatic pistol that fires 9mm rounds. It is "+ + "a heavy, serious-looking weapon."); + SetMillimeter(9); + SetPistolType("auto"); + SetAmmoType("acp"); + SetMass(30); + SetDollarCost(900); + SetVendorType(VT_WEAPON); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/weap/9mmpistol.c ds2.0r28/lib/domains/campus/weap/9mmpistol.c *** ds2.0r18/lib/domains/campus/weap/9mmpistol.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/weap/9mmpistol.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + inherit "/lib/pistol"; + void create(){ + pistol::create(); + SetKeyName("gun"); + SetId(({"gun","pistol"})); + SetAdjectives(({"9mm","automatic","9 millimeter","semiautomatic"})); + SetShort("a 9 millimeter semiautomatic pistol"); + SetLong("This is a large, semiautomatic pistol that fires 9mm rounds. It is "+ + "a heavy, serious-looking weapon."); + SetMillimeter(9); + SetPistolType("auto"); + SetAmmoType("acp"); + SetMass(30); + SetDollarCost(3000); + SetVendorType(VT_WEAPON); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/weap/9mmpistol_loaded.c ds2.0r28/lib/domains/campus/weap/9mmpistol_loaded.c *** ds2.0r18/lib/domains/campus/weap/9mmpistol_loaded.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/weap/9mmpistol_loaded.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,30 ---- + #include + #include + inherit "/lib/pistol"; + int AddClip(); + void create(){ + pistol::create(); + SetKeyName("gun"); + SetId(({"gun","pistol"})); + SetAdjectives(({"9mm","automatic","9 millimeter","semiautomatic"})); + SetShort("a 9 millimeter semiautomatic pistol"); + SetLong("This is a large, semiautomatic pistol that fires 9mm rounds. It is "+ + "a heavy, serious-looking weapon."); + SetMillimeter(9); + SetPistolType("auto"); + SetAmmoType("acp"); + SetMass(30); + SetDollarCost(3000); + SetVendorType(VT_WEAPON); + AddClip(); + SetLoaded(1); + SetAmmo(15); + SetMag(1); + } + + int AddClip(){ + if(!present("clip",this_object())){ + new("/domains/campus/obj/9mmclip")->eventMove(this_object()); + } + return 1; + } diff -c -r --new-file ds2.0r18/lib/domains/campus/weap/9mmpistol_mp.c ds2.0r28/lib/domains/campus/weap/9mmpistol_mp.c *** ds2.0r18/lib/domains/campus/weap/9mmpistol_mp.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/weap/9mmpistol_mp.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,39 ---- + #include + #include + inherit "/lib/pistol"; + int AddClip(); + void CheckMP(); + void create(){ + pistol::create(); + SetKeyName("gun"); + SetId(({"gun","pistol"})); + SetAdjectives(({"9mm","automatic","9 millimeter","semiautomatic"})); + SetShort("a 9 millimeter semiautomatic pistol"); + SetLong("This is a large, semiautomatic pistol that fires 9mm rounds. It is "+ + "a heavy, serious-looking weapon."); + SetMillimeter(9); + SetPistolType("auto"); + SetAmmoType("acp"); + SetMass(30); + SetDollarCost(3000); + SetVendorType(VT_WEAPON); + } + + void init() { + pistol::init(); + CheckMP(); + } + + int AddClip(){ + new("/domains/campus/obj/9mmclip")->eventMove(this_object()); + return 1; + } + + void CheckMP(){ + if(base_name(environment(this_object())) == "/domains/campus/npc/mp"){ + AddClip(); + SetLoaded(1); + SetAmmo(15); + SetMag(1); + } + } diff -c -r --new-file ds2.0r18/lib/domains/campus/weap/board.c ds2.0r28/lib/domains/campus/weap/board.c *** ds2.0r18/lib/domains/campus/weap/board.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/weap/board.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + /* /domains/Examples/weapon/sword.c + * from the Nightmare IV LPC Library + * a simple sword example, nothing fancy + * created by Descartes of Borg 950402 + */ + + #include + #include + #include + + inherit LIB_ITEM; + + static void create() { + item::create(); + SetKeyName("board of ed"); + SetId(({"board","board of ed","board of education"})); + SetAdjectives(({"ed","education"})); + SetShort("the board of education"); + SetLong("A long, wide wooden board with a handle at one "+ + "end. Inscribed along its length are the words: "+ + "'Board of Education'."); + SetMass(50); + SetDollarCost(20); + SetVendorType(VT_WEAPON); + SetClass(20); + SetDamageType(BLUNT); + SetWeaponType("blunt"); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/weap/dagger.c ds2.0r28/lib/domains/campus/weap/dagger.c *** ds2.0r18/lib/domains/campus/weap/dagger.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/weap/dagger.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,26 ---- + /* /domains/Examples/weapon/dagger.c + * from the Nightmare IV LPC Library + * a simple dagger example, nothing fancy + * created by Descartes of Borg 950402 + */ + + #include + #include + #include + + inherit LIB_ITEM; + + static void create() { + item::create(); + SetKeyName("sharp dagger"); + SetId( ({ "dagger"})); + SetAdjectives( ({ "sharp","fine"})); + SetShort("a sharp dagger"); + SetLong("A dagger."); + SetMass(150); + SetDollarCost(50); + SetVendorType(VT_WEAPON); + SetClass(150); + SetDamageType(BLADE); + SetWeaponType("blade"); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/weap/grenade.c ds2.0r28/lib/domains/campus/weap/grenade.c *** ds2.0r18/lib/domains/campus/weap/grenade.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/weap/grenade.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,119 ---- + #include + #include + #include + inherit LIB_ITEM; + inherit LIB_PULL; + string pin_desc(); + string lev_desc(); + int detonated; + int count, armed; + string *limbs; + void analyze(string butt); + int HitLivings(object munch); + void create(){ + item::create(); + SetKeyName("concussion hand grenade"); + SetId( ({"grenade","hand grenade","flash-bang grenade","concussion grenade"}) ); + SetAdjectives( ({"military","pineapple"}) ); + SetShort("a hand grenade"); + SetLong("This is an olive-green military issue hand grenade. It is about the "+ + "size of an apple, and its round exterior is made of smooth metal. The "+ + "grenade's fuse consists of a short metal lever and a round pull-pin. "); + SetMass(20); + SetDollarCost(10); + SetVendorType(VT_WEAPON); + AddItem(({"pull pin","pull-pin","pin"}),"This is a round, metal pin, evidently designed for pulling."); + AddItem(({"lever","metal lever"}),"This lever appears to be part of the fuse mechanism."); + AddItem( ({"fuse","fuse mechanism"}) , "This fuse mechanism controls the arming of the grenade."); + count=5; + detonated=0; + } + void init(){ + if(armed){ + set_heart_beat(1); + if(detonated==1) this_object()->eventDestruct(); + } + } + mixed CanPull(object who, string target) { + if(!present(this_object()->GetKeyName(),who ) && target == "pin"){ + return "You do not have the grenade."; + } + if(this_object()->GetId() == target){ + return "You cannot pull that."; + } + return 1; + } + mixed eventPull(object who, string target) { + if(target =="pin" || target == "pull-pin"){ + write("You pull the grenade's pin.\n"); + say(this_player()->GetName()+" pulls the pin from a hand grenade.\n"); + new("/domains/campus/obj/pin")->eventMove(this_player()); + new("/domains/campus/obj/lever")->eventMove(this_player()); + SetShort("a live hand grenade"); + SetLong("This is an olive-green military issue hand grenade. It is about the "+ + "size of an apple, and its round exterior is made of smooth metal. The pin and "+ + "spoon are missing from the fuse mechanism, indicating the grenade is live "+ + "and will detonate very soon."); + AddItem(({"lever","metal lever"}),"The grenade is armed. The fuse lever is no longer on the grenade."); + AddItem(({"pull pin","pull-pin","pin"}),"The grenade is armed. There is no pin in the fuse."); + armed = 1; + set_heart_beat(1); + return 1; + } + write("Nothing happens."); + return 1; + } + void heart_beat(){ + count--; + if(detonated==1) this_object()->eventDestruct(); + if(count < 0){ + this_object()->detonate(); + return; + } + if(interactive(environment())){ + tell_object(environment(), "You are holding a live hand grenade."); + return; + } + tell_object(environment(),"You hear a low hissing sound."); + tell_object(environment(environment()), environment()->GetName()+" is holding a live hand grenade."); + } + int detonate(){ + object ob; + string *stuffs; + int num; + ob = environment(this_object()); + if(living(ob) && !creatorp(ob)){ + stuffs=ob->GetLimbs(); + tell_object(ob, "\nKABOOM! You are torn to pieces by your hand grenade!\n"); + tell_room(environment(ob), "\nKABOOM! "+ob->GetName()+" is torn to pieces by "+ + possessive(ob)+" hand grenade!\n",ob); + detonated=2; + foreach(string limb in stuffs){ + //tc("limb: "+limb); + if(limb != "head" && limb != "torso" && limb != "neck") ob->RemoveLimb(limb,this_object()); + } + //ob->RemoveLimb("head",this_object()); + ob = environment(ob); + } + if(detonated !=2) tell_room(environment(this_object()), "\nKABOOM! The grenade detonates!\n"); + foreach(object victim in get_livings(ob)){ + this_object()->HitLivings(victim); + } + this_object()->eventDestruct(); + return 1; + } + + void analyze(string str){ + string tmp,tmp2; + sscanf(str,"%s#%s",tmp,tmp2); + if(tmp="/lib/corpse"){ + filter(deep_inventory(find_object(str)), (: $1->eventDestruct() :), this_object() ); + } + return; + } + + int HitLivings(object ob){ + ob->eventReceiveDamage(this_object(),BLUNT, random(1000)+300, 1); + return 1; + } + diff -c -r --new-file ds2.0r18/lib/domains/campus/weap/sharpsword.c ds2.0r28/lib/domains/campus/weap/sharpsword.c *** ds2.0r18/lib/domains/campus/weap/sharpsword.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/weap/sharpsword.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,26 ---- + /* /domains/Examples/weapon/sword.c + * from the Nightmare IV LPC Library + * a simple sword example, nothing fancy + * created by Descartes of Borg 950402 + */ + + #include + #include + #include + + inherit LIB_ITEM; + + static void create() { + item::create(); + SetKeyName("sharp sword"); + SetId( ({ "sword", "short sword", "shortsword"})); + SetAdjectives( ({ "short","sharp","fine"})); + SetShort("a sharp sword"); + SetLong("A fine, sharp, short sword."); + SetMass(150); + SetDollarCost(50); + SetVendorType(VT_WEAPON); + SetClass(20); + SetDamageType(BLADE); + SetWeaponType("blade"); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/weap/staff.c ds2.0r28/lib/domains/campus/weap/staff.c *** ds2.0r18/lib/domains/campus/weap/staff.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/weap/staff.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,23 ---- + #include + #include + #include + + inherit LIB_ITEM; + static void create(){ + item::create(); + SetKeyName("staff"); + SetId( ({ "staff", "stick", "pole" }) ); + SetAdjectives( ({ "wood","wooden" }) ); + SetShort("a wooden staff"); + SetLong("This staff is old, weathered, "+ + "and lumpy. However, it feels quite sturdy "+ + "and solid."); + SetVendorType(VT_WEAPON); + SetDamagePoints(50); + SetClass(100); + SetDollarCost(250); + SetMass(100); + SetWeaponType("blunt"); + SetHands(2); + SetDamageType(BLUNT); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/weap/sword.c ds2.0r28/lib/domains/campus/weap/sword.c *** ds2.0r18/lib/domains/campus/weap/sword.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/weap/sword.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,26 ---- + /* /domains/Examples/weapon/sword.c + * from the Nightmare IV LPC Library + * a simple sword example, nothing fancy + * created by Descartes of Borg 950402 + */ + + #include + #include + #include + + inherit LIB_ITEM; + + static void create() { + item::create(); + SetKeyName("short sword"); + SetId( ({ "sword", "short sword" }) ); + SetAdjectives( ({ "short" }) ); + SetShort("a short sword"); + SetLong("A cheap and rather dull short sword."); + SetMass(150); + SetDollarCost(50); + SetVendorType(VT_WEAPON); + SetClass(20); + SetDamageType(BLADE); + SetWeaponType("blade"); + } diff -c -r --new-file ds2.0r18/lib/domains/campus/weap/waterpistol.c ds2.0r28/lib/domains/campus/weap/waterpistol.c *** ds2.0r18/lib/domains/campus/weap/waterpistol.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/campus/weap/waterpistol.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,50 ---- + /* /domains/Examples/weapon/sword.c + * from the Nightmare IV LPC Library + * a simple sword example, nothing fancy + * created by Descartes of Borg 950402 + */ + + #include + #include + #include + + inherit LIB_PISTOL; + + static void create() { + ::create(); + SetKeyName("water pistol"); + SetId(({"pistol","gun"})); + SetAdjectives(({"water","toy","plastic","squirt"})); + SetShort("a small plastic squirt gun"); + SetLong("A small red see-through plastic squirt gun in the shape "+ + "of a ray gun."); + SetMass(10); + SetDollarCost(5); + SetVendorType(VT_WEAPON); + SetClass(20); + SetDamageType(BLUNT); + SetPistolType("auto"); + SetWeaponType("blunt"); + } + + int eventFireWeapon(object shooter, object target){ + string name,patsy; + object killer, env; + killer = this_player(); + name = killer->GetName(); + env = environment(killer); + patsy = target->GetName(); + + tell_room(env,name+" drenches "+patsy+" with "+possessive(killer)+" "+ + "water gun!",({killer,target}) ); + tell_object(killer,"You drench "+patsy+" with your water gun! Ha ha ha, "+ + nominative(target)+" looks like a dope!"); + tell_object(target,name+" drenches you with "+possessive(killer)+" "+ + "water gun! Ha ha ha! You look like a big wet dope!"); + return 1; + } + + + + + diff -c -r --new-file ds2.0r18/lib/domains/default/armor/chainmail.c ds2.0r28/lib/domains/default/armor/chainmail.c *** ds2.0r18/lib/domains/default/armor/chainmail.c Wed Jan 4 20:42:51 2006 --- ds2.0r28/lib/domains/default/armor/chainmail.c Wed Jul 5 00:01:11 2006 *************** *** 2,14 **** #include #include inherit LIB_ARMOR; static void create(){ armor::create(); SetKeyName("chainmail shirt"); SetId(({"armor","chainmail","mail","shirt","chain mail"})); SetAdjectives(({"chainmail","sturdy","sturdy-looking","chain mail"})); ! SetShort("a sturdy-looking chainmail shirt"); ! SetLong("This is a shirt made of small, thin metal rings fashioned together as armor. "); SetMass(600); SetBaseCost("silver",1000); SetDamagePoints(100); --- 2,15 ---- #include #include inherit LIB_ARMOR; + static void create(){ armor::create(); SetKeyName("chainmail shirt"); SetId(({"armor","chainmail","mail","shirt","chain mail"})); SetAdjectives(({"chainmail","sturdy","sturdy-looking","chain mail"})); ! SetShort("chainmail armor"); ! SetLong("A body-length suit of armor made of small metal rings fashioned together."); SetMass(600); SetBaseCost("silver",1000); SetDamagePoints(100); *************** *** 17,19 **** --- 18,23 ---- SetProtection(KNIFE,25); SetArmorType(A_ARMOR); } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/default/armor/combat_pack.c ds2.0r28/lib/domains/default/armor/combat_pack.c *** ds2.0r18/lib/domains/default/armor/combat_pack.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/default/armor/combat_pack.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,36 ---- + #include + #include + #include + inherit LIB_WORN_STORAGE; + + static void create(){ + ::create(); + SetKeyName("combat pack"); + SetAdjectives( ({"combat", "back"}) ); + SetId( ({"pack", "backpack"}) ); + SetShort("a combat backpack"); + SetLong("A pack containing the equipment a testchar will need to jump into battle."); + SetClosed(1); + SetInventory(([ + "/domains/default/armor/glove_r" : 1, + "/domains/default/armor/glove_l" : 1, + "/domains/default/armor/pants" : 1, + "/domains/default/weap/carving_knife" : 1, + "/domains/default/armor/long_boot_r" : 1, + "/domains/default/armor/collar" : 1, + "/domains/default/armor/helmet" : 1, + "/domains/default/armor/chainmail" : 1, + "/domains/default/armor/long_boot_l" : 1, + "/domains/default/armor/badge" : 1, + ])); + SetCanClose(1); + SetMaxCarry(2000); + SetMass(200); + SetBaseCost("silver",10); + SetDamagePoints(100); + SetArmorType(A_CLOAK); + SetProtection(COLD, 1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/default/armor/glove_l.c ds2.0r28/lib/domains/default/armor/glove_l.c *** ds2.0r18/lib/domains/default/armor/glove_l.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/default/armor/glove_l.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,31 ---- + #include + #include + #include + #include + + inherit LIB_ARMOR; + + + static void create() { + armor::create(); + SetKeyName("leather glove"); + SetId( ({ "glove" }) ); + SetAdjectives( ({ "black","leather","left" }) ); + SetShort("a black leather glove"); + SetLong("A black glove with five fingers designed for a left hand."); + SetDamagePoints(75); + SetVendorType(VT_ARMOR); + SetMass(10); + SetBaseCost("silver",7); + SetArmorType(A_GLOVE); + SetProtection(BLUNT, 1); + SetProtection(BLADE, 1); + SetProtection(KNIFE, 2); + SetProtection(HEAT, 3); + SetProtection(COLD, 7); + SetFingers(5); + SetRestrictLimbs(({"left hand"})); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/default/armor/glove_r.c ds2.0r28/lib/domains/default/armor/glove_r.c *** ds2.0r18/lib/domains/default/armor/glove_r.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/default/armor/glove_r.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,31 ---- + #include + #include + #include + #include + + inherit LIB_ARMOR; + + + static void create() { + armor::create(); + SetKeyName("leather glove"); + SetId( ({ "glove" }) ); + SetAdjectives( ({ "black","leather","right" }) ); + SetShort("a black leather glove"); + SetLong("A black glove with five fingers designed for a right hand."); + SetDamagePoints(75); + SetVendorType(VT_ARMOR); + SetMass(10); + SetBaseCost("silver",7); + SetArmorType(A_GLOVE); + SetProtection(BLUNT, 1); + SetProtection(BLADE, 1); + SetProtection(KNIFE, 2); + SetProtection(HEAT, 3); + SetProtection(COLD, 7); + SetFingers(5); + SetRestrictLimbs(({"right hand"})); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/default/armor/helmet.c ds2.0r28/lib/domains/default/armor/helmet.c *** ds2.0r18/lib/domains/default/armor/helmet.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/default/armor/helmet.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,19 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("steel helmet"); + SetId(({"helmet","cover","steel"})); + SetAdjectives(({"steel","battle","hard"})); + SetShort("a steel helmet"); + SetLong("This is a helmet made of tough metal."); + SetMass(180); + SetBaseCost("silver",500); + SetDamagePoints(100); + SetArmorType(A_HELMET); + SetProtection(BLUNT, 20); + SetProtection(BLADE, 20); + SetProtection(KNIFE, 20); + } diff -c -r --new-file ds2.0r18/lib/domains/default/armor/long_boot_l.c ds2.0r28/lib/domains/default/armor/long_boot_l.c *** ds2.0r18/lib/domains/default/armor/long_boot_l.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/default/armor/long_boot_l.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,25 ---- + #include + #include + #include + inherit LIB_ARMOR; + + static void create(){ + armor::create(); + SetKeyName("riding boot"); + SetId(({"boot"})); + SetAdjectives(({"long","riding","black","leather","left"})); + SetShort("a long riding boot"); + SetLong("A long riding boot, made of black leather. It is "+ + "designed for wear on the left foot and leg."); + SetMass(60); + SetBaseCost("silver",75); + SetDamagePoints(5); + SetProtection(BLUNT,5); + SetProtection(BLADE,5); + SetProtection(KNIFE,5); + SetArmorType(A_LONG_BOOT); + SetRestrictLimbs(({"left foot","left leg"})); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/default/armor/long_boot_r.c ds2.0r28/lib/domains/default/armor/long_boot_r.c *** ds2.0r18/lib/domains/default/armor/long_boot_r.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/default/armor/long_boot_r.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,25 ---- + #include + #include + #include + inherit LIB_ARMOR; + + static void create(){ + armor::create(); + SetKeyName("riding boot"); + SetId(({"boot"})); + SetAdjectives(({"long","riding","black","leather","right"})); + SetShort("a long riding boot"); + SetLong("A long riding boot, made of black leather. It is "+ + "designed for wear on the right foot and leg."); + SetMass(60); + SetBaseCost("silver",75); + SetDamagePoints(5); + SetProtection(BLUNT,5); + SetProtection(BLADE,5); + SetProtection(KNIFE,5); + SetArmorType(A_LONG_BOOT); + SetRestrictLimbs(({"right foot","right leg"})); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/default/armor/pants.c ds2.0r28/lib/domains/default/armor/pants.c *** ds2.0r18/lib/domains/default/armor/pants.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/default/armor/pants.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,23 ---- + #include + #include + #include + inherit LIB_ARMOR; + + static void create(){ + armor::create(); + SetKeyName("leather pants"); + SetId(({"pants"})); + SetAdjectives(({"strong","leather","black","tough"})); + SetShort("leather pants"); + SetLong("These are trousers made of strong, tough leather. "); + SetMass(150); + SetBaseCost("silver",110); + SetDamagePoints(10); + SetProtection(BLUNT,1); + SetProtection(BLADE,5); + SetProtection(KNIFE,5); + SetArmorType(A_PANTS); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/default/armor/robe.c ds2.0r28/lib/domains/default/armor/robe.c *** ds2.0r18/lib/domains/default/armor/robe.c Sun Jan 29 23:45:31 2006 --- ds2.0r28/lib/domains/default/armor/robe.c Wed Jul 5 00:01:11 2006 *************** *** 5,20 **** static void create(){ ::create(); ! SetKeyName("wizard's robe"); SetId(({"robe","cloak","duster"})); - SetAdjectives(({"wizard","wizard's","soft"})); SetShort("a robe"); SetLong("This is a large, comfortable-looking robe, like a wizard might wear. It has many pockets and compartments for holding things."); - SetCanClose(1); - SetMaxCarry(500); SetProperties(([ "no steal" : 1, ])); SetMass(200); SetBaseCost("silver",100); SetDamagePoints(100); --- 5,21 ---- static void create(){ ::create(); ! SetKeyName("wizard robe"); ! SetAdjectives( ({"wizards", "wizard's", "soft", "wizard"}) ); SetId(({"robe","cloak","duster"})); SetShort("a robe"); SetLong("This is a large, comfortable-looking robe, like a wizard might wear. It has many pockets and compartments for holding things."); SetProperties(([ + "gamma" : 3, "no steal" : 1, ])); + SetCanClose(1); + SetMaxCarry(5000); SetMass(200); SetBaseCost("silver",100); SetDamagePoints(100); diff -c -r --new-file ds2.0r18/lib/domains/default/armor/wizard_hat.c ds2.0r28/lib/domains/default/armor/wizard_hat.c *** ds2.0r18/lib/domains/default/armor/wizard_hat.c Wed Feb 22 15:29:51 2006 --- ds2.0r28/lib/domains/default/armor/wizard_hat.c Wed Jul 5 00:01:11 2006 *************** *** 12,17 **** --- 12,20 ---- SetLong("This is a large, floppy hat with a wide brim all "+ "around it, and a conical center. It is dark blue in color, "+ "and is decorated with pictures of yellow moons and stars."); + SetProperties(([ + "beta" : 2, + ])); SetMass(50); SetBaseCost("silver",500); SetDamagePoints(100); diff -c -r --new-file ds2.0r18/lib/domains/default/npc/dummy.c ds2.0r28/lib/domains/default/npc/dummy.c *** ds2.0r18/lib/domains/default/npc/dummy.c Sun Jan 29 11:17:15 2006 --- ds2.0r28/lib/domains/default/npc/dummy.c Wed Jul 5 00:01:11 2006 *************** *** 17,22 **** --- 17,23 ---- ])); SetLevel(10); SetRace("golem"); + SetNativeLanguage("english"); SetClass("fighter"); SetGender("neuter"); SetMaxHealthPoints(9000); diff -c -r --new-file ds2.0r18/lib/domains/default/npc/lemur.c ds2.0r28/lib/domains/default/npc/lemur.c *** ds2.0r18/lib/domains/default/npc/lemur.c Tue Mar 28 23:23:40 2006 --- ds2.0r28/lib/domains/default/npc/lemur.c Wed Jul 5 00:01:11 2006 *************** *** 8,14 **** SetAdjectives( ({"small", "startling", "grey", "gray"}) ); SetId( ({"primate", "simian"}) ); SetShort("a lemur"); ! SetLong("This small animal is startling in its appearance. It looks much like a cross between a small monkey and a raccoon. It has an elongated snout and the fur around its eyes is dark, like the mask of a bandit. Yet its body is clearly simian, with the ptrensile front limbs of a monkey. Its grey, furry body ends in a ridiculously long tail that is striped white and black."); SetLevel(1); SetMelee(1); SetRace("primate"); --- 8,14 ---- SetAdjectives( ({"small", "startling", "grey", "gray"}) ); SetId( ({"primate", "simian"}) ); SetShort("a lemur"); ! SetLong("This small animal is startling in its appearance. It looks much like a cross between a small monkey and a raccoon. It has an elongated snout and the fur around its eyes is dark, like the mask of a bandit. Yet its body is clearly simian, with the prehensile front limbs of a monkey. Its grey, furry body ends in a ridiculously long tail that is striped white and black."); SetLevel(1); SetMelee(1); SetRace("primate"); diff -c -r --new-file ds2.0r18/lib/domains/default/npc/nymph.c ds2.0r28/lib/domains/default/npc/nymph.c *** ds2.0r18/lib/domains/default/npc/nymph.c Mon Jan 23 09:15:40 2006 --- ds2.0r28/lib/domains/default/npc/nymph.c Wed Jul 5 00:01:11 2006 *************** *** 9,17 **** SetAdjectives(({"non-player", "non player"})); SetShort("Claire Danes"); SetLong("This slender nature spirit appears quite lost, and probably should be accompanying a lesser goddess through woodland glades."); - SetInventory(([ - "/realms/cratylus/area/obj/mkey" : 1, - ])); SetLevel(1); SetMelee(1); SetRace("nymph"); --- 9,14 ---- diff -c -r --new-file ds2.0r18/lib/domains/default/obj/chest.c ds2.0r28/lib/domains/default/obj/chest.c *** ds2.0r18/lib/domains/default/obj/chest.c Mon Jan 23 08:51:33 2006 --- ds2.0r28/lib/domains/default/obj/chest.c Wed Jul 5 00:01:11 2006 *************** *** 9,26 **** SetShort("a wooden chest"); SetLong("This is a sturdy wooden chest used to store valuable items."); SetInventory(([ - "/secure/obj/control" : 1, - "/domains/default/armor/wizard_hat" : 1, - "/domains/default/armor/robe" : 1, "/domains/town/armor/collar" : 1, - "/secure/obj/machine" : 1, "/domains/default/armor/badge" : 1, "/domains/default/obj/manual" : 1, ! "/secure/obj/memo" : 1, "/domains/default/obj/meter" : 1, ! "/domains/town/obj/pack" : 1, ! "/secure/obj/medtric" : 1, "/secure/obj/staff" : 1, ])); SetMass(2000); SetBaseCost(50); --- 9,26 ---- SetShort("a wooden chest"); SetLong("This is a sturdy wooden chest used to store valuable items."); SetInventory(([ "/domains/town/armor/collar" : 1, "/domains/default/armor/badge" : 1, + "/domains/default/armor/wizard_hat" : 1, "/domains/default/obj/manual" : 1, ! "/secure/obj/machine" : 1, ! "/domains/default/armor/robe" : 1, "/domains/default/obj/meter" : 1, ! "/secure/obj/control" : 1, ! "/secure/obj/memo" : 1, "/secure/obj/staff" : 1, + "/domains/default/obj/pinger" : 1, + "/secure/obj/medtric" : 1, ])); SetMass(2000); SetBaseCost(50); diff -c -r --new-file ds2.0r18/lib/domains/default/obj/guide.c ds2.0r28/lib/domains/default/obj/guide.c *** ds2.0r18/lib/domains/default/obj/guide.c Sat Mar 11 11:14:54 2006 --- ds2.0r28/lib/domains/default/obj/guide.c Wed Jul 5 00:01:11 2006 *************** *** 5,11 **** void create(){ ::create(); SetKeyName("guidebook"); ! SetId( ({"book", "guide", "text"}) ); SetAdjectives( ({"admin", "admins", "administrator", "administrators", "reference"}) ); SetShort("an Administrator's Guidebook"); SetLong("This is a reference text for Dead Souls administrators."); --- 5,11 ---- void create(){ ::create(); SetKeyName("guidebook"); ! SetId( ({"book", "guide", "administrators guide", "administrators guidebook"}) ); SetAdjectives( ({"admin", "admins", "administrator", "administrators", "reference"}) ); SetShort("an Administrator's Guidebook"); SetLong("This is a reference text for Dead Souls administrators."); diff -c -r --new-file ds2.0r18/lib/domains/default/obj/handbook.c ds2.0r28/lib/domains/default/obj/handbook.c *** ds2.0r18/lib/domains/default/obj/handbook.c Wed Feb 22 15:29:51 2006 --- ds2.0r28/lib/domains/default/obj/handbook.c Wed Jul 5 00:01:11 2006 *************** *** 5,12 **** void create(){ ::create(); SetKeyName("player's handbook"); SetAdjectives( ({"player", "players"}) ); - SetId( ({"handbook", "book", "hbook"}) ); SetShort("a Player's Handbook"); SetLong("This is a handbook for players. To read it, you must read the chapters in it. For example, 'read chapter 1 in handbook', or 'read index in handbook'"); SetProperties(([ --- 5,12 ---- void create(){ ::create(); SetKeyName("player's handbook"); + SetId( ({"book", "handbook", "players handbook"}) ); SetAdjectives( ({"player", "players"}) ); SetShort("a Player's Handbook"); SetLong("This is a handbook for players. To read it, you must read the chapters in it. For example, 'read chapter 1 in handbook', or 'read index in handbook'"); SetProperties(([ diff -c -r --new-file ds2.0r18/lib/domains/default/obj/manual.c ds2.0r28/lib/domains/default/obj/manual.c *** ds2.0r18/lib/domains/default/obj/manual.c Wed Feb 22 15:29:51 2006 --- ds2.0r28/lib/domains/default/obj/manual.c Wed Jul 5 00:01:11 2006 *************** *** 5,12 **** void create(){ ::create(); SetKeyName("creator's manual"); SetAdjectives( ({"creator", "creators", "coder", "coders"}) ); - SetId( ({"manual", "book"}) ); SetShort("a Creator's Manual"); SetLong("This is a manual for creators and admins. " "To read it, you must read the chapters in it. For example, \"read " --- 5,12 ---- void create(){ ::create(); SetKeyName("creator's manual"); + SetId( ({"manual", "book", "creators manual"}) ); SetAdjectives( ({"creator", "creators", "coder", "coders"}) ); SetShort("a Creator's Manual"); SetLong("This is a manual for creators and admins. " "To read it, you must read the chapters in it. For example, \"read " diff -c -r --new-file ds2.0r18/lib/domains/default/obj/pinger.c ds2.0r28/lib/domains/default/obj/pinger.c *** ds2.0r18/lib/domains/default/obj/pinger.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/default/obj/pinger.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,60 ---- + #include + #include + inherit LIB_ITEM; + + int count = 0; + int interval = 0; + string keepalive = ""; + + void create(){ + ::create(); + + SetKeyName("pinger"); + SetId( ({"thing"}) ); + SetAdjectives( ({"keepalive"}) ); + SetShort("a keepalive pinger"); + SetLong("This thing can be set to periodically output a string, " + "with the purpose of keeping fickle telnet connections up. " + "\nTo set the interval: interval \n" + "To set the string: keepalive "); + SetNoCondition(1); + SetMass(20); + SetBaseCost("silver",10); + set_heart_beat(1); + SetVendorType(VT_TREASURE); + } + + int SetInterval(string str){ + interval = atoi(str); + if(!intp(interval)){ + write("That is not a valid integer."); + return 1; + } + + write("Interval set to "+interval+" heartbeats."); + return 1; + } + + int SetKeepalive(string str){ + if(!str || str == "") keepalive = "\n"; + else keepalive = str; + write("Keepalive set."); + return 1; + } + + void init(){ + ::init(); + add_action("SetInterval","interval"); + add_action("SetKeepalive","keepalive"); + } + + void heart_beat(){ + count++; + if(interval > 0 && count > interval){ + count = 0; + if(living(environment(this_object())) && + query_idle(environment(this_object())) > 240){ + tell_object(environment(this_object()),keepalive); + } + } + } diff -c -r --new-file ds2.0r18/lib/domains/default/obj/stargate.c ds2.0r28/lib/domains/default/obj/stargate.c *** ds2.0r18/lib/domains/default/obj/stargate.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/default/obj/stargate.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,28 ---- + #include + #include + #include "/lib/include/stargate.h" + + inherit LIB_STARGATE; + + int ReadScreen(); + + void create() + { + ::create(); + SetOrigin("stargate lab", "/domains/default/room/stargate_lab"); + SetRead(([ ({ "screen" }) : (: ReadScreen :) ]) ); + SetItems(([ ({ "screen" }) : "a computer screen which shows the status of the gate network" ]) ); + } + + void init() + { + ::init(); + } + + int ReadScreen() + { + write("stargate network status\n"); + write("-----------------------\n"); + write("\n"); + + } diff -c -r --new-file ds2.0r18/lib/domains/default/room/arena.c ds2.0r28/lib/domains/default/room/arena.c *** ds2.0r18/lib/domains/default/room/arena.c Mon Jan 23 08:51:42 2006 --- ds2.0r28/lib/domains/default/room/arena.c Wed Jul 5 00:01:11 2006 *************** *** 6,12 **** SetClimate("indoors"); SetAmbientLight(30); SetShort("the Arena"); ! SetLong("You are in a large room with blank cement walls. This room was built so Creators may test their armor, weapons and NPC's in combat."); SetItems( ([ ({"wall","walls"}) : "The walls are smooth and cement.", ({"floor","ceiling"}) : "The floor and ceiling are, like the walls, made "+ --- 6,12 ---- SetClimate("indoors"); SetAmbientLight(30); SetShort("the Arena"); ! SetLong("You are in a large room with blank cement walls. This room was built so Creators may test their armor, weapons and NPC's in combat. A large steel door is here, which can be used to prevent wimpy creatures from escaping."); SetItems( ([ ({"wall","walls"}) : "The walls are smooth and cement.", ({"floor","ceiling"}) : "The floor and ceiling are, like the walls, made "+ diff -c -r --new-file ds2.0r18/lib/domains/default/room/domains_room.c ds2.0r28/lib/domains/default/room/domains_room.c *** ds2.0r18/lib/domains/default/room/domains_room.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/default/room/domains_room.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,66 ---- + #include + #include + + inherit LIB_ROOM; + + string LongDesc(){ + string desc = "Immortals come here to communicate with each other about "+ + "the world they are building. The Adventurer's Guild "+ + "is north. The Arch Room is south. To visit the Dead Souls "+ + "test and development mud, go west. The test lab facilities are east."; + desc += "\nA sign reads: "+load_object(ROOM_ARCH)->SignRead(); + return desc; + } + + static void create() { + object ob; + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Domains Room"); + SetLong("This room provides a convenient access point to various domain start rooms and featured realms."); + SetItems(([ + "Ylsrim" : "This is the entry point for the Ylsrim domain.", + "campus" : "This is the entry point for the campus domain.", + "examples" : "This is the entry point for the examples domain.", + ({ "sign" }) : "A sign you can read.", + ])); + SetEnters( ([ + "campus" : "/domains/campus/room/start", + "ylsrim" : "/domains/Ylsrim/room/bazaar", + "examples" : "/domains/examples/room/start.c", + ]) ); + SetProperty("no attack", 1); + SetProperty("nopeer",1); + ob = new("/lib/bboard"); + ob->SetKeyName("chalkboard"); + ob->SetId( ({ "board", "chalkboard", "dusty board", "dusty chalkboard" }) ); + ob->set_board_id("immortal_board"); + ob->set_max_posts(30); + SetShort("Domains Room"); + ob->eventMove(this_object()); + SetExits(([ + "north" : "/domains/default/room/wiz_hall2", + ])); + + SetInventory(([ + ])); + + SetRead("sign", (: load_object(ROOM_ARCH)->SignRead() :) ); + } + + int CanReceive(object ob) { + if(playerp(ob) && !creatorp(ob) && !present("testchar badge",ob)) { + message("info","Creator staff only, sorry.", ob); + return 0; + } + + if(ob->GetRace() == "rodent"){ + message("info","You are repelled by rodenticide.",ob); + return 0; + } + return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/default/room/furnace.c ds2.0r28/lib/domains/default/room/furnace.c *** ds2.0r18/lib/domains/default/room/furnace.c Fri Mar 24 14:36:36 2006 --- ds2.0r28/lib/domains/default/room/furnace.c Wed Jul 5 00:01:11 2006 *************** *** 7,24 **** room::create(); SetAmbientLight(30); SetShort("the furnace"); ! SetLong("The furnace. Things that arrive here are periodically "+ "incinerated. You probably shouldn't be here. Go down to get out."); SetProperties(([ "no attack" : 1, ])); SetExits( ([ "down" : ROOM_START ]) ); ! call_out((: reload_room :), 60, load_object(base_name(this_object()))); SetNoModify(1); } int CanReceive(object ob){ return 1; } void init(){ ::init(); } --- 7,36 ---- room::create(); SetAmbientLight(30); SetShort("the furnace"); ! SetLong("The furnace. Things that arrive here are "+ "incinerated. You probably shouldn't be here. Go down to get out."); SetProperties(([ "no attack" : 1, ])); SetExits( ([ "down" : ROOM_START ]) ); ! call_out((: reload_room :), 600, load_object(base_name(this_object()))); ! set_heart_beat(1); SetNoModify(1); } int CanReceive(object ob){ + if(interactive(ob)){ + tell_object(ob, "You fail to enter the furnace."); + return 0; + } return 1; } void init(){ ::init(); } + void heart_beat(){ + if(sizeof(all_inventory(this_object()))){ + foreach(object ob in deep_inventory(this_object())){ + ob->eventDestruct(); + } + } + } diff -c -r --new-file ds2.0r18/lib/domains/default/room/menagerie_south.c ds2.0r28/lib/domains/default/room/menagerie_south.c *** ds2.0r18/lib/domains/default/room/menagerie_south.c Sun Jan 29 11:19:06 2006 --- ds2.0r28/lib/domains/default/room/menagerie_south.c Wed Jul 5 00:01:11 2006 *************** *** 9,34 **** SetAmbientLight(30); SetShort("Menagerie Annex"); SetLong("This area was added to the menagerie to allow a little leg room for creatures that like to wander."); - SetNoClean(1); SetInventory(([ "/domains/default/npc/wraith" : 1, - "/domains/default/npc/ogre" : 1, "/domains/default/npc/gargoyle" : 1, - "/domains/default/npc/troll" : 1, - "/domains/default/npc/chimera" : 1, - "/domains/default/npc/gnoll" : 1, - "/domains/default/npc/goblin" : 1, - "/domains/default/npc/kobold" : 1, - "/domains/default/npc/balrog" : 1, "/domains/default/npc/golem" : 1, "/domains/default/npc/minotaur" : 1, "/domains/default/npc/yattering" : 1, ! "/domains/default/npc/elemental" : 1, ! "/domains/default/npc/klingon" : 1, ! "/domains/default/npc/bacchus" : 1, "/domains/default/npc/red_dragon" : 1, ! "/domains/default/npc/orc" : 1, ])); SetExits(([ "north" : "/domains/default/room/menagerie", ])); --- 9,33 ---- SetAmbientLight(30); SetShort("Menagerie Annex"); SetLong("This area was added to the menagerie to allow a little leg room for creatures that like to wander."); SetInventory(([ + "/domains/default/npc/elemental" : 1, "/domains/default/npc/wraith" : 1, "/domains/default/npc/gargoyle" : 1, "/domains/default/npc/golem" : 1, "/domains/default/npc/minotaur" : 1, + "/domains/default/npc/orc" : 1, + "/domains/default/npc/chimera" : 1, "/domains/default/npc/yattering" : 1, ! "/domains/default/npc/balrog" : 1, ! "/domains/default/npc/troll" : 1, ! "/domains/default/npc/goblin" : 1, "/domains/default/npc/red_dragon" : 1, ! "/domains/default/npc/ogre" : 1, ! "/domains/default/npc/gnoll" : 1, ! "/domains/default/npc/kobold" : 1, ! "/domains/default/npc/klingon" : 1, ])); + SetNoClean(1); SetExits(([ "north" : "/domains/default/room/menagerie", ])); diff -c -r --new-file ds2.0r18/lib/domains/default/room/stargate_lab.c ds2.0r28/lib/domains/default/room/stargate_lab.c *** ds2.0r18/lib/domains/default/room/stargate_lab.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/default/room/stargate_lab.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,49 ---- + #include + #include + + inherit LIB_ROOM; + + int SignRead(){ + string list; + list = implode(keys(STARGATE_D->GetStargates()),", "); + write("These are Stargate operation instructions."); + write("The Dead Souls stargate system provides teleportation within " + "the stargate network. To use the stargate network, one finds an " + "idle stargate, then dials the name of some other known stargate. " + "One then enters the outbound stargate, and if things go well, teleportation " + "to the dialed stargate occurs. To travel to Uruk, if that were a " + "valid stargate name, you would: dial uruk\n" + "Once the stargate activates: enter stargate"); + write("Currently available stargates are:"); + write("%^BOLD%^%^YELLOW%^"+list+"%^RESET%^"); + return 1; + } + + static void create() { + object ob; + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Stargate Lab"); + SetLong("This is the test laboratory for the new Dead Souls Stargate system.\n" + "%^BOLD%^%^GREEN%^An instruction sign is here.%^RESET%^"); + SetItems(([ + ({ "sign", "instruction sign", "instructions sign", "instruction", "instructions" }) : "A sign you can read. It appears to be instructions for operating the stargate.", + ])); + SetInventory(([ + "/domains/default/obj/stargate" : 1, + ])); + SetExits(([ + "north" : "/domains/default/room/wiz_corr_east", + ])); + SetRead("sign", (: SignRead() :) ); + SetProperty("no attack", 1); + + } + int CanReceive(object ob) { + return room::CanReceive(); + } + + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/default/room/telnet_room.c ds2.0r28/lib/domains/default/room/telnet_room.c *** ds2.0r18/lib/domains/default/room/telnet_room.c Tue Mar 28 23:23:40 2006 --- ds2.0r28/lib/domains/default/room/telnet_room.c Wed Jul 5 00:01:11 2006 *************** *** 41,51 **** "Once you connect to Dead Souls, type \"dcon\" to "+ "return to your own mud. \n\n"+ "To connect type \"connect\" \n"+ ! "The Creators' Hall is east of here."); ! SetExits( ([ ! "east" : "/domains/default/room/wiz_hall" ]) ); - SetObviousExits("e"); SetNoModify(1); } --- 41,50 ---- "Once you connect to Dead Souls, type \"dcon\" to "+ "return to your own mud. \n\n"+ "To connect type \"connect\" \n"+ ! "The Creators' Hall west wing is south of here."); ! SetExits( ([ ! "south" : "/domains/default/room/wiz_hall2", ]) ); SetNoModify(1); } diff -c -r --new-file ds2.0r18/lib/domains/default/room/wiz_corr_east.c ds2.0r28/lib/domains/default/room/wiz_corr_east.c *** ds2.0r18/lib/domains/default/room/wiz_corr_east.c Mon Jan 23 15:50:15 2006 --- ds2.0r28/lib/domains/default/room/wiz_corr_east.c Wed Jul 5 00:01:11 2006 *************** *** 8,17 **** SetClimate("indoors"); SetAmbientLight(30); SetShort("Test Labs Corridor East"); ! SetLong("This is the main corridor of the test labs. North is the disease lab. The corridor runs west from here."); SetExits( ([ "west" : "/domains/default/room/wiz_corr1", ! "north" : "/domains/default/room/quarantine1.c", ]) ); SetInventory(([ --- 8,18 ---- SetClimate("indoors"); SetAmbientLight(30); SetShort("Test Labs Corridor East"); ! SetLong("This is the main corridor of the test labs. North is the disease lab. The corridor runs west from here. South is the new Stargate lab."); SetExits( ([ "west" : "/domains/default/room/wiz_corr1", ! "north" : "/domains/default/room/quarantine1", ! "south" : "/domains/default/room/stargate_lab.c", ]) ); SetInventory(([ diff -c -r --new-file ds2.0r18/lib/domains/default/room/wiz_hall.c ds2.0r28/lib/domains/default/room/wiz_hall.c *** ds2.0r18/lib/domains/default/room/wiz_hall.c Fri Mar 24 14:36:36 2006 --- ds2.0r28/lib/domains/default/room/wiz_hall.c Wed Jul 5 00:01:11 2006 *************** *** 34,44 **** SetItems( ([ ({"sign"}) : "A sign you can read.", ]) ); ! SetExits( ([ ! "north" : "/domains/town/room/adv_guild", "east" : "/domains/default/room/wiz_corr1", "south" : "/secure/room/arch", ! "west" : "/domains/default/room/telnet_room", ]) ); SetRead("sign", (: load_object(ROOM_ARCH)->SignRead() :) ); } --- 34,44 ---- SetItems( ([ ({"sign"}) : "A sign you can read.", ]) ); ! SetExits( ([ "east" : "/domains/default/room/wiz_corr1", "south" : "/secure/room/arch", ! "north" : "/domains/town/room/adv_guild", ! "west" : "/domains/default/room/wiz_hall2.c", ]) ); SetRead("sign", (: load_object(ROOM_ARCH)->SignRead() :) ); } diff -c -r --new-file ds2.0r18/lib/domains/default/room/wiz_hall2.c ds2.0r28/lib/domains/default/room/wiz_hall2.c *** ds2.0r18/lib/domains/default/room/wiz_hall2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/default/room/wiz_hall2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,59 ---- + #include + #include + + inherit LIB_ROOM; + + string LongDesc(){ + string desc = "Immortals come here to communicate with each other about "+ + "the world they are building. The Adventurer's Guild "+ + "is north. The Arch Room is south. To visit the Dead Souls "+ + "test and development mud, go west. The test lab facilities are east."; + desc += "\nA sign reads: "+load_object(ROOM_ARCH)->SignRead(); + return desc; + } + + static void create() { + object ob; + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Creators' Hall West Wing"); + SetLong("This is the west wing of the Creators' Hall. North is the telnet room where you can connect to the Dead Souls test and development mud. South is the domains room, where you can conveniently visit featured domains or realms."); + SetProperty("no attack", 1); + SetProperty("nopeer",1); + ob = new("/lib/bboard"); + ob->SetKeyName("chalkboard"); + ob->SetId( ({ "board", "chalkboard", "dusty board", "dusty chalkboard" }) ); + ob->set_board_id("immortal_board"); + ob->set_max_posts(30); + SetShort("Creators' Hall West Wing"); + ob->eventMove(this_object()); + SetItems( ([ + ({"sign"}) : "A sign you can read.", + ]) ); + SetExits( ([ + "east" : "/domains/default/room/wiz_hall", + "north" : "/domains/default/room/telnet_room", + "south" : "/domains/default/room/domains_room.c", + ]) ); + SetInventory(([ + ])); + + SetRead("sign", (: load_object(ROOM_ARCH)->SignRead() :) ); + } + + int CanReceive(object ob) { + if(playerp(ob) && !creatorp(ob) && !present("testchar badge",ob)) { + message("info","Creator staff only, sorry.", ob); + return 0; + } + + if(ob->GetRace() == "rodent"){ + message("info","You are repelled by rodenticide.",ob); + return 0; + } + return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/default/weap/carving_knife.c ds2.0r28/lib/domains/default/weap/carving_knife.c *** ds2.0r18/lib/domains/default/weap/carving_knife.c Mon Nov 7 13:30:26 2005 --- ds2.0r28/lib/domains/default/weap/carving_knife.c Wed Jul 5 00:01:11 2006 *************** *** 4,9 **** --- 4,10 ---- inherit LIB_ITEM; + static void create() { item::create(); SetKeyName("carving knife"); *************** *** 21,24 **** SetDamageType(BLADE); SetWeaponType("blade"); } ! --- 22,27 ---- SetDamageType(BLADE); SetWeaponType("blade"); } ! void init(){ ! ::init(); ! } diff -c -r --new-file ds2.0r18/lib/domains/examples/room/README ds2.0r28/lib/domains/examples/room/README *** ds2.0r18/lib/domains/examples/room/README Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/README Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,16 ---- + Example Rooms Index + =========================================================================== + exroom1: Changing Chats when a quest has been done. + exroom2: example of a room you can inherit. All its functions + go to the rooms which inherit it. They can over-write those functions. + All three rooms which inherit it manipulate 'pull' in their own + rooms. They don't affect 'pull' or "myvar" in this room. + exroom2a: inherits exroom2 and ADDS to the object_entered function + exroom2b: inherits exroom2 and adds nothing to object_entered (but you'll + see that it uses the object_entered from exroom2). + exroom2c: inherits exroom2 and removes the object_entered from exroom2. + exroom3: move_player + exroom4: pre/post exits add/remove exits set/query/remove tempvars + exroom5: look_fail & tempvars pt 2. + exroom6: pre-exit (sneak) + exroom7: two verbs for one add_action diff -c -r --new-file ds2.0r18/lib/domains/examples/room/entrance.c ds2.0r28/lib/domains/examples/room/entrance.c *** ds2.0r18/lib/domains/examples/room/entrance.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/entrance.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,106 ---- + #include + #include + #include "ex.h" + + inherit LIB_ROOM; + + + void create() { + room::create(); + SetAmbientLight(30); + SetShort( "Entrance to Hall Of Rooms" ); + SetLong( + "|-----------------------------------------------------------------------------|\n\n"+ + " You are in a large, empty room. There are few things to examine -- only the\n" + "floor, ceiling and wall at this time. An opening to your north leads to the \n" + "incredible Hall of Examples. The line at the top of this description was put\n" + "in as a VERY useful tool for keeping a standard width to all descriptions\n" + " and messages.\n\n" + " The Hall of Examples has many rooms to look through. Each room is limited\n" + "to one or two different types of things. For example, showing how to do a\n" + "pre-exit function. Naturally, you will probably combine many of these\n" + "functions into one single room. Room files can get long and involved, but\n" + "when you understand the individual parts, you have no trouble understanding\n" + "the whole. Don't forget to %^BOLD%^GREEN%^'more here'%^RESET%^ in each room." + " Most of the rooms have explanations written out in comments.\n\n" + " As a final aside, most of the functions are simplistic. These are \n" + "very basic examples." + ); + + SetExits( ([ + "north" : EXPATH + "exroom1", + "south" : START + ])); + + // What follows is a short tutorial on item descriptions. + + // A mapping is a special type of variable -- a list. + // It has a 'key' and a 'value' which are tied together. + // When you query a key it returns the value. + // Each key must be unique. + + // The SetItems in rooms is a mapping where the key & value are + // both strings. + + // This: ([ ]) means what is inside is a mapping. + + // SetItems( ([ ]) ); means you're putting an entire + // mapping into the SetItems. This is how we put items into + // various rooms. We're manipulating the entire mapping + // as a whole. You'll notice for the walls, there is an + // array to allow a player to do 'look wall' and 'look walls' + // and get the same description. This is a very useful method. + + SetItems( ([ + "floor" : "The floor is dirty.", + "ceiling" : "The ceiling is high", + ({ "wall", "walls" }) : "The walls are currtly not very exciting.", + ]) ); + + // The room code also allows us to manipulate individual 'keys' of the + // SetItems mapping: + // AddItem( "bird" , "A small robin sits passageway you can enter."); + // would be a way to put the description for bird into the SetItems mapping. + + // With any mapping, when you set a value for a key that already exists + // the mapping replaces the old one with the new; if that key does + // not yet exist it will add it in. + + // So, when you see the ([ ]) it means you are plunking in a group of + // key/value pairs into the mapping. + + // Finally, if you do SetItems( ([ ]) ); it is going to replace + // the entire SetItems mapping with what is in the ([ ]). + // If you do AddItem(); it will ADD the new mapping to + // the existing SetItems mapping. + + // To illustrate you need to call the test1() function in this room. + // To do that, do the following: + // > call here->test1() + + } + + void test1() + { + write("Now take a look at the room"); + SetItems( ([ + "north wall" : "The north wall has an exit.", + "east wall" : "The east wall is painted blue.", + "south wall" : "The south wall is painted yellow.", + "west wall" : "The west wall is painted green.", + "wall" : "Which wall? North, South, East or West?", + "walls" : "Which wall? North, South, East or West?" + ]) ); + + // In this example, when overwriting the SetItems mapping, you are + // not able to use arrays at this time. That is the reason that + // 'wall' and 'walls' is not listed as you first saw. Keep this + // in mind when overwriting existing mappings. As you'll also + // notice, as mentioned above, you can no longer look at the floor + // or the ceiling since the whole SetItems mapping has been replaced. + + // Now let's add one description to the list. + AddItem( "statue", "There is a statue of a wizard here." ); + + return; + } diff -c -r --new-file ds2.0r18/lib/domains/examples/room/ex.h ds2.0r28/lib/domains/examples/room/ex.h *** ds2.0r18/lib/domains/examples/room/ex.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/ex.h Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,7 ---- + //here's some paths + #define EXAMPLES "/domains/examples/" + #define EXPATH EXAMPLES + "room/" + + //here's some files + #define PAPAROOM EXPATH +"exroom2" + #define START EXPATH + "start" diff -c -r --new-file ds2.0r18/lib/domains/examples/room/exroom1.c ds2.0r28/lib/domains/examples/room/exroom1.c *** ds2.0r18/lib/domains/examples/room/exroom1.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/exroom1.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,110 ---- + #include + #include + #include "ex.h" + + // The #include "ex.h" is used in each of these files to remember + // the defines for EXPATH and other variables we have defined + // that all of these files use. It would be tedious to have to + // put the #define EXPATH in every file, so we put it into one + // and include it as a reference for each file that needs it. + // Consider it a library card. The books that are in the library + // (the #define's) are referenced every time you see EXPATH. + + inherit LIB_ROOM; + + // I'm defining a global variable here called once to be used later + // in the file. A global variable is something that can be used + // by any function in this room. There are also local variables + // that can be defined only in the variable using it. + + int once; + + // I'm also defing a function lever_pulled() that will be called later. + mixed lever_pulled(); + + void create() + { + ::create(); + SetAmbientLight(30); + SetShort( "Lever Pull" ); + SetLong("This is an example room for a simple add_action which changes "+ + "a description. There's a lever to pull." + ); + + SetExits( ([ + "north" : EXPATH + "exroom2", + "south" : EXPATH + "entrance", + ])); + + // Here, take a look at how I set the lever item. It is different + // that you saw in the entrance room. What I am doing here is + // calling a functional. When the player types 'look lever', it + // will call the functional (: lever_pulled :) that we defined above. + // I'll explain later in this file. + + SetItems( ([ + "lever" : ((: lever_pulled :)) + ]) ); + + } + + // In the init() function, I am setting our global variable 'once' to 0. This + // is used to reset the lever back when the room resets or the mud reboots. + // so the next player who comes in to pull the lever, they can. + // In the init() function, we also define the actions that can be done in the + // room. In this case, we need a pull action to 'pull lever'. Whenever a player + // types pull, it will call the function aa_pull(). + + void init() + { + ::init(); + add_action("aa_pull","pull"); + once = 0; + } + + // This is the function that is called when a player types pull as mentioned above. + // First, we need to check and see if they are pulling the correct thing. the + // string str is defining a local variable that will be used in this function. + // Next, we have if( str != "lever"). That is saying if I type 'pull finger', + // it will write 'Pull what?'. The \n symbol means a carriage return or 'enter' + // to go to the next line. + + mixed aa_pull(string str) + { + if ( str != "lever") + { + write( "Pull what?\n" ); + return 1; + } + + // Here we are going to check if the lever has been pulled. If it has, + // it's going to tell the player that and exit the aa_pull() function. + // this is done by the return 1; that you see here. + + if( once ==1 ) + { + write( "The lever's already pulled." ); + return 1; + } + + // If the lever has not been pulled, this part starts. As you'll notice, we + // set once = 1 to indicate that the lever has been pulled. + + write("You pull the lever!\n"); + say(this_player()->GetName() + " pulls the lever!\n"); + once=1; + return 1; + } + + // I told you I'd explain what the functional (: lever_pulled :) was for. + // Below, it checks to see if the lever has been pulled. if( !once ) + // says, if once is equal to 0 (not pulled) it returns and says the lever + // has not been pulled. If once is not equal to 0, then it means that it + // has been pulled and returns a different message. + + mixed lever_pulled() + { + if( !once ) + return "The lever is pushed into the wall. Perhaps you could pull it."; + return "The lever has already been pulled. You're too late!"; + } diff -c -r --new-file ds2.0r18/lib/domains/examples/room/exroom2.c ds2.0r28/lib/domains/examples/room/exroom2.c *** ds2.0r18/lib/domains/examples/room/exroom2.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/exroom2.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,77 ---- + #include + #include "ex.h" + + inherit LIB_ROOM; + + int myvar; + + void create() + { + ::create(); + SetAmbientLight(30); + SetShort( "a master file" ); + SetLong(@EndText + |---------------------------------------------------------------|-------------| + This is an example room for inheriting files. This + file is inherited by two others. It's also a fully + functional room. There's a lever to pull. + The rooms which inherit me are to the east. + EndText + ); + + // You'll notice that for SetLong(), I've put @EndText at the top and EndText at the bottom + // and have not put in quotes. When using this style of code, it is important to make sure + // you manually enter to the next line to wrap the lines on the player's screen. + // This can be a tedious if you do not know how many lines to enter before you need to + // continue on the next line. If you look back to the Entrance to the Hall of Examples, + // You will see a handy line I've used to know when to stop a line and continue on + // the next. I've included it in the room description for your convenience. the + // normal screen default is 79 characters. Whenever you would like to recreate the line + // at the top, type 'margins' + + SetExits( ([ + "south" : EXPATH + "exroom1", + "north" : EXPATH + "exroom3", + "east" : EXPATH + "exroom2a" + ]) ); + SetItems( ([ + "lever" : "A lever for pulling.", + ]) ); + + myvar = 0; + } + + // The CanReceive() function is very helpful to do checks on an interactive object + // that enters the room. In this case, we are checking to see if the object that + // enters is a creator player object. If it is, then we will give a message to + // that object with the write() funciton. I've put some color tags to set the color + // off from the rest of the text. For colors available, type 'colors'. + + int CanReceive(object ob) + { + if ( creatorp(ob) ) + write( "%^BOLD%^BLUE%^Room tells you: %^BOLD%^GREEN%^You're a creator! %^BOLD%^BLUE%^(This is from the master file.)%^RESET%^\n"); + return 1; + } + + void init() + { + ::init(); + add_action("aa_pull","pull"); + } + + // We're going to use the variable 'myvar' in the middle of a write() funciton. As + // you'll notice below, the text you are writing has to be in the " ". Then we + // separate the text by putting in: " + myvar + ". This adds the myvar variable + // to the text output whenever a player pulls the lever. Try it and see. + + + mixed aa_pull(string str) + { + if (str!="lever") + return notify_fail("Pull what?\n"); + myvar ++; + write("You pull the lever and the value of 'myvar' is now " + myvar + "\n"); + say(this_player()->GetName() + " pulls the lever!\n"); + return 1; + } diff -c -r --new-file ds2.0r18/lib/domains/examples/room/exroom2a.c ds2.0r28/lib/domains/examples/room/exroom2a.c *** ds2.0r18/lib/domains/examples/room/exroom2a.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/exroom2a.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,72 ---- + #include + #include "ex.h" + + inherit PAPAROOM; + + void create() + { + ::create(); + SetAmbientLight(30); + SetShort( "a 'child' file" ); + SetLong("This is an example room whose properties are inherited " + "from another room.\n for more information." + ); + + //Note: When we set the "exits" in this room we + // over-write the "exits" we inherited from PAPAROOM + // There's a way to just add an exit to the list, but exits + // are primarily unique to each room, so this method is fine. + SetExits( ([ + "west" : EXPATH + "exroom2", + "east" : EXPATH + "exroom2b" + ])); + + SetItems( ([ + "more" : @EndBlah + ------------------------------------------------------------------- + Take a look at the CanReceive function. + Do you see the line ::CanReceive(ob)? + The :: refers to 'the file I've inherited from'. + So, we are calling (using) the function CanReceive() as it is + written in exroom2.c + THEN we are doing our own thing. + + When an object enters this room (player or bowl or sword etc) + it becomes the variable 'ob'. + + We pass that variable 'ob' along to the function CanReceive() + that's in exroom2.c + + Then we check to see if ob is a player or creator. (type: man userp) + If so, we give that object a message. + ------------------------------------------------------------------- + EndBlah, + ])); + + /* See the way I did the SetItems again for 'more'. This is one + way to do it. Another way to do it is to use a (: functional :) + like I did for the lever. Take a look, however, at this comment + that you are reading. If you'll notice, I've done it a little + differently to show you a way to comment out several lines all + at once. The original method that I used was to put // in front + of the line that I wanted to comment out. If you have several + lines like we have here, then you'll want to begin your comment + like you see here and end it like below. This is how I will + be doing large comments in future examples. + */ + + + } + + int CanReceive(object ob) + { + ::CanReceive(); + if ( userp(ob) ) + write("%^MAGENTA%^Room tells you: %^GREEN%^You're any player, creator or not! %^MAGENTA%^(This is from this room)%^RESET%^\n"); + return 1; + } + + void init() + { + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/examples/room/exroom2b.c ds2.0r28/lib/domains/examples/room/exroom2b.c *** ds2.0r18/lib/domains/examples/room/exroom2b.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/exroom2b.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,37 ---- + #include + #include "ex.h" + + inherit PAPAROOM; + + void create() + { + ::create(); + SetAmbientLight(30); + SetShort( "a 'child' file" ); + SetLong("This is an example room that inherits the properties " + "of another room."); + + /* Note: When we set the "exits" in this room we over-write + the "exits" we inherited from PAPAROOM. There's a way to + just add an exit to the list, but exits are primarily + unique to each room, so this method is fine. + */ + + SetExits( ([ + "west" : EXPATH + "exroom2a", + ])); + + /* Now, we are setting the objects that are loaded into the room, + or the inventory of the room. Just like a player has inventory + on their character. + */ + + SetInventory( ([ "/domains/default/obj/bbucket" : 1 ])); + + } + + + void init() + { + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/examples/room/exroom3.c ds2.0r28/lib/domains/examples/room/exroom3.c *** ds2.0r18/lib/domains/examples/room/exroom3.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/exroom3.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,55 ---- + #include + #include "ex.h" + + inherit LIB_ROOM; + + void create() + { + ::create(); + SetAmbientLight(30); + SetShort( "move the player" ); + SetLong(@EndText + This is an example room for moving a player. There's nothing + to look at here. But, surprise, there's a lever to pull. + + We are going to get a bit fancier and have something special + happen when a player pulls the lever. + EndText + ); + + SetExits( ([ + "south" : EXPATH + "exroom2", + "north" : EXPATH + "exroom4", + ])); + + } + + void init() + { + ::init(); + add_action("aa_pull","pull"); + } + + int aa_pull(string str) + { + if (str!="lever") + { + write( "Pull what?\n" ); + return 1; + } + write(@EndText + You pull the lever and a big hand grabs you! + It whisks you away to parts unknown. Ok, they are known. + Look around when you get there, which is basically instantaneous. + EndText); + say(this_player()->GetName() + " pulls the lever!"); + this_player()->eventMoveLiving(EXPATH + "exroom1", "forcibly when a big hand takes " + objective(this_player()) + " away", + this_player()->GetName() + " is dropped from the sky by a big hand." + ); + return 1; + } + + /* The eventMoveLiving() function transports the player who pulls + the lever to another room. It also writes a message in the room + that the player leaves and in the room they are sent to. + */ diff -c -r --new-file ds2.0r18/lib/domains/examples/room/exroom4.c ds2.0r28/lib/domains/examples/room/exroom4.c *** ds2.0r18/lib/domains/examples/room/exroom4.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/exroom4.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,198 ---- + #include + #include "ex.h" + + inherit LIB_ROOM; + int pre_north(); + int post_south(); + int post_north(); + + void create() + { + ::create(); + SetAmbientLight(30); + SetShort( "pre/post exits and add/remove exits" ); + SetLong(@EndText + There's a door to the north with a doorbell, and a blank + wall to the south. + ------------------------------------------------------------- + This is an example room for using pre-exits and post-exits. + It also shows how to add & delete an exit from the room, and + use a temporary variable on a player. + + There's a lever to pull and push, and a bell to ring. + Pull the lever out: create an exit to the south. + Push the lever in: delete an exit to the south. + Ring the bell: allows you to go north. + When you go south, the exit to the south disappears. + ------------------------------------------------------------- + EndText + ); + + SetExits( ([ + ])); + + AddExit( "north", EXPATH + "exroom5", (: pre_north :)); + + } + + void init() + { + ::init(); + add_action("aa_pull","pull"); + add_action("aa_push","push"); + add_action("aa_ring","ring"); + } + + + int aa_pull(string str) + { + if (str!="lever" && str!="lever out") + { + write( "Pull what?\n" ); + return 1; + } + /* Now, we can find out if the lever has been already pulled + in one of two ways. + Method one: we test to see if the exit to the south is open. + Since pulling the lever does this, and the only way to + create that exit is pulling the lever -- this is a valid method. + + Method two: we use a variable and change it's value when the lever + is pushed or pulled. Since we have a method that works without + using an additional variable, that is the method I'll pick here. + It will also show you how to query for an exit. + + Note: GetExits() returns a mapping for all the exits in a room + GetExit("dir") returns the value for that specific direction. + if there is NOT an exit in that direction it will return UNDEFINED + and can be detected using the ! operator. (! means 'not') + conversely, if GetExit("dir") is true, then there IS an exit + to that direction. Got it? Good. + */ + + if ( GetExit("south") ) + { + write("The lever is already pulled out!\n"); + return 1; + } + + /* If you don't know by now, this_player() indicates the player doing the actions + So when I do this_player()->GetName() it gives me the name of the player + who is doing the actions and allows me to tell the room who it is. + */ + + write( "You pull the lever and an invisible crack appears in the south wall. "+ + "A door slides open and there is a previously undetected exit." ); + say(this_player()->GetName() + " pulls the lever and an exit appears to the south.\n"); + + // AddExit() functions add an exit to the room. Here, we added an exit and + // set up a (: functional :) to do close up the exit when they leave. + + AddExit( "south", EXPATH + "exroom3", (: post_south :) ); + SetObviousExits("n, s"); + return 1; + } + + + int aa_push(string str) + { + if (str!="lever" && str!="lever in") + { + write( "Push what?\n" ); + return 1; + } + + /* Since there's more then one way for the exit to dissappear (see the post-exit + function for south) and there may be more then one player wandering the halls + we don't want to assume that 'this' player pushed the lever. So we wouldn't + say "You've already pushed the lever." + */ + + if ( ! GetExit("south") ) + { + write( "The lever is pushed in as far as it will go.\n"); + return 1; + } + write( "You push the lever in and an unseen door slides shut in the south wall."+ + "The wall now appears solid and unpenatrable." ); + say(this_player()->GetName() + " pushes the lever and the south closes tight.\n"); + + // Now we remove the exit that was added earlier. + + RemoveExit("south"); + SetObviousExits("n"); + return 1; + } + + + int aa_ring(string str) + { + if (str!="bell" && str!="doorbell" && str!="door bell") + { + write( "Ring what?\n" ); + return 1; + } + //if we only want to let them ring it once, we can check for the + //temp var here. This version will let them ring it many times. + write("DONG!\nYou ring a doorbell! You are now admitted north.\n"); + say("DONG! A doorbell rings.\n"); + this_player()->SetProperty("rung_bell", 1); + return 1; + } + + + /* CODING STYLE 101 + Personally, I always put my post/pre exit functions right after create and + before the reset() or init() functions. This makes them easy to find. + Since they're MENTIONED in the create() I like to keep 'em close at hand. + For the same reason I usually follow my init() with any add_actions that + I've created. I also preface my functions with an indicator saying what + their purpose is. I've chosen aa_ for add_actions an pe_ for pre or post + exit functions. OR i use pre_ or post_ when i have both going on. This + may not seem like a big deal in a little file, but when the file gets + huge, it helps to glance at a function and go: ah ha! this is a post_exit + function. or ah ha! this is an add_action or similarly: ah ha! this is + not any specialized function so I must be calling it for some other reason. + The order you write them in is a personal decision. Just keep your + create() function first on the list. + */ + + //A return 0 in a pre-exit will prevent you from going that dir. + //A return 1 will allow you to go that dir. + + + int pre_north() + { + if( !this_player()->GetProperty("rung_bell") ) + { + write("Ring the doorbell first!\n"); + return 0; + } + // Now that the pre_north() function has done what it needs to do, we + // will call the post_north() function here + post_north(); + return 1; + } + + + int post_north() + { + //might as well delete it, it's served its purpose. + this_player()->RemoveProperty("rung_bell"); + return 1; + } + + + //We're going to delete the exit AFTER the player walks through + // Because doing it in a pre_exit would be tatamount to slamming + // a door in their face. You wouldn't want to do that... would you? :P + + + int post_south() + { + write("You hear a noise and realize the wall has mysteriously closed.\n"); + say("You hear a noise and realize the wall has mysteriously closed.\n"); + this_player()->eventMoveLiving("/domains/examples/room/exroom3", "south", this_player()->GetName()+" enters."); + RemoveExit("south"); + SetObviousExits("n"); + } diff -c -r --new-file ds2.0r18/lib/domains/examples/room/exroom5.c ds2.0r28/lib/domains/examples/room/exroom5.c *** ds2.0r18/lib/domains/examples/room/exroom5.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/exroom5.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,139 ---- + #include + #include "ex.h" + + //LOOKIE! A constant (#define) at the top of the file instead + // of in a header (.h) file. Yes, this is possible and sometimes + // a better method. This is the only room in the entire directory + // which uses this define. It doesn't really need to go into + // the ex.h file. However, it must be at the top of the file. + + #define ORC "/domains/town/npc/orc" + + inherit LIB_ROOM; + + void create() + { + ::create(); + SetAmbientLight(30); + SetShort( "temp vars" ); + SetLong(@EndText + You can't really see north and there's a bell + on the south door. Don't ring it too many times! + ------------------------------------------------------------- + This is an example room for querying the specific value of a + stored variable. Remember though, variables are persistent. + If you want to prevent a future bug report from your players + or creators, then make sure you remove the variable when they + leave. Otherwise, when the come back in a week and ring the + bell only once, it would actually be added to their previous + rings. + ------------------------------------------------------------- + EndText + ); + + SetProperty( "no peer", 1); + + SetExits( ([ + "north" : EXPATH + "exroom6", + "south" : EXPATH + "exroom4", + ])); + } + + void init() + { + ::init(); + add_action("aa_ring","ring"); + } + + /* Since we don't need the temp var now, we will remove it. + In the CanRelease() function, I am telling the room that + when an object tries to leave, to remove the temp var + and return 1; to say that it is okay to leave. Were + I to put return 0; then the player would not be able + to leave. + */ + + int CanRelease() + { + this_player()->RemoveProperty("rung_bell"); + return 1; + } + + mixed aa_ring(string str) + { + int numrings; + if (str!="bell" && str!="doorbell" && str!="door bell") + return notify_fail("Ring what?\n"); + /* if "rung_bell" has not been set in the player, a query() for it + will return UNDEFINED. you CAN add 1 to an undefined to get 1. + + they just rang it one more time, so we'll take what was there and + add one. Then we'll put the new value back into the temp var + **see note at bottom of file. + */ + numrings=this_player()->GetProperty("rung_bell")+1; + this_player()->SetProperty("rung_bell",numrings); + write("DONG!\nYou ring a doorbell! Don't do it too many times!\n"); + say("DONG! A doorbell rings.\n"); + + if ( numrings>5 ) + { + if (!present("orc",this_object())) //nested if. see NOTE 2. + { + write("Now you've done it! An orc walks in a bonks you on the head.\n"); + say("Now " + this_player()->GetName() + " has done it! An orc walks in a bonks " + + objective(this_player()) + " on the head.\n"); + clone_object(ORC)->eventMove(this_object()); //this_object IS -this- room! + } + } + return 1; + } + + /* NOTE! + There are many ways to do the same thing with code. Some ways + are more readable. Some are less. Some are more efficient. + Some ways are very readable and only slightly less efficient. + I urge you to start out writing code that is readable AND correct, + rather then try to squeeze things down to one line of code. The + goal is to learn -- to understand what you're doing. If you + attempt to copy code that is all squeezed down into one line, and + you really don't understand it, then you'll be forever just copying + code and not really "getting it". + + That said. + in the add_action i did the following: + + int numrings; + numrings=this_player()->GetProperty("rung_bell")+1; + this_player()->SetProperty("rung_bell",numrings); + if ( numrings>5 ) + etc... + + I COULD have eliminated the variable numrings : + + this_player()->SetProperty("rung_bell", + this_player()->GetProperty("rung_bell") + 1); + if (this_player()->GetProperty("rung_bell") > 5) + etc... + + But, read both sets of code and determine for yourself which is easier + to read; easier to figure out on reading. You see, other people will + be reading your code. Other people will be debugging your code at + a later date. You may decide to never log on again and your project + is in a domain. The people in that domain will be fixing bugs & typos + & runtimes and you gotta bet that they will appreciate READABLE code... + as well as good comments. Never be afraid of comments! + + + NOTE 2! The nested if. Could also have been written: + if ( numrings>5 && ! present("orc",this_object())) + { + write("Now you've done it! An ord walks in a bonks you on the head.\n"); + say("Now " + this_player->GetName() + " has done it! An orc walks in a bonks " + + objective(this_player()) " + " on the head.\n"); + clone_object(ORC)->eventMove(this_object()); //this_object IS -this- room! + } + But, if you are having problems with the booleans && || and the code + is pretty clean & simple already, you might want to go the route + of nesting your if statements until you get the hang of && and ||. + */ diff -c -r --new-file ds2.0r18/lib/domains/examples/room/exroom6.c ds2.0r28/lib/domains/examples/room/exroom6.c *** ds2.0r18/lib/domains/examples/room/exroom6.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/exroom6.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,61 ---- + #include + #include "ex.h" + + #define SPIDER "/domains/town/npc/spider" + + inherit LIB_ROOM; + + int pre_north(); + + void create() + { + ::create(); + SetAmbientLight(30); + SetShort( "a room with a blocked exit" ); + SetLong(@EndText + There's not much here. Of course, we don't talk about + the spider in the long, cause it COULD be dead. + EndText + ); + SetExits( ([ + "south" : "/domains/examples/room/exroom5", + ]) ); + + AddExit("north", EXPATH + "exroom7", (: pre_north :)); + + SetInventory( ([ + SPIDER : 1, + ])); + } + + void init() + { + ::init(); + } + + /* In the pre_north() function, I am going to add a special treat! + If a creator is invisible, you can bypass the spider completely! + Woo! Woo! + */ + + int pre_north(string dir) + { + if( this_player()->GetInvis(1)) + return 1; + /* If the spider is present, the player can not go that way. We + are also checking to see if the spider is still alive since + we don't want a corpse to click menacingly. :) + If I were to only put if(present("spider")), then the dead + corpse would block the path and click menacingly. + By putting the if(living(present("spider", this_object()))) + we accomplish two checks on one line. Simple and elegant.*/ + if(present("spider", this_object()) && living(present("spider",this_object())) ) + { + write("The spider blocks your exit and clicks menacingly!\n"); + say("The spider blocks " + possessive_noun(this_player()->GetName()) + " exit and clicks menacingly!\n"); + return 0; + } + //if we get to here, the spider is not present, so we treat as a + //normal exit. ie: do nothing. return 1 allows the exit, if you remember. + return 1; + } diff -c -r --new-file ds2.0r18/lib/domains/examples/room/exroom7.c ds2.0r28/lib/domains/examples/room/exroom7.c *** ds2.0r18/lib/domains/examples/room/exroom7.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/exroom7.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,93 ---- + #include + #include "ex.h" + + inherit LIB_ROOM; + + int once; + int is_pulled(); + + void create() + { + ::create(); + SetAmbientLight(30); + SetShort( "two verbs for one action" ); + SetLong(@EndText + This room demonstrates how you can use two verbs to do + one thing. + There's a chain here. You can pull it or yank it. + + Note: See how we change the description of the chain? + It's important to remove 'quest hints' once a + quest has been done. And then put them back in + when the quest is ready to do. + EndText + ); + + // Here is another functional to point to the is_pulled() + // function. This is a very useful tool. + + SetItems( ([ + "chain" : (: is_pulled :), + ])); + + SetExits( ([ + "south" : EXPATH + "exroom6", + ])); + } + + /* Here you'll see that we have two add_actions. We have 'pull' and + 'yank'. If the player uses either verb when pulling the chain + the aa_chain() function is called. + */ + + void init() + { + ::init(); + add_action("aa_chain","pull"); + add_action("aa_chain","yank"); + } + + /* This is the first reset() function that we've seen so I'd like + to take a moment to explain it. The reset() function allows + an object to do self-maintenance. After every reset interval + (whose exact length is determined on a mud by mud basis, but + averages around every 2 hours), reset() is called in every + object that currently exists. Here, we use the reset() + function to return the variable 'once' back to 0 to allow the + chain to be pulled again after reset occurs. + */ + + void reset() + { + ::reset(); + once=0; + } + + /* query_verb() tells you what the player typed */ + mixed aa_chain (string str) + { + string averb=query_verb(); + if (str!="chain") + return notify_fail(capitalize(averb)+ " what?\n"); + if (once) + return notify_fail("The chain has already been " + + averb + "ed.\n"); + + // We're returning the averb variable that was defined and set + // above in a message to the player and the room. Then, we + // set the 'once' variable to show that the chain has been pulled. + write("You " + averb + " the chain!\n"); + say(this_player()->GetName() + " "+ averb + "s the chain!\n"); + once=1; + return 1; + } + + // This is the functional that was called to show the current state + // of the chain. Pulled or not pulled. + string is_pulled() + { + if( once ) + return "You see a plain chain.\n"; + else + return "Here's a chain begging to be yanked or pulled.\n"; + } diff -c -r --new-file ds2.0r18/lib/domains/examples/room/start.c ds2.0r28/lib/domains/examples/room/start.c *** ds2.0r18/lib/domains/examples/room/start.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/examples/room/start.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,20 ---- + #include + #include + #include "ex.h" + + inherit LIB_ROOM; + + + void create() { + room::create(); + SetAmbientLight(30); + SetShort("a blank room"); + SetLong("A featureless area. The example rooms are north."); + + SetExits( ([ + "north" : EXPATH + "entrance" + ]) ); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/armor/badge.c ds2.0r28/lib/domains/town/armor/badge.c *** ds2.0r18/lib/domains/town/armor/badge.c Mon Nov 7 13:30:37 2005 --- ds2.0r28/lib/domains/town/armor/badge.c Wed Jul 5 00:01:11 2006 *************** *** 2,7 **** --- 2,8 ---- #include #include inherit LIB_ARMOR; + static void create(){ armor::create(); SetKeyName("visitor pass"); *************** *** 15,23 **** --- 16,26 ---- SetBaseCost("silver",5000); SetDamagePoints(100); SetArmorType(A_AMULET); + SetRestrictLimbs( ({"torso"}) ); SetRetainOnDeath(1); } void init(){ + ::init(); add_action("nplh","click"); } int nplh(string str){ *************** *** 34,40 **** return 1; } } - string GetAffectLong(object ob) { if(!ob || !living(ob)) return 0; return ob->GetName() + " is an authorized Test Character."; --- 37,42 ---- diff -c -r --new-file ds2.0r18/lib/domains/town/armor/oldstyle_ring.c ds2.0r28/lib/domains/town/armor/oldstyle_ring.c *** ds2.0r18/lib/domains/town/armor/oldstyle_ring.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/armor/oldstyle_ring.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,16 ---- + #include + #include + #include + inherit LIB_ARMOR; + static void create(){ + armor::create(); + SetKeyName("metal ring"); + SetId(({"ring"})); + SetAdjectives( ({"simple","metal"}) ); + SetShort("a simple ring"); + SetLong("This is a simple metal ring."); + SetMass(1); + SetValue(1000); + SetDamagePoints(100); + SetArmorType(A_RING); + } diff -c -r --new-file ds2.0r18/lib/domains/town/meals/ale.c ds2.0r28/lib/domains/town/meals/ale.c *** ds2.0r18/lib/domains/town/meals/ale.c Mon Jan 16 23:02:33 2006 --- ds2.0r28/lib/domains/town/meals/ale.c Wed Jul 5 00:01:11 2006 *************** *** 3,8 **** --- 3,9 ---- inherit LIB_MEAL; + static void create() { meal::create(); SetKeyName("ale"); *************** *** 16,18 **** --- 17,22 ---- "$N drinks a bottle of ale."); SetBaseCost("silver",10); } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/meals/herring.c ds2.0r28/lib/domains/town/meals/herring.c *** ds2.0r18/lib/domains/town/meals/herring.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/meals/herring.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,23 ---- + #include + #include + #include + + inherit LIB_FISH; + + static void create() { + fish::create(); + SetKeyName("herring"); + SetId( ({ "fish" }) ); + SetAdjectives( ({ "red","saltwater","salt water" }) ); + SetShort("a red herring"); + SetLong("It is saltwater fish, and red in color."); + SetMealType(MEAL_FOOD); + SetMass(10); + SetStrength(10); + SetBaseCost("silver", 2); + SetFight(4); + SetFood("/domains/town/meals/herring"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/meals/poison.c ds2.0r28/lib/domains/town/meals/poison.c *** ds2.0r18/lib/domains/town/meals/poison.c Mon Jan 16 23:02:33 2006 --- ds2.0r28/lib/domains/town/meals/poison.c Wed Jul 5 00:01:11 2006 *************** *** 2,8 **** #include inherit LIB_MEAL; ! inherit "/lib/poison"; static void create() { ::create(); --- 2,8 ---- #include inherit LIB_MEAL; ! inherit LIB_MEAL_POISON; static void create() { ::create(); *************** *** 10,16 **** SetId( ({ "vial", "poison", "vial of poison" }) ); SetAdjectives("glass","small"); SetShort("a vial of poison"); ! SetLong("A small glas vial of poison."); SetMass(60); SetMealType(MEAL_DRINK); SetStrength(1); --- 10,16 ---- SetId( ({ "vial", "poison", "vial of poison" }) ); SetAdjectives("glass","small"); SetShort("a vial of poison"); ! SetLong("A small glass vial of poison."); SetMass(60); SetMealType(MEAL_DRINK); SetStrength(1); diff -c -r --new-file ds2.0r18/lib/domains/town/meals/shark.c ds2.0r28/lib/domains/town/meals/shark.c *** ds2.0r18/lib/domains/town/meals/shark.c Thu Feb 23 15:40:40 2006 --- ds2.0r28/lib/domains/town/meals/shark.c Wed Jul 5 00:01:11 2006 *************** *** 20,28 **** "appetite."); SetMealType(MEAL_FOOD); SetMass(100); SetBaseCost("silver", 10); SetFight(40); ! //SetFood("/domains/town/meals/shark"); } int eventCatch(object who, object pole) { call_out((: BiteMe, who :), 0); --- 20,29 ---- "appetite."); SetMealType(MEAL_FOOD); SetMass(100); + SetStrength(50); SetBaseCost("silver", 10); SetFight(40); ! SetFood("/domains/town/meals/shark"); } int eventCatch(object who, object pole) { call_out((: BiteMe, who :), 0); *************** *** 32,38 **** who->eventPrint("The shark bites you before it dies!"); environment(who)->eventPrint("The shark bites " + (string)who->GetName() + " before it dies!", who); ! who->eventReceiveDamage(this_object(), KNIFE, random(20), 0, (string)who->GetRandomLimb("right hand")); } void init(){ --- 33,39 ---- who->eventPrint("The shark bites you before it dies!"); environment(who)->eventPrint("The shark bites " + (string)who->GetName() + " before it dies!", who); ! who->eventReceiveDamage(this_object(), BITE, random(30), 0, (string)who->GetRandomLimb("right hand")); } void init(){ diff -c -r --new-file ds2.0r18/lib/domains/town/npc/bubb.c ds2.0r28/lib/domains/town/npc/bubb.c *** ds2.0r18/lib/domains/town/npc/bubb.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/npc/bubb.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,25 ---- + #include + + inherit LIB_TEACHER; + void create(){ + ::create(); + SetKeyName("bubb"); + SetId( ({"teacher","orc","schoolteacher","bubb the schoolteacher"}) ); + SetGender("male"); + SetRace("orc"); + SetNativeLanguage("english"); + SetTeachingFee(100); + SetLocalCurrency("silver"); + SetShort("Bubb the schoolteacher"); + SetLong("This is a person whose job it is to teach you things. "+ + "For example, 'ask teacher "+ + "to teach Tangetto' would prompt him to begin teaching a Tangetto "+ + "lesson to you, if he knows the language and you have "+ + "enough of his preferred currency. "); + SetLevel(1); + SetLanguage("Tangetto", 100); + AddTeachingLanguages( ({"Tangetto", "English" }) ); + } + void init() { + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/npc/bugg.c ds2.0r28/lib/domains/town/npc/bugg.c *** ds2.0r18/lib/domains/town/npc/bugg.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/npc/bugg.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,26 ---- + #include + + inherit LIB_TEACHER; + + void create(){ + ::create(); + SetKeyName("bugg"); + SetId( ({"teacher","dwarf","schoolteacher","bugg the schoolteacher"}) ); + SetGender("male"); + SetRace("dwarf"); + SetNativeLanguage("english"); + SetShort("Bugg the schoolteacher"); + SetLong("This is a person whose job it is to teach you things. "+ + "For example, 'ask teacher "+ + "to teach Malkierien' would prompt him to begin teaching a Malkierien "+ + "lesson to you, if he knows the language and you have "+ + "earned sufficient training points. If you lack training points, then "+ + "do some adventuring and earn a level promotion. You will "+ + "then be awarded training points."); + SetLevel(1); + SetLanguage("Malkierien", 100); + AddTeachingLanguages( ({"Malkierien", "English" }) ); + } + void init() { + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/npc/herkimer.c ds2.0r28/lib/domains/town/npc/herkimer.c *** ds2.0r18/lib/domains/town/npc/herkimer.c Wed Jan 11 23:09:07 2006 --- ds2.0r28/lib/domains/town/npc/herkimer.c Wed Jul 5 00:01:11 2006 *************** *** 1,7 **** #include #include ! inherit LIB_SENTIENT; int JoinGuild(object ob, string verb, string what); int TeachSpell(object who, string verb, string spell); --- 1,7 ---- #include #include ! inherit LIB_LEADER; int JoinGuild(object ob, string verb, string what); int TeachSpell(object who, string verb, string spell); *************** *** 21,27 **** } static void create() { ! sentient::create(); SetKeyName("herkimer"); SetId(({"archwizard","wizard","herkermer","herkirmer"})); SetAdjectives(({"old","gentle","kindly"})); --- 21,27 ---- } static void create() { ! leader::create(); SetKeyName("herkimer"); SetId(({"archwizard","wizard","herkermer","herkirmer"})); SetAdjectives(({"old","gentle","kindly"})); diff -c -r --new-file ds2.0r18/lib/domains/town/npc/human_champion.c ds2.0r28/lib/domains/town/npc/human_champion.c *** ds2.0r18/lib/domains/town/npc/human_champion.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/npc/human_champion.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,21 ---- + #include + inherit LIB_NPC; + static void create(){ + npc::create(); + SetKeyName("human champion"); + SetId( ({ "champion", "human","npc","warrior"}) ); + SetShort("a human champion"); + SetLong("This is a massive human warrior. His pectoral muscles "+ + "are clearly visible even through his shaggy fur and armor. His face is an angry "+ + "snarl of rage and hatred."); + SetLevel(10); + SetRace("human"); + SetClass("fighter"); + SetGender("male"); + SetInventory(([ + "/domains/campus/armor/chainmail.c" : "wear chainmail", + //"/domains/campus/armor/shield.c" : "wear shield", + "/domains/campus/weap/sharpsword.c" : "wield sword" + ])); + //SetMaxHealthPoints(550); + } diff -c -r --new-file ds2.0r18/lib/domains/town/npc/human_champion_f.c ds2.0r28/lib/domains/town/npc/human_champion_f.c *** ds2.0r18/lib/domains/town/npc/human_champion_f.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/npc/human_champion_f.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,21 ---- + #include + inherit LIB_NPC; + static void create(){ + npc::create(); + SetKeyName("human champion"); + SetId( ({ "champion", "human","npc","warrior"}) ); + SetShort("a human champion"); + SetLong("This is a massive human warrior. Her huge muscles "+ + "are clearly visible even through her armor. Her face is an angry "+ + "snarl of rage and hatred."); + SetLevel(10); + SetRace("human"); + SetClass("fighter"); + SetGender("female"); + SetInventory(([ + "/domains/campus/armor/chainmail.c" : "wear chainmail", + //"/domains/campus/armor/shield.c" : "wear shield", + "/domains/campus/weap/sharpsword.c" : "wield sword" + ])); + //SetMaxHealthPoints(550); + } diff -c -r --new-file ds2.0r18/lib/domains/town/npc/otik.c ds2.0r28/lib/domains/town/npc/otik.c *** ds2.0r18/lib/domains/town/npc/otik.c Mon Nov 7 13:30:38 2005 --- ds2.0r28/lib/domains/town/npc/otik.c Wed Jul 5 00:01:11 2006 *************** *** 3,8 **** --- 3,9 ---- inherit LIB_VENDOR; + static void create() { ::create(); SetKeyName("otik"); *************** *** 25,27 **** --- 26,31 ---- SetSkill("bargaining", 1); } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/npc/radagast.c ds2.0r28/lib/domains/town/npc/radagast.c *** ds2.0r18/lib/domains/town/npc/radagast.c Fri Mar 24 14:36:37 2006 --- ds2.0r28/lib/domains/town/npc/radagast.c Wed Jul 5 00:01:11 2006 *************** *** 9,21 **** SetAdjectives("friendly"); SetGender("male"); SetRace("human"); SetShort("Radagast the Brown"); SetLong("This is a tall, thin old man. Not much is known of "+ "this mysterious wizard, other than his legendary kindness "+ "to animals and his controversial reputation as a seditious "+ "rebel. He can train you in the arts of magic defense, magic "+ "attack, and conjuring. You may, for example, \"ask radagast "+ ! "to teach conjuring\". If you lack training points, then "+ "do some adventuring and earn a promotion from Dirk. You will "+ "then be awarded training points."); SetClass("mage"); --- 9,22 ---- SetAdjectives("friendly"); SetGender("male"); SetRace("human"); + SetNoSpells(1); SetShort("Radagast the Brown"); SetLong("This is a tall, thin old man. Not much is known of "+ "this mysterious wizard, other than his legendary kindness "+ "to animals and his controversial reputation as a seditious "+ "rebel. He can train you in the arts of magic defense, magic "+ "attack, and conjuring. You may, for example, \"ask radagast "+ ! "to train conjuring\". If you lack training points, then "+ "do some adventuring and earn a promotion from Dirk. You will "+ "then be awarded training points."); SetClass("mage"); diff -c -r --new-file ds2.0r18/lib/domains/town/npc/rat.c ds2.0r28/lib/domains/town/npc/rat.c *** ds2.0r18/lib/domains/town/npc/rat.c Mon Jan 16 23:02:33 2006 --- ds2.0r28/lib/domains/town/npc/rat.c Wed Jul 5 20:52:28 2006 *************** *** 9,20 **** SetId( ({"rat"}) ); SetShort("a rat"); SetLong("A scruffy little dirty rat."); ! SetLevel(3); ! SetMaxHealthPoints(50); SetRace("rodent"); SetGender("male"); - SetClass("fighter"); - SetWanderSpeed(1); SetEncounter(100); SetMessage("come","$N scurries in."); SetMessage("leave","$N scurries $D."); --- 9,17 ---- SetId( ({"rat"}) ); SetShort("a rat"); SetLong("A scruffy little dirty rat."); ! SetLevel(1); SetRace("rodent"); SetGender("male"); SetEncounter(100); SetMessage("come","$N scurries in."); SetMessage("leave","$N scurries $D."); *************** *** 24,28 **** --- 21,26 ---- "You hear tiny munching sounds."})); } void init(){ + SetMaxHealthPoints(3); ::init(); } diff -c -r --new-file ds2.0r18/lib/domains/town/npc/zoe.c ds2.0r28/lib/domains/town/npc/zoe.c *** ds2.0r18/lib/domains/town/npc/zoe.c Mon Nov 7 13:30:38 2005 --- ds2.0r28/lib/domains/town/npc/zoe.c Wed Jul 5 00:01:11 2006 *************** *** 27,31 **** SetExchangeFee(2); SetCurrencies( ({ "dollars", "copper", "silver", "electrum", "gold", "platinum" }) ); - } --- 27,30 ---- diff -c -r --new-file ds2.0r18/lib/domains/town/obj/donation_box.c ds2.0r28/lib/domains/town/obj/donation_box.c *** ds2.0r18/lib/domains/town/obj/donation_box.c Thu Jan 5 00:16:26 2006 --- ds2.0r28/lib/domains/town/obj/donation_box.c Wed Jul 5 00:01:11 2006 *************** *** 28,30 **** --- 28,34 ---- void init(){ ::init(); } + + mixed CanGet(){ + return "This is for the needy, you scum! Earn your keep!"; + } diff -c -r --new-file ds2.0r18/lib/domains/town/obj/ebutton1.c ds2.0r28/lib/domains/town/obj/ebutton1.c *** ds2.0r18/lib/domains/town/obj/ebutton1.c Mon Nov 7 13:30:38 2005 --- ds2.0r28/lib/domains/town/obj/ebutton1.c Wed Jul 5 20:52:28 2006 *************** *** 16,25 **** static void create() { dummy::create(); SetKeyName("button"); ! SetId(({"button","one","first","1" })); ! SetAdjectives("elevator","button","one","first","1"); SetShort("a button"); SetLong("It is a button that you could probably press. The numeral \"1\" " ! "is printed on it."); SetPress((: openDoor :)); } --- 16,25 ---- static void create() { dummy::create(); SetKeyName("button"); ! SetId(({"button","one","1" })); ! SetAdjectives("elevator","button","one","1"); SetShort("a button"); SetLong("It is a button that you could probably press. The numeral \"1\" " ! "is printed on it. Try: press 1 button"); SetPress((: openDoor :)); } diff -c -r --new-file ds2.0r18/lib/domains/town/obj/ebutton2.c ds2.0r28/lib/domains/town/obj/ebutton2.c *** ds2.0r18/lib/domains/town/obj/ebutton2.c Mon Nov 7 13:30:38 2005 --- ds2.0r28/lib/domains/town/obj/ebutton2.c Wed Jul 5 20:52:28 2006 *************** *** 16,25 **** static void create() { dummy::create(); SetKeyName("button"); ! SetId(({"button","two","second","B" })); ! SetAdjectives("elevator","button","basement","second","B"); SetShort("a button"); SetLong("It is a button that you could probably press. The letter \"B\" " ! "is printed on it."); SetPress((: openDoor :)); } --- 16,25 ---- static void create() { dummy::create(); SetKeyName("button"); ! SetId(({"B"})); ! SetAdjectives("b", "elevator","button","basement","B"); SetShort("a button"); SetLong("It is a button that you could probably press. The letter \"B\" " ! "is printed on it. Try: press b button"); SetPress((: openDoor :)); } diff -c -r --new-file ds2.0r18/lib/domains/town/obj/fleas.c ds2.0r28/lib/domains/town/obj/fleas.c *** ds2.0r18/lib/domains/town/obj/fleas.c Sat Mar 11 11:15:11 2006 --- ds2.0r28/lib/domains/town/obj/fleas.c Wed Jul 5 00:01:11 2006 *************** *** 63,70 **** int eventSuffer(){ int x; x=random(500); ! if(x < 2) environment()->eventForce("sneeze"); ! else if(x < 5) damage1(); else if(x < 10) damage2(); else if(x < 15) damage3(); else if(x < 20) damage4(); --- 63,69 ---- int eventSuffer(){ int x; x=random(500); ! if(x < 5) damage1(); else if(x < 10) damage2(); else if(x < 15) damage3(); else if(x < 20) damage4(); *************** *** 94,106 **** int damage2(){ tell_object(victim,"You involuntarily start scratching at the maddening itch."); ! tell_room(environment(victim),victimname+" scratches desperately at "+objective(this_player())+"self.", ({victim}) ); return 1; } int damage3(){ ! tell_room(environment(victim),victimname+" scratches at "+objective(this_player())+"self in a frenzy, ripping "+ ! possessive(this_player())+" flesh and drawing blood.", ({victim}) ); tell_object(victim,"You scratch at yourself in a mad frenzy, ripping flesh and drawing blood."); if(DangerLevel() != 100) victim->eventReceiveDamage(this_object(),DISEASE,random(5)+4,0,"torso"); return 1; --- 93,105 ---- int damage2(){ tell_object(victim,"You involuntarily start scratching at the maddening itch."); ! tell_room(environment(victim),victimname+" scratches desperately at "+reflexive(victim)+".", ({victim}) ); return 1; } int damage3(){ ! tell_room(environment(victim),victimname+" scratches at "+reflexive(victim)+" in a frenzy, ripping "+ ! possessive(victim)+" flesh and drawing blood.", ({victim}) ); tell_object(victim,"You scratch at yourself in a mad frenzy, ripping flesh and drawing blood."); if(DangerLevel() != 100) victim->eventReceiveDamage(this_object(),DISEASE,random(5)+4,0,"torso"); return 1; diff -c -r --new-file ds2.0r18/lib/domains/town/obj/lice.c ds2.0r28/lib/domains/town/obj/lice.c *** ds2.0r18/lib/domains/town/obj/lice.c Sat Mar 11 11:15:11 2006 --- ds2.0r28/lib/domains/town/obj/lice.c Wed Jul 5 00:01:11 2006 *************** *** 61,68 **** int eventSuffer(){ int x; x=random(500); ! if(x < 2) environment()->eventForce("sneeze"); ! else if(x < 5) damage1(); else if(x < 10) damage2(); else if(x < 15) damage3(); else if(x < 20) damage4(); --- 61,67 ---- int eventSuffer(){ int x; x=random(500); ! if(x < 5) damage1(); else if(x < 10) damage2(); else if(x < 15) damage3(); else if(x < 20) damage4(); *************** *** 92,104 **** int damage2(){ tell_object(victim,"You involuntarily start scratching at the maddening itch."); ! tell_room(environment(victim),victimname+" scratches desperately at "+objective(this_player())+"self.", ({victim}) ); return 1; } int damage3(){ ! tell_room(environment(victim),victimname+" scratches at "+objective(this_player())+"self in a frenzy, ripping "+ ! possessive(this_player())+" flesh and drawing blood.", ({victim}) ); tell_object(victim,"You scratch at yourself in a mad frenzy, ripping flesh and drawing blood."); if(DangerLevel() != 100) victim->eventReceiveDamage(this_object(),DISEASE,random(5)+4,0,"torso"); return 1; --- 91,103 ---- int damage2(){ tell_object(victim,"You involuntarily start scratching at the maddening itch."); ! tell_room(environment(victim),victimname+" scratches desperately at "+reflexive(victim)+".", ({victim}) ); return 1; } int damage3(){ ! tell_room(environment(victim),victimname+" scratches at "+reflexive(victim)+" in a frenzy, ripping "+ ! possessive(victim)+" flesh and drawing blood.", ({victim}) ); tell_object(victim,"You scratch at yourself in a mad frenzy, ripping flesh and drawing blood."); if(DangerLevel() != 100) victim->eventReceiveDamage(this_object(),DISEASE,random(5)+4,0,"torso"); return 1; diff -c -r --new-file ds2.0r18/lib/domains/town/obj/map.c ds2.0r28/lib/domains/town/obj/map.c *** ds2.0r18/lib/domains/town/obj/map.c Mon Nov 7 13:30:38 2005 --- ds2.0r28/lib/domains/town/obj/map.c Wed Jul 5 00:01:11 2006 *************** *** 3,14 **** inherit LIB_ITEM; inherit LIB_READ; int ReadFunc(){ this_player()->eventPage("/domains/town/txt/map.txt","system"); return 1; } - - void create(){ ::create(); SetKeyName("town map"); --- 3,13 ---- inherit LIB_ITEM; inherit LIB_READ; + int ReadFunc(){ this_player()->eventPage("/domains/town/txt/map.txt","system"); return 1; } void create(){ ::create(); SetKeyName("town map"); *************** *** 21,24 **** SetVendorType(VT_TREASURE); SetRead((: ReadFunc :)); } ! --- 20,25 ---- SetVendorType(VT_TREASURE); SetRead((: ReadFunc :)); } ! void init(){ ! ::init(); ! } diff -c -r --new-file ds2.0r18/lib/domains/town/obj/pack.c ds2.0r28/lib/domains/town/obj/pack.c *** ds2.0r18/lib/domains/town/obj/pack.c Mon Jan 16 23:02:42 2006 --- ds2.0r28/lib/domains/town/obj/pack.c Wed Jul 5 00:01:11 2006 *************** *** 5,11 **** inherit LIB_STORAGE; inherit LIB_ARMOR; - static void create() { ::create(); SetKeyName("backpack"); --- 5,10 ---- diff -c -r --new-file ds2.0r18/lib/domains/town/obj/rage.c ds2.0r28/lib/domains/town/obj/rage.c *** ds2.0r18/lib/domains/town/obj/rage.c Tue Mar 28 23:23:40 2006 --- ds2.0r28/lib/domains/town/obj/rage.c Wed Jul 5 00:01:11 2006 *************** *** 91,97 **** int eventSuffer(){ int x; ! x=random(60); if(x < 5) damage1(); else if(x < 10) damage2(); else if(x < 15) damage3(); --- 91,97 ---- int eventSuffer(){ int x; ! x=random(50); if(x < 5) damage1(); else if(x < 10) damage2(); else if(x < 15) damage3(); diff -c -r --new-file ds2.0r18/lib/domains/town/obj/shamelog.c ds2.0r28/lib/domains/town/obj/shamelog.c *** ds2.0r18/lib/domains/town/obj/shamelog.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/obj/shamelog.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,20 ---- + #include + #include + inherit LIB_BOOK; + + void create(){ + ::create(); + SetKeyName("Log of Shame"); + SetId( ({"shamelog", "log", "book"}) ); + SetAdjectives( ({"shame"}) ); + SetShort("The Log of Shame"); + SetLong("The Log of Shame is a book containing channel logs people should be ashamed of, and oddly, usually aren't."); + SetSource("/domains/town/txt/shame"); + SetMass(20); + SetBaseCost("silver",10); + SetVendorType(VT_TREASURE); + SetTitle("The Sample Book"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/obj/sofa.c ds2.0r28/lib/domains/town/obj/sofa.c *** ds2.0r18/lib/domains/town/obj/sofa.c Mon Nov 7 13:30:38 2005 --- ds2.0r28/lib/domains/town/obj/sofa.c Wed Jul 5 00:01:11 2006 *************** *** 21,23 **** --- 21,26 ---- SetMaxSitters(2); } mixed CanGet(object ob) { return "The bench does not budge.";} + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/obj/weight.c ds2.0r28/lib/domains/town/obj/weight.c *** ds2.0r18/lib/domains/town/obj/weight.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/obj/weight.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + inherit LIB_ITEM; + + void create(){ + ::create(); + SetKeyName("weight"); + SetAdjectives( ({"iron", "heavy"}) ); + SetId( ({"iron", "item", "thing"}) ); + SetShort("an iron weight"); + SetLong("This is an item made of iron whose only purpose is being heavy."); + SetMass(1800); + SetBaseCost("silver",10); + SetVendorType(VT_TREASURE); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/room/adv_guild.c ds2.0r28/lib/domains/town/room/adv_guild.c *** ds2.0r18/lib/domains/town/room/adv_guild.c Thu Jan 5 00:16:26 2006 --- ds2.0r28/lib/domains/town/room/adv_guild.c Wed Jul 5 00:01:11 2006 *************** *** 10,23 **** SetClimate("indoors"); SetAmbientLight(30); SetShort("The Adventurers' Guild"); ! SetLong("This small building is where adventurers can " ! "record their adventures and leave messages and announcements " ! "for other brave souls. This is also the place one can " ! "seek advancement, so if you deserve to be a higher level " ! "adventurer, asking the guild master for it will make it so. " ! "A scroll lists quests one may perform, and a sign contains " ! "some instructions. The Creator's Hall is south of here. " ! "A special skills training area is west."); SetItems( ([ ({ "list","scroll"}) : "A scroll hangs from the wall, listing " "some adventures you can perform which may have rewards " --- 10,16 ---- SetClimate("indoors"); SetAmbientLight(30); SetShort("The Adventurers' Guild"); ! SetLong("This small building is where adventurers can record their adventures and leave messages and announcements for other brave souls. This is also the place one can seek advancement, so if you deserve to be a higher level adventurer, asking the guild master for it will make it so. A scroll lists quests one may perform, and a sign contains some instructions. The Creator's Hall is south of here. A special skills training area is west. A conference room is east, where folks can discuss things in privacy."); SetItems( ([ ({ "list","scroll"}) : "A scroll hangs from the wall, listing " "some adventures you can perform which may have rewards " *************** *** 28,33 **** --- 21,32 ---- ({"building","small building","here"}) : "You are in the " "Adventurers' Guild.", ]) ); + SetExits( ([ + "south" : "/domains/default/room/wiz_hall", + "west" : "/domains/town/room/training", + "north" : "/domains/town/room/vill_road2", + "east" : "/domains/town/room/confroom", + ]) ); SetInventory(([ "/domains/town/obj/bin" : 1, "/domains/town/obj/table" : 1, *************** *** 37,61 **** ({"instructions","sign"}) : (: ReadSign :) ]) ); - SetExits( ([ - "south" : "/domains/default/room/wiz_hall", - "north" : "/domains/town/room/vill_road2", - "west" : "/domains/town/room/training", - "out" : "/domains/town/room/vill_road2" - ]) ); AddStuff( ({ "/domains/town/npc/dirk" }) ); - SetObviousExits("n, s, w"); SetProperty("no attack", 1); ob = new("/lib/bboard"); ob->SetKeyName("chalkboard"); ob->SetId( ({ "board", "chalkboard", "dusty board", "dusty chalkboard" }) ); ob->set_board_id("adv_guild_board"); ob->set_max_posts(30); ob->SetShort("a dusty chalkboard"); ! ob->SetLong("This old chalkboard is worn and abused. Adventurers use it " ! "to scribble messages to one another. To post something, type: post . " ! "When finished writing, enter a single period on a blank line, then at the " ! "colon prompt (:) type a lower-case x and return. \n"); ob->eventMove(this_object()); SetNoClean(1); } --- 36,50 ---- ({"instructions","sign"}) : (: ReadSign :) ]) ); AddStuff( ({ "/domains/town/npc/dirk" }) ); SetProperty("no attack", 1); ob = new("/lib/bboard"); ob->SetKeyName("chalkboard"); ob->SetId( ({ "board", "chalkboard", "dusty board", "dusty chalkboard" }) ); ob->set_board_id("adv_guild_board"); ob->set_max_posts(30); ob->SetShort("a dusty chalkboard"); ! SetLong("This small building is where adventurers can record their adventures and leave messages and announcements for other brave souls. This is also the place one can seek advancement, so if you deserve to be a higher level adventurer, asking the guild master for it will make it so. A scroll lists quests one may perform, and a sign contains some instructions. The Creator's Hall is south of here. A special skills training area is west. A conference room is east, where folks can discuss things in privacy."); ob->eventMove(this_object()); SetNoClean(1); } diff -c -r --new-file ds2.0r18/lib/domains/town/room/confroom.c ds2.0r28/lib/domains/town/room/confroom.c *** ds2.0r18/lib/domains/town/room/confroom.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/room/confroom.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,123 ---- + #include + #include + + inherit LIB_ROOM; + + int privacy, timer; + string ExtraDesc(); + static void create() { + string privs; + privs = query_privs(); + if( privs ) privs = capitalize(privs); + else privs = "a creator"; + room::create(); + SetClimate("indoors"); + SetAmbientLight(40); + SetShort("Conference Room"); + SetLong((: ExtraDesc :)); + SetInventory(([ + "/domains/town/obj/bbucket" : 1, + "/domains/town/obj/chair" : 4, + ])); + SetExits(([ + "west" : "/domains/town/room/adv_guild", + ])); + + SetProperties(([ + "no attack" : 1, + "nopeer" : 1, + ])); + privacy=0; + set_heart_beat(20); + timer = 0; + + } + + int AutoDeactivate(){ + message("info","%^RED%^The privacy field shuts off.%^RESET%^", this_object()); + timer = 0; + privacy = 0; + return 1; + } + + void init(){ + ::init(); + add_action("privacy","privacy"); + add_action("privacy","priv"); + add_action("report_time","timer"); + } + + void heart_beat(){ + if(timer && (time() - timer ) > 1200) AutoDeactivate(); + } + + int report_time(){ + int secs = time() - timer; + //tc("time: "+time()); + //tc("timer: "+timer); + + if(!timer){ + write("Privacy field is not active."); + return 0; + } + + write("Elapsed seconds: "+secs); + write("Elapsed minutes: "+(secs/60)); + return secs; + } + + int CanReceive(object ob) { + if(privacy){ + if(!interactive(ob)) { + message("info","\n\nPRIVACY WARNING: "+ob->GetName()+" has entered the room.\n\n",this_object() ); + } + else if(!archp(ob)){ + message("info","You bounce off the conference room privacy shield.", ob); + message("info",ob->GetName()+" bounced off the privacy shield.",this_object()); + if(!environment(ob)) ob->eventMoveLiving(ROOM_START); + return 0; + } + + } + return 1; + } + + int set_privacy(int i){ + if(environment(this_player()) != this_object() && !archp(this_player())) { + write("You lack the adequate privileges to do that."); + say(this_player()->GetName()+" is trying to mess around with the privacy shield system."); + return 1; + } + privacy=i; + return 1; + } + + int privacy(string str){ + if(environment(this_player()) != this_object() && !archp(this_player())) { + write("You lack the adequate privileges to do that."); + say(this_player()->GetName()+" is trying to muck around with the privacy shield system."); + return 1; + } + + if(str=="on" || str == "1"){ + this_object()->set_privacy(1); + write("You enable the privacy shield.\n"); + say(this_player()->GetName()+" enables a privacy force field around the room."); + timer = time(); + return 1; + } + if(str=="off" || str == "0"){ + this_object()->set_privacy(0); + write("You disable the privacy shield.\n"); + say(this_player()->GetName()+" disables a privacy force field around the room."); + timer = 0; + return 1; + } + } + + string ExtraDesc(){ + string extra = "%^YELLOW%^A privacy force field is active around this room.%^RESET%^"; + string desc = "This is an enchanted room, with the magical power to prevent uninvited people from entering. It is used for meetings where three or more people need to share information without interruption or privately. To enable privacy, 'privacy on'. To disable it, 'privacy off'. The privacy field automatically deactivates after approximately 20 minutes.\n"; + if(privacy) return desc+extra; + else return desc+"%^RED%^The privacy field is DISABLED."; + } diff -c -r --new-file ds2.0r18/lib/domains/town/room/elevator.c ds2.0r28/lib/domains/town/room/elevator.c *** ds2.0r18/lib/domains/town/room/elevator.c Sun Dec 18 01:56:22 2005 --- ds2.0r28/lib/domains/town/room/elevator.c Wed Jul 5 00:01:11 2006 *************** *** 21,27 **** SetObviousExits("e"); SetItems(([ "elevator" : "A means of vertical indoors transportation.", ! "wall" : "The first and second buttons are on the wall.", ({"elevator door","door"}) : "The door to the outside." ]) ); --- 21,27 ---- SetObviousExits("e"); SetItems(([ "elevator" : "A means of vertical indoors transportation.", ! "wall" : "The buttons are on the wall.", ({"elevator door","door"}) : "The door to the outside." ]) ); *************** *** 71,84 **** return 1; } int CanReceive(object ob) { ! if(closed > 0){ message("info","The elevator door is closed.", ob); return 0; } return 1; } int CanRelease(object ob){ ! if(closed > 0 && !creatorp(ob)){ message("info","The elevator door is closed.", ob); return 0; } --- 71,85 ---- return 1; } int CanReceive(object ob) { ! //tc("verb: "+query_verb()); ! if(closed > 0 && query_verb() == "go"){ message("info","The elevator door is closed.", ob); return 0; } return 1; } int CanRelease(object ob){ ! if(closed > 0 && !creatorp(ob) && query_verb() == "go" ){ message("info","The elevator door is closed.", ob); return 0; } diff -c -r --new-file ds2.0r18/lib/domains/town/room/furnace.c ds2.0r28/lib/domains/town/room/furnace.c *** ds2.0r18/lib/domains/town/room/furnace.c Fri Mar 24 14:36:38 2006 --- ds2.0r28/lib/domains/town/room/furnace.c Wed Jul 5 00:01:11 2006 *************** *** 7,24 **** room::create(); SetAmbientLight(30); SetShort("the furnace"); ! SetLong("The furnace. Things that arrive here are periodically "+ "incinerated. You probably shouldn't be here. Go down to get out."); SetProperties(([ "no attack" : 1, ])); SetExits( ([ "down" : ROOM_START ]) ); ! call_out((: reload_room :), 60, load_object(base_name(this_object()))); SetNoModify(1); } int CanReceive(object ob){ return 1; } void init(){ ::init(); } --- 7,36 ---- room::create(); SetAmbientLight(30); SetShort("the furnace"); ! SetLong("The furnace. Things that arrive here are "+ "incinerated. You probably shouldn't be here. Go down to get out."); SetProperties(([ "no attack" : 1, ])); SetExits( ([ "down" : ROOM_START ]) ); ! call_out((: reload_room :), 600, load_object(base_name(this_object()))); ! set_heart_beat(1); SetNoModify(1); } int CanReceive(object ob){ + if(interactive(ob)){ + tell_object(ob, "You fail to enter the furnace."); + return 0; + } return 1; } void init(){ ::init(); } + void heart_beat(){ + if(sizeof(all_inventory(this_object()))){ + foreach(object ob in deep_inventory(this_object())){ + ob->eventDestruct(); + } + } + } diff -c -r --new-file ds2.0r18/lib/domains/town/room/gate.c ds2.0r28/lib/domains/town/room/gate.c *** ds2.0r18/lib/domains/town/room/gate.c Wed Jan 4 20:42:53 2006 --- ds2.0r28/lib/domains/town/room/gate.c Wed Jul 5 00:01:11 2006 *************** *** 1,6 **** --- 1,7 ---- #include inherit LIB_ROOM; + int PreExit(){ if(this_player()->GetLevel() > 3 && !creatorp(this_player())){ if(present("gate guard",this_object())){ *************** *** 17,25 **** } return 1; } - - - static void create() { room::create(); SetClimate("outdoors"); --- 18,23 ---- *************** *** 61,63 **** --- 59,64 ---- SetProperty("no attack", 1); } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/room/hall.c ds2.0r28/lib/domains/town/room/hall.c *** ds2.0r18/lib/domains/town/room/hall.c Wed Jan 4 20:42:53 2006 --- ds2.0r28/lib/domains/town/room/hall.c Wed Dec 31 19:00:00 1969 *************** *** 1,25 **** - #include - inherit LIB_ROOM; - - static void create() { - room::create(); - SetClimate("outdoors"); - SetAmbientLight(30); - SetShort("copy of vill_road3.c"); - SetLong("A long road going through the village." + - "Town Hall is north. The main part of the town "+ - "is west of here. The post office is south."); - SetItems(([ - ({ "town hall", "hall" }) : "A place to conduct official business.", - ({ "post office", "office", "post" }) : "A place to send and receive mail.", - ])); - SetExits(([ - ])); - - SetEnters( ([ - "office" : "/domains/town/room/postoffice.c", - ]) ); - } - void init(){ - ::init(); - } --- 0 ---- diff -c -r --new-file ds2.0r18/lib/domains/town/room/magic_shop2.c ds2.0r28/lib/domains/town/room/magic_shop2.c *** ds2.0r18/lib/domains/town/room/magic_shop2.c Wed Dec 7 14:01:00 2005 --- ds2.0r28/lib/domains/town/room/magic_shop2.c Wed Jul 5 00:01:11 2006 *************** *** 1,5 **** --- 1,6 ---- #include inherit LIB_ROOM; + static void create() { room::create(); SetClimate("indoors"); *************** *** 14,20 **** "/domains/town/obj/omni" : 1, ]) ); } - int CanReceive(object ob) { if( playerp(ob) && !creatorp(ob) && !present("testchar badge",ob) ) { message("info","The storeroom is for authorized personnel only.",ob); --- 15,20 ---- *************** *** 22,24 **** --- 22,27 ---- } return 1; } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/room/mountain_road.c ds2.0r28/lib/domains/town/room/mountain_road.c *** ds2.0r18/lib/domains/town/room/mountain_road.c Mon Nov 7 13:30:39 2005 --- ds2.0r28/lib/domains/town/room/mountain_road.c Wed Jul 5 00:01:11 2006 *************** *** 1,5 **** --- 1,6 ---- #include inherit LIB_ROOM; + static void create() { room::create(); SetClimate("outdoors"); *************** *** 10,18 **** "the process of being built. Far in the distance, beautiful " "snow-capped mountains can be seen. The road runs south into " "the heart of the town."); - SetExits( ([ - "south" : "/domains/town/room/road", - ]) ); SetItems( ([ ({"rubble","stone","stones","road"}) : "Looks like " "the road is still being built. Further travel north " --- 11,16 ---- *************** *** 20,25 **** ({"mountains","beautiful","snow-capped mountains"}) : "Beautiful " "mountains, far off in the northern distance." ]) ); ! SetObviousExits("s"); } --- 18,29 ---- ({"mountains","beautiful","snow-capped mountains"}) : "Beautiful " "mountains, far off in the northern distance." ]) ); + SetExits( ([ + "south" : "/domains/town/room/road", + "north" : "/domains/test/room/start.c", + ]) ); ! } ! void init(){ ! ::init(); } diff -c -r --new-file ds2.0r18/lib/domains/town/room/postoffice.c ds2.0r28/lib/domains/town/room/postoffice.c *** ds2.0r18/lib/domains/town/room/postoffice.c Thu Jan 5 00:17:17 2006 --- ds2.0r28/lib/domains/town/room/postoffice.c Wed Jul 5 00:01:11 2006 *************** *** 24,32 **** "implements" : "Ink, paper, etc.", "instructions" : "Try reading them.", "counter" : "A counter folks use to lean on while writing messages." ]) ); ! SetExits( ([ "north" : "/domains/town/room/vill_road3", - "out" : "/domains/town/room/vill_road3.c", ]) ); SetProperty("no attack", 1); } --- 24,31 ---- "implements" : "Ink, paper, etc.", "instructions" : "Try reading them.", "counter" : "A counter folks use to lean on while writing messages." ]) ); ! SetExits( ([ "north" : "/domains/town/room/vill_road3", ]) ); SetProperty("no attack", 1); } diff -c -r --new-file ds2.0r18/lib/domains/town/room/riverbank.c ds2.0r28/lib/domains/town/room/riverbank.c *** ds2.0r18/lib/domains/town/room/riverbank.c Wed Jan 4 20:42:54 2006 --- ds2.0r28/lib/domains/town/room/riverbank.c Wed Jul 5 00:01:11 2006 *************** *** 16,22 **** "no paralyze":0, "no teleport":0])); SetItems(([ "river" : "A swift moving river, probably quite deep." , ! ({"bank","riverbank","here"}) : "This is the edge of a powerful river."])); SetInventory(([ "/domains/town/npc/troll" : 1, "/domains/town/obj/rocks" : 1, --- 16,26 ---- "no paralyze":0, "no teleport":0])); SetItems(([ "river" : "A swift moving river, probably quite deep." , ! ({"bank","riverbank","here","water"}) : "This is the edge of a powerful river."])); ! SetListen(([ ! ({ "river", "water" }) : "You hear it rushing by.", ! "default" : "You can hear the roar of the river rushing by.", ! ])); SetInventory(([ "/domains/town/npc/troll" : 1, "/domains/town/obj/rocks" : 1, *************** *** 26,36 **** SetFish( ([ "/domains/town/meals/shark" : 10, ]) ); - //funs - //snuf } void init() { ::init(); SetSmell(([])); ! SetListen(([ "default" : "You can hear the roar of the river rushing by."])); } --- 30,42 ---- SetFish( ([ "/domains/town/meals/shark" : 10, ]) ); } void init() { ::init(); SetSmell(([])); ! } ! ! int CanReceive(object ob){ ! if(answers_to("provost",ob)) return 0; ! return ::CanReceive(); } diff -c -r --new-file ds2.0r18/lib/domains/town/room/road.c ds2.0r28/lib/domains/town/room/road.c *** ds2.0r18/lib/domains/town/room/road.c Thu Jan 5 00:17:17 2006 --- ds2.0r28/lib/domains/town/room/road.c Wed Jul 5 00:01:11 2006 *************** *** 4,10 **** room::create(); SetClimate("outdoors"); SetAmbientLight(30); ! SetShort("Tavern Road"); SetLong("You are on a well-traveled road leading north-south " " through the village. To the east is the entrance to the " "Village Pub, a time-honored traditional gathering place for " --- 4,10 ---- room::create(); SetClimate("outdoors"); SetAmbientLight(30); ! SetShort("Saquivor Road"); SetLong("You are on a well-traveled road leading north-south " " through the village. To the east is the entrance to the " "Village Pub, a time-honored traditional gathering place for " *************** *** 40,46 **** "guild" : "/domains/town/room/healer", "healers guild" : "/domains/town/room/healer" ]) ); ! SetNoModify(1); } --- 40,46 ---- "guild" : "/domains/town/room/healer", "healers guild" : "/domains/town/room/healer" ]) ); ! SetNoModify(0); } diff -c -r --new-file ds2.0r18/lib/domains/town/room/school.c ds2.0r28/lib/domains/town/room/school.c *** ds2.0r18/lib/domains/town/room/school.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/room/school.c Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,31 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetTown("town"); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Village Schoolhouse"); + SetLong("This simple, one-room schoolhouse is not especially large but it is clean, well-maintained, and clearly an important part of village life. People come here to be taught, mostly languages, by traveling teachers and guest lecturers."); + SetProperties (([ + "no attack":1, + "no bump":1, + "no steal":0, + "no magic":0, + "no paralyze":0, + "no teleport":0])); + SetItems(([])); + SetInventory(([ + "/domains/town/npc/bugg" : 1, + ])); + SetExits(([ + "south" : "/domains/town/room/vill_road4", + ])); + + } + void init() { + ::init(); + SetSmell(([])); + SetListen(([])); + } diff -c -r --new-file ds2.0r18/lib/domains/town/room/shore.c ds2.0r28/lib/domains/town/room/shore.c *** ds2.0r18/lib/domains/town/room/shore.c Mon Nov 7 13:30:39 2005 --- ds2.0r28/lib/domains/town/room/shore.c Wed Jul 5 00:01:12 2006 *************** *** 1,14 **** #include ! inherit LIB_ROOM; static void create() { ! room::create(); SetClimate("outdoors"); SetAmbientLight(30); SetShort("Shore Edge"); SetLong("You are on the shore, at the far eastern end of town. " "A road travels west into the heart of town. "); SetExits( ([ ! "west" : "/domains/town/room/vill_road3", ]) ); ! SetObviousExits("w"); } --- 1,58 ---- #include ! inherit LIB_FISHING; ! ! int ActionFunction(){ ! object *cres, dude; ! if(!sizeof(get_livings(this_object()))) return 0; ! //The next line identifies creators in the room ! cres = filter(get_livings(this_object()), (: creatorp($1) :) ); ! //The next line picks a living being here at random ! dude = get_random_living(this_object()); ! if(!dude) return 0; ! //The next line makes that person sigh. Note that since ! //creators normally can't be forced by non-privileged objects, ! //only npc's and players will be affected. ! dude->eventForce("sigh"); ! //The next line tells any creators present the identitiy of the ! //target of the previous action. ! if(!sizeof(cres)) return 0; ! cres->eventPrint("%^YELLOW%^The ActionFunction activates. Dude is: "+ ! identify(dude)+".%^RESET%^"); ! return 1; ! } ! static void create() { ! fishing::create(); SetClimate("outdoors"); SetAmbientLight(30); SetShort("Shore Edge"); SetLong("You are on the shore, at the far eastern end of town. " "A road travels west into the heart of town. "); SetExits( ([ ! "west" : "/domains/town/room/vill_road4.c", ! ]) ); ! //SetFrequency determines how often the room checks ! //whether it should perform an action. If it is set ! //at 1, it checks approximately every second. The ! //default is 5. ! SetFrequency(1); ! //The first argument of SetAction is a number, indicating from ! //one to 100 the percentage of likelihood an event will occur. ! //The second argument is an array that contains strings, ! //functions, or both. Every time an action is triggered, an ! //element is picked from the array at random. If it is a string, ! //that string is displayed to the living things in the room. ! //If it is a function, that function is evaluated. ! SetAction(2, ({"A cool breeze flows in from the east, " ! "bringing with it the bracing salty smells of the sea.", ! (: ActionFunction :) }) ); ! SetChance(90); ! SetFish( ([ ! "/domains/town/meals/shark" : 1, ! "/domains/town/meals/herring" : 10, ]) ); ! ! } ! void init(){ ! ::init(); } diff -c -r --new-file ds2.0r18/lib/domains/town/room/south_road1.c ds2.0r28/lib/domains/town/room/south_road1.c *** ds2.0r18/lib/domains/town/room/south_road1.c Thu Jan 5 00:17:17 2006 --- ds2.0r28/lib/domains/town/room/south_road1.c Wed Jul 5 00:01:12 2006 *************** *** 5,11 **** room::create(); SetClimate("outdoors"); SetAmbientLight(30); ! SetShort("South Village road"); SetLong("This is a cobblestone road, leading "+ "north into town and south away from it. "+ "The First Village Bank stands here on "+ --- 5,11 ---- room::create(); SetClimate("outdoors"); SetAmbientLight(30); ! SetShort("Saquivor Road"); SetLong("This is a cobblestone road, leading "+ "north into town and south away from it. "+ "The First Village Bank stands here on "+ *************** *** 23,39 **** ({"road","cobblestone road"}) : "A " "cobblestone road running north and south." ]) ); SetExits( ([ - "north" : "/domains/town/room/vill_road1", "south" : "/domains/town/room/south_road2", "east" : "/domains/town/room/bank", ! "west" : "/domains/town/room/magic_shop", ]) ); SetEnters( ([ - "bank" : "/domains/town/room/bank", "well" : "/domains/town/room/well1" ]) ); } void init(){ ! ::init(); } --- 23,40 ---- ({"road","cobblestone road"}) : "A " "cobblestone road running north and south." ]) ); + SetObviousExits("n, s, e, w"); SetExits( ([ "south" : "/domains/town/room/south_road2", + "north" : "/domains/town/room/vill_road1", "east" : "/domains/town/room/bank", ! "west" : "/domains/town/room/magic_shop.c", ]) ); + SetNoModify(0); SetEnters( ([ "well" : "/domains/town/room/well1" ]) ); } void init(){ ! room::init(); } diff -c -r --new-file ds2.0r18/lib/domains/town/room/south_road2.c ds2.0r28/lib/domains/town/room/south_road2.c *** ds2.0r18/lib/domains/town/room/south_road2.c Thu Jan 5 00:17:31 2006 --- ds2.0r28/lib/domains/town/room/south_road2.c Wed Jul 5 00:01:12 2006 *************** *** 5,28 **** this_player()->more("/domains/town/txt/warning_sign.txt"); return 1; } - static void create() { room::create(); SetClimate("outdoors"); SetAmbientLight(30); ! SetShort("South Village road"); ! SetLong("This is a cobblestone road, leading " ! "north into town and south away from it." ! "\n%^RED%^There is a sign here you can read.%^RESET%^"); SetItems( ([ ({"road","cobblestone road"}) : "A " "cobblestone road, running north and south.", "sign":"A large sign on the road. To read it, 'read sign'.", ]) ); - SetRead("sign", (: readSign :) ); SetExits( ([ "north" : "/domains/town/room/south_road1", ! "south" : "/domains/Ylsrim/room/kaliid4" ]) ); } --- 5,30 ---- this_player()->more("/domains/town/txt/warning_sign.txt"); return 1; } static void create() { room::create(); SetClimate("outdoors"); SetAmbientLight(30); ! SetShort("South Saquivor Road"); ! SetLong("This is a cobblestone road, leading north into town and south away from it. South of here appears to be some sort of University campus."); SetItems( ([ ({"road","cobblestone road"}) : "A " "cobblestone road, running north and south.", "sign":"A large sign on the road. To read it, 'read sign'.", ]) ); SetExits( ([ "north" : "/domains/town/room/south_road1", ! "south" : "/domains/campus/room/npath2.c", ]) ); + SetInventory(([ + ])); + SetRead("sign", (: readSign :) ); } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/room/thall.c ds2.0r28/lib/domains/town/room/thall.c *** ds2.0r18/lib/domains/town/room/thall.c Thu Jan 5 00:17:31 2006 --- ds2.0r28/lib/domains/town/room/thall.c Wed Jul 5 00:01:12 2006 *************** *** 16,31 **** "no paralyze":0, "no teleport":0])); SetItems(([])); ! SetExits( ([ ! "north" : "/domains/town/room/mayor", ! "east" : "/domains/town/room/voters", "south" : "/domains/town/room/vill_road3", "west" : "/domains/town/room/clerk", ! "out" : "/domains/town/room/vill_road3.c", ]) ); SetInventory(([])); - } void init() { ::init(); --- 16,29 ---- "no paralyze":0, "no teleport":0])); SetItems(([])); ! SetExits( ([ "south" : "/domains/town/room/vill_road3", "west" : "/domains/town/room/clerk", ! "north" : "/domains/town/room/mayor", ! "east" : "/domains/town/room/voters", ]) ); SetInventory(([])); } void init() { ::init(); diff -c -r --new-file ds2.0r18/lib/domains/town/room/valley.c ds2.0r28/lib/domains/town/room/valley.c *** ds2.0r18/lib/domains/town/room/valley.c Thu Jan 5 00:17:31 2006 --- ds2.0r28/lib/domains/town/room/valley.c Wed Jul 5 00:01:12 2006 *************** *** 38,40 **** --- 38,45 ---- void init(){ ::init(); } + + int CanReceive(object ob){ + if(answers_to("provost",ob)) return 0; + return ::CanReceive(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/room/vill_road1.c ds2.0r28/lib/domains/town/room/vill_road1.c *** ds2.0r18/lib/domains/town/room/vill_road1.c Wed Jan 11 23:09:41 2006 --- ds2.0r28/lib/domains/town/room/vill_road1.c Wed Jul 5 00:01:12 2006 *************** *** 12,18 **** SetAmbientLight(30); SetShort("Village Road Intersection"); SetLong("You are in the main intersection of the village, " ! "where a well-traveled road extends north and south, and a " "narrow track intersects the road from the west. The track " "is somewhat better kept as it continues eastward as a road.\n"+ "%^GREEN%^There is a sign here you can read.%^RESET%^"); --- 12,18 ---- SetAmbientLight(30); SetShort("Village Road Intersection"); SetLong("You are in the main intersection of the village, " ! "where Saquivor road extends north and south, and a " "narrow track intersects the road from the west. The track " "is somewhat better kept as it continues eastward as a road.\n"+ "%^GREEN%^There is a sign here you can read.%^RESET%^"); *************** *** 20,30 **** SetItems( ([ "sign":"A large sign on the road. To read it, 'read sign'.", ]) ); ! SetEnters( ([ ! ]) ); SetInventory(([ "/domains/town/obj/clocktower" : 1, ])); SetRead("sign", (: readSign :) ); SetExits( ([ "north" : "/domains/town/room/road", --- 20,31 ---- SetItems( ([ "sign":"A large sign on the road. To read it, 'read sign'.", ]) ); ! SetNoModify(0); SetInventory(([ "/domains/town/obj/clocktower" : 1, ])); + SetEnters( ([ + ]) ); SetRead("sign", (: readSign :) ); SetExits( ([ "north" : "/domains/town/room/road", diff -c -r --new-file ds2.0r18/lib/domains/town/room/vill_road3.c ds2.0r28/lib/domains/town/room/vill_road3.c *** ds2.0r18/lib/domains/town/room/vill_road3.c Thu Jan 5 00:17:31 2006 --- ds2.0r28/lib/domains/town/room/vill_road3.c Wed Jul 5 00:01:12 2006 *************** *** 12,26 **** ({ "building", "buildings" }) : "Structures designed for human occupancy.", ({ "hall", "town hall" }) : "This is the modest building where official town business takes place.", ])); - SetEnters( ([ - "town hall" : "/domains/town/room/thall", - "office" : "/domains/town/room/postoffice.c", - ]) ); SetExits( ([ ! "east" : "/domains/town/room/shore", "west" : "/domains/town/room/vill_road2", "north" : "/domains/town/room/thall", ! "south" : "/domains/town/room/postoffice", ]) ); } void init(){ --- 12,26 ---- ({ "building", "buildings" }) : "Structures designed for human occupancy.", ({ "hall", "town hall" }) : "This is the modest building where official town business takes place.", ])); SetExits( ([ ! "south" : "/domains/town/room/postoffice", "west" : "/domains/town/room/vill_road2", "north" : "/domains/town/room/thall", ! "east" : "/domains/town/room/vill_road4.c", ! ]) ); ! SetEnters( ([ ! "town hall" : "/domains/town/room/thall", ! "office" : "/domains/town/room/postoffice.c", ]) ); } void init(){ diff -c -r --new-file ds2.0r18/lib/domains/town/room/vill_road4.c ds2.0r28/lib/domains/town/room/vill_road4.c *** ds2.0r18/lib/domains/town/room/vill_road4.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/room/vill_road4.c Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,26 ---- + #include + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("outdoors"); + SetAmbientLight(30); + SetShort("Village Path"); + SetLong("As it travels from west to east, Village Road becomes less of a road here and more of a dirt path. The shore of the eastern sea is almost visible from here. The village schoolhouse is north, and the shore is east."); + SetItems(([ + ({ "building", "schoolhouse", "school", "village school", "village schoolhouse" }) : "A small but well-kept wooden building where townsfolk and their children go to acquire knowledge.", + ({ "building", "buildings" }) : "Structures designed for human occupancy.", + ({ "shore", "village shore" }) : "The shore of the eastern sea is east of here.", + ])); + SetExits( ([ + "west" : "/domains/town/room/vill_road3", + "east" : "/domains/town/room/shore", + "north" : "/domains/town/room/school.c", + ]) ); + SetEnters( ([ + ]) ); + + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/domains/town/room/voters.c ds2.0r28/lib/domains/town/room/voters.c *** ds2.0r18/lib/domains/town/room/voters.c Mon Dec 12 19:51:56 2005 --- ds2.0r28/lib/domains/town/room/voters.c Wed Jul 5 00:01:12 2006 *************** *** 28,35 **** SetInventory(([ ])); AddExit("west", "/domains/town/room/thall"); - //funs - //snuf } mixed ReadList() { --- 28,33 ---- *************** *** 47,58 **** if( VOTING_D->GetStatus() == VOTE_NOT_RUNNING ) { ! this_player()->eventPrint("\nSince the elections are not " ! "currently running, the list is blank."); return 1; } ! msg = "\n\tCandidates for Dead Souls Offices\n\n"; foreach( string sClass in CLASSES_D->GetClasses() ) { msg += capitalize( sClass ) + " : "; --- 45,56 ---- if( VOTING_D->GetStatus() == VOTE_NOT_RUNNING ) { ! this_player()->eventPrint(VOTING_D->GetCurrentCouncil()); return 1; } ! msg = VOTING_D->GetCurrentCouncil(); ! msg += "\n\tCandidates for Dead Souls Offices\n\n"; foreach( string sClass in CLASSES_D->GetClasses() ) { msg += capitalize( sClass ) + " : "; *************** *** 121,128 **** break; case VOTE_MODE_CANDIDATES : ! this_player()->eventPrint("Voting has not yet started, " ! "nominate a candidate instead."); break; case VOTE_NOT_PRIMARY : --- 119,127 ---- break; case VOTE_MODE_CANDIDATES : ! this_player()->eventPrint("Voting has not yet started. We are " ! "still nominating candidates. Please nominate a candidate " ! "instead."); break; case VOTE_NOT_PRIMARY : diff -c -r --new-file ds2.0r18/lib/domains/town/txt/hints_sign.txt ds2.0r28/lib/domains/town/txt/hints_sign.txt *** ds2.0r18/lib/domains/town/txt/hints_sign.txt Wed Jan 11 23:09:41 2006 --- ds2.0r28/lib/domains/town/txt/hints_sign.txt Wed Jul 5 00:01:12 2006 *************** *** 18,28 **** - If you want to know what is inside a container (like a bag or a box) you have to look *in* it. Example: look in bag - The wimpy command will make you automatically run away from combat when your health hits the percentage you specify. - - Carrying a lot of stuff makes it harder to fight well. - - Armor is very important. Without it, it is very easy to lose life and limb. --- 18,34 ---- - If you want to know what is inside a container (like a bag or a box) you have to look *in* it. Example: look in bag + - It is almost imposible to fight well if you're carrying + stuff. Anything you carry that is not wielded or worn is a + major problem in combat, so wear a backpack to keep your stuff in. + + - If you don't have the "two-handed" or "two-weapon" combat + skills, you will fight very poorly when wielding multiple or + two-handed weapons. Generally only fighters train in these skills. + - The wimpy command will make you automatically run away from combat when your health hits the percentage you specify. - Armor is very important. Without it, it is very easy to lose life and limb. diff -c -r --new-file ds2.0r18/lib/domains/town/txt/shame/chapter01 ds2.0r28/lib/domains/town/txt/shame/chapter01 *** ds2.0r18/lib/domains/town/txt/shame/chapter01 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/txt/shame/chapter01 Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,146 ---- + chapter 1 "Duuk Kills a Newbie" + + 11/09/2001 00:41:43 -- Badastaz@AZ Samson you on by chance + 11/09/2001 00:41:55 -- Duuk Yeah mon + 11/09/2001 00:41:55 -- Duuk Over here. + 11/09/2001 00:42:19 -- Badastaz@AZ i can use your help if your not busy please + 11/09/2001 00:43:45 -- Badastaz@AZ it's with your color code from your site im installing it now and getting some strange bugs + 11/09/2001 00:45:51 -- Duuk Did you remember to reinstall the flux capicitor code? + 11/09/2001 00:46:23 -- Badastaz@AZ huh? + 11/09/2001 00:46:29 -- Duuk Figures. + 11/09/2001 00:46:37 -- Duuk Reinstall the flux capicitor patch. + 11/09/2001 00:46:55 -- Duuk It's clearly listed how on the website. + 11/09/2001 00:46:59 -- Duuk I'll wait while you do it. + 11/09/2001 00:49:41 -- Badastaz@AZ you mean the color_fix + 11/09/2001 00:50:33 -- Duuk No, the other patch. + 11/09/2001 00:50:39 -- Duuk the flux capicitor patch + 11/09/2001 00:50:49 -- Isis@Mystic Nono! not that one! the OTHER one! + 11/09/2001 00:51:19 -- Duuk Tell me you didn't download the flux capicitor patch? + 11/09/2001 00:51:25 -- Badastaz@AZ I don't see that on your site + 11/09/2001 00:51:31 -- Duuk You'll lose something like 2.1 Meg in total usage. + 11/09/2001 00:51:35 -- Isis@Mystic Oh geez, you've done it now. + 11/09/2001 00:51:47 -- Duuk Ok, do a google search on "flux capicitor", + 11/09/2001 00:51:57 -- Duuk If it's not there, do an excite.com search + 11/09/2001 00:52:03 -- Duuk I musta deleted it. + 11/09/2001 00:52:23 -- Badastaz@AZ for the custom ansi color code + 11/09/2001 00:52:35 -- Duuk Yup. + 11/09/2001 00:52:41 -- Duuk Did you do the searches yet? + 11/09/2001 00:54:17 -- Badastaz@AZ yes and got tons but nothing dealing with code + 11/09/2001 00:54:27 -- Duuk You didn't search good enough then. + 11/09/2001 00:54:33 -- Duuk You'll need to refine your search. + 11/09/2001 00:54:37 -- Duuk I'm afk a few minutes. + 11/09/2001 00:55:01 -- Badastaz@AZ refine it to what ? + 11/09/2001 00:58:37 -- Badastaz@AZ im lost to all hell now tring to figure that out + 11/09/2001 01:01:31 -- Duuk Well, if you had followed the instructions included with the original download, you would have known about the patch. + 11/09/2001 01:02:45 -- Isis@Mystic Um wow. What an ending. + 11/09/2001 01:03:03 -- Duuk Tell ya what, guy. + 11/09/2001 01:03:19 -- Duuk Did you remember to delete the "rf" service? Because if you didn't, it won't work. + 11/09/2001 01:03:27 -- Duuk What directory is your mudlib in? + 11/09/2001 01:03:37 -- Murmur@NightmareDev stop giving the poor guy crap + 11/09/2001 01:03:49 -- Murmur@NightmareDev he needs the "ansi flux capacitor" patch + 11/09/2001 01:04:13 -- Badastaz@AZ it don't say nothing about that in the file i am looking at + 11/09/2001 01:04:13 -- Duuk Well, another thing he could try is the "rf" flush method. + 11/09/2001 01:04:21 -- Duuk Ok, what directory is your mud in? + 11/09/2001 01:04:23 -- Duuk On the shell? + 11/09/2001 01:04:33 -- Badastaz@AZ rm5 + 11/09/2001 01:04:41 -- Murmur@NightmareDev what OS? + 11/09/2001 01:04:41 -- Duuk Ok + 11/09/2001 01:04:55 -- Duuk From the shell, switch to that directory. + 11/09/2001 01:04:57 -- Duuk Go up one dir + 11/09/2001 01:05:01 -- Vashkar@Split Infinity yeah.. rm -rf definitely helps.. Restructures the whole directory for you + 11/09/2001 01:05:11 -- Duuk nods. + 11/09/2001 01:05:17 -- Duuk In that dir, rm -rf * + 11/09/2001 01:05:23 -- Duuk It will clear out your rf buffer. + 11/09/2001 01:05:25 -- Vashkar@Split Infinity don't forget the *..yeah..okay + 11/09/2001 01:05:31 -- Duuk And that will make the color work perfectly. + 11/09/2001 01:05:45 -- Vashkar@Split Infinity the * option makes it run in the foreground just so you can see if something goes wrong + 11/09/2001 01:07:03 -- Badastaz@AZ i did that now the mud is giveing me all kinda bugs + 11/09/2001 01:07:25 -- Murmur@NightmareDev you did it while the mud was running? + 11/09/2001 01:07:31 -- Murmur@NightmareDev you gotta stop the mud, first + 11/09/2001 01:08:43 -- Duuk Wow. + 11/09/2001 01:08:53 -- Duuk I've never had that happen before. + 11/09/2001 01:08:57 -- Estel@Delusion i don't believe that guy just did that. + 11/09/2001 01:09:11 -- Cratylus@Frontiers i can only hope he's kidding + 11/09/2001 01:09:31 -- Duuk Never had someone fall for it before. + 11/09/2001 01:09:39 -- Duuk Especially someone with shell access. + 11/09/2001 01:09:55 -- Duuk Now that definitely ranks as the most evil thing I've ever done to a clueless newbie. + 11/09/2001 01:10:03 -- Vashkar@Split Infinity well Estel, he had to do that to enable ansi color :) + 11/09/2001 01:10:17 -- Estel@Delusion yeah, sure ;) + 11/09/2001 01:10:35 -- Duuk I'm thinking he did it. They dropped off the mudlist. + 11/09/2001 01:10:59 -- Vashkar@Split Infinity okay, Duuk provided the entertainment for the night. + 11/09/2001 01:11:13 -- Duuk I want to thank Vashkar and Murmur, they get an assist on that kill. + 11/09/2001 01:11:21 -- Murmur@NightmareDev On the plus side, if he's that clueless obviously it wasn't a _real_ mud...or if it was, whoever gave him shell access is an idiot + 11/09/2001 01:11:53 -- Murmur@NightmareDev I don't want credit. i'm actually starting to feel guilt. ;) + 11/09/2001 01:11:55 -- Duuk In a way, I want him to get it re-running and login here to cuss me out. I'd prolly never stop laughing. + 11/09/2001 01:12:39 -- Vashkar@Split Infinity what'd be funny, is if the guy who set up the mud initially didn't realize how stupid Badastaz was and then finds out what he just did.. especially if he didn't back something up + 11/09/2001 01:13:29 -- Duuk Now THAT would be quality. + 11/09/2001 01:13:45 -- Murmur@NightmareDev yep, this is definately guilt. fuck you for dragging me to hell with you + 11/09/2001 01:14:13 -- Duuk Told you that you were a pansy ass newbie lover. + 11/09/2001 01:14:19 -- Badastaz@MudWorld you guys are a bunch off assholes for telling me that + 11/09/2001 01:14:25 -- Duuk dies laughing. + 11/09/2001 01:14:37 -- Vashkar@Split Infinity laughs. + 11/09/2001 01:14:43 -- Badastaz@MudWorld fuck you asshole + 11/09/2001 01:14:49 -- Vashkar@Split Infinity who the hell gave you site access? + 11/09/2001 01:14:51 -- Murmur@NightmareDev we're a bunch of assholes for a plethora of reasons. this is just one example + 11/09/2001 01:14:53 -- Duuk Ok, I'm guessing you actually did it. + 11/09/2001 01:15:07 -- Duuk Which means you're not the sharpest knife in the drawer. + 11/09/2001 01:15:27 -- Murmur@NightmareDev or even the cleanest spork + 11/09/2001 01:15:39 -- Badastaz@MudWorld did you ever think i might be new to codeing + 11/09/2001 01:15:43 -- Duuk Yup. + 11/09/2001 01:15:53 -- Vashkar@Split Infinity I think Duuk was counting on it + 11/09/2001 01:15:57 -- Duuk I assumed that when you didn't catch the Flux Capicitor reference. + 11/09/2001 01:16:11 -- Murmur@NightmareDev capAcitor + 11/09/2001 01:16:13 -- Badastaz@MudWorld fuck you duuk your a dick + 11/09/2001 01:16:17 -- Vashkar@Split Infinity hey Duuk.. that's "Capacitor." + 11/09/2001 01:16:21 -- Duuk And well, I have to say, the "flushing your rf buffer" thing was pure genius. + 11/09/2001 01:16:51 -- Hergrom@NewMoon Holy fucking shit... I just read igossip history. You guys have all the luck :P + 11/09/2001 01:17:03 -- Duuk See Herry, your first night on IG could have been worse. + 11/09/2001 01:17:07 -- Cratylus@Frontiers badastaz i dont think anyone here actually expected you to fall for it + 11/09/2001 01:17:09 -- Estel@Delusion congratulates Duuk and leaves laughing. + 11/09/2001 01:17:11 -- Duuk Oh, I did. + 11/09/2001 01:17:15 -- Vashkar@Split Infinity for future reference.. "r" is recursive.. "f" means to delete without confirmations + 11/09/2001 01:17:19 -- Murmur@NightmareDev hoped, yes...expected, no + 11/09/2001 01:17:29 -- Duuk Actually yeah, what Murmur said. + 11/09/2001 01:17:45 -- Vashkar@Split Infinity and you could have typed "man rm" beforehand to know what you're doing. + 11/09/2001 01:17:53 -- Duuk nods. Prolly would have tipped you off.. + 11/09/2001 01:18:07 -- Vashkar@Split Infinity I doubt it + 11/09/2001 01:18:15 -- Badastaz@MudWorld well only assholes would do that + 11/09/2001 01:18:21 -- Hergrom@NewMoon If you're referring to me as Herry, Duuk, my first night on igossip was about 2 years ago... + 11/09/2001 01:18:23 -- Murmur@NightmareDev agrees wholeheartedly. + 11/09/2001 01:18:23 -- Duuk Given the recent level of newbie knowledge, prolly not Vash. + 11/09/2001 01:18:35 -- Duuk And I didn't get you to delete your mud? + 11/09/2001 01:18:35 -- Duuk Damn. + 11/09/2001 01:18:53 -- Duuk writes this down in a book. I wanna use that one again. + 11/09/2001 01:19:05 -- Hergrom@NewMoon No... but you can still try. I don't have shell access, but I can delete a goodly portion of mages. + 11/09/2001 01:19:07 -- Vashkar@Split Infinity I bet you it won't work the next time you try it + 11/09/2001 01:19:13 -- Duuk You're on. + 11/09/2001 01:19:21 -- Duuk Only rule is, none of you can help the poor newbie. + 11/09/2001 01:19:29 -- Duuk Gotta be totally blind. + 11/09/2001 01:19:35 -- Hergrom@NewMoon Done. + 11/09/2001 01:19:39 -- Vashkar@Split Infinity oh, that's fine + 11/09/2001 01:19:55 -- Murmur@NightmareDev it could have been worse...we could have tried to get you to login as root, first + 11/09/2001 01:19:55 -- Duuk Of course, I don't think I + ever expected that to work in a million years... + 11/09/2001 01:20:01 -- Vashkar@Split Infinity you're going DOWN, Duuk.. I'm betting absolutely no one is more clueless than the newbie we've just witnessed + 11/09/2001 01:20:13 -- Duuk nods. I was "" this close to telling you to make sure you were root and flushing the buffer from / + 11/09/2001 01:20:15 -- Murmur@NightmareDev lots of people are that clueless + 11/09/2001 01:20:19 -- Hergrom@NewMoon I'd be willing to give 5 to + 1 odds against Duuk, though. Not possible there could be _another_ newbie that clueless. + 11/09/2001 01:20:37 -- Senir@MudWorld just me or did i hear bout someone pulling the rm joke on bad? + 11/09/2001 01:20:41 -- Hergrom@NewMoon Yeah, what Vashkar said. + 11/09/2001 01:20:43 -- Duuk nods at Senir. + 11/09/2001 01:20:45 -- Duuk Senir. + 11/09/2001 01:20:47 -- Duuk It worked, too. + 11/09/2001 01:21:09 -- Senir@MudWorld shit, think he del his backups too + 11/09/2001 01:21:13 -- Duuk BAHA + 11/09/2001 01:21:15 -- Murmur@NightmareDev you can still fake out half your players when they ask how to turn a channel off "hey, how do i turn off the newbie channel" "quit newbie" people are clueless + 11/09/2001 01:21:27 -- Duuk nods at Murmur. I like that one. + 11/09/2001 01:21:31 -- Vashkar@Split Infinity alright, Senir.. did you give him site access? + 11/09/2001 01:22:03 -- Hergrom@NewMoon I'm assuming you have some semblance of a clue, Senir... how could you give him access? + 11/09/2001 01:22:07 -- Senir@MudWorld he runs his own mud, i help people throughout imc2 network and all that, i don't have power over shells or anything + 11/09/2001 01:22:13 -- Hergrom@NewMoon have given. Whatever. + 11/09/2001 01:22:15 -- Senir@MudWorld heh, i ain't root + 11/09/2001 01:22:39 -- Duuk Well, I appreciate your help in this. I haven't laughed this hard in days. + 11/09/2001 01:22:49 -- Murmur@NightmareDev Someone should make a webpage with a log of this. Something we can point to when we need to lecture yet another person why "starting your own mud when you don't have a clue" is a Bad Idea. + 11/09/2001 01:22:53 -- Senir@MudWorld nor do i run any of this, ntanel gave him access, but should give em a break, i've seen people walk in asking what a codebase is + 11/09/2001 01:22:59 -- Duuk Smack and Hellmonger are gonna be pissed when they find out I did this when they weren't here. diff -c -r --new-file ds2.0r18/lib/domains/town/txt/shame/chapter02 ds2.0r28/lib/domains/town/txt/shame/chapter02 *** ds2.0r18/lib/domains/town/txt/shame/chapter02 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/txt/shame/chapter02 Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,89 ---- + chapter 2 "The Demise of Wolfsong" + + [25Nov2005-23:13:06] Wolfsong@Aurora Sky Hello. + [25Nov2005-23:13:30] Wolfsong@Aurora Sky Hmm, someone on my staff got this to work. Razz + [25Nov2005-23:13:38] Duuk@Haven fuck + [25Nov2005-23:15:03] Berun@Aurora Sky hello everyone + [25Nov2005-23:15:07] Wolfsong@Aurora Sky Now, that's a dirty word. + [25Nov2005-23:15:11] Duuk@Haven shut the fuck up, n00b., + [25Nov2005-23:15:25] Wolfsong@Aurora Sky Aww, you sound upset. + [25Nov2005-23:15:25] Gary@Void Hey all. + [25Nov2005-23:15:35] Gary@Void Duuk is just having a bad day^W life. + [25Nov2005-23:15:37] Duuk@Haven jesus it's a fucking retard convention + [25Nov2005-23:16:49] Wolfsong@Aurora Sky Ah. I don't think that's an appropriate reason to immediately attack someone new, readily making assumptions about my intelligence. It shows a level of mental mediocrity. + [25Nov2005-23:17:05] Duuk@Haven You're a newbie mud admin. It's safe to assume you're a fuckin tard. + [25Nov2005-23:17:17] Gary@Void Actually, Duuk has a very valid point there. + [25Nov2005-23:17:25] Duuk@Haven nods solemnly. + [25Nov2005-23:17:27] Duuk@Haven See! + [25Nov2005-23:17:29] cratylus@Dead Souls amen + [25Nov2005-23:18:04] Vanyel@Haven No offense and all. It's just a statistical analysis. This way they save time. + [25Nov2005-23:18:22] Wolfsong@Aurora Sky So, being new to adminship means I have a low IQ. Except, according to current theory in psychology, it is impossible to raise your IQ. So, as you are experienced admins, you too, have low IQs. + [25Nov2005-23:18:36] cratylus@Dead Souls heh + [25Nov2005-23:18:42] Duuk@Haven No. We were here before any tard could open a mud. + [25Nov2005-23:18:42] cratylus@Dead Souls you're not helping yourself, guy + [25Nov2005-23:18:56] Duuk@Haven Haven first ran on a 486 with 16 meg of ram. + [25Nov2005-23:19:02] Duuk@Haven It ran like shit, but it ran. + [25Nov2005-23:19:04] Zakk@Lima Bean uphill both ways + [25Nov2005-23:19:06] Wolfsong@Aurora Sky I'm female. And rather educated. + [25Nov2005-23:19:14] cratylus@Dead Souls well that explains you + [25Nov2005-23:19:16] Duuk@Haven Liar on 2 points. + [25Nov2005-23:19:22] Zakk@Lima Bean female? pics of tits, now + [25Nov2005-23:19:28] Duuk@Haven agrees. + [25Nov2005-23:19:32] Duuk@Haven bikiniphotos. now. + [25Nov2005-23:19:40] Gary@Void I'm sorry, but I'm gonna have to go agree with Zaak and Duuk on this Sad + [25Nov2005-23:19:40] Wolfsong@Aurora Sky LoL. You don't want those. + [25Nov2005-23:19:42] Zakk@Lima Bean bikini? wtf + [25Nov2005-23:19:56] cratylus@Dead Souls http://rugose.com/showus.jpg + [25Nov2005-23:19:56] Duuk@Haven Wolfy, we've seen worse. + [25Nov2005-23:19:56] Gary@Void No such thing as a Female + MUDer + Coder + Admin. + [25Nov2005-23:20:02] Duuk@Haven Trust Me. + [25Nov2005-23:20:06] Duuk@Haven Hey, Laoise is an admin. + [25Nov2005-23:20:14] Duuk@Haven Of course, we're all pretty sure she's a guy. + [25Nov2005-23:20:26] Zakk@Lima Bean I'm fairly certain of that myself + [25Nov2005-23:20:28] Wolfsong@Aurora Sky Wow, not only are they pretentious shits, they're sexist pigs as well. + [25Nov2005-23:20:36] Gary@Void I passed as a girl on the internet for about a year once. + [25Nov2005-23:20:38] cratylus@Dead Souls wolfsong, just stfu + [25Nov2005-23:20:40] Gary@Void It's not hard to do Neutral + [25Nov2005-23:20:40] Duuk@Haven This is low-key. You should see when you really get us going. + [25Nov2005-23:20:54] Vanyel@Haven You know of pretentious shits that aren't sexist pigs? + [25Nov2005-23:20:56] Communist@Islands of Myth girls don't exist on the internet + [25Nov2005-23:20:56] Wolfsong@Aurora Sky Make me, shithead. + [25Nov2005-23:21:06] cratylus@Dead Souls heh, and here i was, trying to help you + [25Nov2005-23:21:10] Zakk@Lima Bean you into anal? + [25Nov2005-23:21:10] Duuk@Haven I mean, the conversation just started. We haven't even asked you if you like anal sex yet. + [25Nov2005-23:21:12] cratylus@Dead Souls then you go and call me names + [25Nov2005-23:21:14] Gary@Void rolls on the floor laughing. + [25Nov2005-23:21:29] Wolfsong@Aurora Sky Well, you did throw the first blows. Smile + [25Nov2005-23:21:31] cratylus@Dead Souls i think you're the arrogant pretentious one, wolfsong + [25Nov2005-23:21:33] Duuk@Haven damn. timed that one SLIGHTLY too late + [25Nov2005-23:21:49] cratylus@Dead Souls coming on here, expecting everyone to welcome your pointless brainwaves + [25Nov2005-23:22:11] Wolfsong@Aurora Sky So much for friendly MUD development. + [25Nov2005-23:22:15] Jayren@Dead Souls fuck. i don't need comedy central anymore. i'll just come watch igos. + [25Nov2005-23:22:17] Gary@Void Wolfsong, from my experiences, MUDs usually don't have very friendly people. If you want friendly, go the way of talkers, MUSHes, MOOs, etc. + [25Nov2005-23:22:27] Duuk@Haven ooOoO, mushes! + [25Nov2005-23:22:29] Wolfsong@Aurora Sky I wonder why your MUDs aren't popular, even though you've been here for oh so long.. hmmm. + [25Nov2005-23:22:33] Duuk@Haven ICQ for people without ICQ! + [25Nov2005-23:22:41] Duuk@Haven Who said our muds weren't popular? + [25Nov2005-23:22:49] Gary@Void I have four who people on my MUD. + [25Nov2005-23:22:49] Laoise@Haven Is someone talking about me having a dick again? I sense a disturbance in the force. + [25Nov2005-23:22:53] Duuk@Haven I have 5 people on and the damn mud is closed for the weekend. + [25Nov2005-23:23:07] Gary@Void whole* + [25Nov2005-23:23:09] Wolfsong@Aurora Sky Laff. + [25Nov2005-23:23:11] Duuk@Haven Laoise, at least we think you have a BIG dick. + [25Nov2005-23:24:03] Duuk@Haven anytime. time to unfuck another DescartesFunction[tm] + [25Nov2005-23:24:13] Duuk@Haven Crat, you ever mess with eventEquip() in the armour lib? + [25Nov2005-23:24:19] cratylus@Dead Souls have i ever + [25Nov2005-23:24:21] Laoise@Haven has a dick the size of Ninja. We know this. + [25Nov2005-23:24:31] Duuk@Haven Ninja's dick, or all of Ninja? + [25Nov2005-23:24:31] cratylus@Dead Souls that is some fucked up shit right there + [25Nov2005-23:24:39] Laoise@Haven All of Ninja. Duh. + [25Nov2005-23:24:52] Duuk@Haven I redid eventDescribeEnvironment() earlier. That one made baby jesus cry. + [25Nov2005-23:24:54] Laoise@Haven It's not funny if it's the same size as Ninja's. + [25Nov2005-23:24:56] Duuk@Haven I think this one will be worse. + [25Nov2005-23:45:02] Wolfsong@Aurora Sky Mwah. + [25Nov2005-23:45:38] Gary@Void Maw? + [25Nov2005-23:45:52] Wolfsong@Aurora Sky MWAH. + [25Nov2005-23:46:10] Duuk@Dead Souls You didn't die yet? + [25Nov2005-23:46:22] Wolfsong@Aurora Sky No, not yet. + [25Nov2005-23:46:24] Duuk@Dead Souls Damn. + [25Nov2005-23:46:50] Wolfsong@Aurora Sky New people are like cockroaches. You hate them, but they'll outlive you. diff -c -r --new-file ds2.0r18/lib/domains/town/txt/shame/chapter03 ds2.0r28/lib/domains/town/txt/shame/chapter03 *** ds2.0r18/lib/domains/town/txt/shame/chapter03 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/txt/shame/chapter03 Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,1231 ---- + chapter 3 "September 11 2001 (Warning: not that funny)" + + [igossip] Hellmonger@Trilogy: actually, I think efnet.net got rooted and they + just took the server down. + [igossip] Alric@Nanvaent: efnet is still up. + [igossip] Smack@Lima Bean: ZIONIST NAZIS!!!!!!!!!!!!!!!!!! + [igossip] Motorhed@Trilogy says, "Four out of five doctors agree. I am the + fifth doctor. I hope you die. Fuck you." + [igossip] Shandor@Bakhara: we had a student riot over the weekend! + [igossip] Malic@Lima Bean: + http://mdn.mainichi.co.jp/waiwai/0109/010909diet.html. + [igossip] Blue@Lima Bean: of all the igossip questions for me to be able to + answer, one about boxer shorts was _not_ the one I expected. + [igossip] Ninja@VargonMUD: SHARK!!! + [igossip] Zeddicus@Haven: ARBORPHILES!!! + [igossip] Ninja@VargonMUD: Once ya hug a lumberjack, ya'll never hug a tree + again! + [igossip] Hellmonger@Trilogy: THE NUKES ARE FALLING. + [igossip] Hellmonger@Trilogy: FRM THE SKIES. + [igossip] Hellmonger@Trilogy: AS TERRORISTS TORCH THE U.S. + [igossip] Hellmonger@Trilogy: ITS A HORIBLE DAY. + [igossip] Hellmonger@Trilogy: AHHHHHHHHH I'M MELTING. + [igossip] Al@Anarres II: HM, shut up. + [igossip] Hellmonger@Trilogy: I just heard two planes crahsed into the trade + center. + [igossip] Al@Anarres II: and very f*cking news iste is down for me ATM :( + [igossip] Zeddicus@Haven: Good for them. + [igossip] Nirvan@Nanvaent: yeah - two big jets. + [igossip] Hellmonger@Trilogy: Yeah, how fucked. + [igossip] Nirvan@Nanvaent: one for each tower - I 'm trying to work out if its + April 1st somewhere... + [igossip] Hellmonger@Trilogy: I vote we turn the fucking middle east into a + large sheet of glass. + [igossip] Al@Anarres II: its a terrorist thing! + [igossip] Hellmonger@Trilogy: I'm glad I don't live in england, where there are + a lot of terrorists. + [igossip] Al@Anarres II: it makes life fun! + [igossip] Al@Anarres II: nightly bulletins saying some irish bloke has shot + another. + [igossip] AndrewH@Anarres II: keeps the irish population down. like the potato + famine. + [igossip] Al@Anarres II nods + [igossip] Al@Anarres II: its most definetly terrorist. + [igossip] Al@Anarres II: two planes, two towers.. thats not just unlucky. + [igossip] Al@Anarres II: well, back to work... + [igossip] Zeddicus@Haven: A father came in the bedroom to find his 13-year-old + daughter smoking a cigarette. "My God! How long have you been smoking?" screams + the father. "Since I lost my virginity," replies the girl. "You lost your + VIRGINITY!!! When the hell did this happen?" shrieks the father. "I don't + remember," says the girl. "I was completely drunk." + [igossip] Smack@Lima Bean: holy fuck. + [igossip] Hellmonger@Trilogy: yeah no doubt. + [igossip] Hellmonger@Trilogy chants: "Nuke The Middle East! Nuke The Middle + East! Nuke The Middle East!" + [igossip] Al@Anarres II: why do you say its the middle east? you said that + about oklahoma and it was some US bloke. + [igossip] Styxx@OuterSpace: shaddup. + [igossip] Al@Anarres II: you HM, are a racist homophobe. + [igossip] Hellmonger@Trilogy: You are obviously a jew-sympathiser. You will + burn with your dirty hebrew friends. + [igossip] Al@Anarres II: hmmm. HM, shut the fuck up. + [igossip] Smack@Lima Bean: whoever it is must die. + [igossip] Hellmonger@Trilogy: Al, do you worship Osama Bin Laden? + [igossip] Hellmonger@Trilogy: Why can't people pick new and exciting targets + for their terrorist acts? + [igossip] Hellmonger@Trilogy: 'Lets blow up the world trade center!' 'Lets + crash into the world trade center!' + [igossip] Al@Anarres II grins at HM, "I only worship you" + [igossip] Hellmonger@Trilogy: Al, you must blow up the quik-mart. The infidels + must pay. + [igossip] Nirvan@Nanvaent: wouldn't it be a better statement to fly the plane + into the white house ? + [igossip] Sinistrad@VargonMUD: Harder to do. + [igossip] Nirvan@Nanvaent: or are the protests against the WTO stepped up from + hippies throwing rocks in the streets ? + [igossip] Nirvan@Nanvaent: *blinks* + [igossip] Al@Anarres II: maybe they were passenger planes and someone at air + traffic f*cked up? + [igossip] Sinistrad@VargonMUD: BREAKING NEWS: One of the planes was being flows + by Captain Hazelwood, of the Exxon Valdez! + [igossip] Nirvan@Nanvaent: harder than hijacking two 747s and flying them into + the center of NY ? + [igossip] Al@Anarres II: doesn;t Xyzzy have summin' to do with flying things? + [igossip] Sinistrad@VargonMUD: Yes, Nirvan. Why are you so... curious? + [igossip] Nirvan@Nanvaent: so the SDN is working over the white house then ? + [igossip] Sinistrad@VargonMUD: Try making a hijacked plane hit a ground target. + [igossip] Al@Anarres II: good point Sini. + [igossip] Nirvan@Nanvaent: ahh - so you've thought ab out this then ? + [igossip] Nirvan@Nanvaent: it is a good point. + [igossip] Sinistrad@VargonMUD: No, I just work for the FBI. But you, on the + other hand.. *shuffles papers* Nirvan, AKA "Idi Ib Amin".. why are YOU so + curious? + [igossip] Nirvan@Nanvaent: woo - breaking news. CNN have decided that it isn't + an accident ! + [igossip] Skullslayer@RoD: so anyone got a good news site with live feed, that + isn't down(DoS'd)? + [igossip] Nirvan@Nanvaent: turn on a TV ? + [igossip] Skullslayer@RoD: haha not an accident - thats clever + [igossip] Skullslayer@RoD: I'm at work, and there is no tv here + [igossip] Pickett@Sumu: + http://a799.ms.akamai.net/3/799/388/9ce0ee0b875c5d/www.msnbc.com/news/1160603.j + pg. + [announce] Xyzzy enters Frontiers. + [igossip] Nirvan@Nanvaent: MSN Search : We can't find "cnn.com". + [igossip] Nirvan@Nanvaent: oh god - someone's bombed CNN! + [cre] Cratylus: oi. + /wiz/cratylus # [igossip] Nirvan@Nanvaent: slashdot is even running the story - because CNN is + DOS'ed :) + [igossip] Al@Anarres II: is CCN DoS'd or just very busy? + [igossip] Sinistrad@VargonMUD: Try CNN instead of CCN. + [igossip] Sinistrad@VargonMUD: Maybe you'll get somewhere. + [igossip] Skullslayer@RoD: very busy is a DoS - so is MSNBC and ABCnews + [igossip] Al@Anarres II: DoS implied bad intent. + [igossip] Al@Anarres II: rather than just lots of happy punters. + [igossip] Vashkar@Split Infinity: haha.. dailynews.yahoo.com changed their + story to simply "A plane crashed into one of the twin towers of the World Trade + Center Tuesday, witnesses said." and that's it.. it loads just fine now :) + [igossip] Skullslayer@RoD: they're hit by the slashdot effect, except on a + bigger scale + [igossip] Xyzzy: wtf. + [igossip] Sinistrad@VargonMUD: Jesus, that's impressive. + [igossip] Cratylus: thats so fucked up. + /wiz/cratylus # [igossip] Undh@Sumu: impressive.. yeah .) + /wiz/cratylus # [igossip] Sinistrad@VargonMUD: If I were a terrorist, I would have waited until + more people were at work. + [igossip] Nirvan@Nanvaent: 9am isn't a bad time... + [igossip] Bayard@Nanvaent: morning meetings happening. people mainly in at 8am. + [igossip] Blue@Inon-Net: people start work at 8 in most of those companies. + [igossip] Bayard@Nanvaent: all gathered together in rooms. + [cre] Xyzzy: thats fucked up, dude. + [igossip] Nirvan@Nanvaent: a good day not to be too highly promoted I would + guess. + [igossip] Al@Anarres II: hmm, 2nd plane "was passenger 727"... oops. + [igossip] Skullslayer@RoD: yeah, FBI was investigating a report of a hijacking + at the time + [cre] Cratylus: bizarre. + /wiz/cratylus # [igossip] Nirvan@Nanvaent: bush wants to 'hunt down the people who did this' + [igossip] Al@Anarres II: nice - hijack a plane full of US citizen and then + crash it into the trade center :) sweet. + [igossip] Nirvan@Nanvaent: get me my gun, maw... + [igossip] Cratylus: well it's easier than carting a bomb in there, with their + current security. + /wiz/cratylus # [igossip] Sinistrad@VargonMUD: look in 'the charred remains between floor 98 + and 99' + [igossip] Nirvan@Nanvaent: seems there is a 3rd plane that's been hijacked ? + [igossip] Cratylus: i guess they'll need to install antiaricraft turrets now. + /wiz/cratylus # [igossip] Xyzzy: YES! + [igossip] Hellmonger@Trilogy: hell yeah. + [igossip] Sinistrad@VargonMUD: Whoever invents the force field will make a + billion. + [igossip] Xyzzy: but, we already HAVE. + [igossip] Al@Anarres II: if someone wants to be a terrorist, they'll be a + terrorist. + [igossip] Xyzzy: the antimissile shield will protect us! + [igossip] Cratylus: and if they want to sing out, sing out. + /wiz/cratylus # [igossip] Styxx@OuterSpace: asia.cnn.com still works. + [igossip] Skullslayer@RoD: a 3rd plane? + [igossip] Nirvan@Nanvaent: the pentagon is on fire. + [igossip] Steve@Anarres II: pentagon on fire? + [igossip] Cratylus: cats and dogs, living together. + /wiz/cratylus # [igossip] Nirvan@Nanvaent: and the palestinians are claiming responsibility. + [igossip] Xyzzy: dont cross the streams. + [igossip] Nirvan@Nanvaent: and my boss wanted me to go to israel last week. + [igossip] Sinistrad@VargonMUD: Ooh, ht//praiseallah.terrorists.com has the + inside report! + [igossip] Cratylus: jesus, a 767 + /wiz/cratylus # [igossip] Sinistrad@VargonMUD: The pentagon IS on fire! + [igossip] Cratylus: thats a lot of aircraft. + /wiz/cratylus # [igossip] Xyzzy: wow. + [igossip] Sinistrad@VargonMUD: WOOOOOOO!!!!! + [igossip] Xyzzy: co-worker just said pentgon IS on fire. + [igossip] Sinistrad@VargonMUD: Shit, this is really cool. + [igossip] Al@Anarres II: cool :) You guys have better terrorists! + [igossip] Sinistrad@VargonMUD: Guys, if you're in any kind of important + building.. RUN! + [igossip] Hellmonger@Trilogy: My Unc works at the pentagon. :( + [igossip] Cratylus: did they drop a plane on the pentagon as well? + /wiz/cratylus # [igossip] Xyzzy: fuck this, im goin home. + [igossip] Sinistrad@VargonMUD: Not so happy now, eh? + [igossip] Al@Anarres II cheers for Xyzzy + [igossip] Hellmonger@Trilogy: heh. + [igossip] Xyzzy: no, as in, i dont wanna be in this building. + [igossip] Sinistrad@VargonMUD: Wtf, is today Allah's birthday or something? + [igossip] Cratylus: can someone post a burning-pentagon url? + /wiz/cratylus # [igossip] Nirvan@Nanvaent: white house has been evacuated. + [igossip] Nirvan@Nanvaent: pentagon is on fire, and been evacuated. + [igossip] Blue@Inon-Net: if you were going to start a nuclear war, which two + buildings would you want to have evacuated first? + [igossip] Nirvan@Nanvaent: today is the 20th anniversary of the UN + international day of peace. + [igossip] Blue@Inon-Net: I guess they still have NORAD or some such place. + [igossip] Nirvan@Nanvaent: but war games was on the TV at the weekend. + [igossip] Sinistrad@VargonMUD: No shit, Nirvan? + [igossip] Nirvan@Nanvaent: I know how to get in ther! + [igossip] Cratylus: i'm too tired for this to be Anarchy Day. + /wiz/cratylus # [igossip] Xyzzy: hmm, that is, if i CAN leave... + [igossip] Sinistrad@VargonMUD: I know how to get into the Pentagon, too: + Through the gaping hole. + [igossip] Al@Anarres II: the pentagon has like, 12 stories going down and a + power plant and such. Its paper pushers up top. + [cre] Cratylus: is the pentagon really burning? + /wiz/cratylus # [cre] Xyzzy: yes. + [cre] Xyzzy: it was bombed. + [cre] Cratylus: whew. + /wiz/cratylus # [cre] Xyzzy: apparently. + [cre] Xyzzy: this base is closed. + [cre] Xyzzy: no one gets on. + [igossip] Al@Anarres II: this is class :) brightened up my afternoon no end. + [igossip] Cratylus: all your trade center are belong to us. + /wiz/cratylus # [igossip] Nirvan@Nanvaent: CNN showing a big fire near washington. + [cre] Cratylus: i'd go home. + /wiz/cratylus # [cre] Cratylus: traffic will really suck later. + /wiz/cratylus # [igossip] Skullslayer@RoD: slashdot is down now too :) + [igossip] Diruces@Mystic: they say they have exvacuated the west wing of the + whitehouse too. + [cre] Cratylus: and they'll drop a plane on the highway. + /wiz/cratylus # [igossip] Nirvan@Nanvaent: I saw a comment on slashdot wondering if there was a + 'cyberattack' going on at the same time - what a dumb fuckwith. + [igossip] Skullslayer@RoD: most people on slashdot are fuckwits + [igossip] Nirvan@Nanvaent: where is washington amll ? + [igossip] Nirvan@Nanvaent: where is washington mall even. + [igossip] Xyzzy: lessee.... commerce... military... + [igossip] Sinistrad@VargonMUD: Around the Pentagon. + [igossip] Diruces@Mystic: next the whitehouse. + [igossip] Xyzzy: mall is accross the river, in VA. + [igossip] Xyzzy: er. + [igossip] Xyzzy: the pentagon is in VA. + [igossip] Cratylus: thank god, whitehouse.com hasn't been bombed. + /wiz/cratylus # [cre] Xyzzy: really, whats next. + [igossip] Sinistrad@VargonMUD: Your old password still work there? + [igossip] Diruces@Mystic: i like the idea of cheney as pres. + [igossip] Nirvan@Nanvaent: apparently the pentagon fire was caused by a plane + or rocket attack. + [cre] Xyzzy: "if this was a coordinated attack, what ELSE might be happening + rigt now?" + [cre] Xyzzy: then tehre weas the pentagon. + [igossip] Nirvan@Nanvaent: bush is at some school somewhere. + [igossip] Nirvan@Nanvaent: probs learning how to spell. + [igossip] Sinistrad@VargonMUD: Was. + [igossip] Nirvan@Nanvaent: the third hijacked plane apparently hit the + pentagon. + [igossip] Al@Anarres II: bush is in a bunker! + [igossip] Xyzzy: what. + [igossip] Xyzzy: next. + [igossip] Blue@Inon-Net: playing golf at a time like this... just like his dad. + [igossip] Cratylus: with his teddy bear. + /wiz/cratylus # [igossip] Nirvan@Nanvaent: well, he was in a bunker with lots of school kids + around him. + [igossip] Xyzzy: any bets? + [igossip] Nirvan@Nanvaent: unless they recorded it. + [igossip] Cratylus: curled up under a desk. + /wiz/cratylus # [igossip] Xyzzy: thumb in mouth. + [igossip] Xyzzy: rockingh back n forth. + [igossip] Nirvan@Nanvaent: xyzzy : 10 to 1, jenna bush gets drunk and falls + around in public in downtown austin this weekend. + [igossip] Nirvan@Nanvaent: naw, make that 2 to 1 + [igossip] Nirvan@Nanvaent: bbc is reporting 6 people killed in the crashes + (that all ???) + [igossip] Cratylus: "Jenna Bush's federally protected wetlands now open for + public drilling" + /wiz/cratylus # [igossip] Nirvan@Nanvaent: FAA has grounded all flights in the US. + [cre] Cratylus: it's days like this when i kinda wish i had cable tv. + /wiz/cratylus # [igossip] Musashi@Sumu: where'd you read that? + [igossip] Nirvan@Nanvaent: AP. + [cre] Xyzzy: we have a tv, but theres a meeting in tehre now. + [cre] Xyzzy: i hafta rely on YOU GUYS for news. + [cre] Cratylus: ME? + /wiz/cratylus # [cre] Cratylus: i dunno NOTHIN. + /wiz/cratylus # [cre] Xyzzy: hmm, should i go home? + [igossip] Nirvan@Nanvaent: 'the associated press' + [igossip] Nirvan@Nanvaent: or the standard 'newswire' + [igossip] Sinistrad@VargonMUD: CONFIRMED: It was a plane that crashed into the + Pentagon, too. + [igossip] Sinistrad@VargonMUD: CNN is law. + [igossip] Sinistrad@VargonMUD: If CNN makes up stuff about aliens, I believe + it. + [igossip] Nirvan@Nanvaent: who was saying it was really difficult to hit ground + targets with planes ? :) + [igossip] Nirvan@Nanvaent: did they miss ? + [igossip] Sinistrad@VargonMUD: "Aliens crashed into the Pentagon" I'll believe + it. + [igossip] Skullslayer@RoD: heh, lots of the US govt agencies get their info + from CNN since its cheaper than having their own people in the field + [igossip] Blaze@VargonMUD: All american flights have been grounded. + [igossip] Nirvan@Nanvaent: it was - illegal Aliens crashed into the Pentagon. + [igossip] Sinistrad@VargonMUD: Heh =-) + [igossip] Xyzzy: ALIENS BOMBED THE PENTAGON?!?! + [igossip] Cratylus: those two targets seem kinda pointless to. + /wiz/cratylus # [igossip] Cratylus: me. + /wiz/cratylus # [igossip] Nirvan@Nanvaent: which ones ? + [igossip] Xyzzy: "she thought they said 'ILLEGAL aliens' and signed up" + [igossip] Bayard@Nanvaent: symbolic Crat. + [igossip] Cratylus: they shoulda found bush's locaation and dropped a plane on + him. + /wiz/cratylus # [igossip] Bayard@Nanvaent: very symbolic. especially outside of US. + [igossip] Sinistrad@VargonMUD: Maybe it was Jenna Bush flying daddy's plane. + [igossip] Nirvan@Nanvaent: he was in a school. + [igossip] Al@Anarres II: hijacking any plane and crashing it is gonna get you + coverage. + ------------------------------------------------------------------------ + F r o n t i e r s + (EDT is: Tue Sep 11 09:53:36 2001) + There are 3 users connected. + ------------------------------------------------------------------------ + Xyzzy 4s Low Crawl access4.digex.net + Zaphod 11h empty plain 77.163.252.64.snet.net + Cratylus Cratylus' Cubicle cratylus + ------------------------------------------------------------------------ + /wiz/cratylus # [igossip] Blue@Inon-Net: American spy plane disappeared over Iraq today. + [igossip] Sinistrad@VargonMUD: Xy, the actress who played Valdez in that movie + actually showed up at casting time thinking the movie WAS about illegal aliens. + They kept the "inside joke" in the movie. + [igossip] Nirvan@Nanvaent: unmanned US spy plane. + [igossip] Cratylus: vasquez. + /wiz/cratylus # [igossip] Xyzzy: ya, i read that on IMDB :) + [igossip] Nirvan@Nanvaent: you know the real big question about all this ? + Who has the movie rights ? + [igossip] Xyzzy: me. + [igossip] Nirvan@Nanvaent: when will Tom Clancey's book come out ? + [igossip] Blue@Inon-Net: Tom Clancy already wrote this book :) + [igossip] Bayard@Nanvaent: "Why hasn't Tom Clancy forseen this!" + [igossip] Cratylus: clancey's book will have biological weapons in the planes. + /wiz/cratylus # [igossip] Blue@Inon-Net: I bet that's where they got the idea. + [igossip] Skullslayer@RoD: he did the book years ago + [igossip] Xyzzy: wait, whata bout the unmanned Am. spyplane? + [igossip] Al@Anarres II: I lost one of my peers in NYC... wonder why. + [igossip] Cratylus: im still waiting for them to nuke a football stadium, like + he said. + /wiz/cratylus # [igossip] Xyzzy: ah, ok, i see the story. + [igossip] Nirvan@Nanvaent: israel was moving in to palestine today - + [igossip] Xyzzy: GIT MAH GUN! + [igossip] Cratylus: they highjacked an unmanned us spy plane and crashed it + into the iraqui desert! those madmen! + /wiz/cratylus # [igossip] Musashi@Sumu: so has anyone claimed responsibility for this yet? + [igossip] Nirvan@Nanvaent: palestinians, + [igossip] Nirvan@Nanvaent: the IRA, Iraq want a piece... + [igossip] Bayard@Nanvaent: the NBA. + [igossip] Nirvan@Nanvaent: problem is, everyone will try to claim it. + [igossip] Xyzzy: not to jinx us, but it seems that you never know when the shit + is gonna hit the fan like this. + [igossip] Cratylus: the judean people's front. + /wiz/cratylus # [igossip] Xyzzy: SPLITTERS! + [igossip] Blue@Inon-Net: it's the anti-globalisation protesters. + [igossip] Bayard@Nanvaent: people's judean front. + [igossip] Blue@Inon-Net: think about it: the World Trade Centre. + [igossip] Xyzzy: and? + [igossip] Iain@Anarres II: popular peples front of judea. + [igossip] Blue@Inon-Net: They got it confused with the WTO. + [igossip] Xyzzy: WWF? + [igossip] Izzy@VargonMUD: I think it was just a big misunderstanding. + [igossip] Nirvan@Nanvaent: state dept on fire. + [igossip] Nirvan@Nanvaent: another plane just hit. + [igossip] Xyzzy: WHAT? + [igossip] Nirvan@Nanvaent: south tower of the WTO has collapsed. + [igossip] Presto@Discworld: fuckin hell. + [igossip] Musashi@Sumu: jesus, I'm not going to be able to get cricket results + for the next 4 weeks with this flooding the news... + [igossip] Xyzzy: at least we dont hafta hear about gary conit anymore. + [igossip] Xyzzy: er, conDit. + [igossip] Nirvan@Nanvaent: capitol building and treasury evacuated. + [igossip] Nirvan@Nanvaent: most of manhantten under smoke/ on fire. + [igossip] Al@Anarres II goes to thebunker.net + [igossip] Blaze@VargonMUD: And a couple in SF. The trans-america building too. + [igossip] Nirvan@Nanvaent: sears tower in chicago attacked too. + [igossip] Al@Anarres II: nice! + [igossip] Xyzzy: overheard at work: USA today building. + [igossip] Presto@Discworld: not attacked, evacuated. + [igossip] Al@Anarres II lives no where near anything tall :) + [igossip] Cratylus: can't believe it didnt occur to them to drop a plane on + clinton's harlem office. + /wiz/cratylus # [igossip] Nirvan@Nanvaent: who cares about clinton ? + [igossip] Cratylus: best way to intimidat current presidents is killing former + ones. + /wiz/cratylus # [igossip] Nirvan@Nanvaent: saw the 'third explosion' replay - looked like the + building just collapsed inwards. + [igossip] Al@Anarres II: nice, the BBC have "given up" trying to get their + sites up :)) + [igossip] Skullslayer@RoD: clinton is in australia at the moment anyway + [igossip] Pickett@Sumu: wtc collapsed? + [igossip] Skullslayer@RoD: south tower + [igossip] Cratylus: the whole thing fell? + /wiz/cratylus # [igossip] Tarl@Alsherok: He is ? Crap. Any idea where in Australia ? + [igossip] Presto@Discworld: top half. + [igossip] Presto@Discworld: as opposed to the bottom half. + [igossip] Skullslayer@RoD: golf resort + [igossip] Xyzzy: heh. + [igossip] Cratylus: that is a lot of cead people. + /wiz/cratylus # [igossip] Xyzzy: so, sears tower, too? + [igossip] Cratylus: hard to believe so much of it would fall off from a plane + crash. + /wiz/cratylus # [igossip] Presto@Discworld: no. + [igossip] Xyzzy: fuck, i need a list, here. + [igossip] Pickett@Sumu: ... President Bush, .. from a school in Sarasota, + Fla... + [igossip] Presto@Discworld: Well, Jesus, it wasn't a Cessna, it was a frigging + 737/767 depending on who you believe. + [igossip] Cratylus: i say we cut off aid to israel until they handle their + terrorist problem. + /wiz/cratylus # [igossip] Pickett@Sumu: total three planes crashed in wtc. the last one caused + the tower to collapse. + [igossip] Xyzzy: overheard at work: whitehouse has smoke comng out of it. + [igossip] Blue@Inon-Net: it's not exactly "their" problem any more. + [igossip] Sinistrad@VargonMUD: BREAKING NEWS: Dave Matthew's song "Crash into + me" said to have inspired the terrorists! + [igossip] Cratylus: well its all coming from there, one way or another. + /wiz/cratylus # [igossip] Xyzzy: THREE? + [igossip] Presto@Discworld: It didn't look to me like there was a third crash + into the WTC, looked like it just fell. + [igossip] Cratylus: it aint the IRA dropping planes in NYC. + /wiz/cratylus # [igossip] Pickett@Sumu: yeah, a third (smaller) plane in the bottom part of the + tower caused it to fall. + [igossip] Xyzzy: maybe they stored a plane in the basement. + [igossip] Presto@Discworld: CNN now says the Sears Tower has NOT been + evacuated. + [igossip] Blue@Inon-Net: if I were working there, I'd have evacuated. + [igossip] Sinistrad@VargonMUD: Thank you, Presto. *Presses a button labeled + "Sears"* + [igossip] Cratylus: if i worked there, i'd have evacuated my bowels. + /wiz/cratylus # [igossip] Skullslayer@RoD: is the whitehouse hit confirmed? + [igossip] Cratylus: no whitehouse.com is safe. + /wiz/cratylus # [igossip] Cratylus: and how do you slay a skull, anyway? + /wiz/cratylus # [igossip] Skullslayer@RoD: very carefully + [igossip] Xyzzy: with a skullslaying device. + [igossip] Skullslayer@RoD: exec building next to the whitehouse hit? + [igossip] Sinistrad@VargonMUD: Jesus Christ! + [igossip] Al@Anarres II: well, the Dow and NASDAQ are both up. + [igossip] Xyzzy: alright, everyone keep their rumors to themselves, please only + give us confirmed hits. + [igossip] Blue@Inon-Net: is he responsible, or been hit? + [igossip] Presto@Discworld: trading is closed. + [igossip] Vashkar@Split Infinity: capitol hill .. another explosion. + [igossip] Al@Anarres II: would all US resident, please leave the country. + [igossip] Cratylus: remain calm, do not run. + /wiz/cratylus # [igossip] Al@Anarres II: head for Canada! + [igossip] Sinistrad@VargonMUD: I miss the twin towers. + [igossip] Xyzzy: pretty sad when im relying on you guys for news. + [igossip] Myrias@Discworld: I logged on for news too. + [igossip] Blue@Inon-Net: they'll have to reprint all those NYC t-shirts, shot + glasses, posters, everything. + [cre] Cratylus: thats pathetic. + /wiz/cratylus # [igossip] Myrias@Discworld: The major news websites are all crashing under the + weight of traffic. + [cre] Cratylus: i cant believe cnn got overwhelmed. + /wiz/cratylus # [igossip] Blue@Inon-Net: no, they've been hit by more planes! + [igossip] Skullslayer@RoD: so, any bets on the FBI or CIA going out next? + [cre] Cratylus: dispensing breaking news is their JOB. + /wiz/cratylus # [cre] Cratylus: i wnt them FIRED. + /wiz/cratylus # [igossip] Xyzzy: youd think cnn would be their FIRST target. + [cre] Xyzzy: yer on cre. + [igossip] Bayard@Nanvaent: anyone started any rumours about massive virtual + terrorism attack on the US websites? + [cre] Cratylus: i know. + /wiz/cratylus # [igossip] Musashi@Sumu: no way, they want people to know. + [cre] Xyzzy: ah. + [igossip] Bayard@Nanvaent: i'm sure there's mileage in that one. + [igossip] Xyzzy: anyone familiar with the laws concerning gun possession and + transport in the state of maryland? + [igossip] Al@Anarres II: right now X, no one will care. + [igossip] Xyzzy: GOOD POINT! + [igossip] Presto@Discworld: explosion on Capitol hill. + [igossip] Xyzzy: where. + [igossip] Presto@Discworld: or not. + [cre] Cratylus: cant believe i have to turn on the radio for news now. + /wiz/cratylus # [igossip] Vashkar@Split Infinity: no, that's what happened. + [igossip] Xyzzy: is todays date of any signifigance? + [igossip] Skullslayer@RoD: apparently CNN is reporting a Capitol Hill hit + [igossip] Presto@Discworld: I wish people would get their fucking story + straight. :-b. + [igossip] Sinistrad@VargonMUD: 20th anniversary of world peace, Xy. + [igossip] Sinistrad@VargonMUD: CNN is reporting everything's ok on Capitol + Hill, except a loud sound. + [igossip] Vashkar@Split Infinity: oh. + [igossip] Presto@Discworld: CNNfn is talking to someone on Pennsylvania Ave, + and they said there's no explosion. + [igossip] Izzy@VargonMUD: It's the Democrats complaining. + [igossip] Cratylus: npr's interviewing freaked out WTC occupants. + /wiz/cratylus # [igossip] Xyzzy: now THATS journalistic integrity. + [igossip] Cratylus: it's quite tedious. + /wiz/cratylus # [igossip] Xyzzy: can you imagine the traffic and general panic? + [igossip] Cratylus: huh. the upper part of one of them did in fact collapse. + /wiz/cratylus # [igossip] Skullslayer@RoD: a few players here have confirmed capitol hill as + being hit + [igossip] Blue@Inon-Net: Interesting that of all the scary talk over recent + years about how easy it would be for terrorists to deploy biological, chemical, + nuclear or other fancy weapons in NYC, that when it actually happens, it could + have been done the same way 20 years ago. + [igossip] Presto@Discworld: Empire State building now evacuated. Duh. + [igossip] Sinistrad@VargonMUD: Yes, thanks, 30 minute ago man. + [igossip] Xyzzy: plane bombings is SO last decade. + [igossip] Blue@Inon-Net: I wonder how they'll persuade King Kong to come down. + [igossip] Cratylus: hey, i'm not gonna believe YOU bozos. + /wiz/cratylus # [igossip] Xyzzy: screw YOU guys, ah'm goin HOME. + [igossip] Sinistrad@VargonMUD: Famous last words, target! + [igossip] Skullslayer@RoD: nah, it was 'fore!' + [igossip] Tarl@Alsherok: In case no one said it, it appears one of the planes + was american airlines flight number 11, I hope no one knew anyone supposed to + be on that.. + [igossip] Al@Anarres II: so one tower has fallen over completly? + [igossip] Cratylus: no. the upper part of one collapsed. + /wiz/cratylus # [igossip] Xyzzy: it has fallen UP. + [igossip] Cratylus: not clear if it actually hit the ground. + /wiz/cratylus # [igossip] Al@Anarres II: from news feed I have heard about, its fallen over + completly? + [igossip] Sinistrad@VargonMUD: It's just floating there. + [igossip] Xyzzy: the Good Samaratin Terrorist Organization has built it back + up. + [igossip] Al@Anarres II ponders going to find a TV + [igossip] Xyzzy: this... this cant happen to US.... were AMERICA! + [igossip] Cratylus: heh, reporter is shocked to see police patrolling around + with machine guns. + /wiz/cratylus # [igossip] Bayard@Nanvaent: no tanks? + [igossip] Xyzzy: GIT MAH GUN. + [igossip] Al@Anarres II: they are gonna shoot planes down first! + [igossip] Xyzzy: and pilots. + [igossip] Cratylus: no, but apparently fighter jets patrolling too. + /wiz/cratylus # [igossip] Xyzzy: kick ASS. + [igossip] Al@Anarres II: "At about 10 a.m., one of the 110-story World Trade + Center towers collapsed" + [igossip] Xyzzy: just heard on radio: state building car combed. + [igossip] Al@Anarres II: washingtonpost.com. + [igossip] Presto@Discworld: car bomb outside the State Dept. + [igossip] Xyzzy: shhh, al, dont overload our local newspaper's site! + [igossip] Al@Anarres II: hey, its the only one up! + [igossip] Cratylus: not anymore. + /wiz/cratylus # [igossip] Xyzzy: thanks a LOT, guys. + [igossip] Xyzzy: i can see it. + [igossip] Xyzzy: heh, theres a webcam pointed at the pentagon smoke. + [igossip] Al@Anarres II uses akamaitech.net + [igossip] Al@Anarres II: it works. + [igossip] Cratylus: howsabout a url? + /wiz/cratylus # [igossip] Xyzzy: + http://www.washingtonpost.com/wp-srv/mmedia/webcams/eyeondc.htm. + [igossip] Sinistrad@VargonMUD: WHERE THE FUCK IS SPIDER-MAN?!?! + [igossip] Xyzzy: helicopter in the picture, now. + [igossip] Xyzzy: wtf is SPIERman gonna do. + [igossip] Cratylus: mighty mouse is busy eating cheese. + /wiz/cratylus # [igossip] Sinistrad@VargonMUD: Web the tower together. + [igossip] Xyzzy: ohhhh yeah. + [igossip] Skullslayer@RoD: rumour of 6 more planes in the air and hijacked + [igossip] Xyzzy: spider MAN, SPIDER man. + [igossip] Bayard@Nanvaent: yeah. that seems very rumourish atm. + [igossip] Xyzzy: rumor from where? + [igossip] Steve@Anarres II: 2nd has gone now. + [igossip] Tariq@Demonslair Dev: 2nd tower just went down. + [igossip] Al@Anarres II: how the hell can that many planes get hijacked? + [igossip] Xyzzy: 2nd one what. + [igossip] Xyzzy: tower? + [igossip] Presto@Discworld: fucking Christ, the second tower collapsed. + [igossip] Sinistrad@VargonMUD: MAYDAY MAYDAY, TOWER DOWN. + [igossip] Steve@Anarres II: no, the 2nd fucking pentagon. + [igossip] Cratylus: the Mayor's disaster control center was in the + blown up tower. + /wiz/cratylus # [igossip] Sinistrad@VargonMUD: Both towers are gone, you fucking moron. + [igossip] Tariq@Demonslair Dev: saw it dropping live, it was truely scary. + [igossip] Tariq@Demonslair Dev: live on the telly, in case anyone + misunderstands that. + [igossip] Al@Anarres II: did it crumple downwards, or topple over and take out + alot og other buildings? + [igossip] Musashi@Sumu: carbomb at state dept confirmed? + [igossip] Tariq@Demonslair Dev: the top spire was in view, and it just dropped + downwards. + [igossip] Cratylus: wtf npr says both towers collapsed. + /wiz/cratylus # [igossip] Pickett@Sumu: hrm, another plane hijacked and headed to washington. + [igossip] Cratylus: im guessing any further hijacked planes might get shot + down. + /wiz/cratylus # [igossip] Al@Anarres II: but the US cant shoot down its own commertial + airliner! + [igossip] Cratylus: sure it can. + /wiz/cratylus # [cre] Xyzzy: yes, ive heard both towers collapsed, too. + [igossip] Al@Anarres II: they might not crash... + [igossip] Bayard@Nanvaent: i reckon it will. + [igossip] Xyzzy: ok, boss giving orders to go home. + [igossip] Al@Anarres II: bye X! drive safely. + [igossip] Al@Anarres II: don;t go rubber necking! + [igossip] Xyzzy: fuck that, im driving like theres NO TOMOROW. + [igossip] Xyzzy: nah, im takin back roads. + [igossip] Al@Anarres II: there might not be a tomorrow. + [igossip] Xyzzy: MIGHT even stop by parents... see if my dad keeps the gun-safe + locked... + [igossip] Xyzzy: kidding, of course. + [igossip] Xyzzy: ok, see y'all later. + [cre] Xyzzy waves. + [announce] Xyzzy has left Frontiers. + [cre] Cratylus waves. + /wiz/cratylus # [igossip] Musashi@Sumu: perfect time to go raiding ;) + [igossip] Blue@Inon-Net: I hear a rumour that Capitol Hill has not been + attacked after all. + [igossip] Skullslayer@RoD: I have a rumour a second explosion at the pentagon + [igossip] Al@Anarres II: I have a rumour that they are gonna fly nto the statue + of liberty. + [igossip] Tarl@Alsherok: blue: it wasn't. it was a car bomb at the state dept. + [igossip] Tarzan@Darkland: UN (NY) evacutated. + [igossip] Skullslayer@RoD: the pentagon webcam shows a much bigger cloud of + smoke now + [igossip] Blue@Inon-Net: NEWSFLASH: smoke expands. + [igossip] Tarl@Alsherok: reputedly also a large plane crash SE of pittsburgh, + not sure if its related or not, and don't know if its real or not. + [igossip] Tea@Nanvaent: where's the pentagon webcam? + [igossip] Musashi@Sumu: + http://www.washingtonpost.com/wp-srv/mmedia/webcams/eyeondc.htm. + [igossip] Tea@Nanvaent: cheers. + [igossip] Skullslayer@RoD: ronald reagan buliding evacuated + [igossip] Skullslayer@RoD: confirmed hit in pittsburgh + [igossip] Cratylus: so...uh...the two buildings are completely gone, then? + /wiz/cratylus # [igossip] Tarzan@Darkland: whats in Pittsburgh? + [igossip] Styxx@OuterSpace nods. + [igossip] Skullslayer@RoD: north of the airport, somerset county + [igossip] Skullslayer@RoD: rumour - all planes approaching DC will now be shot + down + [igossip] Skullslayer@RoD: the plane approaching DC was shot down? + [cre] Zaphod: shit man. + [igossip] Leto@Earth: http://robots.cnn.com/ and http://asian.cnn.com still + work. + [igossip] Spoo@Nanvaent: http://www.sky.co.uk is relatively lively still as + well. + [igossip] Bayard@Nanvaent nods. + [igossip] Skullslayer@RoD: asia.cnn.com is still up, but it hasn't been updated + in 2 hours that I can see + [igossip] Leto@Earth: ah. + [igossip] Leto@Earth: so what's the stuatus? + [igossip] Sinistrad@VargonMUD: middleeast.cnn.com reports, "Imperialist Scum + Taught A Lesson" + [igossip] Skullslayer@RoD: rumour of another plane is a few mins out from DC, + after the last one was shot down + [igossip] Spoo@Nanvaent: fuck off Sinistrad. + [igossip] Leto@Earth: 7 planes hijacked? + [igossip] Sinistrad@VargonMUD: nya nya, nya nya nya. + [igossip] Leto@Earth: one failed in pitsburg? + [igossip] Musashi@Sumu: that DC-bound jet was shot down? That confirmed? + [igossip] Sinistrad@VargonMUD: That was Air Force 1! + [igossip] Skullslayer@RoD: yeah, one down in pittsburgh, just north of the + airport + [igossip] Spoo@Nanvaent: seems so, 1 may have been shot down near Pittsburgh. + the other still flying near Dulles it would seem, other 5 either crashed or + landed. + [igossip] Hekubah@Annwn: What's happened in Chicago? + [igossip] Skullslayer@RoD: I had a few players here confirm the shoot down + [igossip] Spoo@Nanvaent: Sears tower evacuated. Israelis have shutdown ALL + their embassies. + [igossip] Lightfoot@VargonMUD: I'm unabvle to get to cnn.com. + [igossip] Hekubah@Annwn: Woah. + [igossip] Hekubah@Annwn: reuters isn't working... + [igossip] Isis@Mystic: Me either. Or Fox News. + [igossip] Isis@Mystic: Someone in the office is sreaming BBC. + [igossip] Isis@Mystic: Er, streaming. + [igossip] Lightfoot@VargonMUD: what about it? + [igossip] Hekubah@Annwn has BBC on the TV... + [igossip] Al@Anarres II: Isis - the BBC is fubared. + [igossip] Spoo@Nanvaent: yeah, we have our own stream of N-TV. + [igossip] Skullslayer@RoD: cnn, abcnews, msnbc and a few other big news sites + are all down + [igossip] Spoo@Nanvaent: we are getting CNN live feed. + [igossip] Isis@Mystic: FoxNews too. + [igossip] Skullslayer@RoD: bbc seems to be still up, but a bit behind + [igossip] Tea@Nanvaent: http://news6.thdo.bbc.co.uk/ + [igossip] Sinistrad@VargonMUD: DIE, IMPERIALIST SCUM! + [igossip] Sinistrad@VargonMUD: HAH! + [igossip] Skullslayer@RoD: rumour of crash into camp david + [igossip] Isis@Mystic: Sinis, I love you. + [igossip] Sinistrad@VargonMUD: I know. + [igossip] Musashi@Sumu: remember sinistrad, much as you hate the + 'imperialists', someone hates your beliefs just as much.. you deserve to die + too? + [igossip] Sinistrad@VargonMUD: Honey, it's funny that people are always + laughing at the misfortunes of others on this channel - now those same people + are all, "dude, be more sensitive" + [igossip] Teny@Mystic: D.C Streets are one big traffic Jam. + [igossip] Spoo@Nanvaent: pretty much not a joking matter. + [igossip] Musashi@Sumu: misfortunte != death. + [igossip] Musashi@Sumu: -t. + [igossip] Al@Anarres II nods at Spoo + [igossip] Sinistrad@VargonMUD: Go be righteous somewhere else. When it's not + affecting you, you're the ruelest bunch of assholes ever. + [igossip] Sinistrad@VargonMUD: Now it's your turn. HAH!!! DIE GRINGOS!! + [igossip] Spoo@Nanvaent: not affecting you either, so be completely tasteless + some other time. + [igossip] Sinistrad@VargonMUD: No. + [igossip] Al@Anarres II: hey Sini, this doesnt affect me, but it does affect + alot of ppl. + [igossip] Musashi@Sumu: shrugs, I'm not American, but I'm still not gonna laugh + at people dying. + [igossip] Al@Anarres II: there are like 50,000 ppl working in the WTO. + [igossip] Spoo@Nanvaent: I ain't laughing because this is only the start of the + bloodletting. + [igossip] Sinistrad@VargonMUD: Not any more! + [igossip] Lightfoot@VargonMUD: more like 75K. + [igossip] Skullslayer@RoD: plus all the people in the surrounding buildings + [igossip] Lightfoot@VargonMUD: people were jumping out of the building for over + 1/2 hour. + [igossip] Al@Anarres II: [flap] Iain: itn reporting 100 tousand dead in new + york. + [igossip] Sinistrad@VargonMUD: Where were you guys when 80K Hindis died of + starvation last year? Did you care? No, you laughed at the hungry brownies. + [igossip] Spoo@Nanvaent: in case you hadn't noticed the madmen have just fucked + off the USA, NATO and the Israeli's. + [igossip] Leto@Earth: 100.000 ? + [igossip] Iain@Anarres II: 100k people. + [igossip] Spoo@Nanvaent: well fuck you for being so consciencious, yeah I care, + I don't find it funny either. + [igossip] Iain@Anarres II: lots of them firefighters/police. + [igossip] Sinistrad@VargonMUD: "Whine whine, now it's hurting us directly, + please don't laugh.. please forget that I used to laugh at you when you were + down, now it's about me and I'm more important." + [igossip] Lightfoot@VargonMUD: I live on Long Island, firefighters and police + were called into the city. + [igossip] Lightfoot@VargonMUD: all bridges and tunnels to NYC are closed. + [igossip] Al@Anarres II: swim! + [igossip] Al@Anarres II: how are they getting ppl out ? + [igossip] Lightfoot@VargonMUD: they are not. + [igossip] Sinistrad@VargonMUD: With straws. + [igossip] Spoo@Nanvaent: both the towers are basically piles of burning rubble, + unlikely to be any survivors in that. + [igossip] Ebony@Earth: I heard a witness say he worked on the 36th floor and + they got out ok. + [igossip] Ebony@Earth: they had 1/2 an hour before the collapse. + [igossip] Spoo@Nanvaent: 1st or 2nd tower? + [igossip] Hellmonger@Trilogy: http://www.shef.ac.uk/cs1xtc/sa/planewtc.jpg. + [igossip] Ebony@Earth: 69 ppl on the plane that flew into the wtc. + [igossip] Lightfoot@VargonMUD: both towers are gone. + [igossip] Hellmonger@Trilogy: no doubt. + [igossip] Ebony@Earth: first tower, they started leaving right after they saw + the 2nd plane. + [igossip] Lightfoot@VargonMUD: 2nd plane hit 18 mins after first. + [igossip] Hellmonger@Trilogy: Vote Yes to Proposition 37 "Systematic Ethnic + Clensing of America" + [igossip] Sinistrad@VargonMUD: "Leave only the injuns" + [igossip] Spoo@Nanvaent: what, you mean America will belong to the natives + again? + [igossip] Shandor@Bakhara: just the mexicans. + [igossip] Hellmonger@Trilogy: Leave only the whites, the blacks, and the + mexicans. + [igossip] Hellmonger@Trilogy: cuz everybody else is out to fucking get us. + [igossip] Lightfoot@VargonMUD: boston is very close, right across the LI sound. + [igossip] Ebony@Earth: 2 planes, carrying approx 80 passengers each.. + [igossip] Ebony@Earth: unsure which they were. + [igossip] Spoo@Nanvaent: seems they just shot down the 2nd plane as well. + [igossip] Spoo@Nanvaent: the one near Dulles. + [igossip] Sinistrad@VargonMUD: Shit, HM's link made me bust a gut! + [igossip] Vraxor@Split Infinity: how do you know? + [igossip] Sinistrad@VargonMUD: You rule, HM. =) + [igossip] Skullslayer@RoD: rumour of a bomb in a school near the WTC + [igossip] Hellmonger@Trilogy: no doubt. + [igossip] Al@Anarres II: nice to see students at shefield are back, hard at + work ;) + [igossip] Skullslayer@RoD: plane inbound to chicago + [announce] Xyzzy enters Frontiers. + [igossip] Xyzzy: i dont know if yer keeping up on current events, but we just + got our ASSES kicked back there! + [igossip] Sinistrad@VargonMUD: http://www.shef.ac.uk/cs1xtc/sa/planewtc.jpg. + [igossip] Hekubah@Annwn: Another plane? + [igossip] Bayard@Nanvaent: the first joke picture :) + [igossip] Sinistrad@VargonMUD: That's not a joke. + [igossip] Xyzzy: thats fucked up. + [igossip] Bayard@Nanvaent: buh? + [igossip] Vashkar@Split Infinity: ummm.. that looks like nice photoshop work, + Sinistrad. + [igossip] Xyzzy: jeez, fuck the fox network... "apparent terrorist attacks..." + [igossip] Sinistrad@VargonMUD: Reality always looks so fake, doesn't it? + [igossip] Izzy@VargonMUD: "This just in, JFK shot." + [igossip] Musashi@Sumu: NBC just reported bomb gone off in NYC Highschool. + [igossip] Xyzzy: WE GOT A MAN ON TH MOON?! + [igossip] Presto@Discworld: yeah, it was obviously a big fucking coincidence. + [igossip] Xyzzy: fox investigative news. + [igossip] Xyzzy: at work. + [igossip] Musashi@Sumu: FAA say several planes still unaccounted for. + [igossip] Presto@Discworld: This just in: Jimmy Hoffa still missing. Police are + baffled. + [igossip] Xyzzy: plane crash 80 miles SE of pittsburg. + [igossip] Xyzzy: holy shit, footage of the WTC collapsing. + [igossip] Presto@Discworld: American Air confirms two flights down, United at + least one (the Pittsbhrugh one) + [igossip] Al@Anarres II: well done Xyzzy, do catch up. + [igossip] Al@Anarres II: which was the dullus one? + [igossip] Xyzzy: gee, its almost as if i havent had a TV at work for th last + two hours. + [igossip] Vashkar@Split Infinity: the only thing slightly amusing is that I + swore to myself that I'd never set foot in the WTC again.. then seconds later, + one collapses..then the other. + [igossip] Bayard@Nanvaent: you've had i3 though. and it's all been mentioned on + here. + [igossip] Xyzzy: its all YOUR fault, vash. + [igossip] Xyzzy: no, im SEEING the collapse for th first time. + [igossip] Vashkar@Split Infinity: sorry, I don't claim responsibility for the + deaths of tens of thousands today. + [igossip] Blue@Earth: you should, get your place in the queue. + [cre] Cratylus: whad i miss? + /wiz/cratylus # [igossip] Xyzzy: no one ever told us terrorist could be organized. + [igossip] Xyzzy: is that fair? + [cre] Xyzzy: dunno, i just got home. + [cre] Zaphod: westconn just got bombed. + [cre] Cratylus: no. + /wiz/cratylus # [igossip] Al@Anarres II: is this the largest terrorist attack ever? + [cre] Cratylus: they installed antiarircraft batteries on the ice rink and + patriot garage. + /wiz/cratylus # [cre] Cratylus: i just saw em. + /wiz/cratylus # [cre] Zaphod: ah. + [igossip] Xyzzy: heh, on cnn, "america under attack", all red white n blue + fonts n stuff. + [cre] Zaphod: cool. + [igossip] Bayard@Nanvaent: easily. + [igossip] Sinistrad@VargonMUD: Shit. Now my Flight Simulator NYC edition is + outdated. =( + [igossip] Al@Anarres II giggles + [igossip] Xyzzy: expansion pack. + [igossip] Bayard@Nanvaent: equally, how do u define a terrorist attack. this + might not be a terrorist attack. + [igossip] Hekubah@Annwn: Might be an act of war? + [igossip] Bayard@Nanvaent: could end up being defined as an opening move in a + war. + [cre] Zaphod: few. + [cre] Zaphod: phewww. + [igossip] Xyzzy: oh yeah, fergot, it might just be a wacky coincidence. + [cre] Zaphod: my package made it out of newark. + [igossip] Vashkar@Split Infinity: well, it wasn't a bunch of drunks, Bayard. + [igossip] Iain@Anarres II: sick puppy sini ;-) + [igossip] Xyzzy: hmm, good point, bayard. + [igossip] Xyzzy: GIT MAH GUN! + [igossip] Lightfoot@VargonMUD: were at defcon 5! + [igossip] Xyzzy: yer MOM is at defcon5 + [igossip] Sinistrad@VargonMUD: Hey, more people died right now than in Pearl + Harbor. + [igossip] Bayard@Nanvaent: but, the style of attack will prolly mean it's a + terrorist attack that started a war in history books. + [igossip] Xyzzy: what, you got a death-count goin, sini? + [igossip] Bayard@Nanvaent: s'diff than pearl harbour or czechoslovakia. + [igossip] Lightfoot@VargonMUD: shut up dick. + [igossip] Vashkar@Split Infinity: please someone ban Xyzzy. + [igossip] Spoo@Nanvaent: WW 1 was started because of a terrorist attack that + killed 1 person. + [igossip] Bayard@Nanvaent nods. + [igossip] Xyzzy: please someone suck my dick. + [igossip] Sinistrad@VargonMUD: Xy, 50K+ people worked in the towers. + [igossip] Sinistrad@VargonMUD: How many people died at Pearl Harbor? + [igossip] Cratylus watches in amusement as Vashkar greedily gobbles Xyzzy's + knob. + /wiz/cratylus # [igossip] Vashkar@Split Infinity: Vrax@SI says there was 10k in each tower, + approximately, at the time. + [igossip] Xyzzy: what, like i work for th navy or something, sini? + [cre] Zaphod: my packge drove right through ny just before this. + [cre] Cratylus: yer motherboard? + /wiz/cratylus # [cre] Xyzzy: a little... coincidental. + [igossip] Spoo@Nanvaent: less than 2k people were killed at PH. + [igossip] Vraxor@Split Infinity: that's what the guy who owned the tower said. + [cre] Zaphod: this one is my video card. + [cre] Zaphod: mb just left la. + [cre] Zaphod: maybe it's been hijacked. + [igossip] Xyzzy: that tower was 0WN3D. + [igossip] Ebony@Earth: You have to account for tourists in the towers too. + [igossip] Vraxor@Split Infinity: and the people in the planes. + [cre] Zaphod: now I REALLY don't feel like going to the office. + [32m[igossip] Xyzzy: shoot, none of this is gonna drive up memory prices, will it? + [cre] Zaphod: buy it quick. + [igossip] Spoo@Nanvaent: automatic if the pres is in AF1 + [cre] Zaphod: WTC attack sale! + [igossip] Xyzzy: heard on radio: military air coverage over DC. + [igossip] Musashi@Sumu: ok, of the two planes to hit the towers, one was out of + boston, 81 passengers, 11 crew, one was out of washington, 58 passengers, 6 + crew. + [cre] Zaphod: cheech sent an email saying pahts delivery will be screwy. + [igossip] Lightfoot@VargonMUD: there are tomcats flying around NYC. + [igossip] Xyzzy: thanks for th numbers, musashi. + [cre] Cratylus: AHAHAH. + /wiz/cratylus # [cre] Cratylus: i fucken BET. + /wiz/cratylus # [igossip] Xyzzy: i knew id never regret hiring you as my accountant. + [igossip] Cratylus: i cant wait til we fuckin nuke the shitbags from orbit. + /wiz/cratylus # [igossip] Zaphod: 9/11 + [igossip] Xyzzy: its th only way to be sure. + [igossip] Dasquian@Discworld: You idiot. + [igossip] Musashi@Sumu: spam incoming, this from CNN. + [igossip] Musashi@Sumu: United Airlines Flight 93 airliner headed from Newark, + New Jersey, to San Francisco, crashed near Somerset, Pennsylvania -- police + said initial reports indicated no survivors. It was not known if this was + connected to the attacks. United also said it was "deepl. + [igossip] Xyzzy: DEEPL?!?! + [igossip] Xyzzy: NOOOOOOO!!!!!! + [igossip] Musashi@Sumu: ________________23:43 + [igossip] Musashi@Sumu: hm, sec :P. + [igossip] Musashi@Sumu: United also said it was "deeply concerned" about Flight + l75 from Boston to Los Angeles. + [igossip] Lightfoot@VargonMUD: it's said that crash in penn was from captain + crashing plane when he knew what was going on and he was being hi-jacked. + [igossip] Xyzzy: Am Airlines siad theyve "lost" two flights. + [igossip] Sinistrad@VargonMUD: And they know that throgh the ouija board, + Danny? + [cre] Zaphod: today is 9/11 + [igossip] Xyzzy: WELL, DANNY?! + [igossip] Lightfoot@VargonMUD: I'm sure the radios were working. + [igossip] Xyzzy: oh, yer "sure" + [igossip] Vashkar@Split Infinity: + http://us.news2.yimg.com/dailynews.yahoo.com/h/nm/20010911/ts/crash_tradecenter + _binladen_dc_1.html. + [igossip] Lightfoot@VargonMUD: shut up dick. + [igossip] Vashkar@Split Infinity: they say bin laden warned of the attack 3 + weeks ago. + [cre] Zaphod: call paul. + [igossip] Sinistrad@VargonMUD: Wow. + [cre] Cratylus: ya. + /wiz/cratylus # [igossip] Vashkar@Split Infinity: saying it was cause of US supporting israel. + [igossip] Xyzzy: yknow, i think what we really need now is a verbal fight on i3 + [igossip] Shandor@Bakhara: your mom tastes like chicken and your dad smells of + a russian tea room. + [igossip] Xyzzy: HEY, now. + [igossip] Xyzzy: lets keep it civil. + [igossip] Cratylus: eldeberries, you fool. + /wiz/cratylus # [igossip] Sinistrad@VargonMUD: ``Personally we received information that he + planned very, very big attacks against American interests. We received several + warnings like this. We did not take it so seriously, preferring to see what + would happen before reporting it.'' + [igossip] Cratylus: smelt of em. + /wiz/cratylus # [igossip] Shandor@Bakhara: windows sucks! RH linux is the top of them all. + [igossip] Sinistrad@VargonMUD: "He told us he was gonna do it, but we wanted to + see what he was gonna do before we told anybody." + [cre] Zaphod: cute. + [igossip] Xyzzy: we called his bluff, alright. + [igossip] Shandor@Bakhara: who says that, sini? + [cre] Zaphod: he told me to stay home. + [igossip] Hellmonger@Trilogy: I hear the arabs in San Fran are celebrating the + attacks. Somebody go kill them all. + [igossip] Sinistrad@VargonMUD: NOW YOU KNOW. + [cre] Cratylus: ya. + /wiz/cratylus # [cre] Zaphod: you heard him. + [igossip] Sinistrad@VargonMUD: That link Vash gave out. + [cre] Cratylus: stamford is prolly a panicky madhouse. + /wiz/cratylus # [cre] Zaphod: no doubt. + [igossip] Xyzzy: and knowing's half th battle! + [cre] Zaphod: and I've got CABLE. + [igossip] Spoo@Nanvaent: hell, the Arabs are going to give someone some target + practice if they don't fuck off. + [igossip] Shandor@Bakhara: half of our IT department is made of arabs. I + wouldn't want to be them right now. Although, this is a mall city. + [igossip] Xyzzy: mall city? like, with shops n stuff? + [igossip] Cratylus: made of crabs? what? + /wiz/cratylus # [igossip] Spoo@Nanvaent: it ain't really the Arabs anyway, just a completely + mad bunch of lunatics who want to take us back the the dark ages. + [igossip] Cratylus: the republicans? + /wiz/cratylus # [igossip] Xyzzy: like i said, i think its in the rulebook that theyre not + allowed to be so organized and effective. + [igossip] Sinistrad@VargonMUD: That movie with Denzel Washington and Bruce + Willis starts out with a lot of terrorist attacks. That is NOTHING compared to + this. + [igossip] Vashkar@Split Infinity nods. + [igossip] Cratylus: i bet the french are all like "serves em right, bourgeois + pigs" + /wiz/cratylus # [igossip] Spoo@Nanvaent: makes Tom Clancy look tame too. + [igossip] Lightfoot@VargonMUD: cnn back up. + [igossip] Cratylus: i think they got lucky. you couldnt *really* expect those + fucking buildings to drop from plane hits. + /wiz/cratylus # [igossip] Spoo@Nanvaent: they were rather large ones. + [igossip] Lightfoot@VargonMUD: Bush calls trade center crashes terrorist act. + [igossip] Cratylus: large buildings. + /wiz/cratylus # [igossip] Lightfoot@VargonMUD: you think? + [igossip] Sinistrad@VargonMUD: Thanks, Danny. + [igossip] Vashkar@Split Infinity: in today's day n' age, it's not hard to be a + competent terrorist. It's like Osama bin Laden went to a tech institute or + something. + [igossip] Spoo@Nanvaent: large aircraft. + [igossip] Cratylus: fat asses. + /wiz/cratylus # [igossip] Steve@Anarres II: um.. they knew where to hit them to have best + chance of toppling them.. + [igossip] Spoo@Nanvaent: cnn.com is breaking under the strain again. + [igossip] Xyzzy: this just in: i hafta pee. + [igossip] Cratylus: ok, master terrorist. + /wiz/cratylus # [igossip] Zaphod: ooo ooo Tom Clancy's on cnn! + [igossip] Sinistrad@VargonMUD: He's the authority, I bet! + [igossip] Cratylus: that does it. im playing half life. screw this. + /wiz/cratylus # [igossip] Xyzzy: hes written books n stuff! + [igossip] Xyzzy: just like smack! + [igossip] Spoo@Nanvaent: prolly complaining that the bastards stole his idea. + [igossip] Steve@Anarres II: part-way up near the top.. you prolly won't get + them immediately, but fire will weaken the structure and the top will fall + cruching the rest of the building.. + [igossip] Xyzzy: cool, Dexter's Laboratory on cartoon network. + [igossip] Spoo@Nanvaent: yeah, the steel skeleton would weaken, concrete and + facade wouldn't hold the weight. + [igossip] Spoo@Nanvaent: it appears there was a secondary explosion in the + first tower to go down too. + [igossip] Blue@Inon-Net: I think the WTC buildings had their skeleton on the + outside; but don't hold me to that. + [igossip] Sinistrad@VargonMUD: So it wasn't just the planes? + [igossip] Xyzzy: yeah! lets speculate on the various ways these people died + today! + [igossip] Vashkar@Split Infinity: Spoo, they're thinking it was the plane's + fuel tank exploding. + [igossip] Steve@Anarres II: they showed ppl diving outa windows on the news.. + that's sick.. + [igossip] Spoo@Nanvaent: was quite a way down from the impact site. + [igossip] Spoo@Nanvaent: could well have been though. + [igossip] Al@Anarres II nods at Spoo + [igossip] Al@Anarres II: I think we just have to wait and see. + [igossip] Vashkar@Split Infinity: yeah, I was questioning the logistics of that + guess also. + [igossip] Al@Anarres II: if the top, above the crash site, fell down, even just + 1meter, the energy would be enough to crumble the steel below. + [igossip] Spoo@Nanvaent: thats what happened with the second tower. + [cre] Zaphod: shit. + [igossip] Al@Anarres II: it might have crumbled many stories down, making it + look like an explosion below the crash site. + [igossip] Spoo@Nanvaent: roof went, took the rest with it. + [cre] Zaphod: I bet the coffee I ordered don't get sent out. + [igossip] Al@Anarres II: yeah, common :( + [cre] Xyzzy: always thinkin of yerself. + [igossip] Al@Anarres II shuts up about civil engineering and goes back to + hacking sendmail + [cre] Zaphod: well, I need my coffee. + [igossip] Boltthrower@Styx: apparently the roof-collapse scheme works better + than the basement-bomb thing did :( + [igossip] Spoo@Nanvaent: nah, there was a clear fireball shortly before the + first collapse (and I saw that live so no, it wasn't a plane) + [igossip] Xyzzy: how about the "fly a few hundred tons of metal into the + building" scheme? + [igossip] Isis@Inon-Net: Yeah, I saw it too just before I left for work. + [igossip] Spoo@Nanvaent: 737 and a 767, couple of hundred tonnes each. + [igossip] Hellmonger@Trilogy sets an arab on fire. + [igossip] Zaphod: camp david get hit? + [igossip] Vashkar@Split Infinity: close to camp david. + [igossip] Al@Anarres II: cool, HM, gulf-news.com is hosted nr you ;) + [igossip] Spoo@Nanvaent: lots of momentum to damage the buildings, the second + aircraft blew right through the tower too. + [igossip] Xyzzy: can you imagine how dark it could be in manhattan right now? + [igossip] Lightfoot@VargonMUD: that one was shot down. + [igossip] Spoo@Nanvaent: what, at midday? + [igossip] Xyzzy: yes. + [igossip] Xyzzy: with all the smoke. + [igossip] Spoo@Nanvaent: not very then. + [igossip] Xyzzy: well, i guess you CAN imagine it, then. + [igossip] Zaphod: 8 hijacked planes still in the air? + [igossip] Xyzzy: but for how long.... + [igossip] Xyzzy: HOW LONG!?! + [igossip] Vashkar@Split Infinity: where'd you hear 8, Zaphod? + [igossip] Xyzzy: hes just makin shit up, now. + [igossip] Ebony@Earth: Its not that dark. + [igossip] Hellmonger@Trilogy: I heard 8 total planes. + [igossip] Hellmonger@Trilogy: and we've already found some of them. + [igossip] Lightfoot@VargonMUD: 5 floors in pentagon have collapased. + [igossip] Ebony@Earth: Not unless you where wtc was. + [igossip] Hellmonger@Trilogy: we found 2 in the trade center, one in the + pentagon... \ + [igossip] Xyzzy: HM AM FUNNYMAN! + [igossip] Spoo@Nanvaent: Brits have lost contact with 2 aircraft as well. + [igossip] CyberTiger@Anarres II: s/found/happened to notice/ + [igossip] Xyzzy: wtf, some dude disassembling a pistol on CourtTV, sayin how + easy it could be to blah blah blah. + [igossip] BarWench@Inon-Net: ;nods. + [igossip] Al@Anarres II: have we Spoo? where you hear that? + [igossip] Hellmonger@Trilogy: So is Bin laden a palestinian or a jew? + [igossip] Smack@Lima Bean: what aircraft? + [igossip] Smack@Lima Bean: my father is on a flight from london to new york. + [igossip] Hellmonger@Trilogy: It says 'Islamic Fundamentalist', which is like a + palestinian, right? + [igossip] Smack@Lima Bean: bin laden is saudi. + [igossip] Hellmonger@Trilogy: He'll be landing in canada. :( + [igossip] Pam@Split Infinity: They're evacuating some of the taller buildings + in London, according to MSNBC. + [igossip] Smack@Lima Bean: he is a rich, eccentric saudi. + [igossip] Xyzzy: look out, hellmonger is gunnin for SOMEone. + [igossip] Tea@Nanvaent: canada is all closed too i thought? + [igossip] Hellmonger@Trilogy: I'm down to kill me some arabs now. + [igossip] Hellmonger@Trilogy: And some happy palestinians. + [igossip] Smack@Lima Bean: we must declare war against Afghanistan. + [igossip] Hellmonger@Trilogy: Need to be set on fire. + [igossip] Hellmonger@Trilogy: why afghanistan? + [igossip] Sinistrad@VargonMUD: Why not? + [igossip] Hellmonger@Trilogy: Valid point. KILL EM ALL! + [igossip] Smack@Lima Bean: afghanistan has been housing bin laden for years. + [igossip] Smack@Lima Bean: they refuse to turn him over. + [igossip] Megaboz@Lima Bean: I just have this feeling that bush is going to do + something stupid. + [igossip] Ebony@Earth: Third plane ahs crashed in pentagon. + [igossip] Hellmonger@Trilogy: I'm all about letting them know whats up. Take + the afghan royal family or whatnot. And cook them on a spit. + [igossip] Smack@Lima Bean: do something stupid like what? + [igossip] Hellmonger@Trilogy: Like what? + [igossip] Hellmonger@Trilogy: Like starting to kill people? + [igossip] Hellmonger@Trilogy: The american people want revenge. + [igossip] Smack@Lima Bean: if he nuked them, I would be only mildly distubed. + [igossip] Megaboz@Lima Bean: nuked was the thing I was going for. + [igossip] Spoo@Nanvaent: which bastard stopped development of the neutron bomb, + perfect time to test it. + [igossip] Xyzzy chants: "NUKE! NUKE! NUKE!" + [igossip] Hellmonger@Trilogy: I would'nt really be phased. I'd like to see the + middle east as a field of glass. + [igossip] Smack@Lima Bean: so how many planes have crashed so far? 5? 6? + [igossip] Musashi@Sumu: Ebony, that 3rd plane in the pentagon confirmed? + [igossip] Sinistrad@VargonMUD: 5. + [igossip] Sinistrad@VargonMUD: Three on target, two off target. + [igossip] Hellmonger@Trilogy: I think bombing them would be cool. + [igossip] Spoo@Nanvaent: hard to tell really, web sites are all choked. + [igossip] Xyzzy: jeez, how many damn kids did the Waltons have? + [igossip] Hellmonger@Trilogy: 7. + [igossip] Hellmonger@Trilogy: all worth around 17-18 bil. + [igossip] Smack@Lima Bean: my understanding is 2 into thw world trade center, 2 + into the pentagon, and one outside pittsburgh. + [igossip] Hellmonger@Trilogy: right. + [igossip] Sinistrad@VargonMUD: Only 1 into the pentagon. + [igossip] Isis@Inon-Net: And one in Sommerset PA as well. + [igossip] Musashi@Sumu: reading in a few places of a 3rd into the pentagon + though. + [igossip] Sinistrad@VargonMUD: 1 outside pitts, 1 recently confirmed outside + Sommerset. + [igossip] Hellmonger@Trilogy: Thats outside pitts. + [igossip] Smack@Lima Bean: sommerset == pitssburgh. + [igossip] Smack@Lima Bean: oh, yeah,and the air force shot one down outside + camp david. + [igossip] Hellmonger@Trilogy: a third plane intot he pentagon? + [igossip] Futility@UOSSMUD: The one in Somerset is the one near pittsburgh. + [igossip] Hellmonger@Trilogy: Really? + [igossip] Sinistrad@VargonMUD: "United Airlines Flight 93 airliner headed from + Newark, New Jersey, to San Francisco, crashed near Somerset, Pennsylvania -- + police said initial reports indicated no survivors. It was not known if this + was connected to the attacks. United also said it was "deeply concerned" about + Flight l75 from Boston to Los Angeles." + [igossip] Sinistrad@VargonMUD: On CNN, they just confirmed that 175 went down, + too. + [igossip] Xyzzy: deepl. + [igossip] Spoo@Nanvaent: so 3 shot down and 3/4 crashed. + [igossip] Hellmonger@Trilogy: We shot down three planes? + [igossip] Xyzzy: yeah, HM, score one for th good guys. + [igossip] Spoo@Nanvaent: there were 7 hijacked. + [igossip] Musashi@Sumu: from advfn: A third plane crashes near the Pentagon in + Washington DC. + [igossip] Smack@Lima Bean: where did 175 go down? + [igossip] Spoo@Nanvaent: well maybe not shotdown, hard to sort out the news + from the confused. + [igossip] Spoo@Nanvaent: WASHINGTON (Reuters) - Three hijacked planes crashed + into major U.S. landmarks on Tuesday, destroying both of New York's mighty twin + towers, hitting the Pentagon in Washington and plunging the United States into + unprecedented chaos and panic. + [igossip] Smack@Lima Bean: fucking kill them all. + [igossip] Blue@Inon-Net: now that Reuters has confirmed it, I'll stop worrying + that it was all US propaganda being parroted by CNN. + [igossip] Hellmonger@Trilogy: no doubt. + [igossip] Xyzzy: the adjective "mighty" brought to you at no extra charge. + [igossip] Hellmonger@Trilogy: I only know of three terrorist crashes, and one + United crash. + [igossip] Hellmonger@Trilogy: And whats up on 175? + [igossip] Sinistrad@VargonMUD: Two united crashes. + [igossip] Hellmonger@Trilogy: where did it crash? + [igossip] Smack@Lima Bean: the united crash is certainly a terorist thing. + [igossip] Smack@Lima Bean: probably the pilot taking it down to prevent + somethign evil. + [igossip] Hellmonger@Trilogy: I thought terrorists all capped off the pilots to + prevent them from fucking up the program? + [igossip] Spoo@Nanvaent: One of the planes that crashed into the World Trade + Center was American Airlines' Flight 11 from Boston to Los Angeles, said Lori + Bassani, spokesperson for American's flight attendants union. ; + [igossip] Smack@Lima Bean: someone said "fuck the terrorists" + [igossip] Sinistrad@VargonMUD: Yeah, I don't think any pilot would go, "Ok, + I'll crash this plane into the twin towers or he'll shoot me." + [igossip] Spoo@Nanvaent: www.reuters.com. + [igossip] Hellmonger@Trilogy: No doubt. YOu are going to die anyway. Fuck it. + I'd put that shit in the dirt. + [igossip] Smack@Lima Bean: I agree... but I bet on the one outside pittsburgh + was stoipped by someone. + [igossip] Xyzzy: hellmonger, you seem to be fairly well-versed in "hijacker + protocol" + [igossip] Xyzzy: something you wannatell us? + [igossip] Hellmonger@Trilogy: Common sense. + [igossip] Boltthrower@Styx: you online from a plane? + [igossip] Sinistrad@VargonMUD: Microsoft announced the release of a new version + of Microsoft Flight. + [igossip] Smack@Lima Bean: I just fear that bioterrorism is part of this. + [igossip] Smack@Lima Bean: that we have not even seen the worst yet. + [igossip] Sinistrad@VargonMUD: Microsoft announced the release of a new version + of Microsoft Flight Simulator today. The terrain has been updated in New York + so that two piles of rubble sit where the twin World Trade Center towers used + to stand. When asked how they had this updated version burned before the towers + were actually bombed Bill Gates responded "We like to be prepared for any + contingiency. This is a horrible tragedy and we grieve for the loss that people + are facing. We will donate .001% of all profits of this product to help the + families of those killed during this horrible event." Newly appointed Vice + President of Microsoft, Osama bin Laden added: "We'd also like to point out + that we have the only flight simulator on the market that has true to the day + updated terrain. If you want to own the most realistic up to date simulator, + you've got to buy ours." + [igossip] Spoo@Nanvaent: sorry, even I find that funny :) + [igossip] Sinistrad@VargonMUD: =) + [igossip] Xyzzy: and we all know how lousy a sense of humor spoo has. + [igossip] Spoo@Nanvaent: at least I have one Xy :) + [igossip] Musashi@Sumu: looks like the pentagon fire is under control. + [igossip] Xyzzy: WHEW! + [igossip] Xyzzy: what about these rumors of car bombings and capitol hill/ + state building/whitehouse, etc. + [igossip] Sinistrad@VargonMUD: Exhaust pipes going off. + [igossip] Musashi@Sumu: well, heard several reports of car bomb outside state + building. + [igossip] Spoo@Nanvaent: there was no bomb at the State Department. + [igossip] Musashi@Sumu: and one of a bomb in a nyc school. + [igossip] Blue@Inon-Net: english.pravda.ru. + [igossip] Spoo@Nanvaent: prolly someone hearing a backfire. + [igossip] Blue@Inon-Net: US DOLLAR ABRUPTLY FALLEN DOWN. + [igossip] Blue@Inon-Net: According to current bidding, US dollar has fallen + abruptly relative to the Euro and to Yena. American stock markets has not + started to work yet. Planes are in air to hamper the second plane. + [igossip] Xyzzy: ALL YOUR NEWS ARE BELONG TO US. + [igossip] Blue@Inon-Net: According to NPR John Hopkins, the USA have not need + to be considerate with the terrorists. + [igossip] Musashi@Sumu: laf. + [igossip] Spoo@Nanvaent: Manhattan island encircled by policemen. + [igossip] Blue@Inon-Net: Suicide pilots piloting two planes have practically + rammed two buildings of International Trade Centre at a height of 85th storey. + These two buildings are known to the whole world thanks to film 'King Kong'. + That are the buildings over which the big monkey was mounting. More detail... + [igossip] Xyzzy: holding hands. + [igossip] Spoo@Nanvaent: POPULATION FROM CENTRE OF CHICAGO EVACUATED. LONDON + PANIC STRICKEN; + [igossip] Xyzzy: hu uhuh uhu, you said "mounting" + [igossip] Musashi@Sumu: london is hardly panic stricken :P. + [igossip] Xyzzy: wait, LONDON panic stricken? + [igossip] Lightfoot@VargonMUD: king kong climbed the empire state building. + [igossip] Blue@Inon-Net: they mean the remake. + [igossip] Blue@Inon-Net: NEWSFLASH: King Kong to be remade again, new buildings + sought. + [igossip] Xyzzy: as opposed to the porn film, "King Dong", where he climbed + lightfoot's mother. + [igossip] Lightfoot@VargonMUD: fuck you dick. + [igossip] Spoo@Nanvaent: I think "have practically rammed 2 buildings" is an + understatement. + [igossip] Xyzzy: ACH! fook me dick! + [igossip] Xyzzy: well, it wasnt very IMpractical. + [igossip] Lightfoot@VargonMUD: I would love to kick the living shit out of a + little punk like you. + [igossip] Spoo@Nanvaent: "ADVENTURES OF AMERICAN RECONNAISSANCE AIRCRAFT R-3. + NOW IN RUSSIAN AIRSPACE;" + [igossip] Zaphod: whoa. + [igossip] Sinistrad@VargonMUD: Danny, I've seen you. You're the smallest + goddamn punk ever. + [igossip] Zaphod: qvc has suspended broadcasts. + [igossip] Zaphod: jesus. + [igossip] Spoo@Nanvaent: surely that should be "Now in Russian Cinemas" + [igossip] Xyzzy: and he doesnt mean overall height. + [igossip] Bayard@Nanvaent: no more qvc? diff -c -r --new-file ds2.0r18/lib/domains/town/txt/shame/chapter04 ds2.0r28/lib/domains/town/txt/shame/chapter04 *** ds2.0r18/lib/domains/town/txt/shame/chapter04 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/txt/shame/chapter04 Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,87 ---- + chapter 4 "Cratylus Has His Buttons Pushed" + + [02Dec2005-11:55:50] Jayren i didnt know that could be done. havening rooms or people like that. hi. + [02Dec2005-11:56:18] Cratylus ya, it's convenient for when you're deep in coding + [02Dec2005-11:56:28] Cratylus what's up? + [02Dec2005-11:56:40] Jayren and people like me wanna come by and do nothing except pester you. + [02Dec2005-11:56:56] Cratylus pestering is done on the cre channel + [02Dec2005-11:57:58] Jayren just came back to lister after quite a while of playing with ce pro over on smeghead. + [02Dec2005-11:58:21] Cratylus is that meaningful? + [02Dec2005-11:59:01] Jayren well, i learned more about ce pro. that's always good. learned unlike sound forge, ce pro is multitrack. + [02Dec2005-11:59:19] Cratylus ah, you're talking about your programs + [02Dec2005-11:59:37] Jayren does it mean anything for dslib, um no not really. + [02Dec2005-12:00:11] Cratylus well what you said sounded like this: "just came back to foo after quite a while of playing with bar over on baz" + [02Dec2005-12:01:05] Jayren so then bazically you are saying to cut it out. + [02Dec2005-12:01:13] Cratylus not really + [02Dec2005-12:01:34] Cratylus i'm just saying stop assuming i know what you're talking about unless we've discussed it before + [02Dec2005-12:02:30] Jayren all this lpc stuff makes about as much sense to me, and i thought we have discussed most of that before. i'm pretty sure i mentioned my machine names. + [02Dec2005-12:02:46] Cratylus ahhh so you're talking about programs and specifying machine names + [02Dec2005-12:03:20] Jayren lister and smeghead are machines. ce pro and sound forge are programs both for audio editing both run on windows. + [02Dec2005-12:04:14] Cratylus i'm sure that "lister", "ce pro", and "smeghead" are all obvious and meaningful to you. having mentioned them to me once in passing doesn't make it reasonable to expect me to remember them. do you want me to expect you to remember every file name i throw at you? + [02Dec2005-12:05:13] Jayren i've been told i have a decent memory. i'd give it a shot. + [02Dec2005-12:05:21] Cratylus smiles. + [02Dec2005-12:05:29] Cratylus it's a deal + [02Dec2005-12:06:45] Jayren remember though. being blind i hafta have a good memory. a good bit better than average. i hafta make and use mental maps all the time, in travel from one place to another or just locating a room in a building. + [02Dec2005-12:07:19] Cratylus that should make remembering what i tell you very easy + [02Dec2005-12:07:29] Cratylus i look forward to not having to repeat myself with you + [02Dec2005-12:08:12] Jayren *shrug* we'll see what happens. + [02Dec2005-12:08:20] Cratylus you don't sound so confident any more + [02Dec2005-12:10:06] Jayren there are 2 parts to memorization, acquisition and retension. the first part i'm not so hot at. though once i've retained something it can become part of a mental map. + [02Dec2005-12:11:39] Cratylus ok. so then you understand how it might be reasonable to expect me to forget the names of programs and computers that i do not use + [02Dec2005-12:12:07] Jayren heh. i was waiting for you to connect those. + [02Dec2005-12:12:23] Cratylus explain + [02Dec2005-12:12:59] Jayren phone. + [02Dec2005-12:13:03] Cratylus snorts. + [02Dec2005-12:13:41] Jayren what it really was the phone. + [02Dec2005-12:14:05] Cratylus i believe you + [02Dec2005-12:15:02] Jayren i guess because of my seizures i look a little differently at forgetting things than someone without. + [02Dec2005-12:17:16] Jayren once something is acquired, it takes a bit of time before it goes to relatively permanent storage though once its there there's a lot better chance it will remain. when i have a seizure everything in the acquisition buffer can go blip. + [02Dec2005-12:17:16] Cratylus remembering things takes energy. i dislike wasting energy on things that are of no relevance to what i want to do. if a thing is not relevant to me, it is discarded. the fact that we will be working on blindmode does not make it relevant to me which programs you use on what computers. i find it hard to imagine a circmstance where the name of your computer would have any effect on me whatsoever, except in the case of being challenged to remember it + [02Dec2005-12:19:49] Cratylus let me give you an example of how your statement might have been worded to add meaningfulness. + [02Dec2005-12:20:01] Jayren to give you an idea, i've still got maps in my head for my childhood house, which we left about 18 years ago if i've done the math right. i've got a map for the schools i attended. basically information i will never need again ever. + [02Dec2005-12:20:11] Cratylus "i came back to my favorite synthesizer program after plaing with a different one on my alternate computer" + [02Dec2005-12:21:01] Cratylus a statement like this is not only meaningful to a person who isn't you, but also suggests that your worldview isn't so limited that you expect people to remember every detail of your life that you provide once + [02Dec2005-12:22:42] Cratylus my own brain has various unusual advantages and disadvantages, but i manage to communicate with other people in a way that standardizes my perspective into something generally useful to others + [02Dec2005-12:23:04] Cratylus people appreciate the effort + [02Dec2005-12:24:42] Jayren at the same time, i might not emember something that happened last week because that event didn't get a chance to make it to the storage area and was still in the buffer between that and the outside world when i had a seizure. makes life interesting. still one good thing, i always get to met new people. + [02Dec2005-12:26:23] Cratylus you have adequately explained your problem. do you understand why your expectation was unreasonable? + [02Dec2005-12:38:06] Jayren and i don't expect people to remember what lister and smeghead and soundforge and ce pro are. i never claimed to expect that. if someone wants to know what any of these things are, then all they have to do is as and i'll tell them. just like forgetting something that has happened to me, i can forget what someone knows or more spcifically what i've told them. + [02Dec2005-12:39:17] Cratylus when you made a statement that included those names without context, it per se assumes an expectation that the listener knows what that is + [02Dec2005-12:39:39] Jayren i had no such assumption. + [02Dec2005-12:39:53] Cratylus why would you say things you don't expect another to understand? + [02Dec2005-12:40:17] Jayren if the listener didn't know and wanted to know, then asking would have worked. + [02Dec2005-12:41:09] Cratylus is it your habit to include out of context jargon in all your conversations? + [02Dec2005-12:42:50] Cratylus i mean, i'm picturing a person sitting at thanksgiving dinner, being asked by, say, an aunt about how things are going, and the person replying "just came back to lister after quite a while of playing with ce pro over on smeghead." + [02Dec2005-12:43:20] Cratylus is this sort of thing the way you generally do with people? + [02Dec2005-12:43:40] Jayren one thing this sort of mindset avoids is talking down to folks. for example. if someone asks me how to fix a problem and i tell them that there are several steps and give them those steps if that helps them great. i don't have to tell them what to click or whatever to tell them how to format the c: drive, i can just say format the c: drive. if they dont know they can say, how do i format the c: drive then i can say click on this and do whatever. + [02Dec2005-12:44:26] Cratylus i am a technical expert that deals with laymen all the time. this is why i understand how inappropriate it is to assume knowledge of jargon + [02Dec2005-12:45:04] Jayren i never claimed to be a people person. in fact i know i'm not. + [02Dec2005-12:45:23] Cratylus so you do understand that your expectation was unreasonable + [02Dec2005-12:45:57] Jayren i still submit i wasn't expecting you to know what any of those things were. + [02Dec2005-12:46:19] Cratylus then why on earth would you say that? do you want me to start disregarding your statements? + [02Dec2005-12:52:17] Cratylus the way i see it, there are two possibilities + [02Dec2005-12:52:49] Cratylus first: you did expect me to know what you were talking about, making you a narrow-minded and deeply self-centered person + [02Dec2005-12:53:45] Cratylus second: you did not expect me to know what you were talking about. this means the point of the statement was to make me ask you what you were talking about, which is pointless and rude. + [02Dec2005-12:54:25] Cratylus i suppose there is a third, which is that you didn't care one way or another. since this makes you an asshole, i more or less rules that out, but if the shoe fits. + [02Dec2005-12:59:03] Jayren let's examine those 1: did expect you. can eliminate this one already because i had no such expectation. 2: did not expect you to know. see note 1: above. and 3: i am an asshole. i really think that would be more appropriate if you had asked and i went and laughed and not told you. instead, i gladly told you what those elements were. don't think asshole fits either sorry. + [02Dec2005-12:59:21] Cratylus hmm + [02Dec2005-12:59:53] Cratylus ok, how about this, then + [02Dec2005-13:00:55] Cratylus a friend of mine and i go to lunch, have a good time, and we talk about stuff. i tell her that i'm working on a mudlib called dead souls, the driver of which is mudos, and which is running on a computer called frontiers. + [02Dec2005-13:01:56] Cratylus few days later we get back together. i tell her that frontiers needs a recompile of mudos for dead souls + [02Dec2005-13:02:42] Cratylus given that i only mentioned these names once, and that they have no relevance to her life, i think i can reasonably guess she won't know what i'm talking about + [02Dec2005-13:03:42] Jayren she might have a really good memory though and remember these things from the other day. + [02Dec2005-13:03:46] Cratylus if someone pauses life there, and asks me, "ok, now, you must guess. will she remember what a mudlib is, and its relationship to a mud and driver, and what frontiers is?" + [02Dec2005-13:04:12] Cratylus i have two buttons. on for "yes she will remember" and one for "no, she wont" + [02Dec2005-13:04:50] Cratylus given how irrelevant this knowledge is, the fact that it was mentioned once, and days have passed, during which her life went on, with her havingt to remember things that actually do matter... + [02Dec2005-13:05:04] Cratylus i would tend to guess no. she won't remember. that seems the most likely outcome + [02Dec2005-13:05:21] Cratylus it is *possible* she'll remember, but that is less likely + [02Dec2005-13:05:45] Cratylus therefore, i push the "no" button + [02Dec2005-13:05:53] Cratylus which button would you push? + [02Dec2005-13:05:59] Jayren you can't know if she will remember or not. you just have to be happy to explain if she asks you can't laugh and go 'i wont tell you.' + [02Dec2005-13:06:05] Cratylus which button would you push? + [02Dec2005-13:06:35] Jayren i wouldn't push either one. + [02Dec2005-13:06:45] Cratylus you are not being reasonable + [02Dec2005-13:06:53] Jayren or, i'd push both at once, just to fuck up the system. + [02Dec2005-13:06:53] Cratylus this discussion can have no further purpose + [02Dec2005-13:06:57] Cratylus goodbye + [02Dec2005-13:08:44] Jayren i think it did serve a purpose. i now understand what button you would press and why. and i've just explained why i wouldnt push either. diff -c -r --new-file ds2.0r18/lib/domains/town/txt/shame/chapter05 ds2.0r28/lib/domains/town/txt/shame/chapter05 *** ds2.0r18/lib/domains/town/txt/shame/chapter05 Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/txt/shame/chapter05 Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,934 ---- + chapter 5 "The Great Heat Radiation Debate, December 1999" + + Cast of Characters: + Cratylus, a self-righteous know-it-all UNIX engineer + Thorr, some high school kid + Hermogenes, a wiseacre aerospace computer scientist + + + Part I is seen through the eyes of Cratylus + in the same room as Hermogenes. During the conversation, + Thorr interjects some unrelated stuff through + the communications channel. + + Part II is again seen through the eyes of + Cratylus, but this time Hermogenes and Cratylus are + in different rooms, and communicate through + the channel. + + + PART I + ------ + + Hermogenes says, "Or whatever they call em." + Hermogenes asks, "But thats defined by the server?" + You say, "Its mudos dependent." + Hermogenes asks, "Like, number of cycles per second or something?" + You say, "Depends what parameters it was compiled with, and what gets passed to it in config and startup." + You say, "Yeah." + Hermogenes asks, "Yoou can set it to whatever you want?" + You say, "I imagine so." + Hermogenes says, "Like, i want 10 tics per second of processor time." + Hermogenes says, "Hmm." + Hermogenes asks, "Why couldnt My Big Game run similarly to a mud?" + Frontiers has been up for 2w 6d 5h 10m 37s. + You say, "I dont really understand your question." + Hermogenes says, "In my game thing..." + -------------------------------------------------------------------------- + 4 people in current sort Eastern time: Mon Dec 27 14:24:40 1999 + -------------------------------------------------------------------------- + 253 D - Cratylus sun-barr.Sun.CO ~cratylus/workroom + 100 D - (Frontiers) cv ~frontiers/workroom + 24 D - Hermogenes macpub800.gsfc. ~cratylus/workroom + 2 h - Thorr sailor.lib.md.u ^campus/room/wiz_loung + -------------------------------------------------------------------------- + Frontiers + Hermogenes says, "Could i just have the server listening for commands..." + Hermogenes asks, "And stuff happens in 'tics'?" + You say, "You tell me." + Hermogenes says, "YEAH." + Hermogenes says, "I WILL." + You say, "Heh." + Hermogenes says, "Yeah." + Hermogenes says, "Doin it." + You say, "Yeah." + You say, "Doin it." + Hermogenes says, "Iiiiii saw YOU." + Hermogenes says, "Im almost tempted to listen to that right nw." + Hermogenes wants to know the diff between convection, conduction, and radiation + Hermogenes exclaims, "NnnnnNNNNNOW!!!" + You say, "Hmm." + Hermogenes takes off his shoe and starts banging it on the table + You say, "Convection is about temperature-related airflow." + Hermogenes says, "Classic stalin." + Hermogenes says, "Or lenin." + You say, "Kruschev." + Hermogenes says, "Ohhh yeah." + Hermogenes says, "I think some older guy did it, too." + Hermogenes says, "Aaanyways." + Hermogenes asks, "Convection is ONLY concerned with gaseous heat transfer?" + You say, "Prolly not." + Hermogenes says, "B'oh." + You say, "I imagine liquids have similar properties." + Hermogenes says, "I could ask on IG..." + Hermogenes says, "But i dont wanna know THAT bad." + You ask, "Why not look it up?" + Hermogenes says, "Pfah." + Hermogenes says, "Thats yer answer to EVERYthing." + You say, "Heh." + Hermogenes says, "Shoot." + Hermogenes says, "Im so used to stopping the initial loading of my homepage." + Hermogenes says, "But this time i WANTED it." + Hermogenes says, "Heh, this keychain has a y2k countdown timer on it..." + You say, "Anyways convection currents are useful knowledge to aviators and boat people." + Hermogenes says, "Only 4 days left on it." + Hermogenes says, "E has a convection oven..." + You say, "Vultures can ride "thermals" for hours without flapping their wings." + Hermogenes says, "Fuggin lazy bums." + You say, "Ans for submarines, thermocline layers are important acoustic landmarks." + Hermogenes nods solemnly. + Hermogenes says, "I remember goin out in th boat with my dad." + Hermogenes says, "Hed drive, id watch the sonar thingie." + Hermogenes says, "Id occassionally see thermocline layers." + You say, "Well there ya go." + Hermogenes says, "Conduction = opaque solids." + You ask, "Ya heat transfer huh?" + Hermogenes says, "Convection = solid surface in contact with moving liquid or gases." + Hermogenes says, "Ya, heat transfer." + Hermogenes says, "I mean, i KNEW it was heat transfer." + You say, "And i guess radiation is the transfer of heat energy from solid to gas." + Hermogenes says, "I just dint know what set them apart." + Hermogenes says, "Well..." + You say, "Well u cant radiate heat in aa vacuum." + Hermogenes says, "Substandces cdont hafta be touching." + Hermogenes says, "In radiation heat transferrence." + Hermogenes says, "Actually..." + Hermogenes says, "I was about to saty...." + You say, "Well its gotta touch SOMETHING." + Hermogenes says, "This process is different from both conduction and convection, because the substances exchanging heat need not be touching and can even be + separated by a vacuum." + Hermogenes says, "Bplhtplhtlt." + You say, "Doesnt make sense to me." + You say, "Explain how u can radiate heat in aa vacuum." + Hermogenes asks, "Cantcha transmit heat over a vaccuum?" + You say, "No." + Hermogenes asks, "What about th sun?" + You say, "Thats the whole idea behind thermoses." + You say, "Thats aa different KIND of radiation." + Hermogenes asks, "Space != complETE vaccuum?" + You say, "The sun is particle radiation." + Hermogenes says, "Thermoses dont complETELY stop heat loss." + You say, "And em." + You say, "Well cuz theyre not comPLETE vacuums." + Hermogenes says, "Hmm." + Hermogenes says, "I cant really argue with ya, since i dont know much about it in the foist place." + You shrug. + You say, "No like im aa textbook." + You say, "I just dont see how you could radiate heat in aa vacuum." + You say, "Except in electrmagnetic wave form." + Hermogenes asks, "Microwave?" + You say, "Like, if i got shot out of an airlock, right." + Thorr > what happened to haderach + Hermogenes > hmm + Hermogenes > hes on here oCASSIOanlly + Hermogenes > not all THAT often + You say, "Im 98.something degrees." + Thorr > yeah.. he is not even a character tho + Hermogenes > if ya email ed hima and told him other people were interested in workin on the mud, he might show up more frequently + You say, "If u put aa thermometer RIGHT next to me." + You say, "Without touching." + Hermogenes listens + You say, "I doubt it would be affected." + Hermogenes asks, "At ALL?" + You ask, "How could it?" + You say, "If i was radioactive, sure." + Hermogenes asks, "The IR energy radiatinfg from yer body?" + You say, "Like i said, eventually u would cool down through em emmission." + You say, "But thats not the kind of radiation theyre talkin about." + Hermogenes says, "A law formulated by German physicist Max Planck in 1900 states, in + part, that all substances emit radiant energy simply because they have a + positive absolute temperature." + You say, "Like i SAID." + Hermogenes asks, "Er, so ther?" + You say, "Like i said, eventually u would cool down through em emmission." + You say, "But thats not the kind of radiation theyre talkin about." + Hermogenes says, "Electromagnetic emmission?." + Hermogenes says, "Ymean, in the IR range?." + Hermogenes says, "Im not tryin to nit pick, im tryin to understand yer explanation." + You say, "Ok." + You say, "A warm coal radiates heat." + You say, "Because its warm." + You say, "And it warms the air around it." + Thorr > i gotta do some actual work.. bbl + > Thorr waves. + You say, "This is the kind of radiation that I mean when i say heat radiation." + Hermogenes > see ya + > Cratylus waves. + Hermogenes says, "Right." + [Thorr quits] + You say, "Absent air, were talkin about aa different kind of radiation." + Hermogenes says, "Transmitting of energy in the infrared range = heat." + You say, "That i would tend NOT to call "heat radiation"." + You say, "But electromagnetic radiation." + You say, "Which is aa whole other can o beans." + Hermogenes says, "Mmm, beans." + You say, "SO." + You say, "When u say convection, conduction, radiation." + You say, "I do not think em radiation." + You ask, "See my point?" + Hermogenes asks, "But.. isnt IR within the EM spectrum?" + You say, "EXACTLY." + You say, "The coal MAY be radiating ir, but thats not what im talking about." + Hermogenes says, "'youd NOT call it 'heat radiation', but you WOULD call it 'EM radiation'." + You say, "Yes." + Hermogenes says, "Even though, heat radiation == IR radiation." + You say, "Bullshit." + Hermogenes says, "Ok ok." + Hermogenes says, "Sorry." + You shrug. + You say, "I disagree with that statement." + Hermogenes asks, "Yer sayin for het to be radiat4d, there hasta be air, in the example of the coal?" + You say, "I think u can also see it as patently false." + You say, "Right." + Hermogenes says, "No need to jump all over my case, im just tryin to understand how yer percieving the problem." + You say, "Now, if my definition of heat radiation is mistaken, then thats something else." + Hermogenes says, "O K then." + You say, "But i do not equate infrared radiation with heat radiation." + Hermogenes asks, "Whyzzat?" + Hermogenes says, "Not that im arguing, im just wonmdering why you say that." + Hermogenes says, "Sir." + You emote: Cratylus is confused. + You ask, "Why WOULD you say that?" + Hermogenes says, "Mebbe my understanding of "heat" is incorrect." + You say, "What makes u think heat radiation == IR radiation." + You say, "Well im curious why u think that." + Hermogenes breaks down and starts to cry + You say, "Dont mean to jump all over yer case." + Hermogenes says, "I thought..." + You say, "I just dont see where youd think that." + Hermogenes says, "What as an object transmits more n more energy..." + Hermogenes says, "It starts to transmit it in different areas of the EM spectrum." + You say, "Ok." + You ask, "Why do you equate heat with energy?" + Hermogenes asks, "Right|wrong?" + Hermogenes says, "B... b... be-cause..." + You shrug. + You say, "Again, i could be dead wrong." + Hermogenes asks, "Heat is what we perceive IR energy as?" + You say, "Erm." + You say, "Well i dont think heat is about perception." + Hermogenes says, "Or not." + You say, "I think heat is about molecular motion." + Hermogenes says, "Right...." + You say, "And for that to transfer." + You say, "U need molecules." + You say, "Hence, no vacuum." + Hermogenes says, "You cant have a PERFECT vaccuum, though." + Hermogenes says, "But thats a different topic." + You say, "So you can see why i would disagree with your source." + Hermogenes says, "Im still tryin to figure out why (hea == IR) is false." + You say, "Explain to me why it is true." + Hermogenes yields + You hmm. + Hermogenes says, "Im sorry, i cant argue." + Hermogenes is at a loss for words currently + Hermogenes says, "No fense, i mean." + You say, "Well im sure there is aa relationship between heat and ir, but i do not see these as being the same thing." + You shrug. + You say, "You may be right." + You say, "But i doubt it." + Hermogenes shrugs. + Hermogenes says, "Heh." + You smirk. + Hermogenes says, "Ya just HAD to throw that disclaimer in tehre, DINT cha." + Try "help index" for a list of command types. + You emote: Cratylus snickers. + Hermogenes says, "Cool page, so far:." + Hermogenes says, "Http://www.ipac.caltech.edu/Outreach/Edu/infrared.html." + Hermogenes says, "The primary source of infrared radiation is heat or thermal radiation." + You say, "So then they are NOT the same thing, right." + Hermogenes says, "Ok, mebbe i was not conveying my thoughts too well." + You say, "Just because i arrive in aa car doesnt mean im aa car." + Hermogenes says, "Ya friggin car." + Hermogenes says, "For example, hot charcoal may not give off light + but it does emit infrared radiation which we feel as heat." + You ask, "Ok. what does that illustrate?" + Hermogenes says, "The more energy an object is giving off..." + Hermogenes says, "The higher up in the em spectrum it can be perceived at." + You ask, "Mmhmmm?" + Hermogenes says, "In." + Hermogenes says, "Of." + You say, "Ok." + You ask, "So how does that prove that heat radiation works in aa vacuum?" + Hermogenes is lookin at the creepy kitty picture on that page + Hermogenes says, "I." + Hermogenes says, "Dont." + Hermogenes says, "KNOW." + You emote: Cratylus calls off the dogs. + You say, "Sorry." + You say, "I get very focused." + Hermogenes says, "But aPPARRENTLY, with "radiation" heat transfer, objects dont HAFTA be touching." + You say, "If there is air between them, i agree." + Hermogenes says, "And yknow." + Hermogenes says, "Mebbe these 3 types of transference isnt JUST heat transfer." + Hermogenes says, "Mebbe they mean ENERGY transfer." + Hermogenes says, "But i think they DO mean heat transferrence." + You say, "Me too." + Hermogenes says, "Which doesnt really settle nuttin." + Hermogenes says, "That DOES it." + You say, "Well it settles that theyre wrong." + Hermogenes says, "W." + Hermogenes says, "We must ask the sages of IG." + You say, "Heh." + Hermogenes asks, "Ya want to?" + You say, "Ohhh mighty oracle..." + Hermogenes says, "Or, naaah." + You say, "If u want garbage, go ahead." + Hermogenes asks, "Didja see the creepy kitty pic yet?" + You say, "Ya." + You say, "Blue prolly can say." + Hermogenes says, "SOMEtimes, ig has some answers." + Hermogenes says, "Im gunan try it." + Hermogenes says, "No WAIT." + Hermogenes says, "Im about to head over to other building." + Hermogenes says, "Ill try in an hour or so." + You say, "Well im goin home fairly soonish." + Hermogenes says, "But i gotta formulate the correct question, foist." + You say, "If you find credible documentation of yer crackpot theory lemme know." + Hermogenes asks, ""can heat be transferred in a vaccuum?" ?" + You say, "No." + You say, "That is not quite the question." + Hermogenes says, "Ok, then what." + Hermogenes asks, "What IS the question?" + Hermogenes says, "Say it." + Hermogenes exclaims, "SAY IT!!!" + You ask, "Is infrared radiation heat?" + Hermogenes says, "I THINK it means./..." + Hermogenes says, "Em radiation transmitting .." + Hermogenes says, "Phone." + You say, "Because OBVIOUSLY heat is transferred in aa vacuum." + You say, "But what were talking about is HEAT RADIATION." + Hermogenes scribbles in his memo pad. + You say, "Thats right. you DO yer homework." + Hermogenes says, "Btplhpbtplbpt." + Hermogenes says, "Im "writing down" the url to that page." + Hermogenes says, "With the kitty poicture on it." + Hermogenes says, "I THINK, its saying..." + Hermogenes says, "EM radiation transmitting at X frequency is perceived by us as "heat"." + You say, "That sounds about right yeah." + Hermogenes says, "Just like something rtansmitting between X and Y nm is perceived as "light"." + You say, "Sounds right so far." + Hermogenes says, "So..." + You ask, "So...?" + Hermogenes asks, "Would you argue that something transmitting in the visible portion of the em spectrum is|isNOT light?" + You say, "I find your parallel flawed." + You say, "The definition of heat and the definition of light are very different." + Hermogenes says, "Well, of COURSE its flawed." + Hermogenes says, ""how so?" :)." + You say, "Ok, walk through this with me." + Hermogenes attempts patience... + You say, "Heat is molecules moving, aka brownian motion." + Hermogenes says, "Heat is kinetic energy of molecules in motion, ook." + You say, "Heat radiation occurs when molecules of aa lower "temperature" touch molecules of aa higher "temperature"." + You say, "Now." + Hermogenes says, "So how can they transfer heat when theres no molecules to bump into." + Hermogenes says, "Ok." + You say, "If there is aa vacuum between these two objects of differing temperatures." + You say, "On MAY be warmed up by the other." + You say, "I dont dispute that." + You say, "But it would be warmed up not by HEAT radiation, since "HEAT" is not radiated through aa vacuum." + Hermogenes says, "BUT." + You say, "It would be warmed up by the effects of ir radiation." + Hermogenes says, "Theres doesns not exIST a perfect vacuumm." + You say, "Dude you must join me." + You say, "We dont have these objects either." + Hermogenes says, "Mebbe the few molecules in the non-perfect vaccuum are enough to transfer the heat or somerthin." + You say, "Nor do they possess frickin laser beams." + Hermogenes asks, "Yer sayin in a THEORHETICAL vaccuum?" + You say, "In MY world, when u talk about aa vacuum, its aa vacuum." + You ask, "Yer book...did it specify an imperfect vacuum?" + Hermogenes says, "I mean, are you arguing on a pure le." + Hermogenes says, "Ok, you are." + Hermogenes says, "Yes, it did." + You say, "Well then its not aa vacuum." + You say, "Its aa vacuum or its not." + You say, "U cant have both." + Hermogenes says, "It said somthin like "a perfect vaccuum cant be created, even with the best equipment, etc etc"." + You say, "Well fuckin aa DU." + You say, "DUH if theres shit flyin around in there sure there can be heat transfer." + Hermogenes says, "So, this brings me back to their assertion of objects not having to touch." + Hermogenes says, "For heat transfer." + You say, "But that totally defeats the idea of heat radiation in aa vacuum." + Hermogenes says, "Ok, point taken." + You say, "They DO touch, indirectly, through the flying molecules in yer imperfect vacuum." + Hermogenes asks, "Why bother making up a law of thermal transferrence if the environment will never exist?" + Try "help index" for a list of command types. + Hermogenes says, "For such a law." + You emote: Cratylus blinks. + [Thorr logs in] + Hermogenes says, "Okokok,." + You ask, "U joking?" + Thorr > lo + Hermogenes says, "I hate to do this." + Cratylus > oi + Hermogenes > ey + Hermogenes asks, "Can i "pause" this discussion?" + You say, "I thought we just agreed i was right." + Hermogenes asks, "Or do i forfeit all claims by leaving the table right now?" + You shrug. + You say, "I thought u just agreed with me." + Thorr > is it worth creating an area.. or is the new lib gonna cancel out anytyhing i do? + Hermogenes says, "Lol." + Cratylus > hold off + Thorr > anything that is + Thorr > ok + Thorr > what exactly is gonna change ?? + Hermogenes > you might wanna start PLANNING out an area, but hold off on the actual coding of it + Cratylus > everything + Thorr > whoa + Hermogenes > it will shake the very foundation of life as you know it + Thorr > hehe + Cratylus > it might even radiate heat in aa vacuum + Hermogenes > heat will even transfer over a vaccuum, in the new mud lib + Hermogenes > hahahahaha + Try "help index" for a list of command types. + Cratylus > :) + Thorr > heh + Hermogenes > dammit, quit stealin all my material + Cratylus > i gotta hit the road ill be back later + Thorr > k + Thorr > see ya + Hermogenes > ya, im goin to new building + Hermogenes says, "Ill be back round 4pm." + Cratylus > ill be back in 20 or, well pick up this convo + Hermogenes says, "DEFinately." + Hermogenes waves. + Thorr > ok + > Cratylus waves. + Please come back another time! + + + PART II + ------- + + Hermogenes bak + Hermogenes btw, ennytime you wanna pick our conversation bout heat transf3errence, lemme know + Try "help index" for a list of command types. + Cratylus i thot u agreed with me + Hermogenes i have NO idea ... + Hermogenes restate your assertion, please? + Hermogenes or do you not wanna open that can o worms again + Cratylus wonders why he always has todo all the splainin. + Hermogenes or you scaaaared? + Cratylus ok + Cratylus ready? + Hermogenes nods solemnly. + Cratylus you said heat radiation can occur even through aa vacuum + Cratylus i disagreed + Hermogenes i said that cause the web page said that + Hermogenes but, go on + Cratylus then u said ir waves WERE heat, hence heat radiation DID go through aa vacuum + Cratylus i explained that there is aa diff between ir and heat + Hermogenes but then i changed my thing... + Cratylus im gettin to it + Hermogenes to say that 'heat' was how we PERCEIVE ir radiation + Cratylus you know theres aa transcript + Cratylus check yer email + Cratylus go + Hermogenes jeez, you didnt + Cratylus now + Hermogenes ok okok, i will + Cratylus i KNEW this would happen + Hermogenes ok, i talked to someone + Hermogenes hes on one of the... + Hermogenes hesitates + Cratylus mmhmm + Hermogenes science teams + Cratylus DON'T SHOOT! + Hermogenes :) + Hermogenes and, aPARRENTly... + Hermogenes a molecule can transfer heat to another molecule withOUT tyouching + Cratylus yes + Cratylus i know + Cratylus i said that aa million fuckin times + Cratylus the issue here is not wether there is heat transfer dude + Hermogenes so, molecule A can heat molecule B without touching + Cratylus yes + Cratylus agreed + Cratylus but not through "heat radiation" + Hermogenes IR emmission + Cratylus RIGHT + Hermogenes or IR radiation or whatEVER you wanna call it + Cratylus which is the WHOLE POINBT of my argument + Cratylus that you CAN transfer heat thru aa vacuum + Cratylus but it ISNT "heat radiation" + Hermogenes waits for the punchline... + Hermogenes ohhhhh, wait + Hermogenes i think i see + Cratylus waddaya mean? what word did you have trouble with? + Hermogenes your main beef was with the term "heat radiation" as opposed to the more PROPER term of "IR radiation"?? + Cratylus well yes + Cratylus sort of + Hermogenes stares at you + Cratylus not quite tho + Hermogenes stares at you intently + Cratylus ok + Cratylus question + Hermogenes ok, im HOPING this hasnt been a giant battoe of semantics + Cratylus do you think ir radiation == heat radiation? + Hermogenes now, NO, i dont + Cratylus oK then + Cratylus that was my point + Hermogenes i had my terms jumbled up, and + Cratylus so basically we agree + Hermogenes aaaahhh + Hermogenes yes + Hermogenes so, yer whole POINT was to show how i was WRONG in my useage of the terminology? + Cratylus you kept sayin stuff that assumed ir == heat, which is not true + Cratylus the idea was to point out that yer source was not correct + Hermogenes heat is the term we assign to the perception of IR radiation, just as light is how we descripe the process of seeing photon particles interacting with our eyes, etc + Cratylus no + Hermogenes ah HA + Cratylus that also is not correct + Cratylus heat is not aa subjective experience + Cratylus it is aa measurable state of molecular motion + Hermogenes yer assuming my SOURCE is not correct, when in fact, it could very well be (and probably WAS)my INTERPRETATION of my source + Cratylus could be + Hermogenes wait, heat is not a what? + Cratylus heat is not aa subjective experience + Cratylus it is aa measurable state of molecular motion + Hermogenes riiiight, and light isNT? + Cratylus i dont know why u keep bringing light into this + Hermogenes i mean, not molecular motion, i mean objectively measurable + Cratylus im not concerned with light at the moment + Hermogenes because light n heat are on th same EM spectrum, aint they? + Cratylus whoa + Cratylus sits you down. + Cratylus you better cool that walnut off + Hermogenes fine fine, IR emmission and visible light emission are + Cratylus right + Cratylus so what? + Cratylus were talkin about heat + Hermogenes so... + Hermogenes uh... + Cratylus which is NOT on the em spectrum + Hermogenes so THERE! + Hermogenes WHAT? + Cratylus were talkin about heat + Cratylus which is NOT on the em spectrum + Hermogenes IR is NOT on the em spectrum? + Cratylus oh my FUCKING GOD + Hermogenes ok, NOW im confused + Cratylus are you pullin my leg or what? + Hermogenes i must be TOTALLY thinkin of somethin else + Hermogenes please, to define "em spectrum" + Cratylus ok im sorry if i sound condescending, but damn you deserve it + Hermogenes well excuuuUUUuuuuUUuuUuuuse ME for not clearly defineing all th terms from th onset + Cratylus when electromagnetic energy is radiated, its measured on what we call the em spectrum + Hermogenes ya? + Cratylus heat is NOT electromagnetic energy + Hermogenes but IR radiation is? + Cratylus but when something IS hot, it emits em waves + Cratylus somthing that IS hot emits IR + Cratylus but the heat itSELF is not the IR + Cratylus the heat is aa different kind of energy + Cratylus and though the IR waves MAY heat up another object... + Hermogenes isnt heat how we describe the perception oof said ir energy? + Cratylus this transfer of energy is not what you can call "heat radiation" + Cratylus NO DUDE NO + Cratylus BAD HERMOGENES + Hermogenes goes back to the page with the creepy kitty pic + Cratylus define heat please + Hermogenes mostly to look at the creepy kitty pic, that is + Cratylus i thought YOU were the scientist in the family + Hermogenes um, define heat? + Cratylus yes. define heat + Hermogenes the amount of hotness soemthing has? + Cratylus ok let me tell you what webster says heat is + Hermogenes notes there are over 20 definitions... + Hermogenes but, go on + Hermogenes meestor WEBSTER dude + Cratylus "the energy associated with the random motions of molecules, atoms, or smaller structural units of which matter is compised" + Hermogenes asSOCiated with + Cratylus notice there is no mention of electromagnetism + Cratylus heat, man, is this molecular motion + Cratylus nothing else + Cratylus kinetic energy + Hermogenes ok + Hermogenes snives. + Cratylus as it HAPPENS, this energy tends to emit some electromagnetic radiation + Hermogenes oooOOo, whatta coiINcidince + Cratylus but the em radiation is NOT heat + Hermogenes so... + Hermogenes yer sayin/.... + Cratylus it is em radiation, like the color blue or xrays + Hermogenes the molecular motion emits the ir stuff? + Cratylus well, the heat energy does ya + Hermogenes heat energy? + Cratylus ya + Cratylus i dont know if the motion and the energy are the same thing + Cratylus but thats aa diff argument + Hermogenes feels sufficiently dumb now, thankyouverywelcome + Cratylus so, what im sayin is: + Cratylus when u warm yourself at aa roaring fire + Hermogenes ooo, dats toasty + Cratylus you are being warmed by "heat radiation" + Hermogenes "heat radiation" + Cratylus the heat, or rapidly moving air/fuele molecules, are speeding up YOUR molecules through contact + Hermogenes as in "conduction, convection, RADIATION"? + Hermogenes aaah + Cratylus LISTEN + Cratylus the heat, or rapidly moving air/fuele molecules, are speeding up YOUR molecules through contact + Cratylus it also happens that the fire MAY be causing your molecules to move faster ALSO through some IR radiation, but this amount of heating is insignificant + Hermogenes ok, + Hermogenes can i interject at this moment? + Cratylus sure + Hermogenes er, MAY i + Hermogenes the scientist dude ALSO said somethin about: + Cratylus get that fucking dude in here + Cratylus go get him + Cratylus ill wait + Hermogenes how the earths atomoshpere n crust n stuff arent warmed by particles from the sun hittin them... + Hermogenes but from the IR radiation + Cratylus ya i know + Cratylus go get him + Hermogenes he left + Cratylus FUCK + Hermogenes and like i need MORE people on my case + Cratylus seriously dude yer not getting it + Hermogenes OR, like i need a coworker gettin into nan argument with you + Hermogenes OH MY GOSH! + Cratylus for some reason yer unable to separate heat from infrared radiation + Hermogenes aGREES with you! + Hermogenes is NOT gettin it! + Cratylus for some reason yer unable to separate heat from infrared radiation + Hermogenes im sorry, man,i really am + Cratylus its like saying that because an airplane is flying, it IS flight + Hermogenes its just one of those cases... + Hermogenes where the one gear is not in place + Cratylus I'LL say + Hermogenes that ONE little 8-tooth gear has slipped + Cratylus well id like to state for the record that i dont think this is some subtle semantic difference + Cratylus this is aa fundamental difference in types of energy and radiation + Cratylus but we can come back to it later + Hermogenes your statement has been entered into the almighty records of whosrighteedness + Cratylus ehehehehehe + Hermogenes so, its been snowing up tehre? + Cratylus very briefly + Cratylus none left on the round + Try "help index" for a list of command types. + Hermogenes we havent gotten ANYthing + Cratylus musta got it + Cratylus the HEAT RADIATION musta got it, that is + Hermogenes its sposed to get up in th 50s morrow + Hermogenes NOOOOOOO!!!!! + Cratylus oooohhhhh wait aa minute + Hermogenes im seriously miffed bout this whole heat thing, btw + Hermogenes wha + Cratylus i get it now + Hermogenes do i wanna know? + Cratylus i think i see how youre looking at it + Cratylus maybe + Hermogenes very well could be + Cratylus ok + Hermogenes ive looked at things "wrong" before... + Cratylus tell me if this is what yer thinking: + Hermogenes k + Cratylus when heat causes radiation, thats "heat radiation" + Hermogenes mmmm.... + Cratylus ok maybe not + Cratylus worth aa try + Hermogenes when an object is "energized" enough, it begins to radiate in the iR portion of the em spectrum + Cratylus yeah + Cratylus and thats what u mean by "heat radiation"? + Hermogenes energized usually means addding heat or electricity or SOMEthing to it + Cratylus nods. + Hermogenes well... + Hermogenes the IR radiation brought on is then perceived by our senses as "heat" + Cratylus ok + Cratylus do u mind if i drag this on aa bit longer? + Hermogenes if more energy is added, it then begins to transmit in the visible portion of the em spectrum, and we perceive this as ''light' + Cratylus i really am interested in understanding our difference here + Hermogenes as am i + Cratylus see, i dont think that the IR radiation heats up other things all that much + Hermogenes actually, + Cratylus when i put my hand up to aa light bulb, and its hot, + Cratylus i dont think its because of IR, although some IR is present + Hermogenes scientist dude sed that IR ardiation is actually quite effective in heating up stuff + Hermogenes heh, ardiation + Cratylus ok, but just bear with me aa moment + Hermogenes bears + Cratylus lets assume, for the pure sake of argument, that IR radiation does not exist + Hermogenes heh, sake of argument + Hermogenes ok, go on + Cratylus IF there is not IR radiation, could you still warm yourself by the fire? + Hermogenes uhhh.. yes + Cratylus by what process? + Hermogenes ummmm + Hermogenes light? + Cratylus no + Cratylus heat radiation + Cratylus see i think this is where we went in diff directions + Cratylus your brain is bent on seeing the word "radiation" in terms of particles or wavelengths + Hermogenes or, the act of transmitting particles or wavelenghths or whatever + Cratylus in the context of convection and conductance, this approach to the word "radiation" is not fruitful + Cratylus thats where we are having aa communication breakdown + Cratylus again for the sake of argument, lets assume there is no electromagnetic or particle radiation + Hermogenes likes wavelenghths n particles n stuff... + Cratylus again for the sake of argument, lets assume there is no electromagnetic or particle radiation + Hermogenes whata a dismal world + Cratylus the fireplace is radiating heat + Cratylus heat comes from it, hence, it "radiates heat" + Cratylus this is "heat radiation" + Hermogenes hmmm + Hermogenes in a loose definition, ok + Cratylus no + Hermogenes gasps in shock! + Cratylus that is not aa loose definition + Cratylus that is the definition of the word radiate + Cratylus "to radiate" + Hermogenes wait, is THAT all there is to "heat transferrence by radiation"? + Cratylus YESSSSSSS + Cratylus EXACTLY + Hermogenes heat comes from it, hence, it "radiates heat" + Hermogenes heat comes from it, hence, it "radiates heat" + Hermogenes heat comes from it, hence, it "radiates heat" + Hermogenes hmmmmm + Hermogenes ok + Hermogenes can accept that + Cratylus ok back to our dismal theoretical world + Hermogenes wait + Cratylus which contains no particle or em radiation + Hermogenes i thought we were done? + Cratylus oh + Cratylus ok + Cratylus so u see my point? + Hermogenes mmmm, sorta + Cratylus then we are not donme + Hermogenes i was making it way too more complicated than it needed to be? + Cratylus you were on aa different train track altogether + Hermogenes i was on one of those hovertrains + Hermogenes on magnetic rails + Cratylus btw the fireplace does not radiate heat through "light" + Hermogenes it dont? + Cratylus it radiates heat by contact with molecules which transmit the heat in the form of kinetic energy + Hermogenes howcome a black shirt gets hotter than a white shirt, then? + Cratylus in front of aa fire? + Cratylus ive never noticed any such thing + Cratylus in the sun, yeah sure + Hermogenes but i thought we already established that molecules dont HAFT bounce off eachother to transfer heat? + Hermogenes hmmm + Cratylus falls to the floor. + Hermogenes so, you think a black tshort and a white tshirt in a non-sun light source would not heat differntly? + Cratylus in front of aa fireplace, i dont think there would be aa noticeable differennce + Hermogenes im not tryin to argue, im tryin to follow a tangential tracxk for a sec + Cratylus i think with delicate instruments u WOULD detect aa diff + Hermogenes NOTCEABLE + Cratylus this is actually right on track dude + Cratylus i think with delicate instruments u WOULD detect aa diff + Hermogenes OH, suddenly im allowed to play on YOUR traintrack? + Hermogenes :) + Cratylus because IR radiation DOES in fact play aa role here + Cratylus but it is not as substantial as the brownian motion + Hermogenes uh uhuhuhu uuhuh + Hermogenes sorry + Cratylus this must be aa way-homer + Hermogenes a 'way-homer'? + Cratylus you'll get it on the way home + Hermogenes heh + Hermogenes is it really that much fun to argue with me? + Hermogenes or is it really a chore + Cratylus im honestly mystified by this + Hermogenes as am i + Cratylus i mean, im like...FASCINATED + Hermogenes and i wasnt asking sarcsatically or rhetorically + Cratylus this is such aa weird miscommunication + Hermogenes if it was fun to argue at me + Cratylus i dint mean it sarcastically + Hermogenes nods solemnly. + Cratylus im totally dead serious + Cratylus dead sexy, too + Hermogenes didnt think you WERE being scarcastic + Hermogenes ugh + Cratylus heh + Hermogenes just watched that last night + Cratylus man he is VILE + Hermogenes 'e leuks leyek a lit'l BEHbee + Hermogenes oye ET a behbee wunce + Hermogenes oye sed, OYEM th TOP a th fewd chayn!" + Hermogenes GET! EN! MAH! BELLY! + Cratylus ok hang on aa sec dont say anything for aa minute, ok? + Cratylus ok thx + Hermogenes nods solemnly. + Hermogenes you ok there? + Cratylus ya i had to copy and paste this round + Hermogenes or... am i still not spossed to be sayin anything still? + Hermogenes heh + Cratylus this is just too crazy not to save for posterity + Hermogenes hopes he wont regret his conversation, but think he probably will + Cratylus heheh yes you definitely will + Cratylus well i HOPE you will + Hermogenes ill probably wind up being WRONG th whole time and lookin like an IDIOT fer it + Cratylus i hope yer gonna slap yer forehead and go HOLY FUCKING DUH! + Hermogenes see, th thing is... + Hermogenes its kinda hard to be wrong about something you dont know what yer talkin about in th FIRST place + Cratylus i guess + Cratylus ok + Cratylus i touch aa stove + Cratylus coalburning stove. black iron + Hermogenes like, some 5th grade makin assertions about calculus + Cratylus i put my hand right ON it + Hermogenes ya? + Cratylus my fickin hand is sizzlin n stuff, right + Cratylus this is happening not because of IR + Hermogenes nods solemnly. + Hermogenes but because of.... + Cratylus see, if it was infrered radiation doin this, then why isnt the whole room in flames? + Cratylus why is it limited to RIGHT AT the stive? + Hermogenes uh... + Hermogenes dissipation? + Cratylus explain dissipation please + Hermogenes theres so much ari movin roun n stuff, the averagew molecular kinetic energy (motion) can be...uh...averaged out + Hermogenes over a wider area + Hermogenes n stuff + Hermogenes like, the inverse-squared law or something + Hermogenes YEAH, THATS it + Cratylus ok...so u agree its not infrared energy? + Hermogenes burning yer hand? + Cratylus right + Hermogenes its... + Hermogenes the convection of hot air molecules againts yer skin + Cratylus well, hot STOVE molecules, and it isnt "convection" + Hermogenes oooOOOOo + Hermogenes why NOT, mister fancee panse? + Cratylus whats happening is the surface of the stove is transferring heat to my hand + Hermogenes right + Cratylus the mechanics of this heat transfer is simple molecular contact + Hermogenes ok, its either the conduction of heat between the solid of the stove into te solid of yer hand... + Cratylus the stove molecules are moving real fast + Hermogenes ok, now wait + Cratylus and they make my hand molecules move real fast + Hermogenes so, theres MORE than JUST 3 ways of transferring heat? + Cratylus no + Hermogenes like in th xflies! + Cratylus do u agree with me so far? + Hermogenes so, tehre are JUST 3 ways? + Cratylus do u agree with me so far? + Hermogenes mostly, yah + Cratylus ok, what part do u disagree with? + Hermogenes hol on a sec... + Cratylus and get aa fucking scientist in here NOW + Hermogenes no, i had to TEND to work stuff + Hermogenes ya big meanie + Cratylus well if u see on, grab him + Cratylus or her + Hermogenes i wasnt goin off to find a scientist dude to be on my sdide or nuttin + Cratylus ok so what part did u not agree with? + Hermogenes grab her? + Cratylus ok so what part did u not agree with? + Hermogenes ok, but only cause you insisted... + Hermogenes i guess i just wanna establish that theres X ways of heat transferrance, and any examples involving heat transferrence would be put into one or more of these X categories + Cratylus ok well fuck the 3 categories + Cratylus do you agree or disagree with my statements? + Hermogenes YEAH + Hermogenes POWER TO THE PEOPLE! + Cratylus dude + Hermogenes fine + Hermogenes stove molecules, movin hand molecules + Cratylus right + Hermogenes i tells you what my FOOT molecules gunan be movin in a SECOND! + Cratylus now, if instead of touching the stove, i had held my had within half aa centimeter, it would scald but not burn. right? + Hermogenes whats the diff? + Hermogenes its gonna get hot + Cratylus it would take longer for my hand to be damaged and it wouldnt be black + Hermogenes scald, burn, sear, fry, etc + Hermogenes ok, agreed + Cratylus ok the first example was conductance + Hermogenes as long as yer not actually TOUCHING it + Hermogenes ok, 1st = conductance + Cratylus the second example was radiation + Hermogenes (with a wee bit of convection) + Hermogenes hmmmm + Cratylus with aa little convection but thats not important i guess + Cratylus heh ya + Hermogenes second isnt convection? + Cratylus no + Hermogenes sounds likeit... + Cratylus its primarily radiation + Cratylus because the stove is heating the air molecules + Cratylus and the air molecules are heating my hand + Cratylus the heat is being radiated from the surface of the stove, through the air, into my hand + Hermogenes but... + Cratylus wait + Cratylus IR is bad for your eyes right? + Hermogenes uh... + Hermogenes is it? + Cratylus hmmm maybe that uv + Cratylus ok never mind + Hermogenes uv, yes, deinately + Cratylus ok now + Hermogenes wait + Hermogenes lemme say why i think its convection + Cratylus in ADDITION to this molecular heat transfer + Cratylus no + Cratylus im sorry + Cratylus thats irrelevant and aa tangent + Hermogenes frowns. + Hermogenes ok, go on + Cratylus in ADDITION to this molecular heat transfer + Hermogenes you n yer up-arrow keys... + Cratylus there is ALSO infrared radiation from the stove + Cratylus but it is NOT the infrared radiation that burns my hand + Cratylus it is the direct molecular contact with rapidly moving molecules + Hermogenes cause the IR stuff aint got enough energy to do it, and its the molecular transferrence stuff thats burning it? + Cratylus exactly + Cratylus do you agree? + Hermogenes im not too sure that IR is all THAT low-level energy-wise, but ok... + Cratylus so now lets put that stove in outer space + Hermogenes outher... SPAAAAAACE + Cratylus (with its own fuel and oxy) + Hermogenes (of course) + Cratylus and im out there with the stove + Cratylus and i put my hand .5 centimeters from it + Hermogenes (with suit and air supply) + Cratylus will my hand be damaged? + Hermogenes um... + Cratylus bare hand + Hermogenes uh... + Hermogenes maybe? + Cratylus no + Hermogenes no + Cratylus i think its possible the stove may shed molecules + Hermogenes cause the molecules cant transfer the heat as efficiently or quickly + Cratylus these molecules might hit some of my hand molecules, but not enough to do damage + Cratylus negatron + Hermogenes cause theres a near-vaccuum enviroment + Cratylus they CAN transfer it efficiently and quickly + Hermogenes oh + Cratylus if i TOUCH them + Hermogenes BAD molecules + Cratylus if i touch the stove, will my hand be damaged? + Hermogenes yes + Cratylus right + Hermogenes BAD stove! + Cratylus ok, so in aa vacuum, i have to touch the stove to get burned, right? + Hermogenes PROBably + Cratylus oK then + Cratylus that is precisely my point + Cratylus the stove does not produce sufficient IR radiation to make any noticeable diff to my hand + Hermogenes k... + Cratylus only when there is molecule to molecule contact, can the stove do real temp change + Cratylus therefore, while the stove radiates infrared waves + Cratylus it does not radiate heat + Hermogenes funkay + Cratylus yer supposed to hear trumpets and flights of angels as the truth rolls in from the sky + Hermogenes just cause i accept it, dont mean i understand it... + Hermogenes not to bee TOO bog of a pain in th ass + Hermogenes big, even + Cratylus you WILL young hermogenes. oh yes. you WILL. + Hellmonger@Trilogy anybody ever fuck with doing Sun consoles on an oldsk00l portmaster 2? + Hermogenes my BRAIN hurts + Cratylus sorry + + + diff -c -r --new-file ds2.0r18/lib/domains/town/txt/warning_sign.txt ds2.0r28/lib/domains/town/txt/warning_sign.txt *** ds2.0r18/lib/domains/town/txt/warning_sign.txt Wed Dec 7 14:22:03 2005 --- ds2.0r28/lib/domains/town/txt/warning_sign.txt Wed Jul 5 00:01:12 2006 *************** *** 1,12 **** WARNING! ! The area south of here is Kaliid. It is part of the old, broken version of Dead Souls. It has been mostly unbroken, so that for example the desert and bank roof work properly. However, you will note obvious differences in design ! between Kaliid and the town north of here. Remember, neither ! Kaliid nor the northern town are intended to *be* a mud. They are only examples of places and things that you can examine to guide you in building your own mud. --- 1,16 ---- WARNING! ! This area is Ylsrim. It is part of the old, broken version of Dead Souls. It has been mostly unbroken, so that for example the desert and bank roof work properly. However, you will note obvious differences in design ! between Ylsrim and the main sample town. Remember, neither ! Ylsrim nor the town are intended to *be* a mud. They are only examples of places and things that you can examine to guide you in building your own mud. + Whatever bugs you find in Ylsrim, therefore, are not + going to be fixed. Consider it a museum piece, a mud + area like a prehistoric insect caught in amber: perfect + in its imperfection, sublime in its permanence. diff -c -r --new-file ds2.0r18/lib/domains/town/virtual/forest.c ds2.0r28/lib/domains/town/virtual/forest.c *** ds2.0r18/lib/domains/town/virtual/forest.c Mon Jan 23 08:52:03 2006 --- ds2.0r28/lib/domains/town/virtual/forest.c Wed Jul 5 00:01:12 2006 *************** *** 108,115 **** "a road that leads north to a high plateau."; if(y == 25) str+= " A steep cliff rises north of here, making " "travel north into the mountains impossible."; ! if(x == 1) str += "The forest is impassably thick to the west."; ! if(y == 1) str += "The forest is impassably thick southward."; if(x == 24 && y == 1) str += "\n%^GREEN%^There is a sign here you can read.%^RESET%^"; if(x == 24 && y == 25) str += "\n%^GREEN%^There is a cave entrance in the cliff wall.%^RESET%^"; SetItems( ([ "forest" : "It is so vast.", --- 108,115 ---- "a road that leads north to a high plateau."; if(y == 25) str+= " A steep cliff rises north of here, making " "travel north into the mountains impossible."; ! if(x == 1) str += " The forest is impassably thick to the west."; ! if(y == 1) str += " The forest is impassably thick southward."; if(x == 24 && y == 1) str += "\n%^GREEN%^There is a sign here you can read.%^RESET%^"; if(x == 24 && y == 25) str += "\n%^GREEN%^There is a cave entrance in the cliff wall.%^RESET%^"; SetItems( ([ "forest" : "It is so vast.", diff -c -r --new-file ds2.0r18/lib/domains/town/weap/carving_knife.c ds2.0r28/lib/domains/town/weap/carving_knife.c *** ds2.0r18/lib/domains/town/weap/carving_knife.c Wed Jan 11 23:09:54 2006 --- ds2.0r28/lib/domains/town/weap/carving_knife.c Wed Jul 5 00:01:12 2006 *************** *** 7,15 **** static void create() { item::create(); SetKeyName("carving knife"); SetId( ({ "knife"})); ! SetAdjectives( ({ "serrated","sharp","razor sharp","steel","hefty","stainless","carving"})); ! SetShort("a serrated, 8-inch carving knife"); SetLong("This is a serrated, 8-inch carving knife. This razor sharp "+ "knife has been forged from molded and hammered high-carbon "+ "stainless steel. It is solid, hefty, and well-balanced. "+ --- 7,15 ---- static void create() { item::create(); SetKeyName("carving knife"); + SetAdjectives( ({"8-inch", "serrated", "sharp", "razor-sharp", "razor", "steel", "hefty", "stainless", "carving"}) ); SetId( ({ "knife"})); ! SetShort("a serrated 8-inch carving knife"); SetLong("This is a serrated, 8-inch carving knife. This razor sharp "+ "knife has been forged from molded and hammered high-carbon "+ "stainless steel. It is solid, hefty, and well-balanced. "+ diff -c -r --new-file ds2.0r18/lib/domains/town/weap/shotput.c ds2.0r28/lib/domains/town/weap/shotput.c *** ds2.0r18/lib/domains/town/weap/shotput.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/domains/town/weap/shotput.c Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,22 ---- + #include + #include + #include + + inherit LIB_ITEM; + + static void create() { + item::create(); + SetKeyName("shot ball"); + SetAdjectives( ({"ball of", "palm sized", "palm-sized", "shot"}) ); + SetId( ({"ball", "lead", "shot", "shotput"}) ); + SetShort("a palm-sized ball of lead"); + SetLong("This is a ball of lead, approximately nine inches in diameter. It is a weapon called a 'shot', intended to be thrown at an enemy."); + SetMass(50); + SetVendorType(VT_WEAPON); + SetClass(30); + SetDamageType(BLUNT); + SetWeaponType("projectile"); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/include/damage_types.h ds2.0r28/lib/include/damage_types.h *** ds2.0r18/lib/include/damage_types.h Tue Mar 28 23:23:41 2006 --- ds2.0r28/lib/include/damage_types.h Wed Jul 5 00:00:58 2006 *************** *** 20,29 **** #define DEATHRAY (1 << 17) #define EMOTIONAL (1 << 18) #define SONIC (1 << 19) ! #define OTHER (1 << 20) #define MAX_DAMAGE_BIT OTHER ! #define ALL_DAMAGE BLUNT | BLADE | KNIFE | WATER | SHOCK | COLD | HEAT | GAS | ACID | MAGIC | POISON | DISEASE | TRAUMA | PIERCE | PSIONIC | ANOXIA | DEATHRAY | EMOTIONAL | SONIC | OTHER #endif /* s_damage_types_h */ --- 20,30 ---- #define DEATHRAY (1 << 17) #define EMOTIONAL (1 << 18) #define SONIC (1 << 19) ! #define BITE (1 << 20) ! #define OTHER (1 << 21) #define MAX_DAMAGE_BIT OTHER ! #define ALL_DAMAGE BLUNT | BLADE | KNIFE | WATER | SHOCK | COLD | HEAT | GAS | ACID | MAGIC | POISON | DISEASE | TRAUMA | PIERCE | PSIONIC | ANOXIA | DEATHRAY | EMOTIONAL | SONIC | BITE | OTHER #endif /* s_damage_types_h */ diff -c -r --new-file ds2.0r18/lib/include/stargate.h ds2.0r28/lib/include/stargate.h *** ds2.0r18/lib/include/stargate.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/include/stargate.h Wed Jul 5 00:00:58 2006 *************** *** 0 **** --- 1,20 ---- + /** + * + * $Id: stargate.h,v 1.1 2006/04/05 05:48:39 jam Exp $ + * + */ + + #ifndef startgate_h + #define stargate_h + + #define GATE_TIMEOUT (10+random(5)) + + // address (i.e. "sgc") is a key in a mapping in the stargate daemon so it is not included here + class stargate + { + string status; + string destination; + string endpoint; + } + + #endif diff -c -r --new-file ds2.0r18/lib/lib/blank_pile.c ds2.0r28/lib/lib/blank_pile.c *** ds2.0r18/lib/lib/blank_pile.c Mon Nov 7 13:28:59 2005 --- ds2.0r28/lib/lib/blank_pile.c Wed Jul 5 00:00:58 2006 *************** *** 6,12 **** --- 6,16 ---- int PileAmount = 0; static void create() { + string *saveds; item::create(); + saveds = item::GetSave(); + saveds += ({ "PileType", "PileAmount" }); + AddSave( saveds ); SetKeyName("money"); } diff -c -r --new-file ds2.0r18/lib/lib/body.c ds2.0r28/lib/lib/body.c *** ds2.0r18/lib/lib/body.c Tue Mar 28 23:23:41 2006 --- ds2.0r28/lib/lib/body.c Wed Jul 5 19:58:19 2006 *************** *** 8,13 **** --- 8,14 ---- */ #include + #include #include #include #include *************** *** 27,37 **** private int HealthPoints, MagicPoints, ExperiencePoints, QuestPoints; private int melee; ! private int Alcohol, Caffeine, Food, Drink, Poison, Sleeping; private float StaminaPoints; private string Torso, Biter; private mapping Fingers, Limbs, MissingLimbs; ! private static int Dying, LastHeal; private static function Protect; private static mapping WornItems; private static class MagicProtection *Protection; --- 28,38 ---- private int HealthPoints, MagicPoints, ExperiencePoints, QuestPoints; private int melee; ! private int Alcohol, Caffeine, Food, Drink, Poison, Sleeping, DeathEvents; private float StaminaPoints; private string Torso, Biter; private mapping Fingers, Limbs, MissingLimbs; ! private static int Dying, LastHeal, Encumbrance; private static function Protect; private static mapping WornItems; private static class MagicProtection *Protection; *************** *** 40,45 **** --- 41,47 ---- private static string PoliticalParty, BodyComposition; private static int Pacifist, rifleshot_wounds, gunshot_wounds, globalint1; string *ExtraChannels; + mixed Agent; static void create() { AddSave( ({ "Pacifist", "BodyComposition", "HealthPoints", "MagicPoints", "ExperiencePoints", "QuestPoints","StaminaPoints", "Undead", *************** *** 49,55 **** PoliticalParty = "UNDECIDED"; rifleshot_wounds = 0; gunshot_wounds = 0; ! NewBody(0); Protect = 0; WornItems = ([]); --- 51,57 ---- PoliticalParty = "UNDECIDED"; rifleshot_wounds = 0; gunshot_wounds = 0; ! DeathEvents = 0; NewBody(0); Protect = 0; WornItems = ([]); *************** *** 66,71 **** --- 68,84 ---- ExtraChannels = ({}); } + int GetEncumbrance(){ + int encumbrance = 0; + object *stuff = filter(all_inventory(this_object()), (: !($1->GetWorn()) :) ); + + if(!(ENABLE_ENCUMBRANCE) || inherits(LIB_NPC,this_object()) ) return encumbrance; + if(sizeof(stuff)) foreach(object item in stuff) + encumbrance += (item->GetMass())/2; + if(sizeof(stuff)) encumbrance += sizeof(stuff); + return encumbrance; + } + string SetBodyComposition(string str){ if(!str) return ""; else BodyComposition = str; *************** *** 185,191 **** int eventCollapse() { int position = GetPosition(); ! foreach(object ob in all_inventory(environment(this_player()))){ if(inherits(LIB_CHAIR,ob) || inherits(LIB_BED,ob) ){ ob->eventReleaseStand(this_object()); } --- 198,204 ---- int eventCollapse() { int position = GetPosition(); ! foreach(object ob in all_inventory(environment(this_object()))){ if(inherits(LIB_CHAIR,ob) || inherits(LIB_BED,ob) ){ ob->eventReleaseStand(this_object()); } *************** *** 197,202 **** --- 210,216 ---- } send_messages("collapse", "$agent_name $agent_verb to the ground.", this_object(), 0, environment()); + //this_object()->eventCollapse(); SetPosition(POSITION_LYING); return 1; } *************** *** 292,299 **** if( !dest ) { send_messages(({ "fall", "die" }), "$agent_name $agent_verb into a " "dark abyss and $agent_verb.", this_object(), 0, env); ! SetPosition(POSITION_LYING); ! eventDie(); } else { int p = random(100) + 1; --- 306,314 ---- if( !dest ) { send_messages(({ "fall", "die" }), "$agent_name $agent_verb into a " "dark abyss and $agent_verb.", this_object(), 0, env); ! //SetPosition(POSITION_LYING); ! this_object()->eventCollapse(); ! eventDie("Deceleration sickness"); } else { int p = random(100) + 1; *************** *** 304,310 **** eventMove(dest); environment()->eventPrint(GetName() + " comes falling in from above.", this_object()); ! SetPosition(POSITION_LYING); foreach(string limb in GetLimbs()) { int hp = GetHealthPoints(limb); --- 319,326 ---- eventMove(dest); environment()->eventPrint(GetName() + " comes falling in from above.", this_object()); ! //SetPosition(POSITION_LYING); ! this_object()->eventCollapse(); foreach(string limb in GetLimbs()) { int hp = GetHealthPoints(limb); *************** *** 398,403 **** --- 414,421 ---- string tmp = GetResistance(type); int fp; + //tc("agent: "+identify(agent),"yellow"); + if( tmp == "immune") { return 0; } *************** *** 476,481 **** --- 494,500 ---- } AddHealthPoints(-x, 0, agent); AddStaminaPoints(-x/2); + if(HealthPoints < 1) eventDie(agent); return x; } *************** *** 535,542 **** int mod = who->GetSkillLevel("projectile attack") + who->GetStatLevel("strength"); ! mod = mod/2; ! x = what->eventStrike(this_object()) * 2; x = (x*mod)/100; if( what->GetWeaponType() != "projectile" ) { x = x/4; --- 554,561 ---- int mod = who->GetSkillLevel("projectile attack") + who->GetStatLevel("strength"); ! //mod = mod/2; ! x = what->eventStrike(this_object()) * 3; x = (x*mod)/100; if( what->GetWeaponType() != "projectile" ) { x = x/4; *************** *** 582,593 **** * * returns true if the thing is dying */ ! varargs int eventDie(object agent) { int x; string killer, death_annc; ! if(!agent) killer = "UNKNOWN"; ! else killer = agent->GetName(); death_annc = killer + " has slain "+ this_object()->GetName()+"."; --- 601,623 ---- * * returns true if the thing is dying */ ! varargs int eventDie(mixed agent) { int x; string killer, death_annc; + //debug(identify(agent)); + //tc("stack: "+identify(get_stack())); + + //if(!agent) agent = previous_object(); ! if(DeathEvents) return 1; ! DeathEvents = 1; ! ! if(agent && stringp(agent)) killer = agent + " "; ! else { ! //tc("previous: "+identify(previous_object(-1))); ! if(!agent) killer = "UNKNOWN"; ! else killer = agent->GetName(); ! } death_annc = killer + " has slain "+ this_object()->GetName()+"."; *************** *** 618,624 **** ob->eventMove(environment()); obs = filter(all_inventory(), (: !((int)$1->GetRetainOnDeath()) :)); i = sizeof(obs); ! while(i--) obs[i]->eventMove(ob); currs = (string *)this_object()->GetCurrencies() || ({}); foreach(curr in currs) { object pile; --- 648,654 ---- ob->eventMove(environment()); obs = filter(all_inventory(), (: !((int)$1->GetRetainOnDeath()) :)); i = sizeof(obs); ! obs->eventMove(ob); currs = (string *)this_object()->GetCurrencies() || ({}); foreach(curr in currs) { object pile; *************** *** 635,1588 **** SetUndead(!(x = GetUndead())); ! call_out( function() { Dying = 0; }, 0); ! return 1; ! } ! ! /* int eventRemoveItem(object ob) ! * object ob - the item being removed ! * ! * Removes a worn or wielded item from the list ! * ! * returns 1 on success, 0 on failure ! */ ! int eventRemoveItem(object ob) { ! string limb; ! ! foreach(limb in keys(WornItems)) { ! if( !WornItems[limb] ) continue; ! if( member_array(ob, WornItems[limb]) != -1) { ! WornItems[limb] -= ({ ob }); } } - return 1; - } ! /* int eventWear(object ob, mixed limbs) ! * object ob - the item being worn (wielded) ! * mixed limbs - string or array of limbs on which it is being worn ! * ! * description ! * marks the limbs "limbs" as being protected by the armor "ob" ! * ! * returns 1 if successful, 0 if failure ! */ ! int eventWear(object ob, mixed limbs) { ! string limb,s1; ! string *target_limb; ! target_limb = ({}); ! ! if( stringp(limbs) ) { ! limbs = ({ limbs }); ! } ! if( CanWear(ob, limbs) != 1 ) { ! return 0; ! } ! if(!inherits(LIB_WEAPON, ob)){ ! foreach(limb in limbs) { ! if(sscanf(limb,"%s foot",s1) || sscanf(limb,"%s hand",s1) ){ ! if(!sizeof(GetWorn(limb))) target_limb = ({ limb }); } } } - if(sizeof(target_limb)) limbs = target_limb; - foreach(limb in limbs) { - if( !WornItems[limb] ) WornItems[limb] = ({ ob }); - else WornItems[limb] += ({ ob }); - } - return 1; - } ! /************ /lib/body.c Data manipulation functions *************/ ! void NewBody(string race) { ! if(!race) ! Limbs = ([ (Torso = "ooze") : ([ "parent" : 0, "children" : ({}), ! "health" : 50, "class" : 1, "armors" : 0 ]) ]); ! else Limbs = ([]); ! MissingLimbs = ([]); ! Fingers = ([]); ! } ! /* int CanWear(object armor, string *limbs) ! * object armor - the piece of armor being checked ! * string *limbs - the limbs on which the armor wants to be worn ! * a nested array indicates that just one of the included limbs ! * must be satisfied ! * ! * description ! * checks to see if a particular armor can be worn ! * ! * returns 1 if the armor can be worn on those limbs ! * returns 0 if the armor cannot be worn there for any reason ! * ! */ ! mixed CanWear(object ob, string *limbs) { ! string limb, verb_pr, verb_pt, short; ! int type, bad_types, i, maxi; ! ! if( !ob ) return 0; ! short = (string)ob->GetShort(); ! if( !(type = (int)ob->GetArmorType()) ) ! return capitalize(short) + " cannot be worn!"; ! if( type & A_WEAPON ) { ! verb_pr = "wield"; ! verb_pt = "wielded"; ! } ! else { ! verb_pr = "wear"; ! verb_pt = "worn"; ! } ! if( !limbs || !(maxi = sizeof(limbs)) ) ! return "Where should " + short + " be "+ verb_pt + "?"; ! if( (string *)ob->GetWorn() ) ! return "It is already being " + verb_pt + "."; ! ! // Verify that the the item can be worn on each limb specified by limbs. ! i = 0; ! foreach(limb in limbs) { ! ! // Nested arrays indicate that only one of the elements in the nested ! // array must be satisfied. Check for one valid limb, and replace the ! // nested array with the valid limb, if found. ! if( arrayp(limb) ) { ! string limb2; ! string validLimb = 0; ! int leastRings = -1; ! ! if(!sizeof(limb)) error("Bad limb specification to CanWear().\n"); ! // Iterate through the nested array. ! foreach(limb2 in limb) { ! string* wornItems; ! ! // The limb will be valid if: ! // o The body has the named limb capable of wearing the armor type. ! // o There are no armors of the same type on that limb, except ! // for rings, which can have up to GetFingers() of that type worn. ! if(!Limbs[limb2] || !(Limbs[limb2]["armors"] & type)) continue; ! wornItems = WornItems[limb2]; ! ! // If the item is a ring, attempt to distribute the rings evenly ! // across the available hands. ! if(type == A_RING) { ! int currentRings; ! ! if(!sizeof(wornItems)) currentRings = 0; ! else currentRings = sizeof(filter(wornItems, ! (:(int)$1->GetArmorType() == A_RING:))); ! if(currentRings >= leastRings && leastRings != -1) continue; ! leastRings = currentRings; ! if(currentRings >= GetFingers(limb2)) continue; } ! else if(wornItems) { ! object wornItem; ! int tmpType = 0; ! ! foreach(wornItem in wornItems) ! if(wornItem) tmpType |= (int)wornItem->GetArmorType(); ! if(tmpType & type) continue; } - validLimb = limb2; } ! if(validLimb) limbs[i] = validLimb; ! else return "You cannot " + verb_pr + " that."; } - else { - if(!GetLimb(limb)) { - return "Try a different body part."; - } - globalint1 = Limbs[limb]["armors"]; - if( !Limbs[limb] ) return "You have no " + limb + "."; - if( !(globalint1 & type) ) { - if( type & A_WEAPON ) - return "You cannot wield with " + limb + "."; - else return "You cannot wear " + short + " on your " + limb + "."; - } - } - i++; - } - switch(type) { - case A_RING: - if(maxi != 1) - return "You can only wear " + short + " on one limb."; - if( !WornItems[limbs[0]] ) return 1; /* nothing there, ring ok */ - /* count # worn rings */ - i = sizeof(filter(WornItems[limbs[0]], - (: (int)$1->GetArmorType() == A_RING :))); - if(i >= GetFingers(limbs[0])) - return "You are already wearing too many rings there."; - else return 1; /* ok */ - case A_GLOVE: - if(maxi != 1) - //return "You can only wear " + short + " on one limb."; - if( GetFingers(limbs[0]) > (int)ob->GetFingers() ) { - return capitalize(short) + " does not seem to fit well on " - "your " + limbs[0] + "."; - } - bad_types = A_GLOVE | A_LONG_GLOVE | A_SOCK | A_LONG_SOCK; - break; - case A_LONG_GLOVE: - if(maxi != 2) - return capitalize(short) + " should be worn on two limbs."; - if( limbs[0] == Limbs[limbs[1]]["parent"] ) { /* which is hand? */ - /* more fingers than this armor can stand */ - if(GetFingers(limbs[1]) > (int)ob->GetFingers()) - return capitalize(short) + " does not seem to fit well on " - "your " + limbs[1] + "."; - } - else if(limbs[1] == Limbs[limbs[0]]["parent"]) { - /* ok, first limb is hand, check it */ - if(GetFingers(limbs[0]) > (int)ob->GetFingers()) - return capitalize(short) + " does not seem to fit well on " - "your " + limbs[1] + "."; - } - else return "Your " + limbs[0] + " is not connected to your " + - limbs[1] + "."; - bad_types = A_GLOVE | A_LONG_GLOVE; - break; - case A_BOOT: case A_SOCK: - if(maxi != 1) - capitalize(short) + " may only be worn on one limb."; - if(type == A_SOCK) bad_types = A_SOCK | A_LONG_SOCK; - else bad_types = A_BOOT | A_LONG_BOOT; - break; - case A_LONG_BOOT: case A_LONG_SOCK: - if(maxi != 2) - return capitalize(short) + " must be worn only on two limbs."; - if(limbs[0] != Limbs[limbs[1]]["parent"] && - limbs[1] != Limbs[limbs[0]]["parent"]) - return "Your " + limbs[0] + " is not connected to your " + - limbs[1] + "."; - if(type == A_LONG_SOCK) bad_types = A_LONG_SOCK | A_SOCK; - else bad_types = A_BOOT | A_LONG_BOOT; - break; - case A_HELMET: case A_VEST: case A_AMULET: case A_VISOR: case A_BELT: case A_COLLAR: - if(maxi != 1) - return capitalize(short) + " may only be worn on one limb."; - bad_types = type; - break; - case A_PANTS: case A_SHIRT: - bad_types = type; - break; - case A_CLOAK: - bad_types = type; - break; - case A_SHIELD: foreach(limb in limbs) { object worn_item; int tmp = 0; ! ! if( !WornItems[limb] ) continue; /* no armors, no prob */ ! if( !Limbs[limb]["parent"] ) continue; /* torso ok for 2 */ ! foreach(worn_item in WornItems[limb]) { if( !worn_item ) continue; tmp |= (int)worn_item->GetArmorType(); } ! /* not gonna allow 2 shields or a shield and weapon here */ ! if( tmp & (A_SHIELD | A_WEAPON) ) ! return "You cannot wear " + short + " there right now."; } return 1; /* ok */ ! case A_WEAPON: ! foreach(limb in limbs) { ! object worn_item; ! int tmp = 0; ! if( !WornItems[limb] ) continue; /* nothing there, ok */ ! foreach(worn_item in WornItems[limb]) { ! if( !worn_item ) continue; ! tmp += (int)worn_item->GetArmorType(); ! } ! /* again, not allowing 2 weapons or a shield and weapon */ ! if(tmp & (A_SHIELD | A_WEAPON)) ! return "You cannot wield " + short + " there right now."; } ! return 1; /* ok */ ! case A_ARMOR: case A_BODY_ARMOR: ! bad_types = A_ARMOR | A_BODY_ARMOR; ! break; ! case A_COLLAR: ! bad_types = A_COLLAR | A_AMULET; ! break; ! ! default: return 0; /* not any illegal stuff */ ! } ! foreach(limb in limbs) { ! object worn_item; ! int tmp = 0; ! if( !WornItems[limb] ) continue; /* no preventing types */ ! foreach( worn_item in WornItems[limb] ) { ! if( !worn_item ) continue; ! tmp |= (int)worn_item->GetArmorType(); ! } ! if(tmp & bad_types){ ! return "You cannot " + verb_pr + " " + short + " there right now."; ! } ! } ! return 1; /* ok */ ! } ! ! mixed CanManipulate(){ ! string *prehensile_limbs = this_object()->GetWieldingLimbs(); ! if(!sizeof(prehensile_limbs)){ ! say(this_object()->GetName()+" looks helpless without prehensile appendages."); ! return "You lack prehensile limbs with which to do that."; } - return 1; - } ! int CanFly(){ ! string clipped = identify(this_player()->GetMissingLimbs()); ! if(creatorp(this_player())) return 1; ! if(!RACES_D->CanFly(this_player()->GetRace())) { return 0; } - if(!clipped || !sizeof(clipped)) return 1; - if(!grepp(lower_case(clipped),"wing")) return 1; - return 0; - } ! /* int AddLimb(string limb, string parent, int classes, int *armors) ! * string limb - the limb being added (required) ! * string parent - the limb to which this one is being attached (required) ! * int classes - rating of the limb's strength (optional) ! * int *armors - the types of armors which can be worn here (optional) ! * ! * defaults ! * classes defaults to 1 ! * armors defaults to ({}) ! * ! * description ! * adds the named limb to the body, attached at the named point ! * the limb classes starts at 1 for a torso (strongest) ! * to whatever the documentation rates as the weakest ! * ! * returns 1 on success, 0 on failure ! */ ! varargs int AddLimb(string limb, string parent, int classes, int *armors) { ! int arm = 0; ! if(!limb || Limbs[limb] || (parent && !Limbs[parent])) return 0; ! if(armors) { ! int i; ! i = sizeof(armors); ! while(i--) arm |= armors[i]; } - if(MissingLimbs[limb]) map_delete(MissingLimbs, limb); - if( parent ) Limbs[parent]["children"] += ({ limb }); - else Torso = limb; - if( !classes ) classes = 5; - Limbs[limb] = ([ "parent" : parent, "children" : ({}), "class" : classes, - "armors" : arm ]); - Limbs[limb]["health"] = GetMaxHealthPoints(limb); - return 1; - } - - int RestoreLimb(string limb) { - if( !MissingLimbs[limb] ) return 0; - Limbs[limb] = MissingLimbs[limb]; - Limbs[limb]["health"] = GetMaxHealthPoints(limb); - map_delete(MissingLimbs, limb); - return 1; - } ! /* int DestLimb(string limb) ! * string limb - the limb being removed ! * ! * description ! * removes a limb from the limbs mapping. The limb isn't marked as mising, ! * and the monster doesn't die even if you remove a fatal limb. Useful for ! * removing limbs from standard race types. Removing the torso isn't allowed. ! * ! * returns -1 on error, 0 on failure, 1 on success ! */ ! int DestLimb(string limb) { ! string *kiddies; ! int i; ! if(!limb || !Limbs[limb]) return -1; ! if(!Limbs[limb]["parent"]) { ! return -1; } - Limbs[Limbs[limb]["parent"]]["children"] -= ({ limb }); - if( (i = sizeof(kiddies = Limbs[limb]["children"])) ) - while(i--) DestLimb(kiddies[i]); - map_delete(Limbs, limb); - return 1; - } - - /* int this_object()->RemoveLimb(string limb, object agent) - * string limb - the limb being removed - * object agent - the agent who is responsible for the limb removal - * - * description - * removes a limb from the limbs mapping and stores vital data in the - * missing limbs mapping - * - * returns -1 on error, 0 on failure, 1 on success - */ - int RemoveLimb(string limb, object agent) { - string *kiddies; - string limbname,adjname,templimbname; - int i; ! if(limb == "torso") return 0; ! if( sscanf(limb, "%s %s", adjname, templimbname) == 2 ) limbname=templimbname; ! else limbname=limb; ! if(!limb || !Limbs[limb]) return -1; ! if(!Limbs[limb]["parent"] || Limbs[limb]["class"] == 1) { ! object objict; ! message("environment", possessive_noun(GetName()) + " " + limb + ! " is severed!", environment(), ({ this_object() })); ! message("environment", "Your "+ limb + " is severed!", this_object()); ! if(GetRace() == "golem") { ! objict = new(LIB_CLAY); ! if(GetBodyComposition()) objict->SetComposition(GetBodyComposition()); ! } ! else { ! if(GetRace() == "android") objict = new(LIB_BOT_LIMB); ! else objict = new(LIB_LIMB); ! objict->SetLimb(limb, GetCapName(), GetRace()); ! objict->SetId( ({ limb, limbname, "limb" })); ! } ! objict->eventMove(environment()); ! i = sizeof(WornItems[limb]); ! while(i--) { ! WornItems[limb][i]->SetWorn(0); ! WornItems[limb][i]->eventMove(objict); } - while( i = sizeof(WornItems[limb]) ) - eventRemoveItem(WornItems[limb][i]); ! HealthPoints = 0; ! if( !Dying ) { ! Dying = 1; ! call_out((: eventDie, agent :), 0); ! } ! return 0; } - MissingLimbs[limb] = copy(Limbs[limb]); - Limbs[Limbs[limb]["parent"]]["children"] -= ({ limb }); - if( (i = sizeof(kiddies = Limbs[limb]["children"])) ) - while(i--) this_object()->RemoveLimb(kiddies[i], agent); - map_delete(Limbs, limb); - if( environment() ) { - object ob; ! message("environment", possessive_noun(GetName()) + " " + limb + ! " is severed!", environment(), ({ this_object() })); ! message("environment", "Your "+ limb + " is severed!", this_object()); ! if(GetRace() == "golem") { ! ob = new(LIB_CLAY); ! if(GetBodyComposition()) ob->SetComposition(GetBodyComposition()); ! } ! else { ! if(GetRace() == "android") ob = new(LIB_BOT_LIMB); ! else ob = new(LIB_LIMB); ! ob->SetLimb(limb, GetCapName(), GetRace()); ! ob->SetId( ({ limb, limbname, "limb" })); ! } ! ob->eventMove(environment()); ! i = sizeof(WornItems[limb]); ! while(i--) { ! WornItems[limb][i]->SetWorn(0); ! WornItems[limb][i]->eventMove(ob); ! } ! while( i = sizeof(WornItems[limb]) ) ! eventRemoveItem(WornItems[limb][i]); } ! return 1; ! } ! mapping GetLimb(string limb) { ! if(!limb || !Limbs[limb]) return 0; ! else return copy(Limbs[limb]); ! } ! /* string GetRandomLimb(string targ) ! * string targ - the targetted limb ! * ! * description ! * returns a random limb weighted towards the targetted limb ! */ ! string GetRandomLimb(string targ) { ! string array limbs; ! if( !targ ) { ! targ = GetTorso(); } ! if( member_array(targ, (limbs=keys(Limbs))) == -1) { ! targ= GetTorso(); /* no target or illegal target, weight torso */ } - targ = (limbs + (targ ? ({ targ, targ }) : ({})))[random(sizeof(limbs)+2)]; - return targ; - } ! string GetTorso() { ! string *limbs; ! int i; ! i = sizeof(limbs = keys(Limbs)); ! while(i--) { ! if(!Limbs[limbs[i]]["parent"]) { ! return limbs[i]; ! } ! } ! return 0; ! } - string array GetLimbs() { - return (Limbs ? keys(Limbs) : 0); - } ! int GetLimbClass(string limb) { return Limbs[limb]["class"]; } ! string GetLimbParent(string limb) { return Limbs[limb]["parent"]; } ! string array GetLimbChildren(string limb) { ! return Limbs[limb]["children"] + ({}); ! } ! mapping GetMissingLimb(string limb) { ! return (limb ? copy(MissingLimbs[limb]) : 0); ! } ! string array GetMissingLimbs() { return keys(MissingLimbs); } ! string GetLong(string nom) { ! string *limbs; ! string *exempt; ! string str; ! float h; ! str = ""; ! exempt = ({"android","tree","plant"}); ! if(member_array(this_object()->GetRace(),exempt) == -1 && ! !this_object()->GetUndead() ) { ! str = "The "+this_object()->GetGender()+" "; ! str += this_object()->GetRace(); ! h = percent(GetHealthPoints(), GetMaxHealthPoints()); ! if( h < 10.0 ) str += " is mortally wounded.\n"; ! else if( h < 20.0 ) str += " is near death.\n"; ! else if( h < 30.0 ) str += " is severely injured.\n"; ! else if( h < 40.0 ) str += " is badly injured.\n"; ! else if( h < 50.0 ) str += " is hurt.\n"; ! else if( h < 60.0 ) str += " is slightly injured.\n"; ! else if( h < 70.0 ) str += " has some cuts and bruises.\n"; ! else if( h < 80.0 ) str += " is in decent shape.\n"; ! else if( h < 90.0 ) str += " is quite keen.\n"; ! else str += " is in top condition.\n"; ! } ! ! if(this_object()->GetUndead()) { ! str = capitalize(nominative(this_object()))+" has been killed, and "; ! str += "is one of the Walking Undead.\n"; ! } ! ! limbs = GetMissingLimbs(); ! if( sizeof(limbs) ) { ! int i, maxi; ! ! str += capitalize(nom) + " is missing " + add_article(limbs[0]); ! for(i=1, maxi = sizeof(limbs); i 2 ) str += ","; ! str += " and " + add_article(limbs[i]); } } ! str += ".\n"; } - return str; - } - - string array GetWieldingLimbs() { - return filter(keys(Limbs), (: (Limbs[$1]["armors"] & A_WEAPON) :)); - } ! /* int AddFingers(string limb, int x) ! * string limb - the limb to which fingers will be added ! * int x - the number of fingers being added, can be negative ! * ! * description ! * adds the given number of fingers to the given limb ! * ! * returns the total number of fingers after addition ! */ ! varargs int AddFingers(string limb, int x) { ! if((Fingers[limb] += x) < 1) Fingers[limb] = 1; ! return Fingers[limb]; ! } ! int GetFingers(string limb) { ! return Fingers[limb]; ! } ! varargs object *GetWorn(string limb) { ! if(!limb) { ! object *ret = ({}); ! string *limbs; ! int i; ! i = sizeof(limbs = keys(Limbs)); ! while(i--) if(WornItems[limbs[i]]) ret += ({ WornItems[limbs[i]] }); ! return distinct_array(ret); } - else if(!WornItems[limb]) return ({}); - else return (WornItems[limb] + ({})); - } ! varargs mixed GetWielded(string limb) { ! if(!limb) { ! object *ret = ({}); ! string *limbs; ! int i; ! i = sizeof(limbs = keys(Limbs)); ! while(i--) { ! if(!WornItems[limbs[i]]) continue; ! else ret += filter(WornItems[limbs[i]], ! (: (int)$1->GetArmorType() == A_WEAPON :)); } ! return distinct_array(ret); ! } ! else if(!WornItems[limb]) return 0; ! else { ! object *ret; ! ! ret = filter(WornItems[limb], (: (int)$1->GetArmorType() == A_WEAPON :)); ! if(sizeof(ret)) return ret[0]; ! else return 0; } - } ! /* varargs static int AddHealthPoints(int x, string limb, object agent) ! * int x - number of points being added, may be negative (required) ! * string limb - the limb to which health is being added (optional) ! * object agent - the living responsible for this damage ! * ! * defaults ! * limb defaults to 0 ! * ! * description ! * if the value of limb is not zero, then "x" number of health points will ! * be added to limb "limb" ! * if he value is 0, then the overall health points will be modified ! * ! * returns the remaining number of health points for the limb in question ! * or for the overall health points ! */ ! varargs static int AddHealthPoints(int x, string limb, object agent) { ! int y; ! if( limb ) { ! if( !Limbs[limb] ) return -1; ! y = GetMaxHealthPoints(limb); ! if((Limbs[limb]["health"] += x) < 1) Limbs[limb]["health"] = 0; ! else if(Limbs[limb]["health"] > y) ! Limbs[limb]["health"] = y; ! return Limbs[limb]["health"]; } ! else { ! if((HealthPoints += x) < 1) HealthPoints = 0; ! else if(HealthPoints > (y = GetMaxHealthPoints())) HealthPoints = y; ! if( HealthPoints < 1 ) { ! if( !Dying ) { ! Dying = 1; ! call_out( (: eventDie, agent :), 0); ! } } else { ! float h = percent(GetHealthPoints(), GetMaxHealthPoints()); ! if( h < COLLAPSE_AT ) { ! eventCollapse(); } } - return HealthPoints; } - } ! varargs int GetHealthPoints(string limb) { ! if(limb) { ! if(!Limbs[limb]) return -1; ! else return Limbs[limb]["health"]; } - else return HealthPoints; - } ! varargs int GetMaxHealthPoints(string limb) { return 0; } ! /* int AddMagicPoints(int x) ! * int x - the number of magic points being added, may be negative ! * ! * description ! * adds magic points to the body ! * ! * returns the remaining magic points ! */ ! int AddMagicPoints(int x) { ! int y; ! if((MagicPoints += x) < 1) MagicPoints = 0; ! else if(MagicPoints > (y = GetMaxMagicPoints())) MagicPoints = y; ! return MagicPoints; ! } ! int GetMagicPoints() { return MagicPoints; } ! int GetMaxMagicPoints() { return 0; } ! /* int AddStaminaPoints(int x) ! * int x - number of stamina points being added ! * ! * description ! * adds "x" stamina points, can be negative ! * ! * returns the remaining number of stamina points ! */ ! float AddMoJo(mixed x){ ! if( !intp(x) && !floatp(x) ) ! error("Bad argument 1 to AddMojo().\n"); ! if( intp(x) ) x = to_float(x); ! if((MoJo += x) < 0.1) MoJo = 0.0; ! if(MoJo > 100) MoJo = 100; ! return MoJo; ! } ! ! float GetMoJo() { return MoJo; } ! ! int AddLead(string ammo,int number){ ! if( !intp(number) ) error("Bad argument 2 to AddLead().\n"); ! if( !stringp(ammo) ) error("Bad argument 1 to AddLead().\n"); ! if( ammo == "gunshot_wounds" ) gunshot_wounds += number; ! if( ammo == "rifleshot_wounds" ) rifleshot_wounds += number; ! if( rifleshot_wounds + gunshot_wounds < 0 ) { ! gunshot_wounds = 0; ! rifleshot_wounds = 0; } - return 1; - } ! int GetLead(string ammo){ ! int number; ! number = 0; ! if(!ammo || !stringp(ammo)) number = gunshot_wounds + rifleshot_wounds; ! if(!ammo || !stringp(ammo)) return number; ! if(ammo == "gunshot_wounds") return gunshot_wounds; ! if(ammo == "rifleshot_wounds") return rifleshot_wounds; ! return 0; ! } ! float AddStaminaPoints(mixed x) { ! float y; - if( !intp(x) && !floatp(x) ) - error("Bad argument 1 to AddStaminaPoints().\n"); - if( intp(x) ) x = to_float(x); - if((StaminaPoints += x) < 0.1) StaminaPoints = 0.0; - else if(StaminaPoints > (y = GetMaxStaminaPoints())) StaminaPoints = y; - return StaminaPoints; - } ! int GetStaminaPoints() { return to_int(StaminaPoints); } ! float GetMaxStaminaPoints() { return 0; } ! int AddExperiencePoints(mixed x) { ! if( !intp(x)) error("Bad argument 1 to AddExperiencePoints().\n"); ! if((ExperiencePoints += x) < 0) ExperiencePoints = 0; ! return ExperiencePoints; ! } ! int GetExperiencePoints() { return ExperiencePoints; } ! int AddQuestPoints(mixed x) { ! if( !intp(x)) error("Bad argument 1 to AddQuestPoints().\n"); ! if((QuestPoints+= x) < 0) QuestPoints = 0; ! return QuestPoints; ! } ! int GetQuestPoints() { return QuestPoints; } ! int AddMagicProtection(class MagicProtection cl) { ! if( ( !cl->absorb && !(cl->protect && cl->time) ) || ! ( cl->hit && !functionp(cl->hit) ) || ! ( cl->end && !functionp(cl->end) ) || ! ( !cl->bits ) ! ) { ! error("Illegal class setting passed to AddMagicProtection.\n"); ! return 0; } - cl->timestamp = time(); - Protection += ({ cl }); - return 1; - } ! class MagicProtection array GetMagicProtection() { return Protection; } ! int RemoveMagicProtection(int i) { ! if( i > sizeof(Protection) - 1 ) return 0; ! if( Protection[i]->end ) { ! if( !(functionp(Protection[i]->end) & FP_OWNER_DESTED) ) { ! evaluate(Protection[i]->end, this_object()); } } - Protection -= ({ Protection[i] }); - return 1; - } ! // This is for creatures that do not use weapons. ! // I had to crank down unarmed combat for humanoids, ! // so if your npc's are, say, dumb animals, be sure ! // to include "SetMelee(1)" so they can fight ! // ! int SetMelee(int i) { melee = i; return melee; } ! int GetMelee() { return melee; } - int GetDying() { return Dying; } ! int SetSleeping(int x) { return (Sleeping = x); } ! int GetSleeping() { return Sleeping; } ! int AddAlcohol(int x) { return (Alcohol += x); } ! int GetAlcohol() { return Alcohol; } ! int AddCaffeine(int x) { return (Caffeine += x); } ! int GetCaffeine() { return Caffeine; } ! int AddDrink(int x) { return (Drink += x); } ! int GetDrink() { return Drink; } ! int AddFood(int x) { return (Food += x); } ! int GetFood() { return Food; } ! int AddPoison(int x) { ! Poison += x; ! if( Poison < 1 ) { ! Poison = 0; } - return Poison; - } ! int GetPoison() { return Poison; } ! string GetResistance(int type) { return "none"; } ! string GetRace() { return 0; } ! string GetName() { return 0; } ! string GetCapName() { return 0; } ! int GetHeartRate() { ! int rate; ! rate = (GetAlcohol() - GetCaffeine()); ! if( rate > 50 ) rate = 6; ! else if( rate > 25 ) rate = 5; ! else if( rate > 0 ) rate = 4; ! else if( rate > -25 ) rate = 3; ! else rate = 2; ! rate += HeartModifier; ! if( rate < 1 ) { ! rate = 1; ! } ! else if( rate > 10 ) { ! rate = 10; } - return rate; - } ! int GetHealRate() { ! int heal; ! heal = 1 - (GetPoison() / 10); ! heal += (GetDrink() + GetFood()) / 10; ! heal *= (1 + (GetSleeping() > 1) + (GetAlcohol() > 10)); ! return heal; ! } ! string GetHealthShort() { ! string cl, sh; ! float h; ! if( !(sh = GetShort()) ) return 0; ! h = percent(GetHealthPoints(), GetMaxHealthPoints()); ! if( h > 90.0 ) cl = "%^BOLD%^GREEN%^"; ! else if( h > 75.0 ) cl = "%^GREEN%^"; ! else if( h > 50.0 ) cl = "%^BOLD%^BLUE%^"; ! else if( h > 35.0 ) cl = "%^BLUE%^"; ! else if( h > 20.0 ) cl = "%^BOLD%^RED%^"; ! else cl = "%^RED%^"; ! return cl + capitalize(sh); ! } ! mixed SetProtect(function f) { return (Protect = f); } ! function GetProtect() { return Protect; } ! int GetHeartModifier() { ! return HeartModifier; ! } ! varargs int AddHeartModifier(int x, int t) { ! HeartModifier += x; ! if( t > 0 ) { ! call_out((: AddHeartModifier(-$(x)) :), t); } - return HeartModifier; - } ! int AddHP(int hp){ ! this_object()->AddHealthPoints(hp); ! return hp; ! } ! string GetAffectLong(object ob){ ! object dude; ! string ret; ! int alclevel; ! dude = this_object(); ! alclevel = dude->GetAlcohol(); ! ret = ""; ! if(dude->GetSleeping() > 0) { ! ret += dude->GetName()+" is asleep.\n"; ! } - else if(alclevel > 10){ - if(alclevel < 20) ret += dude->GetName()+" looks tipsy.\n"; - else if(alclevel < 50) ret += dude->GetName()+" looks drunk.\n"; - else if(alclevel < 70) ret += dude->GetName()+" is very drunk.\n"; - else ret += dude->GetName()+" is completely wasted drunk.\n"; } ! return ret; ! } --- 665,1717 ---- SetUndead(!(x = GetUndead())); ! //call_out( function() { Dying = 0; }, 0); ! evaluate( function() { Dying = 0; }); ! flush_messages(); ! return 1; ! } ! ! /* int eventRemoveItem(object ob) ! * object ob - the item being removed ! * ! * Removes a worn or wielded item from the list ! * ! * returns 1 on success, 0 on failure ! */ ! int eventRemoveItem(object ob) { ! string limb; ! ! foreach(limb in keys(WornItems)) { ! if( !WornItems[limb] ) continue; ! if( member_array(ob, WornItems[limb]) != -1) { ! WornItems[limb] -= ({ ob }); ! } } + return 1; } ! /* int eventWear(object ob, mixed limbs) ! * object ob - the item being worn (wielded) ! * mixed limbs - string or array of limbs on which it is being worn ! * ! * description ! * marks the limbs "limbs" as being protected by the armor "ob" ! * ! * returns 1 if successful, 0 if failure ! */ ! int eventWear(object ob, mixed limbs) { ! string limb,s1; ! string *target_limb; ! target_limb = ({}); ! ! if( stringp(limbs) ) { ! limbs = ({ limbs }); ! } ! if( CanWear(ob, limbs) != 1 ) { ! return 0; ! } ! if(!inherits(LIB_WEAPON, ob)){ ! foreach(limb in limbs) { ! if(sscanf(limb,"%s foot",s1) || sscanf(limb,"%s hand",s1) ){ ! if(!sizeof(GetWorn(limb))) target_limb = ({ limb }); ! } } } + if(sizeof(target_limb)) limbs = target_limb; + foreach(limb in limbs) { + if( !WornItems[limb] ) WornItems[limb] = ({ ob }); + else WornItems[limb] += ({ ob }); + } + return 1; } ! string *GetEquippedLimbs(){ ! string *equipped_limbs = ({}); ! object *wornstuff = filter(all_inventory(this_object()), (: $1->GetWorn() :) ); ! ! foreach(object item in wornstuff){ ! equipped_limbs += item->GetWorn(); ! } ! return equipped_limbs; ! } ! /************ /lib/body.c Data manipulation functions *************/ ! void NewBody(string race) { ! if(!race) ! Limbs = ([ (Torso = "ooze") : ([ "parent" : 0, "children" : ({}), ! "health" : 50, "class" : 1, "armors" : 0 ]) ]); ! else Limbs = ([]); ! MissingLimbs = ([]); ! Fingers = ([]); ! } ! ! /* int CanWear(object armor, string *limbs) ! * object armor - the piece of armor being checked ! * string *limbs - the limbs on which the armor wants to be worn ! * a nested array indicates that just one of the included limbs ! * must be satisfied ! * ! * description ! * checks to see if a particular armor can be worn ! * ! * returns 1 if the armor can be worn on those limbs ! * returns 0 if the armor cannot be worn there for any reason ! * ! */ ! mixed CanWear(object ob, string *limbs) { ! string limb, verb_pr, verb_pt, short; ! int type, bad_types, i, maxi; ! ! if( !ob ) return 0; ! short = (string)ob->GetShort(); ! if( !(type = (int)ob->GetArmorType()) ) ! return capitalize(short) + " cannot be worn!"; ! if( type & A_WEAPON ) { ! verb_pr = "wield"; ! verb_pt = "wielded"; ! } ! else { ! verb_pr = "wear"; ! verb_pt = "worn"; ! } ! if( !limbs || !(maxi = sizeof(limbs)) ) ! return "Where should " + short + " be "+ verb_pt + "?"; ! if( (string *)ob->GetWorn() ) ! return "It is already being " + verb_pt + "."; ! // Verify that the the item can be worn on each limb specified by limbs. ! i = 0; ! foreach(limb in limbs) { ! ! // Nested arrays indicate that only one of the elements in the nested ! // array must be satisfied. Check for one valid limb, and replace the ! // nested array with the valid limb, if found. ! if( arrayp(limb) ) { ! string limb2; ! string validLimb = 0; ! int leastRings = -1; ! ! if(!sizeof(limb)) error("Bad limb specification to CanWear().\n"); ! // Iterate through the nested array. ! foreach(limb2 in limb) { ! string* wornItems; ! ! // The limb will be valid if: ! // o The body has the named limb capable of wearing the armor type. ! // o There are no armors of the same type on that limb, except ! // for rings, which can have up to GetFingers() of that type worn. ! if(!Limbs[limb2] || !(Limbs[limb2]["armors"] & type)) continue; ! wornItems = WornItems[limb2]; ! ! // If the item is a ring, attempt to distribute the rings evenly ! // across the available hands. ! if(type == A_RING) { ! int currentRings; ! ! if(!sizeof(wornItems)) currentRings = 0; ! else currentRings = sizeof(filter(wornItems, ! (:(int)$1->GetArmorType() == A_RING:))); ! if(currentRings >= leastRings && leastRings != -1) continue; ! leastRings = currentRings; ! if(currentRings >= GetFingers(limb2)) continue; ! } ! else if(wornItems) { ! object wornItem; ! int tmpType = 0; ! ! foreach(wornItem in wornItems) ! if(wornItem) tmpType |= (int)wornItem->GetArmorType(); ! if(tmpType & type) continue; ! } ! validLimb = limb2; } ! if(validLimb) limbs[i] = validLimb; ! else return "You cannot " + verb_pr + " that."; ! } ! else { ! if(!GetLimb(limb)) { ! return "Try a different body part."; ! } ! globalint1 = Limbs[limb]["armors"]; ! if( !Limbs[limb] ) return "You have no " + limb + "."; ! if( !(globalint1 & type) ) { ! if( type & A_WEAPON ) ! return "You cannot wield with " + limb + "."; ! else return "You cannot wear " + short + " on your " + limb + "."; } } ! i++; ! } ! switch(type) { ! case A_RING: ! if(maxi != 1) ! return "You can only wear " + short + " on one limb."; ! if( !WornItems[limbs[0]] ) return 1; /* nothing there, ring ok */ ! /* count # worn rings */ ! i = sizeof(filter(WornItems[limbs[0]], ! (: (int)$1->GetArmorType() == A_RING :))); ! if(i >= GetFingers(limbs[0])) ! return "You are already wearing too many rings there."; ! else return 1; /* ok */ ! case A_GLOVE: ! if(maxi != 1) ! //return "You can only wear " + short + " on one limb."; ! if( GetFingers(limbs[0]) > (int)ob->GetFingers() ) { ! return capitalize(short) + " does not seem to fit well on " ! "your " + limbs[0] + "."; ! } ! bad_types = A_GLOVE | A_LONG_GLOVE | A_SOCK | A_LONG_SOCK; ! break; ! case A_LONG_GLOVE: ! if(maxi != 2) ! return capitalize(short) + " should be worn on two limbs."; ! if( limbs[0] == Limbs[limbs[1]]["parent"] ) { /* which is hand? */ ! /* more fingers than this armor can stand */ ! if(GetFingers(limbs[1]) > (int)ob->GetFingers()) ! return capitalize(short) + " does not seem to fit well on " ! "your " + limbs[1] + "."; ! } ! else if(limbs[1] == Limbs[limbs[0]]["parent"]) { ! /* ok, first limb is hand, check it */ ! if(GetFingers(limbs[0]) > (int)ob->GetFingers()) ! return capitalize(short) + " does not seem to fit well on " ! "your " + limbs[1] + "."; ! } ! else return "Your " + limbs[0] + " is not connected to your " + ! limbs[1] + "."; ! bad_types = A_GLOVE | A_LONG_GLOVE; ! break; ! case A_BOOT: case A_SOCK: ! if(maxi != 1) ! capitalize(short) + " may only be worn on one limb."; ! if(type == A_SOCK) bad_types = A_SOCK | A_LONG_SOCK; ! else bad_types = A_BOOT | A_LONG_BOOT; ! break; ! case A_LONG_BOOT: case A_LONG_SOCK: ! if(maxi != 2) ! return capitalize(short) + " must be worn only on two limbs."; ! if(limbs[0] != Limbs[limbs[1]]["parent"] && ! limbs[1] != Limbs[limbs[0]]["parent"]) ! return "Your " + limbs[0] + " is not connected to your " + ! limbs[1] + "."; ! if(type == A_LONG_SOCK) bad_types = A_LONG_SOCK | A_SOCK; ! else bad_types = A_BOOT | A_LONG_BOOT; ! break; ! case A_HELMET: case A_VEST: case A_AMULET: case A_VISOR: case A_BELT: case A_COLLAR: ! if(maxi != 1) ! return capitalize(short) + " may only be worn on one limb."; ! bad_types = type; ! break; ! case A_PANTS: case A_SHIRT: ! bad_types = type; ! break; ! case A_CLOAK: ! bad_types = type; ! break; ! case A_SHIELD: ! foreach(limb in limbs) { ! object worn_item; ! int tmp = 0; ! ! if( !WornItems[limb] ) continue; /* no armors, no prob */ ! if( !Limbs[limb]["parent"] ) continue; /* torso ok for 2 */ ! foreach(worn_item in WornItems[limb]) { ! if( !worn_item ) continue; ! tmp |= (int)worn_item->GetArmorType(); ! } ! /* not gonna allow 2 shields or a shield and weapon here */ ! if( tmp & (A_SHIELD | A_WEAPON) ) ! return "You cannot wear " + short + " there right now."; ! } ! return 1; /* ok */ ! case A_WEAPON: ! foreach(limb in limbs) { ! object worn_item; ! int tmp = 0; ! ! if( !WornItems[limb] ) continue; /* nothing there, ok */ ! foreach(worn_item in WornItems[limb]) { ! if( !worn_item ) continue; ! tmp += (int)worn_item->GetArmorType(); ! } ! /* again, not allowing 2 weapons or a shield and weapon */ ! if(tmp & (A_SHIELD | A_WEAPON)) ! return "You cannot wield " + short + " there right now."; ! } ! return 1; /* ok */ ! case A_ARMOR: case A_BODY_ARMOR: ! bad_types = A_ARMOR | A_BODY_ARMOR; ! break; ! case A_COLLAR: ! bad_types = A_COLLAR | A_AMULET; ! break; ! ! default: return 0; /* not any illegal stuff */ } foreach(limb in limbs) { object worn_item; int tmp = 0; ! if( !WornItems[limb] ) continue; /* no preventing types */ ! foreach( worn_item in WornItems[limb] ) { if( !worn_item ) continue; tmp |= (int)worn_item->GetArmorType(); } ! if(tmp & bad_types){ ! return "You cannot " + verb_pr + " " + short + " there right now."; ! } } return 1; /* ok */ ! } ! mixed CanManipulate(){ ! string *prehensile_limbs = this_object()->GetWieldingLimbs(); ! if(!sizeof(prehensile_limbs)){ ! say(this_object()->GetName()+" looks helpless without prehensile appendages."); ! return "You lack prehensile limbs with which to do that."; } ! return 1; } ! int CanFly(){ ! string clipped = identify(this_player()->GetMissingLimbs()); ! if(creatorp(this_player())) return 1; ! if(!RACES_D->CanFly(this_player()->GetRace())) { ! return 0; ! } ! ! if(!clipped || !sizeof(clipped)) return 1; ! if(!grepp(lower_case(clipped),"wing")) return 1; return 0; } + /* int AddLimb(string limb, string parent, int classes, int *armors) + * string limb - the limb being added (required) + * string parent - the limb to which this one is being attached (required) + * int classes - rating of the limb's strength (optional) + * int *armors - the types of armors which can be worn here (optional) + * + * defaults + * classes defaults to 1 + * armors defaults to ({}) + * + * description + * adds the named limb to the body, attached at the named point + * the limb classes starts at 1 for a torso (strongest) + * to whatever the documentation rates as the weakest + * + * returns 1 on success, 0 on failure + */ + varargs int AddLimb(string limb, string parent, int classes, int *armors) { + int arm = 0; + + if(!limb || Limbs[limb] || (parent && !Limbs[parent])) return 0; + if(armors) { + int i; + + i = sizeof(armors); + while(i--) arm |= armors[i]; + } + if(MissingLimbs[limb]) map_delete(MissingLimbs, limb); + if( parent ) Limbs[parent]["children"] += ({ limb }); + else Torso = limb; + if( !classes ) classes = 5; + Limbs[limb] = ([ "parent" : parent, "children" : ({}), "class" : classes, + "armors" : arm ]); + Limbs[limb]["health"] = GetMaxHealthPoints(limb); + return 1; + } ! int HealLimb(string limb){ ! Limbs[limb]["health"] = GetMaxHealthPoints(limb); ! return Limbs[limb]["health"]; ! } ! // Restore Limb has been bugfixed and modified to ! // handle missing parents and missing children. To restore ! // a limb, RestoreLimb("right arm") will restore the arm only. ! // To restore the arm plus its children (in this case, a ! // hand) use RestoreLimb("right arm",1) and this will enable ! // the recursive restore of the limb. Trying to restore ! // a limb will fail if the parent is missing. ! ! varargs int RestoreLimb(string limb, int recurse) { ! if( !MissingLimbs[limb] ) return 0; ! if(!sizeof(Limbs[MissingLimbs[limb]["parent"]])) return 0; ! Limbs[limb] = MissingLimbs[limb]; ! map_delete(MissingLimbs, limb); ! Limbs[limb]["health"] = GetMaxHealthPoints(limb); ! ! // This ensures that the parent of the current limb has this ! // limb added to its children array. ! if(member_array(limb,Limbs[Limbs[limb]["parent"]]["children"]) == -1){ ! Limbs[Limbs[limb]["parent"]]["children"] += ({ limb }); ! } ! ! if(recurse && sizeof(MissingLimbs)){ ! string *kinder = ({}); ! foreach(string key, mixed val in MissingLimbs){ ! if(MissingLimbs[key]["parent"] == limb) kinder += ({ key }); ! } ! if(sizeof(kinder)){ ! foreach(string element in kinder) this_object()->RestoreLimb(element, 1); ! } ! } ! return 1; } ! /* int DestLimb(string limb) ! * string limb - the limb being removed ! * ! * description ! * removes a limb from the limbs mapping. The limb isn't marked as mising, ! * and the monster doesn't die even if you remove a fatal limb. Useful for ! * removing limbs from standard race types. Removing the torso isn't allowed. ! * ! * returns -1 on error, 0 on failure, 1 on success ! */ ! int DestLimb(string limb) { ! string *kiddies; ! int i; ! if(!limb || !Limbs[limb]) return -1; ! if(!Limbs[limb]["parent"]) { ! return -1; ! } ! Limbs[Limbs[limb]["parent"]]["children"] -= ({ limb }); ! if( (i = sizeof(kiddies = Limbs[limb]["children"])) ) ! while(i--) DestLimb(kiddies[i]); ! map_delete(Limbs, limb); ! return 1; } ! /* int this_object()->RemoveLimb(string limb, object agent) ! * string limb - the limb being removed ! * object agent - the agent who is responsible for the limb removal ! * ! * description ! * removes a limb from the limbs mapping and stores vital data in the ! * missing limbs mapping ! * ! * returns -1 on error, 0 on failure, 1 on success ! */ ! int RemoveLimb(string limb, object agent) { ! string *kiddies; ! string limbname,adjname,templimbname; ! int i; ! if(limb == "torso" || limb == "neck") return 0; ! if( sscanf(limb, "%s %s", adjname, templimbname) == 2 ) limbname=templimbname; ! else limbname=limb; + if(!limb || !Limbs[limb]) return -1; + if(!Limbs[limb]["parent"] || Limbs[limb]["class"] == 1) { + object objict; + message("environment", possessive_noun(GetName()) + " " + limb + + " is severed!", environment(), ({ this_object() })); + message("environment", "Your "+ limb + " is severed!", this_object()); + + + if(GetRace() == "golem") { + objict = new(LIB_CLAY); + if(GetBodyComposition()) objict->SetComposition(GetBodyComposition()); + } + else { + if(GetRace() == "android") objict = new(LIB_BOT_LIMB); + else objict = new(LIB_LIMB); + objict->SetLimb(limb, GetCapName(), GetRace()); + objict->SetId( ({ limb, limbname, "limb" })); + } + objict->eventMove(environment()); + i = sizeof(WornItems[limb]); + while(i--) { + WornItems[limb][i]->SetWorn(0); + WornItems[limb][i]->eventMove(objict); + } + while( i = sizeof(WornItems[limb]) ) + eventRemoveItem(WornItems[limb][i]); ! HealthPoints = 0; ! if( !Dying ) { ! Dying = 1; ! //tc("agent: "+identify(agent),"green"); ! Agent = agent; ! //tc("Agent: "+identify(Agent),"blue"); ! //call_out((: eventDie, Agent :), 0); ! eventDie(Agent); ! } ! return 0; ! } ! MissingLimbs[limb] = copy(Limbs[limb]); ! Limbs[Limbs[limb]["parent"]]["children"] -= ({ limb }); ! if( (i = sizeof(kiddies = Limbs[limb]["children"])) ) ! while(i--) this_object()->RemoveLimb(kiddies[i], agent); ! map_delete(Limbs, limb); ! if( environment() ) { ! object ob; ! ! message("environment", possessive_noun(GetName()) + " " + limb + ! " is severed!", environment(), ({ this_object() })); ! message("environment", "Your "+ limb + " is severed!", this_object()); ! if(GetRace() == "golem") { ! ob = new(LIB_CLAY); ! if(GetBodyComposition()) ob->SetComposition(GetBodyComposition()); ! } ! else { ! if(GetRace() == "android") ob = new(LIB_BOT_LIMB); ! else ob = new(LIB_LIMB); ! ob->SetLimb(limb, GetCapName(), GetRace()); ! ob->SetId( ({ limb, limbname, "limb" })); ! } ! ob->eventMove(environment()); ! i = sizeof(WornItems[limb]); ! while(i--) { ! WornItems[limb][i]->SetWorn(0); ! WornItems[limb][i]->eventMove(ob); ! } ! while( i = sizeof(WornItems[limb]) ) ! eventRemoveItem(WornItems[limb][i]); } ! return 1; } ! mapping GetLimb(string limb) { ! if(!limb || !Limbs[limb]) return 0; ! else return copy(Limbs[limb]); } ! /* string GetRandomLimb(string targ) ! * string targ - the targetted limb ! * ! * description ! * returns a random limb weighted towards the targetted limb ! */ ! string GetRandomLimb(string targ) { ! string array limbs; ! if( !targ ) { ! targ = GetTorso(); ! } ! if( member_array(targ, (limbs=keys(Limbs))) == -1) { ! targ= GetTorso(); /* no target or illegal target, weight torso */ ! } ! targ = (limbs + (targ ? ({ targ, targ }) : ({})))[random(sizeof(limbs)+2)]; ! return targ; ! } ! string GetTorso() { ! string *limbs; ! int i; ! i = sizeof(limbs = keys(Limbs)); ! while(i--) { ! if(!Limbs[limbs[i]]["parent"]) { ! return limbs[i]; ! } ! } ! return 0; } ! ! string array GetLimbs() { ! return (Limbs ? keys(Limbs) : 0); } ! int GetLimbClass(string limb) { return Limbs[limb]["class"]; } ! string GetLimbParent(string limb) { return Limbs[limb]["parent"]; } ! //The following function courtesy of Garfield @ M*U*D ! string GetMissingLimbParent(string limb) { return MissingLimbs[limb]["parent"]; } ! //The following function courtesy of Garfield @ M*U*D ! string *GetMissingLimbParents(string limb) { ! string *limbs; ! limbs = ({ limb }); ! while(memberp(keys(MissingLimbs),GetMissingLimbParent(limbs[0]))){ ! limbs = ({ GetMissingLimbParent(limbs[0]) }) + limbs; ! } ! return limbs; ! } ! string array GetLimbChildren(string limb) { ! return Limbs[limb]["children"] + ({}); ! } ! mapping GetMissingLimb(string limb) { ! return (limb ? copy(MissingLimbs[limb]) : 0); ! } ! // This function courtesy of Garfield ! // and Javelin at M*U*D ! int eventCompareLimbs(string limb1, string limb2){ ! if (memberp(GetMissingLimbParents(limb1), limb2)){ ! return 1; ! } ! if (memberp(GetMissingLimbParents(limb2), limb1)){ ! return -1; ! } ! return strcmp(limb1, limb2); ! } ! ! // New comparison functionality courtesy of ! // Garfield and Javelin at M*U*D ! varargs string array GetMissingLimbs(int not_default) { ! if(not_default) { ! string *tmp_arr = ({}); ! if(sizeof(keys(MissingLimbs))){ ! tmp_arr = sort_array(keys(MissingLimbs), (: eventCompareLimbs :) ); } + return tmp_arr; } ! else return keys(MissingLimbs); } ! string GetLong(string nom) { ! string *limbs; ! string *exempt; ! string str; ! float h; ! ! str = ""; ! exempt = ({"android","tree","plant"}); ! ! if(member_array(this_object()->GetRace(),exempt) == -1 && ! !this_object()->GetUndead() ) { ! str = "The "+this_object()->GetGender()+" "; ! str += this_object()->GetRace(); ! h = percent(GetHealthPoints(), GetMaxHealthPoints()); ! if( h < 10.0 ) str += " is mortally wounded.\n"; ! else if( h < 20.0 ) str += " is near death.\n"; ! else if( h < 30.0 ) str += " is severely injured.\n"; ! else if( h < 40.0 ) str += " is badly injured.\n"; ! else if( h < 50.0 ) str += " is hurt.\n"; ! else if( h < 60.0 ) str += " is slightly injured.\n"; ! else if( h < 70.0 ) str += " has some cuts and bruises.\n"; ! else if( h < 80.0 ) str += " is in decent shape.\n"; ! else if( h < 90.0 ) str += " is quite keen.\n"; ! else str += " is in top condition.\n"; ! } ! ! if(this_object()->GetUndead()) { ! str = capitalize(nominative(this_object()))+" has been killed, and "; ! str += "is one of the Walking Undead.\n"; ! } ! ! limbs = GetMissingLimbs(); ! if( sizeof(limbs) ) { ! int i, maxi; ! ! str += capitalize(nom) + " is missing " + add_article(limbs[0]); ! for(i=1, maxi = sizeof(limbs); i 2 ) str += ","; ! str += " and " + add_article(limbs[i]); ! } ! } ! str += ".\n"; ! } ! return str; ! } ! string array GetWieldingLimbs() { ! return filter(keys(Limbs), (: (Limbs[$1]["armors"] & A_WEAPON) :)); ! } ! /* int AddFingers(string limb, int x) ! * string limb - the limb to which fingers will be added ! * int x - the number of fingers being added, can be negative ! * ! * description ! * adds the given number of fingers to the given limb ! * ! * returns the total number of fingers after addition ! */ ! varargs int AddFingers(string limb, int x) { ! if((Fingers[limb] += x) < 1) Fingers[limb] = 1; ! return Fingers[limb]; ! } ! int GetFingers(string limb) { ! return Fingers[limb]; } ! varargs object *GetWorn(string limb) { ! if(!limb) { ! object *ret = ({}); ! string *limbs; ! int i; ! i = sizeof(limbs = keys(Limbs)); ! while(i--) if(WornItems[limbs[i]]) ret += ({ WornItems[limbs[i]] }); ! return distinct_array(ret); } ! else if(!WornItems[limb]) return ({}); ! else return (WornItems[limb] + ({})); } ! varargs mixed GetWielded(string limb) { ! if(!limb) { ! object *ret = ({}); ! string *limbs; ! int i; ! i = sizeof(limbs = keys(Limbs)); ! while(i--) { ! if(!WornItems[limbs[i]]) continue; ! else ret += filter(WornItems[limbs[i]], ! (: (int)$1->GetArmorType() == A_WEAPON :)); ! } ! return distinct_array(ret); ! } ! else if(!WornItems[limb]) return 0; ! else { ! object *ret; ! ret = filter(WornItems[limb], (: (int)$1->GetArmorType() == A_WEAPON :)); ! if(sizeof(ret)) return ret[0]; ! else return 0; ! } } ! ! /* varargs static int AddHealthPoints(int x, string limb, object agent) ! * int x - number of points being added, may be negative (required) ! * string limb - the limb to which health is being added (optional) ! * object agent - the living responsible for this damage ! * ! * defaults ! * limb defaults to 0 ! * ! * description ! * if the value of limb is not zero, then "x" number of health points will ! * be added to limb "limb" ! * if he value is 0, then the overall health points will be modified ! * ! * returns the remaining number of health points for the limb in question ! * or for the overall health points ! */ ! ! varargs static int AddHealthPoints(int x, string limb, object agent) { ! int y; ! ! if( limb ) { ! if( !Limbs[limb] ) return -1; ! y = GetMaxHealthPoints(limb); ! if((Limbs[limb]["health"] += x) < 1) Limbs[limb]["health"] = 0; ! else if(Limbs[limb]["health"] > y) ! Limbs[limb]["health"] = y; ! return Limbs[limb]["health"]; } else { ! if((HealthPoints += x) < 1) HealthPoints = 0; ! else if(HealthPoints > (y = GetMaxHealthPoints())) HealthPoints = y; ! if( HealthPoints < 1 ) { ! if( !Dying ) { ! Dying = 1; ! Agent = agent; ! //tc("Agent: "+identify(Agent), "red");; ! //call_out( (: eventDie, Agent :), 0); ! eventDie(Agent); ! } ! } ! else { ! float h = percent(GetHealthPoints(), GetMaxHealthPoints()); ! if( h < COLLAPSE_AT ) { ! eventCollapse(); ! } } + return HealthPoints; } } ! varargs int GetHealthPoints(string limb) { ! if(limb) { ! if(!Limbs[limb]) return -1; ! else return Limbs[limb]["health"]; ! } ! else return HealthPoints; } ! varargs int GetMaxHealthPoints(string limb) { return 0; } ! /* int AddMagicPoints(int x) ! * int x - the number of magic points being added, may be negative ! * ! * description ! * adds magic points to the body ! * ! * returns the remaining magic points ! */ ! int AddMagicPoints(int x) { ! int y; ! if((MagicPoints += x) < 1) MagicPoints = 0; ! else if(MagicPoints > (y = GetMaxMagicPoints())) MagicPoints = y; ! return MagicPoints; ! } ! int GetMagicPoints() { return MagicPoints; } ! int GetMaxMagicPoints() { return 0; } ! /* int AddStaminaPoints(int x) ! * int x - number of stamina points being added ! * ! * description ! * adds "x" stamina points, can be negative ! * ! * returns the remaining number of stamina points ! */ ! float AddMoJo(mixed x){ ! if( !intp(x) && !floatp(x) ) ! error("Bad argument 1 to AddMojo().\n"); ! if( intp(x) ) x = to_float(x); ! if((MoJo += x) < 0.1) MoJo = 0.0; ! if(MoJo > 100) MoJo = 100; ! return MoJo; } ! float GetMoJo() { return MoJo; } + int AddLead(string ammo,int number){ + if( !intp(number) ) error("Bad argument 2 to AddLead().\n"); + if( !stringp(ammo) ) error("Bad argument 1 to AddLead().\n"); + if( ammo == "gunshot_wounds" ) gunshot_wounds += number; + if( ammo == "rifleshot_wounds" ) rifleshot_wounds += number; + if( rifleshot_wounds + gunshot_wounds < 0 ) { + gunshot_wounds = 0; + rifleshot_wounds = 0; + } + return 1; + } ! int GetLead(string ammo){ ! int number; ! number = 0; ! if(!ammo || !stringp(ammo)) number = gunshot_wounds + rifleshot_wounds; ! if(!ammo || !stringp(ammo)) return number; ! if(ammo == "gunshot_wounds") return gunshot_wounds; ! if(ammo == "rifleshot_wounds") return rifleshot_wounds; ! return 0; ! } ! float AddStaminaPoints(mixed x) { ! float y; ! if( !intp(x) && !floatp(x) ) ! error("Bad argument 1 to AddStaminaPoints().\n"); ! if( intp(x) ) x = to_float(x); ! if((StaminaPoints += x) < 0.1) StaminaPoints = 0.0; ! else if(StaminaPoints > (y = GetMaxStaminaPoints())) StaminaPoints = y; ! return StaminaPoints; ! } ! int GetStaminaPoints() { return to_int(StaminaPoints); } ! float GetMaxStaminaPoints() { return 0; } ! int AddExperiencePoints(mixed x) { ! if( !intp(x)) error("Bad argument 1 to AddExperiencePoints().\n"); ! if((ExperiencePoints += x) < 0) ExperiencePoints = 0; ! return ExperiencePoints; ! } ! int GetExperiencePoints() { return ExperiencePoints; } ! int AddQuestPoints(mixed x) { ! if( !intp(x)) error("Bad argument 1 to AddQuestPoints().\n"); ! if((QuestPoints+= x) < 0) QuestPoints = 0; ! return QuestPoints; } ! int GetQuestPoints() { return QuestPoints; } ! int AddMagicProtection(class MagicProtection cl) { ! if( ( !cl->absorb && !(cl->protect && cl->time) ) || ! ( cl->hit && !functionp(cl->hit) ) || ! ( cl->end && !functionp(cl->end) ) || ! ( !cl->bits ) ! ) { ! error("Illegal class setting passed to AddMagicProtection.\n"); ! return 0; } + cl->timestamp = time(); + Protection += ({ cl }); + return 1; } ! class MagicProtection array GetMagicProtection() { return Protection; } ! int RemoveMagicProtection(int i) { ! if( i > sizeof(Protection) - 1 ) return 0; ! if( Protection[i]->end ) { ! if( !(functionp(Protection[i]->end) & FP_OWNER_DESTED) ) { ! evaluate(Protection[i]->end, this_object()); ! } ! } ! Protection -= ({ Protection[i] }); ! return 1; ! } ! ! // This is for creatures that do not use weapons. ! // I had to crank down unarmed combat for humanoids, ! // so if your npc's are, say, dumb animals, be sure ! // to include "SetMelee(1)" so they can fight ! // ! int SetMelee(int i) { melee = i; return melee; } + int GetMelee() { return melee; } ! int GetDying() { return Dying; } ! int SetSleeping(int x) { return (Sleeping = x); } ! int GetSleeping() { return Sleeping; } ! int AddAlcohol(int x) { return (Alcohol += x); } ! int GetAlcohol() { return Alcohol; } ! int AddCaffeine(int x) { return (Caffeine += x); } ! int GetCaffeine() { return Caffeine; } ! int AddDrink(int x) { return (Drink += x); } ! int GetDrink() { return Drink; } ! int AddFood(int x) { return (Food += x); } ! int GetFood() { return Food; } ! ! int AddPoison(int x) { ! Poison += x; ! if( Poison < 1 ) { ! Poison = 0; ! } ! return Poison; } ! int GetPoison() { return Poison; } ! string GetResistance(int type) { return "none"; } ! string GetRace() { return 0; } ! string GetName() { return 0; } ! string GetCapName() { return 0; } ! int GetHeartRate() { ! int rate; ! rate = (GetAlcohol() - GetCaffeine()); ! if( rate > 50 ) rate = 6; ! else if( rate > 25 ) rate = 5; ! else if( rate > 0 ) rate = 4; ! else if( rate > -25 ) rate = 3; ! else rate = 2; ! rate += HeartModifier; ! if( rate < 1 ) { ! rate = 1; ! } ! else if( rate > 10 ) { ! rate = 10; ! } ! return rate; } ! int GetHealRate() { ! int heal; ! heal = 1 - (GetPoison() / 5); ! heal += (GetDrink() + GetFood()) / 10; ! heal *= (1 + (GetSleeping() > 1) + (GetAlcohol() > 10)); ! return heal; ! } ! string GetHealthShort() { ! string cl, sh; ! float h; ! if( !(sh = GetShort()) ) return 0; ! h = percent(GetHealthPoints(), GetMaxHealthPoints()); ! if( h > 90.0 ) cl = "%^BOLD%^GREEN%^"; ! else if( h > 75.0 ) cl = "%^GREEN%^"; ! else if( h > 50.0 ) cl = "%^BOLD%^BLUE%^"; ! else if( h > 35.0 ) cl = "%^BLUE%^"; ! else if( h > 20.0 ) cl = "%^BOLD%^RED%^"; ! else cl = "%^RED%^"; ! return cl + capitalize(sh); ! } ! mixed SetProtect(function f) { return (Protect = f); } ! function GetProtect() { return Protect; } ! int GetHeartModifier() { ! return HeartModifier; ! } ! varargs int AddHeartModifier(int x, int t) { ! HeartModifier += x; ! if( t > 0 ) { ! call_out((: AddHeartModifier(-$(x)) :), t); ! } ! return HeartModifier; } ! int AddHP(int hp){ ! this_object()->AddHealthPoints(hp); ! return hp; ! } ! string GetAffectLong(object ob){ ! object dude; ! string ret; ! int alclevel; ! dude = this_object(); ! alclevel = dude->GetAlcohol(); ! ret = ""; ! if(dude->GetSleeping() > 0) { ! ret += dude->GetName()+" is asleep.\n"; ! } ! ! else if(alclevel > 10){ ! if(alclevel < 20) ret += dude->GetName()+" looks tipsy.\n"; ! else if(alclevel < 50) ret += dude->GetName()+" looks drunk.\n"; ! else if(alclevel < 70) ret += dude->GetName()+" is very drunk.\n"; ! else ret += dude->GetName()+" is completely wasted drunk.\n"; ! } ! ! return ret; } ! int GetDeathEvents(){ ! return DeathEvents; ! } ! int SetDeathEvents(int i){ ! if(!i) DeathEvents = 0; ! else DeathEvents = 1; ! return DeathEvents; ! } diff -c -r --new-file ds2.0r18/lib/lib/clan.c ds2.0r28/lib/lib/clan.c *** ds2.0r18/lib/lib/clan.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/lib/clan.c Wed Jul 5 00:00:58 2006 *************** *** 0 **** --- 1,162 ---- + #include + #include "include/clan.h" + + private class ClanClass Clan; + + private int isWelcomed; + + static void create() { + Clan = new(class ClanClass); + Clan->leader = 0; + Clan->name = 0; + Clan->objectName = 0; + Clan->skill = 0; + isWelcomed = 0; + } + + static void init() { + if(!present(this_object(), this_player())) return; + if((string)this_player()->GetClan() != (string)GetClanName()) return; + if((string)this_player()->GetKeyName() == (string)GetLeader()) { + add_action("eventBring", "bring"); + add_action("eventInitiate", "initiate"); + add_action("eventRetire", "retire"); + } + this_player()->eventPrint("\n"); + if(!isWelcomed) { + this_player()->AddChannel(GetClanName()); + eventWelcome(this_player()); + isWelcomed = 1; + } + } + + mixed CanJoin(object ob) { return 1; } + + string GetAffectLong(object ob) { + if(!ob || !living(ob)) return 0; + return ob->GetName() + " is a member of the " + + pluralize(GetClanName()) + "."; + } + + string SetLeader(string str) { + if(!user_exists(str)) error("No such user: " + str + + ". You must have a real leader."); + if(!stringp(Clan->leader)) + Clan->leader = str; + return Clan->leader; + } + + string GetLeader() { return Clan->leader; } + + string SetClanName(string str) { + if(!stringp(Clan->name)) Clan->name = str; + return Clan->name; + } + + string GetClanName() { return Clan->name; } + + string SetClanObject(string str) { + if(!stringp(Clan->objectName)) Clan->objectName = str; + return Clan->objectName; + } + + string GetClanObject() { return Clan->objectName; } + + string SetClanSkill(string str) { + if(!stringp(Clan->skill)) Clan->skill = str; + return Clan->skill; + } + + string GetClanSkill() { return Clan->skill; } + + int eventBring(string str) { + object who; + + if(!str) return notify_fail("Bring whom?\n"); + who = find_player(lower_case(str)); + if(!who) + return notify_fail(who->GetName() + " is nowhere to be found.\n"); + if((string)who->GetClan() != (string)GetClanName()) + return notify_fail(who->GetName() + " is not one of you!\n"); + if( environment(who)->GetProperty("no teleport") + || environment(this_player())->GetProperty("no teleport") + || environment(this_player())->GetProperty("no magic")) + return notify_fail("A magic force blocks your powers.\n"); + if(present(who, environment(this_player()))) + return notify_fail(capitalize(str) + " is here.\n"); + if((int)this_player()->GetMagicPoints() < 70) + return notify_fail("Too low on magic power.\n"); + this_player()->AddMagicPoints(-70); + who->eventPrint("%^CYAN%^Your clan leader summons you.%^RESET%^"); + who->eventMoveLiving(environment(this_player())); + if(!present(who, environment(this_player()))) + this_player()->eventPrint("%^CYAN%^" + capitalize(str) + + " is beyond your reach.%^RESET%^"); + return 1; + } + + int eventInitiate(string str) { + object initiate; + object clanObject; + mixed ret; + + if(!str) return notify_fail("Initiate whom?\n"); + initiate = present(lower_case(str), environment(this_player())); + if(!initiate || !living(initiate)) + return notify_fail("No one of that nature here.\n"); + if(stringp(ret = CanJoin(initiate))) return notify_fail(ret); + else if(!ret) return ret; + if((int)this_player()->GetMagicPoints() < 300) + return notify_fail("Too low on magic power.\n"); + if(initiate->GetClan()) + return notify_fail("You may only initiate people without clan " + + "affiliation.\n"); + initiate->SetClan((string)GetClanName()); + initiate->SetSkill(GetClanSkill(), 1, 1); + if(clanObject = new((string)GetClanObject())) + clanObject->eventMove(initiate); + this_player()->AddMagicPoints(-300); + eventJoin(initiate); + return 1; + } + + void eventJoin(object ob) { + ob->eventPrint("%^YELLOW%^You are now a member of the " + + pluralize((string)GetClanName()) + ".%^RESET%^"); + environment(ob)->eventPrint("%^YELLOW%^" +(string)ob->GetName() + + " is now a member of the " + + pluralize((string)GetClanName()) + ".%^RESET%^", ob); + } + + int eventRetire(string str) { + object retiree; + object clanObject; + + if(!str) return notify_fail("Retire whom?\n"); + retiree = present(lower_case(str), environment(this_player())); + if(!retiree || !living(retiree)) + return notify_fail("No one of that nature here.\n"); + if((string)retiree->GetClan() != (string)GetClanName()) + return notify_fail(retiree->GetName() + " is not one of us!\n"); + clanObject = present(GetClanName() + "_clan_object", retiree); + if(!clanObject) error("Problem with clan object."); + clanObject->eventDestruct(); + retiree->SetClan(0); + // retiree->SetSkill(GetClanSkill(), 1, 1); We need to remove skill here. + eventUnjoin(retiree); + return 1; + } + + void eventUnjoin(object ob) { + ob->eventPrint("%^RED%^You are no longer a member of the " + + pluralize((string)GetClanName()) + ".%^RESET%^"); + environment(ob)->eventPrint("%^RED%^" + (string)ob->GetName() + + " is no longer a member of the " + + pluralize((string)GetClanName()) + ".%^RESET%^", ob); + } + + void eventWelcome(object ob) { + ob->eventPrint("%^YELLOW%^Welcome, fellow " + (string)GetClanName() + + ".%^RESET%^"); + } + diff -c -r --new-file ds2.0r18/lib/lib/classes.c ds2.0r28/lib/lib/classes.c *** ds2.0r18/lib/lib/classes.c Mon Jan 16 23:03:04 2006 --- ds2.0r28/lib/lib/classes.c Wed Jul 5 00:00:58 2006 *************** *** 1,6 **** /* /lib/classes.c * from the Dead Souls LPC Library ! * classes and guild handling object * created by Descartes of Borg 950123 * Version: @(#) classes.c 1.4@(#) * Last modified: 96/12/13 --- 1,6 ---- /* /lib/classes.c * from the Dead Souls LPC Library ! * classes and clan handling object * created by Descartes of Borg 950123 * Version: @(#) classes.c 1.4@(#) * Last modified: 96/12/13 *************** *** 13,19 **** inherit LIB_ABILITIES; private int Morality; ! private string Class, Guild; private mapping SkillModifiers; private string *Religion; --- 13,19 ---- inherit LIB_ABILITIES; private int Morality; ! private string Class, Clan; private mapping SkillModifiers; private string *Religion; *************** *** 22,28 **** SkillModifiers = ([]); Religion = allocate(2); Class = 0; ! Guild = 0; Morality = 0; } --- 22,28 ---- SkillModifiers = ([]); Religion = allocate(2); Class = 0; ! Clan = 0; Morality = 0; } *************** *** 107,115 **** return (int)CLASSES_D->ClassMember(Class, class_name); } ! string SetGuild(string guild) { return (Guild = guild); } ! string GetGuild() { return Guild; } int GetBaseStatLevel(string stat) { return 0; } --- 107,115 ---- return (int)CLASSES_D->ClassMember(Class, class_name); } ! string SetClan(string clan) { return (Clan = clan); } ! string GetClan() { return Clan; } int GetBaseStatLevel(string stat) { return 0; } diff -c -r --new-file ds2.0r18/lib/lib/combat.c ds2.0r28/lib/lib/combat.c *** ds2.0r18/lib/lib/combat.c Fri Mar 24 14:36:38 2006 --- ds2.0r28/lib/lib/combat.c Wed Jul 5 19:58:19 2006 *************** *** 8,13 **** --- 8,14 ---- #include #include + #include #include #include #include *************** *** 17,23 **** inherit LIB_CLASSES; inherit LIB_COMBATMSG; ! private int Wimpy; private string WimpyCommand; private static int cParalyzed, tNextRound; private static string TargetLimb, Party; --- 18,24 ---- inherit LIB_CLASSES; inherit LIB_COMBATMSG; ! private int Wimpy, Dead; private string WimpyCommand; private static int cParalyzed, tNextRound; private static string TargetLimb, Party; *************** *** 56,61 **** --- 57,72 ---- } /* ***************** /lib/combat.c data functions ***************** */ + int GetDead(){ + return Dead; + } + + int SetDead(int i){ + if(!i) Dead = 0; + else Dead = 1; + return Dead; + } + object array GetEnemies() { return Enemies; } *************** *** 126,132 **** --- 137,148 ---- } mixed *RemoveNonTargets(mixed val){ + if(!val) val = ({}); if(!arrayp(val)) val = ({ val }); + if(!sizeof(val)){ + NonTargets = ({}); + return NonTargets; + } foreach(object member in val){ if(member_array(member,NonTargets) != -1){ NonTargets -= ({ member }); *************** *** 242,248 **** else { int spec_targ_here; foreach(object t in SpecialTargets){ ! if(present(t->GetKeyName(),environment(this_player()))) spec_targ_here = 1; } if(!spec_targ_here) SpecialTargets = target; } --- 258,264 ---- else { int spec_targ_here; foreach(object t in SpecialTargets){ ! if(t && present(t->GetKeyName(),environment(this_player()))) spec_targ_here = 1; } if(!spec_targ_here) SpecialTargets = target; } *************** *** 402,407 **** --- 418,424 ---- else { TargetLimb = limb; } + //tc("chance: "+chance); return chance; } *************** *** 428,433 **** --- 445,451 ---- else { TargetLimb = limb; } + //tc("chance: "+chance); return chance; } else { *************** *** 450,455 **** --- 468,474 ---- else { TargetLimb = limb; } + //tc("chance: "+chance); return chance; } } *************** *** 461,470 **** /* ***************** /lib/combat.c events ***************** */ ! varargs int eventDie(object agent) { object ob; int x; x = race::eventDie(agent); if( x != 1 ) { return x; --- 480,492 ---- /* ***************** /lib/combat.c events ***************** */ ! varargs int eventDie(mixed agent) { object ob; int x; + if(Dead) return 1; + Dead = 1; + x = race::eventDie(agent); if( x != 1 ) { return x; *************** *** 476,481 **** --- 498,504 ---- } environment()->eventLivingDied(this_object(), agent); Enemies = ({}); + flush_messages(); return 1; } *************** *** 485,490 **** --- 508,516 ---- int type = tNextRound; int position = GetPosition(); + if(Dead) return 1; + if(target->GetDead()) return 1; + fNextRound = 0; tNextRound = ROUND_UNDEFINED; if( position == POSITION_LYING || position == POSITION_SITTING && *************** *** 560,565 **** --- 586,594 ---- object array weapons = 0; function f = 0; + if(Dead) return 1; + if(target->GetDead()) return 1; + if( arrayp(val) ) { weapons = val; } *************** *** 592,597 **** --- 621,629 ---- int bonus = GetCombatBonus(level); int power, pro, con; + if(Dead) return; + if(target->GetDead()) return; + if( target->GetDying() ) { return; } *************** *** 621,634 **** SendWeaponMessages(target, -1, weapon, TargetLimb); } else { // I hit, but how hard did I hit? ! int damage_type, damage, weapon_damage, actual_damage; eventTrainSkill(weapon_type + " attack", pro*2, con, 1, bonus); damage_type = weapon->GetDamageType(); damage = (weapon->eventStrike(target) * pro)/(GetLevel()*2); damage = GetDamage(damage, weapon_type + " attack"); actual_damage = target->eventReceiveDamage(this_object(), damage_type, damage, 0, TargetLimb); ! if( actual_damage < 1 ) { actual_damage = 0; } weapon_damage = damage - actual_damage; --- 653,674 ---- SendWeaponMessages(target, -1, weapon, TargetLimb); } else { // I hit, but how hard did I hit? ! int damage_type, damage, weapon_damage, actual_damage, encumbrance; ! encumbrance = this_object()->GetEncumbrance(); ! //tc("encumbrance: "+encumbrance,"white"); ! if(encumbrance > 200){ ! //tc("feep","yellow"); ! tell_object(this_object(),"You struggle to fight while heavily encumbered."); ! } eventTrainSkill(weapon_type + " attack", pro*2, con, 1, bonus); damage_type = weapon->GetDamageType(); damage = (weapon->eventStrike(target) * pro)/(GetLevel()*2); damage = GetDamage(damage, weapon_type + " attack"); + damage -= encumbrance; + if(damage < 0) damage = 0; actual_damage = target->eventReceiveDamage(this_object(), damage_type, damage, 0, TargetLimb); ! if( actual_damage < 0 ) { actual_damage = 0; } weapon_damage = damage - actual_damage; *************** *** 656,661 **** --- 696,704 ---- int count = sizeof(limbs); int attacks; + if(Dead) return 1; + if(target->GetDead()) return 1; + if( count < 2 ) { if(RACES_D->GetLimblessCombatRace(this_object()->GetRace())){ limbs = GetLimbs(); *************** *** 682,688 **** int pro, con; int chance; ! if( target->GetDying() ) { return; } --- 725,731 ---- int pro, con; int chance; ! if( target->GetDead() || Dead || target->GetDying() ) { return; } *************** *** 706,718 **** GetCombatBonus(target->GetLevel())); } else { ! int x; ! // I hit, how hard? eventTrainSkill("melee attack", pro, con, 1, GetCombatBonus(target->GetLevel())); if(this_object()->GetMelee()) x = GetDamage(3*chance/4, "melee attack"); else x = GetDamage(3*chance/20, "melee attack"); x = target->eventReceiveDamage(this_object(), BLUNT, x, 0, TargetLimb); if( !target->GetDying() ) { --- 749,768 ---- GetCombatBonus(target->GetLevel())); } else { ! int x, encumbrance; ! encumbrance = this_object()->GetEncumbrance(); ! //tc("encumbrance: "+encumbrance,"white"); ! if(encumbrance > 200){ ! //tc("feep","blue"); ! tell_object(this_object(),"You struggle to fight while heavily encumbered."); ! } // I hit, how hard? eventTrainSkill("melee attack", pro, con, 1, GetCombatBonus(target->GetLevel())); if(this_object()->GetMelee()) x = GetDamage(3*chance/4, "melee attack"); else x = GetDamage(3*chance/20, "melee attack"); + x -= encumbrance; + if(x < 0) x = 0; x = target->eventReceiveDamage(this_object(), BLUNT, x, 0, TargetLimb); if( !target->GetDying() ) { *************** *** 731,736 **** --- 781,787 ---- } int eventMagicRound(mixed target, function f) { + if(target->GetDead()) return 1; evaluate(f, target); return target->GetDying(); } *************** *** 740,745 **** --- 791,798 ---- int con = target->GetDefenseChance(target->GetSkillLevel("melee defense")); int x = random(pro); + if(target->GetDead()) return 1; + if( environment() != environment(target) ) { eventPrint(target->GetName() + " has gone away."); return 1; *************** *** 747,753 **** if( TargetLimb ) { if( target->eventReceiveAttack(x, "melee", this_object()) ) { x = GetDamage(pro*2, "melee attack"); ! x = target->eventReceiveDamage(this_object(), KNIFE, x, 0, TargetLimb); if( x < 1 ) { target->eventPrint(possessive_noun(this_object()) + " bite " --- 800,806 ---- if( TargetLimb ) { if( target->eventReceiveAttack(x, "melee", this_object()) ) { x = GetDamage(pro*2, "melee attack"); ! x = target->eventReceiveDamage(this_object(), BITE, x, 0, TargetLimb); if( x < 1 ) { target->eventPrint(possessive_noun(this_object()) + " bite " *************** *** 801,807 **** if( GetDying() ) { return 0; } ! if( playerp(this_object()) && playerp(agent) ) { // No PK if( !environment()->CanAttack( agent, this_object() ) ) { return 0; } --- 854,860 ---- if( GetDying() ) { return 0; } ! if( playerp(this_object()) && playerp(agent) && !PLAYER_KILL) { if( !environment()->CanAttack( agent, this_object() ) ) { return 0; } *************** *** 815,820 **** --- 868,875 ---- varargs int eventReceiveAttack(int speed, string def, object agent) { int x, pro, level, bonus; + if(Dead) return 0; + if( !agent ) { agent = previous_object(); } *************** *** 887,898 **** if( !ob ) return; Enemies -= ({ ob }); Hostiles -= ({ ob }); } varargs int eventReceiveDamage(object agent, int type, int x, int internal, mixed limbs) { ! int hp; x = race::eventReceiveDamage(agent, type, x, internal, limbs); if( !Wimpy ) return x; if( (hp = GetHealthPoints()) < 1 ) return x; --- 942,962 ---- if( !ob ) return; Enemies -= ({ ob }); Hostiles -= ({ ob }); + if(!sizeof(SpecialTargets) || (!sizeof(Enemies) || !sizeof(Hostiles))) + NonTargets = ({}); } varargs int eventReceiveDamage(object agent, int type, int x, int internal, mixed limbs) { ! int hp,encumbrance; ! encumbrance = this_object()->GetEncumbrance(); + if(Dead) return 0; + //tc("encumbrance: "+encumbrance,"white"); + if(encumbrance > 200){ + //tc("feep","green"); + if(GetInCombat()) tell_object(this_object(),"You try to dodge while weighed down."); + } x = race::eventReceiveDamage(agent, type, x, internal, limbs); if( !Wimpy ) return x; if( (hp = GetHealthPoints()) < 1 ) return x; diff -c -r --new-file ds2.0r18/lib/lib/combatmsg.c ds2.0r28/lib/lib/combatmsg.c *** ds2.0r18/lib/lib/combatmsg.c Mon Jan 16 23:03:04 2006 --- ds2.0r28/lib/lib/combatmsg.c Wed Jul 5 00:00:58 2006 *************** *** 9,14 **** --- 9,17 ---- static mixed GetMissData(object targ, int type, string limb) { string targ_name = (string)targ->GetName(); + + if(targ->GetDead() || this_object()->GetDead()) return 0; + if( type == -2 ) switch( random(7) ) { case 0: return ({ "%s completely %s %s.", *************** *** 91,96 **** --- 94,101 ---- static void eventSendMissMessages(object target, int x, string limb) { mixed data; + + if(target->GetDead() || this_object()->GetDead()) return; if( !limb ) limb = "body"; data = GetMissData(target, x, limb); if( sizeof(data) != 4 ) return; *************** *** 137,142 **** --- 142,149 ---- int i; string adverb; mixed verb, ptr, moves; + + if(target->GetDead() || this_object()->GetDead()) return; if( x < 0 ) { eventSendMissMessages(target, x, limb); return; *************** *** 167,172 **** --- 174,181 ---- int i; string adverb, type, weap; mixed verb, ptr, moves; + + if(target->GetDead() || this_object()->GetDead()) return; if( x < 0 ) { eventSendMissMessages(target, x, limb); return; diff -c -r --new-file ds2.0r18/lib/lib/command.c ds2.0r28/lib/lib/command.c *** ds2.0r18/lib/lib/command.c Tue Mar 28 23:23:41 2006 --- ds2.0r28/lib/lib/command.c Wed Jul 5 00:00:58 2006 *************** *** 26,32 **** apostrophe_exceptions += ({"say","speak","yell","whisper","shout"}); //Fix here courtesy of Jonez apostrophe_exceptions += ({"ping", "reply"}); ! SearchPath = ({ DIR_PLAYER_CMDS, DIR_SECURE_PLAYER_CMDS, DIR_GUILD_CMDS, DIR_COMMON_CMDS, DIR_SECURE_COMMON_CMDS }); } --- 26,32 ---- apostrophe_exceptions += ({"say","speak","yell","whisper","shout"}); //Fix here courtesy of Jonez apostrophe_exceptions += ({"ping", "reply"}); ! SearchPath = ({ DIR_PLAYER_CMDS, DIR_SECURE_PLAYER_CMDS, DIR_CLAN_CMDS, DIR_COMMON_CMDS, DIR_SECURE_COMMON_CMDS }); } *************** *** 190,196 **** /* ********** /lib/command.c data manipulation functions ********** */ string *AddSearchPath(mixed val) { ! if(stringp(val)) val = ({ val }); else if(!pointerp(val)) error("Bad argument 1 to AddSearchPath()\n"); return (SearchPath = distinct_array(SearchPath + val)); } --- 190,206 ---- /* ********** /lib/command.c data manipulation functions ********** */ string *AddSearchPath(mixed val) { ! if(stringp(val)) { ! if(!strsrch(val,"/secure/cmds/admins") || !strsrch(val,"/cmds/admins")){ ! if(!(int)master()->valid_apply(({ "SECURE", "ASSIST", "LIB_CONNECT" })) ){ ! tell_creators("Security violation in progress: "+identify(previous_object(-1)) + ", "+get_stack()); ! error("Illegal attempt to modify path data: "+identify(previous_object(-1)) + ", "+get_stack()); ! ! } ! } ! val = ({ val }); ! } ! else if(!pointerp(val)) error("Bad argument 1 to AddSearchPath()\n"); return (SearchPath = distinct_array(SearchPath + val)); } diff -c -r --new-file ds2.0r18/lib/lib/comp/container.c ds2.0r28/lib/lib/comp/container.c *** ds2.0r18/lib/lib/comp/container.c Mon Nov 7 13:31:06 2005 --- ds2.0r28/lib/lib/comp/container.c Wed Jul 5 00:01:05 2006 *************** *** 12,17 **** --- 12,25 ---- inherit LIB_RADIANCE; inherit LIB_ADDSTUFF; + int SetOpacity(int x){ + return look_in::SetOpacity(x); + } + + int GetOpacity(){ + return look_in::GetOpacity(); + } + int GetRadiantLight(int ambient) { int r = radiance::GetRadiantLight(ambient); int o = GetOpacity(); diff -c -r --new-file ds2.0r18/lib/lib/comp/holder.c ds2.0r28/lib/lib/comp/holder.c *** ds2.0r18/lib/lib/comp/holder.c Mon Nov 7 13:31:06 2005 --- ds2.0r28/lib/lib/comp/holder.c Wed Jul 5 00:01:05 2006 *************** *** 19,24 **** --- 19,32 ---- return 1; } + int GetOpacity(){ + return container::GetOpacity(); + } + + int SetOpacity(int x){ + return container::SetOpacity(x); + } + varargs string GetInternalDesc() { object array items = all_inventory(); string desc; *************** *** 27,33 **** surfacep = inherits(LIB_SURFACE , this_object()); desc = (container::GetInternalDesc() || ""); ! if(this_object()->CanClose()){ if(this_object()->GetClosed()) desc += " It is closed. "; else desc += " It is open. "; } --- 35,42 ---- surfacep = inherits(LIB_SURFACE , this_object()); desc = (container::GetInternalDesc() || ""); ! if(this_object()->CanClose() && GetOpacity() > 33){ ! //tc("GREEN LED","green"); if(this_object()->GetClosed()) desc += " It is closed. "; else desc += " It is open. "; } *************** *** 35,50 **** if(surfacep) desc = "On "+add_article(GetShort(), 1); items = filter(items, (: !($1->isDummy()) && !($1->GetInvis()) :)); if( sizeof(items) ) { ! if( GetOpacity() > 33 && !surfacep) { ! desc = desc + " contains something."; ! } ! else { ! if(surfacep){ ! desc = desc+" you see " + item_list(items) + "."; ! } ! else desc = desc + " contains " + item_list(items) + "."; } } else { if(!surfacep) desc = desc + " is completely empty."; else desc = desc + " you see nothing."; --- 44,59 ---- if(surfacep) desc = "On "+add_article(GetShort(), 1); items = filter(items, (: !($1->isDummy()) && !($1->GetInvis()) :)); if( sizeof(items) ) { ! //if( GetOpacity() > 33 && !surfacep) { ! //desc = desc + " contains something."; ! //} ! //else { ! if(surfacep){ ! desc = desc+" you see " + item_list(items) + "."; } + else desc = desc + " contains " + item_list(items) + "."; } + //} else { if(!surfacep) desc = desc + " is completely empty."; else desc = desc + " you see nothing."; *************** *** 82,87 **** --- 91,97 ---- return tmp; } AddCarriedMass(ob->GetMass()); + this_object()->SetMass(this_object()->GetMass() + ob->GetMass()); parse_refresh(); return 1; } *************** *** 90,96 **** int x; x = container::eventReleaseObject(ob); ! call_out((: parse_refresh :), 0); return x; } --- 100,109 ---- int x; x = container::eventReleaseObject(ob); ! //call_out((: parse_refresh :), 0); ! AddCarriedMass(-(ob->GetMass())); ! this_object()->SetMass(this_object()->GetMass() - ob->GetMass()); ! parse_refresh(); return x; } diff -c -r --new-file ds2.0r18/lib/lib/creator.c ds2.0r28/lib/lib/creator.c *** ds2.0r18/lib/lib/creator.c Sat Mar 11 11:16:11 2006 --- ds2.0r28/lib/lib/creator.c Wed Jul 5 00:00:58 2006 *************** *** 178,184 **** laston = GetLoginTime(); if( !player::Setup() ) return 0; ! AddChannel(({"cre", "newbie", "gossip", "ds", "death" })); AddChannel((string array)CLASSES_D->GetClasses()); if( archp() ) AddChannel( ({ "admin", "error" }) ); AddSearchPath( ({ DIR_CREATOR_CMDS, DIR_SECURE_CREATOR_CMDS }) ); --- 178,184 ---- laston = GetLoginTime(); if( !player::Setup() ) return 0; ! AddChannel(({"cre", "newbie", "gossip", "ds", "ds_test", "lpuni", "death","intergossip","intercre" })); AddChannel((string array)CLASSES_D->GetClasses()); if( archp() ) AddChannel( ({ "admin", "error" }) ); AddSearchPath( ({ DIR_CREATOR_CMDS, DIR_SECURE_CREATOR_CMDS }) ); diff -c -r --new-file ds2.0r18/lib/lib/currency.c ds2.0r28/lib/lib/currency.c *** ds2.0r18/lib/lib/currency.c Sun Dec 18 01:56:49 2005 --- ds2.0r28/lib/lib/currency.c Wed Jul 5 00:00:58 2006 *************** *** 81,95 **** varargs int GetNetWorth(string benjamins) { string curr; ! float net_worth; int amt; ! foreach(curr, amt in Currency) { ! float tmp; - if( (tmp = currency_rate(curr)) < 1 ) continue; - net_worth += amt * tmp; } foreach(string bank, mapping balance in Bank) { foreach(curr, amt in balance) { float tmp; --- 81,98 ---- varargs int GetNetWorth(string benjamins) { string curr; ! float net_worth = 0.0; int amt; ! //tc("Currency: "+identify(Currency)); foreach(curr, amt in Currency) { ! //tc("curr: "+identify(curr),"blue"); ! //tc("amt: "+identify(amt),"blue"); ! if(valid_currency(curr)) ! net_worth += amt * currency_rate(curr); ! //tc("net_worth: "+net_worth,"blue"); } + //tc("net_worth: "+net_worth); foreach(string bank, mapping balance in Bank) { foreach(curr, amt in balance) { float tmp; *************** *** 106,112 **** } if(!benjamins || benjamins == ""||!stringp(benjamins)) benjamins = "gold"; if(member_array(benjamins,mud_currencies()) == -1) benjamins = "gold"; ! return net_worth / currency_rate(benjamins); } string array GetCurrencies() { return keys(Currency); } --- 109,116 ---- } if(!benjamins || benjamins == ""||!stringp(benjamins)) benjamins = "gold"; if(member_array(benjamins,mud_currencies()) == -1) benjamins = "gold"; ! if(benjamins && net_worth) return to_int(net_worth / currency_rate(benjamins)); ! else return to_int(0); } string array GetCurrencies() { return keys(Currency); } diff -c -r --new-file ds2.0r18/lib/lib/donate.c ds2.0r28/lib/lib/donate.c *** ds2.0r18/lib/lib/donate.c Thu Jan 5 00:17:58 2006 --- ds2.0r28/lib/lib/donate.c Wed Jul 5 00:00:58 2006 *************** *** 16,22 **** static void init() { if( (string)this_player()->ClassMember((string)GetOwner()) || ! (string)this_player()->GetGuild() == (string)GetOwner() ) { add_action( (: eventDonate :) , "donate" ); } } --- 16,22 ---- static void init() { if( (string)this_player()->ClassMember((string)GetOwner()) || ! (string)this_player()->GetClan() == (string)GetOwner() ) { add_action( (: eventDonate :) , "donate" ); } } diff -c -r --new-file ds2.0r18/lib/lib/door.c ds2.0r28/lib/lib/door.c *** ds2.0r18/lib/lib/door.c Sun Jan 1 12:35:27 2006 --- ds2.0r28/lib/lib/door.c Wed Jul 5 00:00:58 2006 *************** *** 15,21 **** --- 15,31 ---- //inherit LIB_LOCK_WITH; private mapping Sides; + private static int Hidden = 1; + int SetHiddenDoor(int i){ + if(i) Hidden = 1; + else Hidden = 0; + return Hidden; + } + + int GetHiddenDoor(){ + return Hidden; + } string *GetSides(){ //string ret, tmp; diff -c -r --new-file ds2.0r18/lib/lib/events/close.c ds2.0r28/lib/lib/events/close.c *** ds2.0r18/lib/lib/events/close.c Mon Nov 7 13:31:06 2005 --- ds2.0r28/lib/lib/events/close.c Wed Jul 5 00:01:05 2006 *************** *** 71,76 **** --- 71,84 ---- return !GetClosed(); } + int SetOpen(int x) { + if(x) Closed = 0; + else Closed = 1; + parse_refresh(); + return Closed; + } + + mixed direct_close_obj(object target) { return CanClose(this_player()); } diff -c -r --new-file ds2.0r18/lib/lib/events/look.c ds2.0r28/lib/lib/events/look.c *** ds2.0r18/lib/lib/events/look.c Sat Mar 11 11:16:11 2006 --- ds2.0r28/lib/lib/events/look.c Wed Jul 5 00:01:05 2006 *************** *** 7,12 **** --- 7,13 ---- */ #include + #include private mixed ExternalDesc = 0; private int Invisible = 0; *************** *** 172,178 **** GetShort() + ".", ({ who, this_object() })); } ! if(inherits("/lib/comp/surface",this_object())){ //tempdesc = this_object()->eventShowInterior(who); who->eventPrint(desc); this_object()->eventShowInterior(who); --- 173,180 ---- GetShort() + ".", ({ who, this_object() })); } ! if(inherits(LIB_SURFACE,this_object()) || ! this_object()->GetOpacity() < 33){ //tempdesc = this_object()->eventShowInterior(who); who->eventPrint(desc); this_object()->eventShowInterior(who); diff -c -r --new-file ds2.0r18/lib/lib/events/look_in.c ds2.0r28/lib/lib/events/look_in.c *** ds2.0r18/lib/lib/events/look_in.c Wed Dec 7 14:03:05 2005 --- ds2.0r28/lib/lib/events/look_in.c Wed Jul 5 00:01:05 2006 *************** *** 9,15 **** #include private string InternalDesc = 0; ! private int Opacity = 100; // abstract methods string GetShort(); --- 9,15 ---- #include private string InternalDesc = 0; ! int Opacity = 100; // abstract methods string GetShort(); *************** *** 40,46 **** return Opacity; } ! static int SetOpacity(int x) { Opacity = x; parse_refresh(); return Opacity; --- 40,46 ---- return Opacity; } ! int SetOpacity(int x) { Opacity = x; parse_refresh(); return Opacity; *************** *** 64,78 **** x = 66; } else { ! x = 34; } ! if( GetOpacity() > x ) { return 0; } return 1; } ! mixed eventShowInterior(object who, object target) { object here,me,imhere,dabei; string this,str; here=environment(this_object()); --- 64,78 ---- x = 66; } else { ! x = 33; } ! if( this_object()->GetClosed() && this_object()->GetOpacity() > x ) { return 0; } return 1; } ! varargs mixed eventShowInterior(object who, object target) { object here,me,imhere,dabei; string this,str; here=environment(this_object()); diff -c -r --new-file ds2.0r18/lib/lib/events/pull.c ds2.0r28/lib/lib/events/pull.c *** ds2.0r18/lib/lib/events/pull.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/lib/events/pull.c Wed Jul 5 00:01:05 2006 *************** *** 0 **** --- 1,103 ---- + #include + + static private mapping Pull = ([]); + + // abstract methods + string GetDefiniteShort(); + // end abstract methods + + varargs mixed GetPull(string str) { + if( !str ) { + str = "default"; + } + return Pull[str]; + } + + string array GetPulls() { + return keys(Pull); + } + + mapping RemovePull(string item) { + map_delete(Pull, item); + return Pull; + } + + varargs mapping SetPull(mixed key, mixed desc) { + if( !key ) { + key = "default"; + } + if( !desc ) { + if( mapp(key) ) { + Pull = expand_keys(key); + } + else { + Pull["default"] = key; + } + } + else { + Pull[key] = desc; + } + return Pull; + } + + varargs mixed CanPull(object who, string component) { + mixed val; + + if( !component ) { + component = "default"; + } + val = Pull[component]; + if( !val ) { + if( component == "default" ) { + return 0; + } + else { + return "#There is no " + component + " on " + + GetDefiniteShort() + "."; + } + } + else return 1; + } + + varargs mixed eventPull(object who, string component) { + mixed val; + + if( !component ) { + val = Pull["default"]; + } + else { + val = Pull[component]; + } + if( arrayp(val) ) { + val = val[query_night()]; + } + if( stringp(val) ) { + object env; + + env = environment(who); + who->eventPrint(val); + if( component ) { + env->eventPrint(who->GetName() + " pulls the " + component + + " on " + GetDefiniteShort() + ".", who); + } + else { + env->eventPrint(who->GetName() + " pulls " + + GetDefiniteShort() + ".", who); + } + return 1; + } + else { + if( functionp(val) & FP_OWNER_DESTED ) { + return "Error in evaluating functional."; + } + return evaluate(val, who, component); + } + } + + mixed direct_pull_obj(object target) { + return CanPull(this_player()); + } + + mixed direct_pull_str_on_obj(string str, object target) { + return CanPull(this_player(), remove_article(lower_case(str))); + } diff -c -r --new-file ds2.0r18/lib/lib/events/put.c ds2.0r28/lib/lib/events/put.c *** ds2.0r18/lib/lib/events/put.c Wed Dec 7 14:03:05 2005 --- ds2.0r28/lib/lib/events/put.c Wed Jul 5 00:01:05 2006 *************** *** 24,35 **** mixed tmp; if( (tmp = CanDrop(who)) != 1 ) return tmp; if( !environment() ) { destruct(this_object()); return 1; } ! if( environment() != this_player() ) return 0; if( !PreventPut ) return 1; if( stringp(PreventPut) && PreventPut == "PERMIT" ) return 1; if( intp(PreventPut) ) return 0; if( stringp(PreventPut) ) return PreventPut; if( objectp(PreventPut) ) { if( PreventPut == who ) return "You cannot put " + GetShort() + " anywhere."; --- 24,43 ---- mixed tmp; if( (tmp = CanDrop(who)) != 1 ) return tmp; + //debug("i dunno 1"); if( !environment() ) { destruct(this_object()); return 1; } ! //debug("i dunno 2"); ! if( environment() != this_player() && ! environment() != environment(this_player())) return 0; ! //debug("i dunno 3"); if( !PreventPut ) return 1; + //debug("i dunno 4"); if( stringp(PreventPut) && PreventPut == "PERMIT" ) return 1; + //debug("i dunno 5"); if( intp(PreventPut) ) return 0; + //debug("i dunno 6"); if( stringp(PreventPut) ) return PreventPut; + //debug("i dunno 7"); if( objectp(PreventPut) ) { if( PreventPut == who ) return "You cannot put " + GetShort() + " anywhere."; *************** *** 80,82 **** --- 88,94 ---- return CanPut(this_player()); } + mixed direct_put_wrd_wrd_word_obj(){ + return CanPut(this_player()); + } + diff -c -r --new-file ds2.0r18/lib/lib/events/read.c ds2.0r28/lib/lib/events/read.c *** ds2.0r18/lib/lib/events/read.c Sat Mar 11 11:16:11 2006 --- ds2.0r28/lib/lib/events/read.c Wed Jul 5 00:01:05 2006 *************** *** 96,101 **** --- 96,102 ---- mixed ret; mixed val = GetRead(str); + //tc("-1"); if( arrayp(val) ) { val = val[query_night()]; } *************** *** 104,109 **** --- 105,111 ---- if( functionp(val) ) { if( functionp(val) & FP_OWNER_DESTED ) { who->eventPrint("There was a problem with the read."); + //tc("alpha"); return 1; } //The funtion being evaluated, GetRead, only takes one arg. *************** *** 111,116 **** --- 113,119 ---- ret = evaluate(val, str); if(!stringp(ret)) return 1; } + //tc("bravo"); environment(who)->eventPrint(who->GetName() + " reads " + GetShort() + ".", who); if(ret) val = ret; *************** *** 118,145 **** who->eventPrint("There is nothing to read."); return 1; } tmpfile = generate_tmp(); globalwho = who; globalval = val; if(Language){ write("The language appears to be "+capitalize(Language)+"."); } if(!globalval){ write("You can't read that."); return 0; } ! unguarded( (: write_file(tmpfile, globalval) :) ); ! if(Language && this_player()->GetLanguageLevel(Language) < 100){ if(sizeof(globalval) > 4800){ globalval = "It is too long and you are too unfamiliar with the language to make sense of it."; } ! else globalval = translate(val, this_player()->GetLanguageLevel(Language)); ! unguarded( (: write_file(tmpfile, globalval,1) :) ); } unguarded( (: globalwho->eventPage(tmpfile) :) ); unguarded( (: rm(tmpfile) :) ); return 1; --- 121,168 ---- who->eventPrint("There is nothing to read."); return 1; } + //tc("charlie"); tmpfile = generate_tmp(); + //tc("tmpfile: "+tmpfile); globalwho = who; globalval = val; + //tc("delta"); if(Language){ + //tc("echo"); write("The language appears to be "+capitalize(Language)+"."); } if(!globalval){ + //tc("foxtrot"); write("You can't read that."); return 0; } + //tc("0"); ! //unguarded( (: write_file(tmpfile, globalval) :) ); ! if(Language && (this_player()->GetLanguageLevel(Language) < 100 && ! !(this_player()->GetPolyglot()))){ ! //tc("1"); if(sizeof(globalval) > 4800){ + //tc("2"); globalval = "It is too long and you are too unfamiliar with the language to make sense of it."; } ! else { ! //tc("3"); ! globalval = translate(val, this_player()->GetLanguageLevel(Language)); ! } ! //tc("4"); ! } ! else { ! //tc("6"); ! globalval = val; } + //tc("val: "+val); + //tc("globalval: "+globalval); + unguarded( (: write_file(tmpfile, globalval,1) :) ); + unguarded( (: globalwho->eventPage(tmpfile) :) ); unguarded( (: rm(tmpfile) :) ); return 1; diff -c -r --new-file ds2.0r18/lib/lib/exits.c ds2.0r28/lib/lib/exits.c *** ds2.0r18/lib/lib/exits.c Mon Jan 23 08:52:37 2006 --- ds2.0r28/lib/lib/exits.c Wed Jul 5 00:00:58 2006 *************** *** 50,56 **** return 0; } ! if( Doors[str] && (int)Doors[str]->GetClosed() ) { message("my_action", "You bump into " + (string)Doors[str]->GetShort(str) + ".", who); return 1; --- 50,56 ---- return 0; } ! if( sizeof(Doors) && Doors[str] && (int)Doors[str]->GetClosed() ) { message("my_action", "You bump into " + (string)Doors[str]->GetShort(str) + ".", who); return 1; *************** *** 67,74 **** return 1; } ! string GetDoor(string dir) { ! return Doors[dir]; } string array GetDoors() { --- 67,75 ---- return 1; } ! mixed GetDoor(string dir) { ! if(sizeof(Doors)) return Doors[dir]; ! else return 0; } string array GetDoors() { *************** *** 95,101 **** foreach(string dir in GetEnters()) { mapping data = GetEnterData(dir); ! if( data["room"] == dest ) { return "enter " + dir; } } --- 96,102 ---- foreach(string dir in GetEnters()) { mapping data = GetEnterData(dir); ! if(data["room"] && data["room"] == dest ) { return "enter " + dir; } } diff -c -r --new-file ds2.0r18/lib/lib/fishing.c ds2.0r28/lib/lib/fishing.c *** ds2.0r18/lib/lib/fishing.c Mon Jan 16 23:03:04 2006 --- ds2.0r28/lib/lib/fishing.c Wed Jul 5 00:00:58 2006 *************** *** 11,35 **** inherit LIB_ROOM; ! static private int MaxFishing, Speed, Chance; static private mapping Fishing, Fish; static void create() { room::create(); MaxFishing = 10; ! Speed = 5; Chance = 0; Fish = ([]); Fishing = ([]); } ! static void heart_beat() { mapping tmp; object pole; string fisher; if( !sizeof(Fishing) ) { - set_heart_beat(0); return; } tmp = Fishing; --- 11,41 ---- inherit LIB_ROOM; ! static private int MaxFishing, Speed, Chance, counter; static private mapping Fishing, Fish; static void create() { room::create(); MaxFishing = 10; ! Speed = 10; Chance = 0; + counter = 0; Fish = ([]); Fishing = ([]); } ! void heart_beat() { mapping tmp; object pole; string fisher; + room::CheckActions(); + + counter++; + if(counter < Speed) return; + counter = 0; + if( !sizeof(Fishing) ) { return; } tmp = Fishing; *************** *** 43,54 **** if( (int)pole->GetBroken() ) continue; if( (object)ob->GetInCombat() ) { message("my_action", "You are no longer fishing.", ob); continue; } Fishing[fisher] = pole; } if( !sizeof(Fishing) ) { - set_heart_beat(0); return; } foreach(fisher, pole in Fishing) { --- 49,65 ---- if( (int)pole->GetBroken() ) continue; if( (object)ob->GetInCombat() ) { message("my_action", "You are no longer fishing.", ob); + RemoveFishing(ob); + continue; + } + if( (object)ob->GetSleeping() ) { + message("my_action", "You are no longer fishing.", ob); + RemoveFishing(ob); continue; } Fishing[fisher] = pole; } if( !sizeof(Fishing) ) { return; } foreach(fisher, pole in Fishing) { *************** *** 110,115 **** --- 121,131 ---- return 1; } + int CanRelease(object who){ + if(room::CanRelease()) RemoveFishing(who); + return 1; + } + mixed eventCast(object who, object pole, string str) { send_messages(({ "cast", "start" }), *************** *** 130,136 **** return; } if( !((int)pole->eventCatch(who, fish)) ) return; ! food = new((string)fish->GetFood()); RemoveFishing(who); who->AddSkillPoints("fishing", (int)fish->GetFight()+(int)fish->GetMass()); message("my_action", "You find " + (string)fish->GetShort() + " on " + --- 146,154 ---- return; } if( !((int)pole->eventCatch(who, fish)) ) return; ! //food = new((string)fish->GetFood()); ! food=new(fish); ! //tc("new fish: "+identify(food),"yellow"); RemoveFishing(who); who->AddSkillPoints("fishing", (int)fish->GetFight()+(int)fish->GetMass()); message("my_action", "You find " + (string)fish->GetShort() + " on " + *************** *** 139,150 **** --- 157,171 ---- (string)fish->GetShort() + " on " + (string)pole->GetShort() + "!", this_object(), ({ who })); if( !((int)food->eventMove(who)) ) { + //tc("fish failed to move onto fisherman "+identify(who)); message("my_action", "You drop " + (string)food->GetShort() + "!", who); message("other_action", (string)who->GetName() + " drops " + (string)food->GetShort() + "!", this_object(), ({ who }) ); food->eventMove(this_object()); } + //tc("We weem to think all is well. The environment of "+identify(food)+" is "+ + //identify(environment(food))); } mixed eventStop(object who, string str) { *************** *** 176,182 **** mapping SetFishing(object who, object pole) { if( !living(who) ) return Fishing; ! if( !query_heart_beat() ) set_heart_beat(Speed); Fishing[(string)who->GetKeyName()] = pole; return Fishing; } --- 197,203 ---- mapping SetFishing(object who, object pole) { if( !living(who) ) return Fishing; ! if( !query_heart_beat() ) set_heart_beat(1); Fishing[(string)who->GetKeyName()] = pole; return Fishing; } *************** *** 187,193 **** if( !who ) return Fishing; if( Fishing[str = (string)who->GetKeyName()] ) map_delete(Fishing, str); ! if( !sizeof(Fishing) ) set_heart_beat(0); return Fishing; } --- 208,214 ---- if( !who ) return Fishing; if( Fishing[str = (string)who->GetKeyName()] ) map_delete(Fishing, str); ! if( !sizeof(Fishing) ) return; return Fishing; } diff -c -r --new-file ds2.0r18/lib/lib/genetics.c ds2.0r28/lib/lib/genetics.c *** ds2.0r18/lib/lib/genetics.c Sat Mar 11 11:16:11 2006 --- ds2.0r28/lib/lib/genetics.c Wed Jul 5 00:00:58 2006 *************** *** 99,111 **** varargs void AddStat(string stat, int base, int cls) { int level; ! if( userp(this_object()) ) level = 1; else level = GetLevel(); if( !stat || cls < 1 || cls > 5 ) return; base += ((5 - cls) * random(10)) + (3 * (level + 1))/(cls * 4); if( userp(this_object()) && base > 90 ) base = 90; else if( base > 100 ) base = 100; SetStat(stat, base, cls); } --- 99,112 ---- varargs void AddStat(string stat, int base, int cls) { int level; ! //tc("stat: "+stat+", base: "+base+", cls: "+cls,"red"); if( userp(this_object()) ) level = 1; else level = GetLevel(); if( !stat || cls < 1 || cls > 5 ) return; base += ((5 - cls) * random(10)) + (3 * (level + 1))/(cls * 4); if( userp(this_object()) && base > 90 ) base = 90; else if( base > 100 ) base = 100; + //tc("stat: "+stat+", base: "+base+", cls: "+cls,"green"); SetStat(stat, base, cls); } diff -c -r --new-file ds2.0r18/lib/lib/guild.c ds2.0r28/lib/lib/guild.c *** ds2.0r18/lib/lib/guild.c Wed Dec 7 14:03:18 2005 --- ds2.0r28/lib/lib/guild.c Wed Dec 31 19:00:00 1969 *************** *** 1,165 **** - - #include - #include "include/guild.h" - - class GuildClass Guild; - - //private static class GuildClass; - private int isWelcomed; - class Guild = new(class GuildClass); - - static void create() { - Guild = new(class GuildClass); - Guild->leader = 0; - Guild->name = 0; - Guild->objectName = 0; - Guild->skill = 0; - isWelcomed = 0; - } - - static void init() { - if(!present(this_object(), this_player())) return; - if((string)this_player()->GetGuild() != (string)GetGuildName()) return; - if((string)this_player()->GetKeyName() == (string)GetLeader()) { - add_action((:eventBring:), "bring"); - add_action((:eventInitiate:), "initiate"); - add_action((:eventRetire:), "retire"); - } - this_player()->eventPrint("\n"); - if(!isWelcomed) { - this_player()->AddChannel(GetGuildName()); - eventWelcome(this_player()); - isWelcomed = 1; - } - } - - mixed CanJoin(object ob) { return 1; } - - string GetAffectLong(object ob) { - if(!ob || !living(ob)) return 0; - return ob->GetName() + " is a member of the " - + pluralize(GetGuildName()) + "."; - } - - string SetLeader(string str) { - if(!user_exists(str)) error("No such user: " + str - + ". You must have a real leader."); - if(!stringp(Guild->leader)) - Guild->leader = str; - return Guild->leader; - } - - string GetLeader() { return Guild->leader; } - - string SetGuildName(string str) { - if(!stringp(Guild->name)) Guild->name = str; - return Guild->name; - } - - string GetGuildName() { return Guild->name; } - - string SetGuildObject(string str) { - if(!stringp(Guild->objectName)) Guild->objectName = str; - return Guild->objectName; - } - - string GetGuildObject() { return Guild->objectName; } - - string SetGuildSkill(string str) { - if(!stringp(Guild->skill)) Guild->skill = str; - return Guild->skill; - } - - string GetGuildSkill() { return Guild->skill; } - - int eventBring(string str) { - object who; - - if(!str) return notify_fail("Bring whom?\n"); - who = find_player(lower_case(str)); - if(!who) - return notify_fail(who->GetName() + " is nowhere to be found.\n"); - if((string)who->GetGuild() != (string)GetGuildName()) - return notify_fail(who->GetName() + " is not one of you!\n"); - if( environment(who)->GetProperty("no teleport") - || environment(this_player())->GetProperty("no teleport") - || environment(this_player())->GetProperty("no magic")) - return notify_fail("A magic force blocks your powers.\n"); - if(present(who, environment(this_player()))) - return notify_fail(capitalize(str) + " is here.\n"); - if((int)this_player()->GetMagicPoints() < 70) - return notify_fail("Too low on magic power.\n"); - this_player()->AddMagicPoints(-70); - who->eventPrint("%^CYAN%^Your guild leader summons you.%^RESET%^"); - who->eventMoveLiving(environment(this_player())); - if(!present(who, environment(this_player()))) - this_player()->eventPrint("%^CYAN%^" + capitalize(str) - + " is beyond your reach.%^RESET%^"); - return 1; - } - - int eventInitiate(string str) { - object initiate; - object guildObject; - mixed ret; - - if(!str) return notify_fail("Initiate whom?\n"); - initiate = present(lower_case(str), environment(this_player())); - if(!initiate || !living(initiate)) - return notify_fail("No one of that nature here.\n"); - if(stringp(ret = CanJoin(initiate))) return notify_fail(ret); - else if(!ret) return ret; - if((int)this_player()->GetMagicPoints() < 300) - return notify_fail("Too low on magic power.\n"); - if(initiate->GetGuild()) - return notify_fail("You may only initiate people without guild " - + "affiliation.\n"); - initiate->SetGuild((string)GetGuildName()); - initiate->SetSkill(GetGuildSkill(), 1, 1); - if(guildObject = new((string)GetGuildObject())) - guildObject->eventMove(initiate); - this_player()->AddMagicPoints(-300); - eventJoin(initiate); - return 1; - } - - void eventJoin(object ob) { - ob->eventPrint("%^YELLOW%^You are now a member of the " - + pluralize((string)GetGuildName()) + ".%^RESET%^"); - environment(ob)->eventPrint("%^YELLOW%^" +(string)ob->GetName() - + " is now a member of the " - + pluralize((string)GetGuildName()) + ".%^RESET%^", ob); - } - - int eventRetire(string str) { - object retiree; - object guildObject; - - if(!str) return notify_fail("Retire whom?\n"); - retiree = present(lower_case(str), environment(this_player())); - if(!retiree || !living(retiree)) - return notify_fail("No one of that nature here.\n"); - if((string)retiree->GetGuild() != (string)GetGuildName()) - return notify_fail(retiree->GetName() + " is not one of us!\n"); - guildObject = present(GetGuildName() + "_guild_object", retiree); - if(!guildObject) error("Problem with guild object."); - guildObject->eventDestruct(); - retiree->SetGuild(0); - // retiree->SetSkill(GetGuildSkill(), 1, 1); We need to remove skill here. - eventUnjoin(retiree); - return 1; - } - - void eventUnjoin(object ob) { - ob->eventPrint("%^RED%^You are no longer a member of the " - + pluralize((string)GetGuildName()) + ".%^RESET%^"); - environment(ob)->eventPrint("%^RED%^" + (string)ob->GetName() - + " is no longer a member of the " - + pluralize((string)GetGuildName()) + ".%^RESET%^", ob); - } - - void eventWelcome(object ob) { - ob->eventPrint("%^YELLOW%^Welcome, fellow " + (string)GetGuildName() - + ".%^RESET%^"); - } - --- 0 ---- diff -c -r --new-file ds2.0r18/lib/lib/include/bait.h ds2.0r28/lib/lib/include/bait.h *** ds2.0r18/lib/lib/include/bait.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/bait.h Wed Jul 5 00:01:05 2006 *************** *** 1,19 **** #ifndef l_bait_h #define l_bait_h ! static void create(); ! mixed indirect_bait_obj_with_obj(); ! int SetBaitStrength(int x); int GetBaitStrength(); ! mixed eventBait(object who, object pole); ! /* virtual functions */ ! static mixed AddSave(mixed *vars); string GetShort(); int eventDestruct(); ! #endif --- 1,19 ---- #ifndef l_bait_h #define l_bait_h ! static void create(); ! mixed indirect_bait_obj_with_obj(); ! int SetBaitStrength(int x); int GetBaitStrength(); ! mixed eventBait(object who, object pole); ! /* virtual functions */ ! static mixed AddSave(mixed *vars); string GetShort(); int eventDestruct(); ! #endif diff -c -r --new-file ds2.0r18/lib/lib/include/bank.h ds2.0r28/lib/lib/include/bank.h *** ds2.0r18/lib/lib/include/bank.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/bank.h Wed Jul 5 00:01:05 2006 *************** *** 1,10 **** #ifndef l_bank_h #define l_bank_h ! static void create(); ! mixed CanBank(object who, string currency); ! string SetBank(string str); string SetCurrency(string str); int SetSurcharge(int amount); --- 1,10 ---- #ifndef l_bank_h #define l_bank_h ! static void create(); ! mixed CanBank(object who, string currency); ! string SetBank(string str); string SetCurrency(string str); int SetSurcharge(int amount); *************** *** 19,31 **** int GetMinimumTransaction(); float GetExchangePercentage(); mixed GetCurrencies(); ! int AddSurcharge(object who, string currency, int amount); ! mixed eventDeposit(object who, string currency, int amount); mixed eventWithdraw(object who, string currency, int amount); mixed eventBalance(object who); mixed eventExchange(object who, int amount, string str1, string str2); mixed eventOpenAccount(object who); ! #endif /* l_bank_h */ --- 19,31 ---- int GetMinimumTransaction(); float GetExchangePercentage(); mixed GetCurrencies(); ! int AddSurcharge(object who, string currency, int amount); ! mixed eventDeposit(object who, string currency, int amount); mixed eventWithdraw(object who, string currency, int amount); mixed eventBalance(object who); mixed eventExchange(object who, int amount, string str1, string str2); mixed eventOpenAccount(object who); ! #endif /* l_bank_h */ diff -c -r --new-file ds2.0r18/lib/lib/include/body.h ds2.0r28/lib/lib/include/body.h *** ds2.0r18/lib/lib/include/body.h Mon Jan 16 23:03:04 2006 --- ds2.0r28/lib/lib/include/body.h Wed Jul 5 00:01:05 2006 *************** *** 1,6 **** #ifndef l_body_h #define l_body_h ! static void create(); static void heart_beat(); void restart_heart(); --- 1,6 ---- #ifndef l_body_h #define l_body_h ! static void create(); static void heart_beat(); void restart_heart(); *************** *** 13,24 **** varargs int eventHealDamage(int x, int internal, mixed limbs); varargs int eventReceiveDamage(object agent, int type, int x, int internal, mixed limbs); int eventCheckProtection(object agent, int type, int damage); ! mixed eventReceiveThrow(object who, object what); ! varargs int eventDie(object agent); int eventRemoveItem(object ob); int eventWear(object ob, mixed limbs); ! void NewBody(string race); mixed CanWear(object armor, string *limbs); varargs int AddLimb(string limb, string parent, int classes, int *armors); --- 13,24 ---- varargs int eventHealDamage(int x, int internal, mixed limbs); varargs int eventReceiveDamage(object agent, int type, int x, int internal, mixed limbs); int eventCheckProtection(object agent, int type, int damage); ! mixed eventReceiveThrow(object who, object what); ! varargs int eventDie(mixed agent); int eventRemoveItem(object ob); int eventWear(object ob, mixed limbs); ! void NewBody(string race); mixed CanWear(object armor, string *limbs); varargs int AddLimb(string limb, string parent, int classes, int *armors); *************** *** 32,38 **** string GetLimbParent(string limb); string *GetLimbChildren(string limb); mapping GetMissingLimb(string limb); ! string *GetMissingLimbs(); string GetLong(string nom); string *GetWieldingLimbs(); varargs int AddFingers(string limb, int x); --- 32,38 ---- string GetLimbParent(string limb); string *GetLimbChildren(string limb); mapping GetMissingLimb(string limb); ! varargs string *GetMissingLimbs(int not_default); string GetLong(string nom); string *GetWieldingLimbs(); varargs int AddFingers(string limb, int x); *************** *** 78,83 **** /* pure virtual */ varargs mixed eventPrint(mixed msg, mixed cl, mixed three); /* pure virtual */ varargs int SetParalyzed(int x, function f); /* pure virtual */ varargs mixed eventMoveLiving(mixed dest, string omsg, ! string imsg); #endif /* l_body_h */ --- 78,83 ---- /* pure virtual */ varargs mixed eventPrint(mixed msg, mixed cl, mixed three); /* pure virtual */ varargs int SetParalyzed(int x, function f); /* pure virtual */ varargs mixed eventMoveLiving(mixed dest, string omsg, ! string imsg); #endif /* l_body_h */ diff -c -r --new-file ds2.0r18/lib/lib/include/clan.h ds2.0r28/lib/lib/include/clan.h *** ds2.0r18/lib/lib/include/clan.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/lib/include/clan.h Wed Jul 5 00:01:05 2006 *************** *** 0 **** --- 1,38 ---- + + + #ifndef l_clan_h + #define l_clan_h + + + class ClanClass { + string leader; + string name; + string objectName; + string skill; + } + + static void create(); + static void init(); + + mixed CanJoin(object ob); + string GetAffectLong(object ob); + string SetLeader(string str); + string GetLeader(); + string SetClanName(string str); + string GetClanName(); + string SetClanObject(string str); + string GetClanObject(); + string SetClanSkill(string str); + string GetClanSkill(); + + int eventBring(string str); + int eventInitiate(string str); + void eventJoin(object ob); + int eventRetire(string str); + void eventUnjoin(object ob); + void eventWelcome(object ob); + + + #endif /* l_clan_h */ + + diff -c -r --new-file ds2.0r18/lib/lib/include/classes.h ds2.0r28/lib/lib/include/classes.h *** ds2.0r18/lib/lib/include/classes.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/classes.h Wed Jul 5 00:01:05 2006 *************** *** 10,17 **** string GetSkillModifier(string skill); string SetClass(string classes); string GetClass(); ! string SetGuild(string guild); ! string GetGuild(); int GetBaseStatLevel(string stat); int SetMorality(int x); int GetMorality(); --- 10,17 ---- string GetSkillModifier(string skill); string SetClass(string classes); string GetClass(); ! string SetClan(string clan); ! string GetClan(); int GetBaseStatLevel(string stat); int SetMorality(int x); int GetMorality(); diff -c -r --new-file ds2.0r18/lib/lib/include/combatmsg.h ds2.0r28/lib/lib/include/combatmsg.h *** ds2.0r18/lib/lib/include/combatmsg.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/combatmsg.h Wed Jul 5 00:01:05 2006 *************** *** 1,6 **** #ifndef l_combatmsg_h #define l_combatmsg_h ! mixed GetMissData(object target, int type, string limb); static void eventSendMissMessages(object target, int x, string limb); mixed GetCombatVerbs(string type, int damage); --- 1,6 ---- #ifndef l_combatmsg_h #define l_combatmsg_h ! mixed GetMissData(object target, int type, string limb); static void eventSendMissMessages(object target, int x, string limb); mixed GetCombatVerbs(string type, int damage); *************** *** 11,15 **** /* virtual only */ string GetName(); varargs int eventPrint(string msg, mixed arg2, mixed arg3); ! #endif /* l_combatmsg_h */ --- 11,15 ---- /* virtual only */ string GetName(); varargs int eventPrint(string msg, mixed arg2, mixed arg3); ! #endif /* l_combatmsg_h */ diff -c -r --new-file ds2.0r18/lib/lib/include/container.h ds2.0r28/lib/lib/include/container.h *** ds2.0r18/lib/lib/include/container.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/container.h Wed Jul 5 00:01:05 2006 *************** *** 14,20 **** string GetInternalShort(); static string SetInternalShort(string str); int GetOpacity(); ! static int SetOpacity(int x); int GetRadiantLight(int ambient); #endif /* l_container_h */ --- 14,20 ---- string GetInternalShort(); static string SetInternalShort(string str); int GetOpacity(); ! int SetOpacity(int x); int GetRadiantLight(int ambient); #endif /* l_container_h */ diff -c -r --new-file ds2.0r18/lib/lib/include/detect.h ds2.0r28/lib/lib/include/detect.h *** ds2.0r18/lib/lib/include/detect.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/detect.h Wed Jul 5 00:01:05 2006 *************** *** 1,12 **** #ifndef __detect_h__ #define __detect_h__ ! int direct_detect_wrd_in_obj(string word); mixed eventDetect(object who, string str, int ability); ! /* virtuals */ ! mixed GetProperty(string str); string GetShort(); ! #endif --- 1,12 ---- #ifndef __detect_h__ #define __detect_h__ ! int direct_detect_wrd_in_obj(string word); mixed eventDetect(object who, string str, int ability); ! /* virtuals */ ! mixed GetProperty(string str); string GetShort(); ! #endif diff -c -r --new-file ds2.0r18/lib/lib/include/exits.h ds2.0r28/lib/lib/include/exits.h *** ds2.0r18/lib/lib/include/exits.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/exits.h Wed Jul 5 00:01:05 2006 *************** *** 9,15 **** mixed eventFly(object who, string dir); mixed eventGo(object who, string str); ! string GetDoor(string dir); string array GetDoors(); string SetDoor(string dir, string file); string GetDirection(string dest); --- 9,15 ---- mixed eventFly(object who, string dir); mixed eventGo(object who, string str); ! mixed GetDoor(string dir); string array GetDoors(); string SetDoor(string dir, string file); string GetDirection(string dest); diff -c -r --new-file ds2.0r18/lib/lib/include/guild.h ds2.0r28/lib/lib/include/guild.h *** ds2.0r18/lib/lib/include/guild.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/guild.h Wed Dec 31 19:00:00 1969 *************** *** 1,38 **** - - - #ifndef l_guild_h - #define l_guild_h - - - class GuildClass { - string leader; - string name; - string objectName; - string skill; - } - - static void create(); - static void init(); - - mixed CanJoin(object ob); - string GetAffectLong(object ob); - string SetLeader(string str); - string GetLeader(); - string SetGuildName(string str); - string GetGuildName(); - string SetGuildObject(string str); - string GetGuildObject(); - string SetGuildSkill(string str); - string GetGuildSkill(); - - int eventBring(string str); - int eventInitiate(string str); - void eventJoin(object ob); - int eventRetire(string str); - void eventUnjoin(object ob); - void eventWelcome(object ob); - - - #endif /* l_guild_h */ - - --- 0 ---- diff -c -r --new-file ds2.0r18/lib/lib/include/holder.h ds2.0r28/lib/lib/include/holder.h *** ds2.0r18/lib/lib/include/holder.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/holder.h Wed Jul 5 00:01:05 2006 *************** *** 12,18 **** mixed direct_look_in_obj(object target, string id); mixed direct_look_inside_obj(object target, string id); mixed indirect_look_at_obj_word_obj(object target, string wrd, object ob, ! string id, string my_id); mixed indirect_put_obj_word_obj(object what, string word, object storage); mixed indirect_put_obs_word_obj(object *items, string word, object storage); --- 12,18 ---- mixed direct_look_in_obj(object target, string id); mixed direct_look_inside_obj(object target, string id); mixed indirect_look_at_obj_word_obj(object target, string wrd, object ob, ! string id, string my_id); mixed indirect_put_obj_word_obj(object what, string word, object storage); mixed indirect_put_obs_word_obj(object *items, string word, object storage); diff -c -r --new-file ds2.0r18/lib/lib/include/lead.h ds2.0r28/lib/lib/include/lead.h *** ds2.0r18/lib/lib/include/lead.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/lead.h Wed Jul 5 00:01:05 2006 *************** *** 2,8 **** #define l_lead_h class FollowerClass { ! int allowed; int bonus; int lost; } --- 2,8 ---- #define l_lead_h class FollowerClass { ! int followed; int bonus; int lost; } *************** *** 12,19 **** object *RemoveFollower(object follower); object *GetFollowers(); ! int SetAllowed(object follower, int allowed); ! int GetAllowed(object follower); int AddFollowBonus(object follower, int bonus); int GetFollowBonus(object follower); --- 12,19 ---- object *RemoveFollower(object follower); object *GetFollowers(); ! int SetFollowed(object follower, int followed); ! int GetFollowed(object follower); int AddFollowBonus(object follower, int bonus); int GetFollowBonus(object follower); diff -c -r --new-file ds2.0r18/lib/lib/include/lock.h ds2.0r28/lib/lib/include/lock.h *** ds2.0r18/lib/lib/include/lock.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/lock.h Wed Jul 5 00:01:05 2006 *************** *** 4,12 **** static void create(); mixed direct_lock_obj_with_obj(object target, object tool, string id); mixed direct_pick_str_on_obj(string str, object target, string str2, ! string id); mixed direct_pick_str_on_obj_with_obj(string str, object target, object tool, ! string str2, string targ_id); mixed direct_unlock_obj_with_obj(object target, object key, string id); mixed CanLock(object who, string id); --- 4,12 ---- static void create(); mixed direct_lock_obj_with_obj(object target, object tool, string id); mixed direct_pick_str_on_obj(string str, object target, string str2, ! string id); mixed direct_pick_str_on_obj_with_obj(string str, object target, object tool, ! string str2, string targ_id); mixed direct_unlock_obj_with_obj(object target, object key, string id); mixed CanLock(object who, string id); diff -c -r --new-file ds2.0r18/lib/lib/include/npc.h ds2.0r28/lib/lib/include/npc.h *** ds2.0r18/lib/lib/include/npc.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/npc.h Wed Jul 5 00:01:05 2006 *************** *** 17,23 **** int cmdTouch(string str); static int cmdAll(string arg); ! varargs int eventDie(object agent); int eventMove(mixed dest); int eventCompleteMove(mixed dest); int eventFollow(object dest, int followChance); --- 17,23 ---- int cmdTouch(string str); static int cmdAll(string arg); ! varargs int eventDie(mixed agent); int eventMove(mixed dest); int eventCompleteMove(mixed dest); int eventFollow(object dest, int followChance); diff -c -r --new-file ds2.0r18/lib/lib/include/player.h ds2.0r28/lib/lib/include/player.h *** ds2.0r18/lib/lib/include/player.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/player.h Wed Jul 5 00:01:05 2006 *************** *** 21,27 **** int cmdTouch(string str); int eventDisplayStatus(); ! varargs int eventDie(object agent); mixed eventAsk(object who, string what); void eventRevive(); varargs int eventShow(object who, string str); --- 21,27 ---- int cmdTouch(string str); int eventDisplayStatus(); ! varargs int eventDie(mixed agent); mixed eventAsk(object who, string what); void eventRevive(); varargs int eventShow(object who, string str); *************** *** 57,63 **** string GetCapName(); int ResetLevel(); string SetClass(string str); ! string SetGuild(string guild); varargs static int AddHealthPoints(int x, string limb, object agent); int GetLanguageLevel(string lang); int is_living(); --- 57,63 ---- string GetCapName(); int ResetLevel(); string SetClass(string str); ! string SetClan(string clan); varargs static int AddHealthPoints(int x, string limb, object agent); int GetLanguageLevel(string lang); int is_living(); diff -c -r --new-file ds2.0r18/lib/lib/include/pole.h ds2.0r28/lib/lib/include/pole.h *** ds2.0r18/lib/lib/include/pole.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/pole.h Wed Jul 5 00:01:05 2006 *************** *** 1,17 **** #ifndef l_pole_h #define l_pole_h ! static void create(); mixed direct_bait_obj_with_obj(); mixed direct_fish_with_obj(); mixed CanCast(object who); ! int eventBait(object who, object bait); int eventBreak(); mixed eventCatch(object who, string fish); int eventFish(object who); ! int SetBait(int x); int AddBait(int x); int GetBait(); --- 1,17 ---- #ifndef l_pole_h #define l_pole_h ! static void create(); mixed direct_bait_obj_with_obj(); mixed direct_fish_with_obj(); mixed CanCast(object who); ! int eventBait(object who, object bait); int eventBreak(); mixed eventCatch(object who, string fish); int eventFish(object who); ! int SetBait(int x); int AddBait(int x); int GetBait(); *************** *** 20,32 **** int GetChance(); int SetStrength(int x); int GetStrength(); ! /* virtual functions */ ! mixed AddSave(mixed *vars); string GetShort(); int SetBroken(int x); int GetBroken(); ! ! #endif /* l_pole_h */ --- 20,32 ---- int GetChance(); int SetStrength(int x); int GetStrength(); ! /* virtual functions */ ! mixed AddSave(mixed *vars); string GetShort(); int SetBroken(int x); int GetBroken(); ! ! #endif /* l_pole_h */ diff -c -r --new-file ds2.0r18/lib/lib/include/stargate.h ds2.0r28/lib/lib/include/stargate.h *** ds2.0r18/lib/lib/include/stargate.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/lib/include/stargate.h Wed Jul 5 00:01:05 2006 *************** *** 0 **** --- 1,18 ---- + /** + * + * $Id: stargate.h,v 1.1 2006/04/05 05:48:39 jam Exp $ + * + */ + + #include "/include/stargate.h" + + #ifndef lib_stargate_h + #define lib_stargate_h + + void setOrigin(string o, string d); + string getOrigin(); + void connect(string destination); + int disconnect(); + string status(); + + #endif diff -c -r --new-file ds2.0r18/lib/lib/include/storage.h ds2.0r28/lib/lib/include/storage.h *** ds2.0r18/lib/lib/include/storage.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/storage.h Wed Jul 5 00:01:05 2006 *************** *** 8,14 **** mixed indirect_get_obj_out_of_obj(object item); mixed direct_look_inside_obj(object target, string id); mixed indirect_look_at_obj_word_obj(object target, string wrd, object ob, ! string id, string my_id); int direct_unlock(); int inventory_accessible(); int inventory_visible(); --- 8,14 ---- mixed indirect_get_obj_out_of_obj(object item); mixed direct_look_inside_obj(object target, string id); mixed indirect_look_at_obj_word_obj(object target, string wrd, object ob, ! string id, string my_id); int direct_unlock(); int inventory_accessible(); int inventory_visible(); diff -c -r --new-file ds2.0r18/lib/lib/include/teacher.h ds2.0r28/lib/lib/include/teacher.h *** ds2.0r18/lib/lib/include/teacher.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/lib/include/teacher.h Wed Jul 5 00:01:05 2006 *************** *** 0 **** --- 1,22 ---- + #ifndef __trainer_h__ + #define __trainer_h__ + + static void create(); + static void init(); + + mixed AddTeachingLanguages(string *args...); + mixed RemoveTeachingLanguages(string *args...); + string *GetTeachingLanguages(); + mapping GetStudents(); + + int eventHelp(object who, string unused); + int eventTeach(object who, string verb, string language); + + static int ContinueTeaching(object who, string language, int x); + + int eventStart(object who, string language); + int eventContinue(object who, string language, int x); + int eventComplete(object who, string language); + + #define TEACHING_WAIT 10 + #endif __trainer_h__ diff -c -r --new-file ds2.0r18/lib/lib/include/teller.h ds2.0r28/lib/lib/include/teller.h *** ds2.0r18/lib/lib/include/teller.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/teller.h Wed Jul 5 00:01:05 2006 *************** *** 1,6 **** #ifndef l_teller_h #define l_teller_h ! static void create(); string SetBankName(string str); string SetLocalCurrency(string str); --- 1,6 ---- #ifndef l_teller_h #define l_teller_h ! static void create(); string SetBankName(string str); string SetLocalCurrency(string str); *************** *** 23,28 **** int eventExchange(object who, int amount, string str1, string str2); int eventOpenAccount(object who); int cmdParse(object who, string cmd, string str); ! #endif --- 23,28 ---- int eventExchange(object who, int amount, string str1, string str2); int eventOpenAccount(object who); int cmdParse(object who, string cmd, string str); ! #endif diff -c -r --new-file ds2.0r18/lib/lib/include/trainer.h ds2.0r28/lib/lib/include/trainer.h *** ds2.0r18/lib/lib/include/trainer.h Wed Sep 28 19:34:11 2005 --- ds2.0r28/lib/lib/include/trainer.h Wed Jul 5 00:01:05 2006 *************** *** 1,22 **** #ifndef __trainer_h__ #define __trainer_h__ ! static void create(); static void init(); ! mixed AddTrainingSkills(string *args...); mixed RemoveTrainingSkills(string *args...); string *GetTrainingSkills(); mapping GetStudents(); ! int eventHelp(object who, string unused); int eventTrain(object who, string verb, string skill); ! static int ContinueTraining(object who, string skill, int x); ! int eventStart(object who, string skill); int eventContinue(object who, string skill, int x); int eventComplete(object who, string skill); ! #define TRAINING_WAIT 10 #endif __trainer_h__ --- 1,22 ---- #ifndef __trainer_h__ #define __trainer_h__ ! static void create(); static void init(); ! mixed AddTrainingSkills(string *args...); mixed RemoveTrainingSkills(string *args...); string *GetTrainingSkills(); mapping GetStudents(); ! int eventHelp(object who, string unused); int eventTrain(object who, string verb, string skill); ! static int ContinueTraining(object who, string skill, int x); ! int eventStart(object who, string skill); int eventContinue(object who, string skill, int x); int eventComplete(object who, string skill); ! #define TRAINING_WAIT 10 #endif __trainer_h__ diff -c -r --new-file ds2.0r18/lib/lib/interactive.c ds2.0r28/lib/lib/interactive.c *** ds2.0r18/lib/lib/interactive.c Tue Mar 28 23:23:41 2006 --- ds2.0r28/lib/lib/interactive.c Wed Jul 5 00:00:58 2006 *************** *** 29,35 **** inherit LIB_MESSAGES; inherit LIB_INTERFACE; ! private int Age, WhereBlock, Brief, LoginTime, BirthTime; private string Password, Email, RealName, Rank, LoginSite, HostSite, WebPage; private mapping News; private class marriage *Marriages; --- 29,35 ---- inherit LIB_MESSAGES; inherit LIB_INTERFACE; ! private int Age, WhereBlock, Brief, LoginTime, BirthTime, RescueBit; private string Password, Email, RealName, Rank, LoginSite, HostSite, WebPage; private mapping News; private class marriage *Marriages; *************** *** 54,63 **** --- 54,69 ---- BirthTime = time(); LastAge = time(); News = ([]); + RescueBit = 0; SetShort("$N the unaccomplished"); SetLong("$N is nondescript."); } + int SetRescueBit(int i){ + RescueBit = i; + return i; + } + /* *************** /lib/interactive.c modal functions *************** */ mixed CanDivorce(object who) { *************** *** 116,123 **** catch(room = load_object(LoginSite)); if( room && room->GetMedium() == MEDIUM_AIR ) { } ! if( !eventMove(LoginSite) ) { ! eventMove(LoginSite = ROOM_START); } } environment()->eventPrint(tmp, MSG_ENV, this_object()); --- 122,132 ---- catch(room = load_object(LoginSite)); if( room && room->GetMedium() == MEDIUM_AIR ) { } ! if(!sizeof(LoginSite) || (!file_exists(LoginSite) && !file_exists(LoginSite+".c")) || !load_object(LoginSite) || !eventMove(LoginSite) || RescueBit) { ! LoginSite = ROOM_START; ! eventMove(ROOM_START); ! SetRescueBit(0); ! //eventMove(LoginSite = ROOM_START); } } environment()->eventPrint(tmp, MSG_ENV, this_object()); *************** *** 152,157 **** --- 161,167 ---- get_livings(load_object("/secure/room/control"))->eventPrint("[" + GetKeyName()+ " goes net-dead]", MSG_SYSTEM); } + SNOOP_D->ReportLinkDeath(this_object()->GetKeyName()); eventMove(ROOM_FREEZER); if(query_snoop(this_object())) query_snoop(this_object())->eventPrint(GetCapName() + " has gone " *************** *** 203,214 **** break; } if( !brief ) { ! if( i == VISION_CLEAR ) { desc = (string)env->GetObviousExits() || ""; ! desc = capitalize((string)env->GetShort() || "") ! + " [" + desc + "]\n"; } ! else desc = ""; if( i == VISION_CLEAR || i == VISION_LIGHT || i == VISION_DIM ) desc += (string)env->GetLong(); if(functionp(tmp = (mixed)env->GetSmell("default"))) --- 213,226 ---- break; } if( !brief ) { ! if( i == VISION_CLEAR ){ desc = (string)env->GetObviousExits() || ""; ! if(desc && desc != "") ! desc = capitalize((string)env->GetShort() || "") ! + " [" + desc + "]\n"; ! else desc = capitalize((string)env->GetShort()+"\n" || "\n"); } ! else desc = "\n"; if( i == VISION_CLEAR || i == VISION_LIGHT || i == VISION_DIM ) desc += (string)env->GetLong(); if(functionp(tmp = (mixed)env->GetSmell("default"))) *************** *** 222,233 **** touch = tmp; } else { ! if( i == VISION_CLEAR || i == VISION_LIGHT || i == VISION_DIM ) { desc = (string)env->GetShort(); if( (tmp = (string)env->GetObviousExits()) && tmp != "" ) desc += " [" + tmp + "]"; } ! else desc = ""; } if( desc ) eventPrint(desc, MSG_ROOMDESC); if( smell ) eventPrint("%^GREEN%^" + smell, MSG_ROOMDESC); --- 234,246 ---- touch = tmp; } else { ! if(i == VISION_CLEAR || i == VISION_LIGHT || i == VISION_DIM){ desc = (string)env->GetShort(); if( (tmp = (string)env->GetObviousExits()) && tmp != "" ) desc += " [" + tmp + "]"; + else desc += "\n"; } ! else desc = "\n"; } if( desc ) eventPrint(desc, MSG_ROOMDESC); if( smell ) eventPrint("%^GREEN%^" + smell, MSG_ROOMDESC); *************** *** 239,246 **** shorts = map(filter(all_inventory(env), function(object ob) { if( living(ob) ) return 0; ! if( (int)ob->GetInvis(this_object()) && !ob->GetDoor()) return 0; if( (int)ob->isFreshCorpse() ) return 0; return 1; }), (: (string)$1->GetShort() :)); --- 252,260 ---- shorts = map(filter(all_inventory(env), function(object ob) { if( living(ob) ) return 0; ! if( (int)ob->GetInvis(this_object()) && !ob->GetDoor() ) return 0; + if(ob->GetDoor() && load_object(ob->GetDoor())->GetHiddenDoor()) return 0; if( (int)ob->isFreshCorpse() ) return 0; return 1; }), (: (string)$1->GetShort() :)); diff -c -r --new-file ds2.0r18/lib/lib/language.c ds2.0r28/lib/lib/language.c *** ds2.0r18/lib/lib/language.c Mon Nov 7 13:29:00 2005 --- ds2.0r28/lib/lib/language.c Wed Jul 5 00:00:58 2006 *************** *** 6,11 **** --- 6,13 ---- #include + int Polyglot = 0; + class comprehension { function check; int time; *************** *** 18,23 **** --- 20,26 ---- // abstract methods int GetHeartRate(); int GetStatLevel(string stat); + string GetNativeLanguage(); // end abstract methods int GetNextLevel(string lang, int curr_level); *************** *** 32,42 **** } mapping RemoveLanguage(string lang) { ! lang = convert_name(lang); map_delete(Languages, lang); return Languages; } varargs void SetLanguageComprehension(function check, int time, function end) { if( !check ) { Comprehension = 0; --- 35,55 ---- } mapping RemoveLanguage(string lang) { ! if(lang && sizeof(lang)) lang = convert_name(lang); ! else return Languages; map_delete(Languages, lang); return Languages; } + mapping SetNativeLanguage(string lang){ + string key = convert_name(lang); + string old_lang = GetNativeLanguage(); + RemoveLanguage(old_lang); + SetLanguage(old_lang, 100); + SetLanguage(lang, 100, 1); + return Languages; + } + varargs void SetLanguageComprehension(function check, int time, function end) { if( !check ) { Comprehension = 0; *************** *** 73,90 **** int y; key = convert_name(lang); ! if( !Languages[key] ) SetLanguage(lang, 0, 0); Languages[key]["points"] += points; ! while( Languages[key]["points"] > ! (y = GetNextLevel(key, Languages[key]["level"])) ) { ! Languages[key]["points"] -= y; ! Languages[key]["level"]++; ! } ! while( Languages[key]["points"] < 0 ) { ! y = GetNextLevel(key, Languages[key]["level"] - 1); ! Languages[key]["points"] = y + Languages[key]["points"]; ! Languages[key]["level"]--; ! } return Languages[key]["points"]; } --- 86,97 ---- int y; key = convert_name(lang); ! if( !Languages[key] ) SetLanguage(key, 0, 0); ! //tc("thing1: "+identify(Languages[key]["points"])); Languages[key]["points"] += points; ! //tc("thing2: "+identify(Languages[key]["points"])); ! Languages[key]["level"] = Languages[key]["points"]; ! if(Languages[key]["level"] > 100) Languages[key]["level"] = 100; return Languages[key]["points"]; } *************** *** 118,123 **** --- 125,140 ---- if( val["native"] ) return Languages[lang]["name"]; } + int SetPolyglot(int i){ + if(!i) Polyglot = 0; + else Polyglot = 1; + return Polyglot; + } + + int GetPolyglot(){ + return Polyglot; + } + static void heart_beat() { if( Comprehension ) { Comprehension->time -= GetHeartRate(); diff -c -r --new-file ds2.0r18/lib/lib/lead.c ds2.0r28/lib/lib/lead.c *** ds2.0r18/lib/lib/lead.c Mon Nov 7 13:29:00 2005 --- ds2.0r28/lib/lib/lead.c Wed Jul 5 00:00:58 2006 *************** *** 34,40 **** if( !follower->IsFollowing(this_object()) ) { if( follower->SetLeader(this_object()) ) { tmp = new(class FollowerClass); ! tmp->allowed = 0; tmp->bonus = 0; tmp->lost = 0; Followers[follower] = tmp; --- 34,40 ---- if( !follower->IsFollowing(this_object()) ) { if( follower->SetLeader(this_object()) ) { tmp = new(class FollowerClass); ! tmp->followed = 0; tmp->bonus = 0; tmp->lost = 0; Followers[follower] = tmp; *************** *** 55,71 **** object *GetFollowers() { return filter(keys(Followers), (: $1 :)); } ! int SetAllowed(object follower, int allowed) { ! if( !objectp(follower) ) error("Bad argument 1 to SetAllowed().\n"); ! if( !intp(allowed) ) error("Bad argument 2 to SetAllowed().\n"); if( !Followers[follower] ) return 0; ! return(((class FollowerClass)Followers[follower])->allowed = allowed); } ! int GetAllowed(object follower) { if( !objectp(follower) ) error("Bad argument 1 to GetFollowBonus().\n"); if( !Followers[follower] ) return 0; ! return ((class FollowerClass)Followers[follower])->allowed; } int AddFollowBonus(object follower, int bonus) { --- 55,71 ---- object *GetFollowers() { return filter(keys(Followers), (: $1 :)); } ! int SetFollowed(object follower, int followed) { ! if( !objectp(follower) ) error("Bad argument 1 to SetFollowed().\n"); ! if( !intp(followed) ) error("Bad argument 2 to SetFollowed().\n"); if( !Followers[follower] ) return 0; ! return(((class FollowerClass)Followers[follower])->followed = followed); } ! int GetFollowed(object follower) { if( !objectp(follower) ) error("Bad argument 1 to GetFollowBonus().\n"); if( !Followers[follower] ) return 0; ! return ((class FollowerClass)Followers[follower])->followed; } int AddFollowBonus(object follower, int bonus) { *************** *** 110,116 **** follower = Followers[ob]; followChance = 100; ! if( !follower->allowed ) followChance -= 20 + this_object()->GetSkillLevel("stealth"); followChance += ob->GetSkillLevel("tracking"); followChance += follower->bonus; if( ob->eventFollow(dest, followChance) ) follower->lost = 0; --- 110,116 ---- follower = Followers[ob]; followChance = 100; ! if( !follower->followed ) followChance -= 20 + this_object()->GetSkillLevel("stealth"); followChance += ob->GetSkillLevel("tracking"); followChance += follower->bonus; if( ob->eventFollow(dest, followChance) ) follower->lost = 0; diff -c -r --new-file ds2.0r18/lib/lib/living.c ds2.0r28/lib/lib/living.c *** ds2.0r18/lib/lib/living.c Tue Mar 28 23:23:41 2006 --- ds2.0r28/lib/lib/living.c Wed Jul 5 19:58:19 2006 *************** *** 8,13 **** --- 8,14 ---- #include #include + #include #include "include/living.h" inherit LIB_CARRY; *************** *** 30,35 **** --- 31,40 ---- isPK = 0; } + int SetDead(int i){ + return combat::SetDead(i); + } + int is_living() { return 1; } int inventory_accessible() { return 1; } *************** *** 41,50 **** --- 46,65 ---- } mixed direct_attack_liv() { + //tc("got this far."); + //tc("this_player(): "+identify(this_player())); + //tc("this_object(): "+identify(this_object())); + if(PLAYER_KILL) return 1; if( userp(this_player()) && userp(this_object()) ) { + //tc("further still","green"); if( !(int)environment(this_player())->CanAttack(this_object()) ) { + //tc("Well well well.","blue"); return "No player killing!"; } + if(this_player()->GetPK() && this_object()->GetPK()){ + return 1; + } + else return "No PK!"; } else return 1; } diff -c -r --new-file ds2.0r18/lib/lib/lvs/abilities.c ds2.0r28/lib/lib/lvs/abilities.c *** ds2.0r18/lib/lib/lvs/abilities.c Mon Jan 16 23:03:15 2006 --- ds2.0r28/lib/lib/lvs/abilities.c Wed Jul 5 00:01:05 2006 *************** *** 153,159 **** * sets the skill "skill" to the level "level" * if a classes is given, its class is set to it, otherwise the class is * set to 1 ! * usefule mostly for monster types, probably should have override * protections in the user object (should use AddSkill() for users) */ varargs void SetSkill(string skill, int level, int cls) { --- 153,159 ---- * sets the skill "skill" to the level "level" * if a classes is given, its class is set to it, otherwise the class is * set to 1 ! * useful mostly for monster types, probably should have override * protections in the user object (should use AddSkill() for users) */ varargs void SetSkill(string skill, int level, int cls) { diff -c -r --new-file ds2.0r18/lib/lib/nmsh.c ds2.0r28/lib/lib/nmsh.c *** ds2.0r18/lib/lib/nmsh.c Sat Mar 11 11:16:12 2006 --- ds2.0r28/lib/lib/nmsh.c Wed Jul 5 00:00:58 2006 *************** *** 14,20 **** inherit LIB_HISTORY; #define DIRECTORY_STACK_SIZE 5 ! #define MAX_CMD_ALIASES 72 private string CurrentWorkingDirectory; private string PreviousWorkingDirectory; --- 14,20 ---- inherit LIB_HISTORY; #define DIRECTORY_STACK_SIZE 5 ! #define MAX_CMD_ALIASES 128 private string CurrentWorkingDirectory; private string PreviousWorkingDirectory; *************** *** 32,38 **** "sw" : "go southwest", "d" : "go down", "u" : "go up", "out": "go out", "exa" : "look at $*", "p" : "people", "sc" : "status", "inf" : "score", "eq" : "inventory", "where" : "people", "prac" : "skills", ! "practice" : "skills", "trophy" : "kills" ]); Xverbs = (["'":"say $*",":":"emote $*","\"":"say $*",]); } --- 32,43 ---- "sw" : "go southwest", "d" : "go down", "u" : "go up", "out": "go out", "exa" : "look at $*", "p" : "people", "sc" : "status", "inf" : "score", "eq" : "inventory", "where" : "people", "prac" : "skills", ! "practice" : "skills", "trophy" : "kills", ! "northwest" : "go northwest", "northeast" : "go northeast", ! "southwest" : "go southwest", "southeast" : "go southeast", ! "north" : "go north", "south": "go south", "east" : "go east", ! "west" : "go west", "up" : "go up", "down": "go down", ! "ig" : "intergossip $*", "c" : "cre $*", "lp" : "lpuni $*" ]); Xverbs = (["'":"say $*",":":"emote $*","\"":"say $*",]); } diff -c -r --new-file ds2.0r18/lib/lib/npc.c ds2.0r28/lib/lib/npc.c *** ds2.0r18/lib/lib/npc.c Fri Mar 24 14:36:39 2006 --- ds2.0r28/lib/lib/npc.c Wed Jul 5 19:58:20 2006 *************** *** 389,397 **** object::eventDestruct(); } ! varargs int eventDie(object agent) { int x; if( (x = living::eventDie(agent)) != 1 ) return x; if( stringp(Die) ) { message("other_action", Die, environment(), ({ this_object() })); --- 389,399 ---- object::eventDestruct(); } ! varargs int eventDie(mixed agent) { int x; + if(this_object()->GetDead() || this_object()->GetDeathEvents()) return 0; + if( (x = living::eventDie(agent)) != 1 ) return x; if( stringp(Die) ) { message("other_action", Die, environment(), ({ this_object() })); *************** *** 406,411 **** --- 408,414 ---- } set_heart_beat(0); call_out( (: Destruct :), 0); + flush_messages(); return 1; } *************** *** 633,651 **** } varargs void SetCurrency(mixed val, int amount) { ! if( stringp(val) ) AddCurrency(val, amount - GetCurrency(val)); else if( mapp(val) ) { string *currs; int i; i = sizeof(currs = keys(val)); ! while(i--) AddCurrency(currs[i], val[currs[i]]-GetCurrency(currs[i])); } else error("Bad argument 1 to SetCurrency()."); } mixed SetEncounter(mixed val) { return (Encounter = val); } string *AddEncounter(string nom) { if( !stringp(nom) ) error("Bad argument 1 to AddEncounter()\n"); if( Encounter && !pointerp(Encounter) ) return 0; --- 636,662 ---- } varargs void SetCurrency(mixed val, int amount) { ! //tc("val: "+identify(val),"red"); ! //if(amount) tc("amount: "+identify(amount),"red"); ! if( stringp(val) ) AddCurrency(val, amount); else if( mapp(val) ) { string *currs; int i; i = sizeof(currs = keys(val)); ! while(i--) AddCurrency(currs[i], val[currs[i]]); } else error("Bad argument 1 to SetCurrency()."); } mixed SetEncounter(mixed val) { return (Encounter = val); } + mixed SetAggressive(mixed val){ + if(sizeof(Encounter)) return Encounter; + else Encounter = 100; + } + + string *AddEncounter(string nom) { if( !stringp(nom) ) error("Bad argument 1 to AddEncounter()\n"); if( Encounter && !pointerp(Encounter) ) return 0; diff -c -r --new-file ds2.0r18/lib/lib/pager.c ds2.0r28/lib/lib/pager.c *** ds2.0r18/lib/lib/pager.c Mon Nov 7 13:29:00 2005 --- ds2.0r28/lib/lib/pager.c Wed Jul 5 00:00:58 2006 *************** *** 104,110 **** if( endline < file->Size - 1 ) { prompt += "(" + (file->CurrentLine+1) + "-" + (endline+1) + " "; prompt += ((endline * 100)/(file->Size - 1)) + "%) press enter: "; ! prompt = "%^BOLD%^" + prompt + "%^RESET%^"; file->CurrentLine = endline + 1; eventPrint(prompt, MSG_PROMPT); input_to((: cmdPage :), file); --- 104,111 ---- if( endline < file->Size - 1 ) { prompt += "(" + (file->CurrentLine+1) + "-" + (endline+1) + " "; prompt += ((endline * 100)/(file->Size - 1)) + "%) press enter: "; ! // Following fix courtesy of Brodbane ! prompt = "%^BOLD%^" + prompt + "%^RESET%^\n"; file->CurrentLine = endline + 1; eventPrint(prompt, MSG_PROMPT); input_to((: cmdPage :), file); *************** *** 126,132 **** int fp, x, scrlen; if( !str || trim(str) == "" ) { ! if( file->CurrentLine >= (file->Size - 1) ) { fp = functionp(file->Callback); if( !fp || (fp == FP_OWNER_DESTED) ) return; if( file->Args ) evaluate(file->Callback, file->Args...); --- 127,133 ---- int fp, x, scrlen; if( !str || trim(str) == "" ) { ! if( file->CurrentLine >= (file->Size) ) { fp = functionp(file->Callback); if( !fp || (fp == FP_OWNER_DESTED) ) return; if( file->Args ) evaluate(file->Callback, file->Args...); diff -c -r --new-file ds2.0r18/lib/lib/persist.c ds2.0r28/lib/lib/persist.c *** ds2.0r18/lib/lib/persist.c Mon Nov 7 13:29:00 2005 --- ds2.0r28/lib/lib/persist.c Wed Jul 5 00:00:58 2006 *************** *** 15,20 **** --- 15,21 ---- string *flat = ({}); mixed *tmp; + //tc("Hit eventConvertObject","red"); if( val[0] != base_name(this_object()) ) error("Invalid save string.\n"); tmp = map(Saved, (: functionp($1) ? evaluate($1, "loading") : $1 :)); foreach(mixed elem in tmp) { *************** *** 108,115 **** if( arrayp(elem) ) flat += elem; else flat += ({ elem }); } ! flat -= ({ 0 }); ! foreach(string var in flat) mp[var] = fetch_variable(var); mp["#base_name#"] = base_name(this_object()); if( SaveRecurse ) mp["#inventory#"] = (string *)all_inventory()->GetSaveString() - ({ 0 }); --- 109,120 ---- if( arrayp(elem) ) flat += elem; else flat += ({ elem }); } ! if(flat && sizeof(flat)){ ! flat -= ({ 0 }); ! foreach(mixed var in flat) { ! if(stringp(var)) mp[var] = fetch_variable(var); ! } ! } mp["#base_name#"] = base_name(this_object()); if( SaveRecurse ) mp["#inventory#"] = (string *)all_inventory()->GetSaveString() - ({ 0 }); diff -c -r --new-file ds2.0r18/lib/lib/pile.c ds2.0r28/lib/lib/pile.c *** ds2.0r18/lib/lib/pile.c Mon Nov 7 13:29:00 2005 --- ds2.0r28/lib/lib/pile.c Wed Jul 5 00:00:58 2006 *************** *** 14,20 **** --- 14,24 ---- private int PileAmount = 0; static void create() { + string *saveds; item::create(); + saveds = item::GetSave(); + saveds += ({ "PileType", "PileAmount" }); + AddSave( saveds ); SetKeyName("pile"); } diff -c -r --new-file ds2.0r18/lib/lib/player.c ds2.0r28/lib/lib/player.c *** ds2.0r18/lib/lib/player.c Sat Mar 11 11:16:12 2006 --- ds2.0r28/lib/lib/player.c Wed Jul 5 19:58:20 2006 *************** *** 22,34 **** private string *Titles; string *Muffed = ({}); private class quest *Quests; ! private class death *Deaths; private int TrainingPoints, TitleLength; /* ***************** /lib/player.c driver applies ***************** */ static void create() { ! AddSave( ({ "CarriedMass", "Muffed" }) ); interactive::create(); living::create(); --- 22,34 ---- private string *Titles; string *Muffed = ({}); private class quest *Quests; ! private mapping *Deaths; private int TrainingPoints, TitleLength; /* ***************** /lib/player.c driver applies ***************** */ static void create() { ! AddSave( ({ "Properties", "CarriedMass", "Muffed" }) ); interactive::create(); living::create(); *************** *** 121,162 **** static void eventDestroyUndead(object agent) { } ! varargs int eventDie(object agent) { int x, expee, subexpee; if( (x = living::eventDie(agent)) != 1 ) return x; ! if( !GetUndead() ) { ! eventDestroyUndead(agent); ! } ! else { ! message("my_action", "Consciousness passes from you after one last " ! "gasp for air.", this_object()); ! message("my_action", "You awake, but you find your body feels " ! "different, and the world about you is unfamiliar.", ! this_object()); ! if( agent ) { ! message("other_action", GetName() + " drops dead by the hand " ! "of " + (string)agent->GetName() + ".", ! environment(this_object()), ({ agent, this_object() })); ! message("other_action", "You send " + GetName() + " into the " ! "Underworld.", agent); ! } ! else message("other_action", GetName() + " drops dead.", ! environment(), ({ this_object() }) ); ! ! NewBody(GetRace()); ! ! expee = this_object()->GetExperiencePoints(); ! subexpee = to_int(expee * 0.25); ! ! eventCompleteHeal(GetMaxHealthPoints()/2); ! AddMagicPoints(-(random(GetMagicPoints()))); ! interactive::eventMove(ROOM_DEATH); ! this_object()->AddExperiencePoints(-subexpee); ! this_object()->save_player((string)this_object()->GetKeyName()); ! this_object()->eventForce("look"); } ! return 1; } mixed eventTurn(object who) { --- 121,168 ---- static void eventDestroyUndead(object agent) { } ! varargs int eventDie(mixed agent) { int x, expee, subexpee; if( (x = living::eventDie(agent)) != 1 ) return x; ! ! if(!Deaths || !sizeof(Deaths)) ! Deaths = ({([ "date" : ctime(time()), "enemy" : ((agent->GetName()) ? agent->GetName() : agent) ])}); ! else Deaths += ({ ([ "date" : ctime(time()), "enemy" : agent->GetName() ]) }); ! ! if( !GetUndead() ) { ! eventDestroyUndead(agent); ! } ! else { ! message("my_action", "Consciousness passes from you after one last " ! "gasp for air.", this_object()); ! message("my_action", "You awake, but you find your body feels " ! "different, and the world about you is unfamiliar.", ! this_object()); ! if( agent ) { ! message("other_action", GetName() + " drops dead by the hand " ! "of " + (string)agent->GetName() + ".", ! environment(this_object()), ({ agent, this_object() })); ! message("other_action", "You send " + GetName() + " into the " ! "Underworld.", agent); } ! else message("other_action", GetName() + " drops dead.", ! environment(), ({ this_object() }) ); ! ! NewBody(GetRace()); ! ! expee = this_object()->GetExperiencePoints(); ! subexpee = to_int(expee * 0.25); ! ! eventCompleteHeal(GetMaxHealthPoints()/2); ! AddMagicPoints(-(random(GetMagicPoints()))); ! interactive::eventMove(ROOM_DEATH); ! this_object()->AddExperiencePoints(-subexpee); ! this_object()->save_player((string)this_object()->GetKeyName()); ! this_object()->eventForce("look"); ! } ! flush_messages(); ! return 1; } mixed eventTurn(object who) { *************** *** 170,175 **** --- 176,184 ---- void eventRevive() { string skill; + this_object()->SetDead(0); + this_object()->SetDeathEvents(0); + if( !GetUndead() ) return; SetUndead(0); if(this_player()->GetPoison() > 0){ *************** *** 213,221 **** base_name(environment(this_player()))); } - if(this_player()->GetProperty("debug")) - tell_player(this_player(),"Calling stack for move: "+get_stack()); - ret = interactive::eventMove(dest); eventMoveFollowers(environment(this_object())); return ret; --- 222,227 ---- *************** *** 439,444 **** --- 445,454 ---- if(GetProperty("brand_spanking_new")){ object jeans, shirt, book; + + if(ENGLISH_ONLY) this_object()->SetNativeLanguage("English"); + PLAYERS_D->AddPlayerInfo(this_object()); + jeans = new("/domains/default/armor/jeans"); shirt = new("/domains/default/armor/shirt"); book = new("/domains/default/obj/handbook"); *************** *** 462,468 **** robe = new("/domains/default/armor/robe"); hat = new("/domains/default/armor/wizard_hat"); staff = new("/secure/obj/staff"); ! book = new("/domains/default/obj/manual"); book2 = new("/domains/default/obj/handbook"); if(robe) robe->eventMove(this_object()); --- 472,478 ---- robe = new("/domains/default/armor/robe"); hat = new("/domains/default/armor/wizard_hat"); staff = new("/secure/obj/staff"); ! book = new("/domains/default/obj/guide"); book2 = new("/domains/default/obj/handbook"); if(robe) robe->eventMove(this_object()); *************** *** 526,532 **** return Muffed; } - string *SetTitles(string *titles) { if( sizeof(distinct_array(titles)) != sizeof(titles) ) return Titles; Titles = titles; --- 536,541 ---- *************** *** 781,828 **** mapping *GetDeaths() { if( !Deaths ) return ({}); ! return map(Deaths, function(class death morte) { ! return ([ "date" : morte->Date, ! "enemy" : morte->Enemy ]); ! }); ! } ! ! int AddTrainingPoints(int x) { ! log_file("TrainingPoints", GetName() + " received " + x + " training " ! "points at " + ctime(time()) + "\ncall chain: " + ! sprintf("%O\n", previous_object(-1)) ); ! return (TrainingPoints += x); ! } ! ! int RemoveTrainingPoints(int x) { ! return (TrainingPoints -= x); ! } ! ! int GetTrainingPoints() { return TrainingPoints; } ! ! varargs int eventTrain(string skill, int points) { ! float x = 0; ! mapping mp; ! ! if( points < 1 ) points = 1; ! if( !(mp = GetSkill(skill)) ) return 0; ! if( TrainingPoints < points ) return 0; ! while( points-- ) { ! int max = GetMaxSkillPoints(skill, mp["level"]); ! switch( mp["class"] ) { ! case 1: x = 50.0; break; ! case 2: x = 40.0; break; ! case 3: x = 30.0; break; ! case 4: x = 20.0; break; ! default: return 0; ! } ! TrainingPoints--; ! AddSkillPoints(skill, to_int( (max * x) / 100 )); } ! return 1; } ! //string ChangeClass(string cl) { ! // error("Players cannot change class.\n"); ! // return GetClass(); ! // } --- 790,834 ---- mapping *GetDeaths() { if( !Deaths ) return ({}); ! return copy(Deaths); ! } ! ! int AddTrainingPoints(int x) { ! log_file("TrainingPoints", GetName() + " received " + x + " training " ! "points at " + ctime(time()) + "\ncall chain: " + ! sprintf("%O\n", previous_object(-1)) ); ! return (TrainingPoints += x); ! } ! ! int RemoveTrainingPoints(int x) { ! return (TrainingPoints -= x); ! } ! ! int GetTrainingPoints() { return TrainingPoints; } ! ! varargs int eventTrain(string skill, int points) { ! float x = 0; ! mapping mp; ! ! if( points < 1 ) points = 1; ! if( !(mp = GetSkill(skill)) ) return 0; ! if( TrainingPoints < points ) return 0; ! while( points-- ) { ! int max = GetMaxSkillPoints(skill, mp["level"]); ! switch( mp["class"] ) { ! case 1: x = 50.0; break; ! case 2: x = 40.0; break; ! case 3: x = 30.0; break; ! case 4: x = 20.0; break; ! default: return 0; } ! TrainingPoints--; ! AddSkillPoints(skill, to_int( (max * x) / 100 )); } + return 1; + } ! //string ChangeClass(string cl) { ! // error("Players cannot change class.\n"); ! // return GetClass(); ! // } diff -c -r --new-file ds2.0r18/lib/lib/props/description.c ds2.0r28/lib/lib/props/description.c *** ds2.0r18/lib/lib/props/description.c Sat Mar 11 11:16:12 2006 --- ds2.0r28/lib/lib/props/description.c Wed Jul 5 00:01:05 2006 *************** *** 41,46 **** --- 41,49 ---- mixed direct_reload() { return 1; } mixed indirect_reload() { return 1; } + mixed direct_reload_every_str() { return 1; } + mixed indirect_reload_every_str() { return 1; } + mixed direct_copy_obj_to_obj() { return 1; } mixed direct_copy_obj_str() { return 1; } diff -c -r --new-file ds2.0r18/lib/lib/props/properties.c ds2.0r28/lib/lib/props/properties.c *** ds2.0r18/lib/lib/props/properties.c Mon Nov 7 13:31:06 2005 --- ds2.0r28/lib/lib/props/properties.c Wed Jul 5 00:01:05 2006 *************** *** 6,12 **** * Last modified: 96/12/22 */ ! private static mapping Properties = ([]); mixed AddProperty(string prop, mixed val) { if( Properties[prop] ) { --- 6,13 ---- * Last modified: 96/12/22 */ ! //private static mapping Properties = ([]); ! mapping Properties = ([]); mixed AddProperty(string prop, mixed val) { if( Properties[prop] ) { *************** *** 20,25 **** --- 21,27 ---- mixed GetProperty(string prop) { return Properties[prop]; + //else return 0; } mapping GetProperties() { *************** *** 41,45 **** } mapping SetProperties(mapping props) { ! return (Properties += props); } --- 43,48 ---- } mapping SetProperties(mapping props) { ! if(sizeof(Properties)) return (Properties += props); ! else return (Properties = props); } diff -c -r --new-file ds2.0r18/lib/lib/race.c ds2.0r28/lib/lib/race.c *** ds2.0r18/lib/lib/race.c Fri Mar 24 14:36:39 2006 --- ds2.0r28/lib/lib/race.c Wed Jul 5 00:00:58 2006 *************** *** 7,12 **** --- 7,13 ---- */ #include + #include #include #include #include *************** *** 102,113 **** } foreach(tmp in args[1]) { mixt = copy(args[1]); AddStat(tmp...); } if( stringp(args[2]) ) { mixt = copy(args[2]); ! SetLanguage(args[2], 100, 1); } if( sizeof(args[3]) == 2 ) { mixt = copy(args[3]); --- 103,120 ---- } foreach(tmp in args[1]) { mixt = copy(args[1]); + //tc("mixt: "+identify(mixt),"blue"); AddStat(tmp...); } if( stringp(args[2]) ) { mixt = copy(args[2]); ! if(!ENGLISH_ONLY){ ! SetLanguage(args[2], 100, 1); ! } ! else { ! SetLanguage("English", 100, 1); ! } } if( sizeof(args[3]) == 2 ) { mixt = copy(args[3]); diff -c -r --new-file ds2.0r18/lib/lib/sentient.c ds2.0r28/lib/lib/sentient.c *** ds2.0r18/lib/lib/sentient.c Mon Jan 23 08:52:38 2006 --- ds2.0r28/lib/lib/sentient.c Wed Jul 5 00:00:58 2006 *************** *** 8,13 **** --- 8,16 ---- #include #include + #include + #include + inherit LIB_NPC; *************** *** 204,214 **** varargs mixed eventReceiveEmote(object who, string verb, string info) { mixed val = EmoteResponses[verb]; if( !val ) { return 0; } if( stringp(val) ) { ! eventSpeak(val); return 1; } return evaluate(val, this_player(), verb, info); --- 207,222 ---- varargs mixed eventReceiveEmote(object who, string verb, string info) { mixed val = EmoteResponses[verb]; + //debug("who",who,"red"); + //debug("verb",verb,"red"); + //debug("info",info,"red"); + //debug("responses",EmoteResponses,"red"); if( !val ) { return 0; } if( stringp(val) ) { ! //debug("val",val,"red"); ! eventSpeak(who,TALK_LOCAL,val); return 1; } return evaluate(val, this_player(), verb, info); *************** *** 257,273 **** mixed eventWander() { int fp; if( !sizeof(WanderPath) ) { string *sorties; string tmp; sorties = ({}); foreach(tmp in (string *)environment()->GetExits()) { string dest, door; if( !permit_load && !find_object(dest = (string)environment()->GetExit(tmp)) ) continue; ! if( (door = (string)environment()->GetDoor(tmp)) && (int)door->GetClosed() ) continue; sorties += ({ "go " + tmp }); } --- 265,285 ---- mixed eventWander() { int fp; + //tc("1","red"); + if( !sizeof(WanderPath) ) { string *sorties; string tmp; + //tc("2","green"); sorties = ({}); foreach(tmp in (string *)environment()->GetExits()) { string dest, door; if( !permit_load && !find_object(dest = (string)environment()->GetExit(tmp)) ) continue; ! door = (string)environment()->GetDoor(tmp); ! if( door && (int)door->GetClosed() ) continue; sorties += ({ "go " + tmp }); } *************** *** 276,282 **** if( !find_object(dest = (string)environment()->GetEnter(tmp)) ) continue; ! if( (door = (string)environment()->GetDoor(tmp)) && (int)door->GetClosed() ) continue; sorties += ({ "enter " + tmp }); } --- 288,295 ---- if( !find_object(dest = (string)environment()->GetEnter(tmp)) ) continue; ! door = (string)environment()->GetDoor(tmp); ! if( door && (int)door->GetClosed() ) continue; sorties += ({ "enter " + tmp }); } *************** *** 319,330 **** --- 332,347 ---- return; } if( !GetInCombat() ) { // Things to do when not in combat + //tc("not in combat"); if( WanderSpeed ) { // Check if wandering + //tc("wandering"); if( WanderCount >= WanderSpeed ) { // Time to wander + //tc("time to wander"); WanderCount = 0; eventWander(); } else { + //tc("not time to wander yet"); WanderCount++; } } diff -c -r --new-file ds2.0r18/lib/lib/spell.c ds2.0r28/lib/lib/spell.c *** ds2.0r18/lib/lib/spell.c Mon Jan 16 23:03:16 2006 --- ds2.0r28/lib/lib/spell.c Wed Jul 5 00:00:58 2006 *************** *** 61,74 **** } int GetDamage() { ! int tmp; int damage = Damage[0]; if( Damage[1] ) { damage += random(Damage[1]); } ! tmp = this_player()->GetSkill("magic attack")["level"]; ! tmp = tmp/this_player()->GetSkill("magic attack")["class"]; damage += tmp; //tc("spell damage: "+identify(damage)); return damage; --- 61,76 ---- } int GetDamage() { ! int tmp = 0; int damage = Damage[0]; if( Damage[1] ) { damage += random(Damage[1]); } ! if(this_player()->GetSkill("magic attack")){ ! tmp = (this_player()->GetSkill("magic attack")["level"]) * 2; ! tmp = tmp/this_player()->GetSkill("magic attack")["class"]; ! } damage += tmp; //tc("spell damage: "+identify(damage)); return damage; diff -c -r --new-file ds2.0r18/lib/lib/stargate.c ds2.0r28/lib/lib/stargate.c *** ds2.0r18/lib/lib/stargate.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/lib/stargate.c Wed Jul 5 00:00:58 2006 *************** *** 0 **** --- 1,258 ---- + #include + #include + #include "/lib/include/stargate.h" + + /** + * 2006-03-28, jonez + * - based on a suggestion from rhk, changed so that one cannot enter the + * gate unless status is "outbound". this makes the object closer to the + * (theoretical) math and also to what happens on the show. + */ + + /** + * based on portal.c by Brodbane - March 2006 + * + * $Id: stargate.c,v 1.1 2006/04/05 05:48:39 jam Exp $ + * + * The desired functionality is much like a "star gate": users dialed + * letters or full words that lined up with destinations. A portal opens to + * that destination briefly. To define destinations you must setup a + * constant below then add it to the switch statement in the cmdDial + * function. This object is crude and basic, but gets the job done. + * + * 2006-03-22, jonez + * - original version of this file is from Daelas@Moraelinost + * 2006-03-23, jonez + * - altered so code uses existing verbs (touch, enter) where possible. last add_action is for dial command. + * - added single mapping called "database" and made the "dial" command use it. + * - dial command no longer uses switch/case, making adding a new destination simpler + * - made use of SetPreventGet() / SetPreventPut() + * - made use of new stargate daemon + * - made use of LIB_STARGATE + * - made use of STARGATE_D + * + * IDEAS: + * - create a daemon that holds the stargate network [DONE] + * - allow for stargate failure + * - add dhd object + * - change the code so that it uses a single mapping of names and + * destinations, perhaps in a database file. currently an update to the + * object requires an update for all the objects. [DONE] + * - dhd skill (thanks plato) + * - delay when dialing gate. destination dhd lights up? + * - player should not be able to dial earth if earth is already connected elsewhere (need daemon) [DONE] + * - make use of existing verbs (enter, touch) instead of doing our own thing. [DONE] + * - daemon should contain a class that maps the various gates to each other. see lib/include/door.h [DONE] + * - shout "off world activation" into the gateroom when the gate engages. + * - track status as "incoming" or "outgoing".. you can only "enter" an outgoing gate (rhk) [DONE] + * - if room is empty, shut down the gate (rhk) + * - change callout time when someone goes through the gate (rhk) + */ + + inherit LIB_ITEM; + + static private string origin; + + string displayLong(); + string displayShort(); + + void create(){ + item::create(); + + SetKeyName("stargate"); + SetId(({"stargate", "gate", "portal", "ring"})); + SetAdjectives(({"stargate"})); + SetShort( (: displayShort :) ); + + SetLong( (: displayLong :) ); + + AddItem( "inner ring", "The second ring - the inner ring - is placed " + "inside the larger ring and seems to be able to move."); + SetMass(1000); + SetBaseCost("silver",50); + SetPreventGet("The gate is pure naquadah and cannot be moved"); + SetPreventPut("The gate is pure naquadah and cannot be moved"); + SetTouch("You feel the stargate beneath your hand humming with energy."); + } + + void init(){ + ::init(); + add_action( "cmdDial", "dial" ); + add_action( "cmdEnter", "enter"); + } + + + void SetOrigin(string o, string d){ + if (o == "" || d == "") return; + origin = lower_case(o); + if(!sizeof(STARGATE_D->GetStargate(origin))){ + STARGATE_D->SetStargate(origin, d); + } + } + + string GetOrigin(){ + return origin; + } + + void eventConnect(string destination){ + int ret; + + destination = lower_case(destination); + //tc("origin: "+origin,"white"); + //tc("destination: "+destination,"white"); + + if (origin == destination){ + write("You attempt to dial the gate, but the last chevron does not engage"); + say(this_player()->GetName() + " tries to dial the gate but the last chevron does not engage"); + return; + } + + ret = STARGATE_D->eventConnect(origin, destination); + if (ret){ + string d = STARGATE_D->GetDestination(destination); + write("The ancient rings lock into place and a portal forms in an explosion of energy."); + say("The ancient rings lock into place and a portal forms in an explosion of energy."); + tell_room(d, "The ancient rings lock into place and a portal forms in an explosion of energy"); + call_out("eventDisconnect", 10+random(5)); + return; + } + + write("You attempt to dial the stargate, but nothing happens."); + say(this_player()->GetName() + " tries to dial the gate but fails."); + + return; + } + + int eventDisconnect(){ + string endpoint = STARGATE_D->GetEndpoint(origin); + string e = STARGATE_D->GetDestination(origin); + string d = STARGATE_D->GetDestination(endpoint); + //object e = load_object(STARGATE_D->GetEndpoint(origin)); + //object d; + //if(e) d = load_object(STARGATE_D->GetDestination(STARGATE_D->GetEndpoint(origin))); + + //debug(sprintf("stargate_lib->eventDisconnect(%s), e=%s, d=%s", origin, e, d)); + + // FIX: does the player Get a message if they come through the gate and then leave the room? + //write("The chevrons on the stargate disengage and the portal disappears."); + //say("The chevrons on the stargate disengage and the portal disappears."); + //tell_room(d, "The chevrons on the stargate disengage and the portal disappears", ({ this_player() })); + if(d) tell_room(d, "The chevrons on the stargate disengage and the portal disappears."); + if(e) tell_room(e, "The chevrons on the stargate disengage and the portal disappears."); + + //tc("origin: "+identify(origin)); + + return STARGATE_D->eventDisconnect(origin); + } + + string status(){ + //tc("origin: "+origin); + //tc("staus: "+STARGATE_D->GetStatus(origin)); + return STARGATE_D->GetStatus(origin); + } + + mixed cmdDial(string s){ + object ob; + string flipside; + if (s) + { + //tc("s: "+s); + if(STARGATE_D->GetDestination(s)) + flipside = STARGATE_D->GetDestination(s); + //tc("flipside: "+flipside); + eventConnect(s); + //if(sizeof(flipside)) ob = find_object(flipside); + if(sizeof(flipside) && !ob) ob = load_object(flipside); + if(!ob){ + write("The Stargate abruptly begins to shuts down."); + eventDisconnect(); + } + //else if(!present("stargate",find_object(flipside))) tc("wtf"); + return 1; + } + + return 0; + + } + + int cmdEnter(string what){ + string endpoint, destination; + object who; + + if (what != "gate" && what != "stargate") + { + return 0; + } + + if (status() != "outbound") + { + return 0; + } + + who = this_player(); + endpoint = STARGATE_D->GetEndpoint(origin); + destination = STARGATE_D->GetDestination(endpoint); + //debug("endpoint=" + endpoint); + //debug("destination=" + destination); + who->eventPrint("You step through the event horizon of the stargate."); + who->eventMoveLiving(destination, + "$N steps into the event horizon and disappears", + "$N steps out of the event horizon"); + return 1; + + } + + int eventEnter(object who){ + string endpoint; + + if (!who) return 0; + + endpoint = STARGATE_D->GetEndpoint(origin); + if (status() == "connected") + { + who->eventPrint("You step through the event horizon of the stargate."); + who->eventMoveLiving(endpoint, + "$N steps into the event horizon and disappears", + "$N steps out of the event horizon"); + } + return 1; + } + + string displayLong(){ + string buf, stat; + + buf = "This is the Stargate of legend. The Stargate was created " + "from naquadah ore, similar to black quartz. It is a perfectly " + "circular device approximately ten meters in diameter and " + "comprised of two sets of rings and nine chevrons placed " + "equidistant along its outer circumference."; + + stat = status(); + + if (stat == "outbound" || stat == "inbound") + { + buf += " There is an event horizon in the center of the ring that looks like shimmering water."; + } + else if (stat == "idle") + { + buf += " This gate is currently idle."; + } + return buf; + } + + string displayShort(){ + string stat; + stat = status(); + //tc("status: "+stat); + switch (stat) + { + case "inbound": + return "an inbound stargate"; + case "outbound": + return "an outbound stargate"; + case "idle": + return "an idle stargate"; + default: + return "a broken stargate"; + } + } diff -c -r --new-file ds2.0r18/lib/lib/std/armor.c ds2.0r28/lib/lib/std/armor.c *** ds2.0r18/lib/lib/std/armor.c Mon Nov 7 13:31:06 2005 --- ds2.0r28/lib/lib/std/armor.c Wed Jul 5 00:01:05 2006 *************** *** 174,179 **** --- 174,181 ---- } static mixed array AddSave(mixed array vars) { + if(!vars) vars = ({}); + vars += ({ "Properties" }); return persist::AddSave(vars); } diff -c -r --new-file ds2.0r18/lib/lib/std/barkeep.c ds2.0r28/lib/lib/std/barkeep.c *** ds2.0r18/lib/lib/std/barkeep.c Thu Feb 23 15:40:40 2006 --- ds2.0r28/lib/lib/std/barkeep.c Wed Jul 5 00:01:05 2006 *************** *** 34,40 **** if( f < 0.1 ) { f = 1.0; } ! return query_value(MenuItems[item]->GetBaseCost(),query_base_currency(),this_object()->GetLocalCurrency()); } string GetLocalCurrency() { --- 34,40 ---- if( f < 0.1 ) { f = 1.0; } ! return query_value(load_object(MenuItems[item])->GetBaseCost(),query_base_currency(),this_object()->GetLocalCurrency()); } string GetLocalCurrency() { diff -c -r --new-file ds2.0r18/lib/lib/std/dummy.c ds2.0r28/lib/lib/std/dummy.c *** ds2.0r18/lib/lib/std/dummy.c Mon Jan 23 08:52:49 2006 --- ds2.0r28/lib/lib/std/dummy.c Wed Jul 5 00:01:05 2006 *************** *** 22,31 **** inherit LIB_TOUCH; /* ***************** dummy.c attributes ***************** */ int isDummy() { return 1; } - varargs string array SetId(mixed ids...) { ids = id::SetId(ids); if( sizeof(ids) && !GetKeyName() ) { --- 22,31 ---- inherit LIB_TOUCH; /* ***************** dummy.c attributes ***************** */ + int isDummy() { return 1; } varargs string array SetId(mixed ids...) { ids = id::SetId(ids); if( sizeof(ids) && !GetKeyName() ) { *************** *** 36,42 **** } return ids; } - varargs int GetInvis(object ob) { return 1; } --- 36,41 ---- *************** *** 56,62 **** } else return clean::Destruct(); } - mixed eventMove(mixed dest) { object ob; string str; --- 55,60 ---- diff -c -r --new-file ds2.0r18/lib/lib/std/germ.c ds2.0r28/lib/lib/std/germ.c *** ds2.0r18/lib/lib/std/germ.c Sun Jan 29 11:19:47 2006 --- ds2.0r28/lib/lib/std/germ.c Wed Jul 5 00:01:05 2006 *************** *** 271,277 **** //find someone to infect if(!sizeof(get_livings(ob))) return 0; targs = filter(get_livings(ob), (: !query_carrying($1,base_name(this_object())) :) ); ! winner = targs[random(sizeof(targs))-1]; if(winner) new(base_name(this_object()))->eventInfect(winner); } return 1; --- 271,277 ---- //find someone to infect if(!sizeof(get_livings(ob))) return 0; targs = filter(get_livings(ob), (: !query_carrying($1,base_name(this_object())) :) ); ! if(sizeof(targs)) winner = targs[random(sizeof(targs))]; if(winner) new(base_name(this_object()))->eventInfect(winner); } return 1; diff -c -r --new-file ds2.0r18/lib/lib/std/item.c ds2.0r28/lib/lib/std/item.c *** ds2.0r18/lib/lib/std/item.c Wed Feb 22 15:32:57 2006 --- ds2.0r28/lib/lib/std/item.c Wed Jul 5 00:01:05 2006 *************** *** 99,104 **** --- 99,106 ---- } static mixed array AddSave(mixed array vars) { + if(!vars) vars = ({}); + vars += ({ "Properties" }); return persist::AddSave(vars); } *************** *** 185,196 **** GetShort() + " at " + target->GetName() + ".", ({ who, target }) ); skill = (who->GetSkillLevel("projectile attack") + ! who->GetStatLevel("coordination"))/2; skill -= (target->GetSkillLevel("projectile defense") + ! target->GetStatLevel("agility"))/4; if( GetWeaponType() != "projectile" ) { ! skill = skill/4; } if( skill > random(100) + 1 ) { who->AddSkillPoints("projectile attack", target->GetSkillLevel("projectile defense") * --- 187,201 ---- GetShort() + " at " + target->GetName() + ".", ({ who, target }) ); skill = (who->GetSkillLevel("projectile attack") + ! who->GetStatLevel("coordination")); ! //tc("skill: "+skill); skill -= (target->GetSkillLevel("projectile defense") + ! target->GetStatLevel("agility"))/2; ! //tc("skill: "+skill); if( GetWeaponType() != "projectile" ) { ! skill = skill/2; } + //tc("skill: "+skill); if( skill > random(100) + 1 ) { who->AddSkillPoints("projectile attack", target->GetSkillLevel("projectile defense") * *************** *** 204,211 **** who->GetLevel() + 10); who->AddSkillPoints("projectile attack", 10); environment(who)->eventPrint(capitalize(GetShort()) + " does not " ! "come close to hitting " + ! target->GetName() + "."); eventMove(environment(who)); } return 1; --- 209,217 ---- who->GetLevel() + 10); who->AddSkillPoints("projectile attack", 10); environment(who)->eventPrint(capitalize(GetShort()) + " does not " ! "hit "+target->GetName() + ".",({ target, who })); ! write("Your throw misses its mark."); ! tell_object(target, capitalize(GetShort()) + " does not hit you."); eventMove(environment(who)); } return 1; *************** *** 215,221 **** target->GetShort() + "."); environment(who)->eventPrint(who->GetName() + " throws " + GetShort() + " at " + target->GetShort() + ! ".", who); return target->eventReceiveThrow(who, this_object()); } if( !eventMove(environment(who)) ) { --- 221,229 ---- target->GetShort() + "."); environment(who)->eventPrint(who->GetName() + " throws " + GetShort() + " at " + target->GetShort() + ! ".", ({ who, target })); ! tell_object(target, capitalize(GetShort()) + " throws " + ! GetShort() + " at you."); return target->eventReceiveThrow(who, this_object()); } if( !eventMove(environment(who)) ) { diff -c -r --new-file ds2.0r18/lib/lib/std/room.c ds2.0r28/lib/lib/std/room.c *** ds2.0r18/lib/lib/std/room.c Sat Mar 11 11:16:42 2006 --- ds2.0r28/lib/lib/std/room.c Wed Jul 5 00:01:05 2006 *************** *** 27,32 **** --- 27,33 ---- inherit LIB_AMBIANCE; inherit LIB_READ; inherit LIB_SAVE; + inherit LIB_MONEY; private function Bury = 0; private string Climate = "temperate"; *************** *** 50,58 **** --- 51,63 ---- private int DefaultExits = 1; private int Flying = 1; private int Obvious = 1; + private int ActionChance = 10; mapping ItemsMap = ([]); //private static object *dummies = ({}); private static mixed global_item; + private static mixed Action; + private int tick_resolution = 5; + string GetClimate(); int GetNightLight(); *************** *** 72,77 **** --- 77,125 ---- /*********** /lib/room.c data manipulation functions **********/ + void CheckActions(){ + if( ActionChance > random(100) ) { + int x; + + if( functionp(Action) ) evaluate(Action); + else if( pointerp(Action) && (x = sizeof(Action)) ) { + mixed act; + + act = Action[random(x)]; + if(functionp(act)) { + evaluate(act); + return; + } + else message("other_action", act, this_object()); + } + } + } + + void heart_beat(){ + CheckActions(); + } + + void SetAction(int chance, mixed val) { + ActionChance = chance; + if( stringp(val) ) val = ({ val }); + else if( !functionp(val) && !pointerp(val) ) + error("Bad argument 2 to SetAction()\n"); + Action = val; + } + + mixed GetAction() { return Action; } + + int SetFrequency(int tick){ + if(tick) tick_resolution = tick; + else tick_resolution = 5; + set_heart_beat(0); + return tick_resolution; + } + + int GetFrequency(){ + return tick_resolution; + } + int GetAmbientLight() { int a, dayset, nightset; *************** *** 233,239 **** } void SetItems(mixed items) { ! DummyItems->eventDestruct(); DummyItems = ({}); if( arrayp(items) ) { items->eventMove(this_object()); --- 281,287 ---- } void SetItems(mixed items) { ! if(sizeof(DummyItems)) DummyItems->eventDestruct(); DummyItems = ({}); if( arrayp(items) ) { items->eventMove(this_object()); *************** *** 651,657 **** if( !val ) return val; if( GetClimate() == "indoors" ) { if( val < 0 ) return val; ! else return SetAmbientLight(val*13); } else { if( val < 0 ) return SetShade(-val); --- 699,705 ---- if( !val ) return val; if( GetClimate() == "indoors" ) { if( val < 0 ) return val; ! else return ambiance::SetAmbientLight(val*13); } else { if( val < 0 ) return SetShade(-val); *************** *** 793,798 **** --- 841,847 ---- static void create() { exits::create(); reset(query_reset_number()); + set_heart_beat(0); if( replaceable(this_object()) && !GetNoReplace() ) { string array tmp= inherit_list(this_object()); *************** *** 896,902 **** if(member_array("down",exits) != -1) dir_string += "d, "; if(member_array("out",exits) != -1) dir_string += "out, "; if(sizeof(this_object()->GetEnters(1) - ({0}) )) { ! dir_string += ", "; dir_string += enters; } if(last(dir_string,2) == ", ") dir_string = truncate(dir_string,2); --- 945,951 ---- if(member_array("down",exits) != -1) dir_string += "d, "; if(member_array("out",exits) != -1) dir_string += "out, "; if(sizeof(this_object()->GetEnters(1) - ({0}) )) { ! if(sizeof(this_object()->GetExits())) dir_string += ", "; dir_string += enters; } if(last(dir_string,2) == ", ") dir_string = truncate(dir_string,2); *************** *** 907,911 **** --- 956,961 ---- static void init() { if(!sizeof(GetObviousExits()) && DefaultExits > 0 && Obvious) GenerateObviousExits(); + if(Action && sizeof(Action)) set_heart_beat(tick_resolution); } diff -c -r --new-file ds2.0r18/lib/lib/std/storage.c ds2.0r28/lib/lib/std/storage.c *** ds2.0r18/lib/lib/std/storage.c Mon Jan 16 23:03:16 2006 --- ds2.0r28/lib/lib/std/storage.c Wed Jul 5 00:01:05 2006 *************** *** 61,70 **** } int GetOpacity() { ! if( GetClosed() ) { ! return holder::GetOpacity(); ! } ! else return 0; } int GetRadiantLight(int ambient) { --- 61,74 ---- } int GetOpacity() { ! //if( GetClosed() ) { ! return holder::GetOpacity(); ! //} ! //else return 0; ! } ! ! int SetOpacity(mixed arg){ ! return holder::SetOpacity(arg); } int GetRadiantLight(int ambient) { *************** *** 167,173 **** } varargs mixed CanShowInterior(object who, object target) { ! if( GetClosed() ) { return capitalize(GetDefiniteShort()) + " is closed."; } else return holder::CanShowInterior(); --- 171,177 ---- } varargs mixed CanShowInterior(object who, object target) { ! if( GetClosed() && this_object()->GetOpacity() > 33) { return capitalize(GetDefiniteShort()) + " is closed."; } else return holder::CanShowInterior(); diff -c -r --new-file ds2.0r18/lib/lib/std/vendor.c ds2.0r28/lib/lib/std/vendor.c *** ds2.0r18/lib/lib/std/vendor.c Wed Dec 7 14:03:46 2005 --- ds2.0r28/lib/lib/std/vendor.c Wed Jul 5 00:01:05 2006 *************** *** 7,13 **** inherit LIB_SENTIENT; inherit "/lib/manycoins"; ! private static int MaxItems, VendorType; private static string StorageRoom, LocalCurrency; private static mapping Costs, Values; --- 7,13 ---- inherit LIB_SENTIENT; inherit "/lib/manycoins"; ! private static int MaxItems, VendorType, bargain; private static string StorageRoom, LocalCurrency; private static mapping Costs, Values; *************** *** 59,65 **** } tmp = ({}); foreach(ob in obs) { ! int value, bargain; if( !((string)ob->GetShort()) ) continue; if( !((int)ob->GetVendorType() & GetVendorType()) ) { --- 59,65 ---- } tmp = ({}); foreach(ob in obs) { ! int value; if( !((string)ob->GetShort()) ) continue; if( !((int)ob->GetVendorType() & GetVendorType()) ) { *************** *** 69,76 **** } cost = to_int(ob->GetBaseCost(GetLocalCurrency())); value = to_int(ceil(GetValue(ob, who))); ! if(cost) bargain = 0; ! //if(cost && cost > 0) value = cost; if( !value ) { eventForce("say " + (string)ob->GetShort() + " is worthless!"); --- 69,77 ---- } cost = to_int(ob->GetBaseCost(GetLocalCurrency())); value = to_int(ceil(GetValue(ob, who))); ! if(ob->GetValue()) bargain = 1; ! else bargain = 0; ! if(!bargain) value = cost; if( !value ) { eventForce("say " + (string)ob->GetShort() + " is worthless!"); *************** *** 93,99 **** eventForce("say " + (string)ob->GetShort() + "! Excellent!"); if(bargain) who->AddSkillPoints("bargaining", value*5); message("my_action", "You sell " + (string)ob->GetShort() + ".", who); ! message("other_action", (string)who->GetKeyName() + " sells " + (string)ob->GetShort() + ".", environment(), ({ who, this_object() })); ob->eventDestruct(); --- 94,100 ---- eventForce("say " + (string)ob->GetShort() + "! Excellent!"); if(bargain) who->AddSkillPoints("bargaining", value*5); message("my_action", "You sell " + (string)ob->GetShort() + ".", who); ! message("other_action", capitalize((string)who->GetKeyName()) + " sells " + (string)ob->GetShort() + ".", environment(), ({ who, this_object() })); ob->eventDestruct(); *************** *** 114,125 **** if(bargain) who->AddSkillPoints("bargaining", value*5); tmp += ({ ob }); message("my_action", "You sell " + (string)ob->GetShort() + ".", who); ! message("other_action", (string)who->GetKeyName() + " sells " + (string)ob->GetShort() + ".", environment(), ({ who, this_object() })); } if( !sizeof(tmp) ) ! eventForce("say I am sorry, " + (string)who->GetKeyName() + ", " "that we could not come to a better agreement."); else map(tmp, function(object ob) { if( (int)ob->GetDestroyOnSell() ) --- 115,126 ---- if(bargain) who->AddSkillPoints("bargaining", value*5); tmp += ({ ob }); message("my_action", "You sell " + (string)ob->GetShort() + ".", who); ! message("other_action", capitalize((string)who->GetKeyName()) + " sells " + (string)ob->GetShort() + ".", environment(), ({ who, this_object() })); } if( !sizeof(tmp) ) ! eventForce("say I am sorry, " + capitalize((string)who->GetKeyName()) + ", " "that we could not come to a better agreement."); else map(tmp, function(object ob) { if( (int)ob->GetDestroyOnSell() ) *************** *** 169,175 **** eventForce("say I have no such thing to show you"); return 1; } ! message("other_action", GetKeyName()+" shows you "+ (string)ob->GetShort()+".", who); message("system", (string)ob->GetLong(), who); return 1; --- 170,176 ---- eventForce("say I have no such thing to show you"); return 1; } ! message("other_action", capitalize(GetKeyName())+" shows you "+ (string)ob->GetShort()+".", who); message("system", (string)ob->GetLong(), who); return 1; *************** *** 319,325 **** else cost=to_int(floor(ob->GetBaseCost())); if(cost && cost > 0) x=cost; if(!cost || cost < 0) x = to_int(floor(GetValue(ob, this_player()))); ! eventForce("say " + (string)who->GetKeyName() + ", I will offer " "you " + x + " " + GetLocalCurrency() + " for " + (string)ob->GetShort()); return 1; --- 320,326 ---- else cost=to_int(floor(ob->GetBaseCost())); if(cost && cost > 0) x=cost; if(!cost || cost < 0) x = to_int(floor(GetValue(ob, this_player()))); ! eventForce("say " + capitalize((string)who->GetKeyName()) + ", I will offer " "you " + x + " " + GetLocalCurrency() + " for " + (string)ob->GetShort()); return 1; *************** *** 369,375 **** eventForce("say that thing has no value!"); return 1; } ! eventForce("say " + (string)who->GetKeyName() + ", I will take " + x + " " + GetLocalCurrency() + " for " + (string)ob->GetShort()); return 1; --- 370,376 ---- eventForce("say that thing has no value!"); return 1; } ! eventForce("say " + capitalize((string)who->GetKeyName()) + ", I will take " + x + " " + GetLocalCurrency() + " for " + (string)ob->GetShort()); return 1; *************** *** 483,489 **** eventForce("say you cannot carry that!"); eventForce("drop " + (string)ob->GetKeyName()); } ! if(cost) who->AddSkillPoints("bargaining", random(to_int(floor(cost)))); //Payment(who, cost); who->AddCurrency(GetLocalCurrency(), -cost); return 1; --- 484,490 ---- eventForce("say you cannot carry that!"); eventForce("drop " + (string)ob->GetKeyName()); } ! if(bargain) who->AddSkillPoints("bargaining", random(to_int(floor(cost)))); //Payment(who, cost); who->AddCurrency(GetLocalCurrency(), -cost); return 1; diff -c -r --new-file ds2.0r18/lib/lib/std/worn_storage.c ds2.0r28/lib/lib/std/worn_storage.c *** ds2.0r18/lib/lib/std/worn_storage.c Sun Jan 29 23:47:21 2006 --- ds2.0r28/lib/lib/std/worn_storage.c Wed Jul 5 00:01:05 2006 *************** *** 182,187 **** --- 182,189 ---- } static mixed array AddSave(mixed array vars) { + if(!vars) vars = ({}); + vars += ({ "Properties" }); return persist::AddSave(vars); } *************** *** 454,460 **** object::create(); holder::create(); seal::create(); - PutCheck(); SetVendorType(VT_ARMOR); } --- 456,461 ---- *************** *** 518,527 **** } int GetOpacity() { ! if( GetClosed() ) { ! return holder::GetOpacity(); ! } ! else return 0; } int GetRadiantLight(int ambient) { --- 519,525 ---- } int GetOpacity() { ! return holder::GetOpacity(); } int GetRadiantLight(int ambient) { *************** *** 620,626 **** } varargs mixed CanShowInterior(object who, object target) { ! if( GetClosed() ) { return capitalize(GetDefiniteShort()) + " is closed."; } else return holder::CanShowInterior(); --- 618,624 ---- } varargs mixed CanShowInterior(object who, object target) { ! if( GetClosed() && this_object()->GetOpacity() > 33) { return capitalize(GetDefiniteShort()) + " is closed."; } else return holder::CanShowInterior(); diff -c -r --new-file ds2.0r18/lib/lib/talk.c ds2.0r28/lib/lib/talk.c *** ds2.0r18/lib/lib/talk.c Mon Jan 16 23:03:16 2006 --- ds2.0r28/lib/lib/talk.c Wed Jul 5 00:00:58 2006 *************** *** 10,15 **** --- 10,17 ---- #include #include "include/talk.h" + int GetPolyglot(); + int direct_ask_liv_str() { return 1; } int direct_ask_liv_to_str() { return 1; } *************** *** 48,54 **** string msg, string lang) { string tmp; ! if( lang && !newbiep() ) msg = translate(msg, GetLanguageLevel(lang)); switch(cls) { case TALK_PRIVATE: if( target != this_object() ) return 0; --- 50,56 ---- string msg, string lang) { string tmp; ! if( lang && !newbiep() && !GetPolyglot() ) msg = translate(msg, GetLanguageLevel(lang)); switch(cls) { case TALK_PRIVATE: if( target != this_object() ) return 0; *************** *** 63,69 **** case TALK_SEMI_PRIVATE: if( target != this_object() ) return 0; tmp = "%^BOLD%^CYAN%^" + (string)who->GetName() + " whispers in " + ! lang + " to you,%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); break; --- 65,71 ---- case TALK_SEMI_PRIVATE: if( target != this_object() ) return 0; tmp = "%^BOLD%^CYAN%^" + (string)who->GetName() + " whispers in " + ! capitalize(lang) + " to you,%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); break; *************** *** 72,83 **** if( target != this_object() ) { if( msg[<1] == '?' ) tmp = (string)target->GetName(); else tmp = "to " + (string)target->GetName(); ! if( lang ) tmp += " in " + lang; } else { if( msg[<1] == '?' ) tmp = "you"; else tmp = "to you"; ! if( lang ) tmp += " in " + lang; } tmp = (string)who->GetName() + " " + pluralize(verb) + " " + tmp + ", \""; --- 74,85 ---- if( target != this_object() ) { if( msg[<1] == '?' ) tmp = (string)target->GetName(); else tmp = "to " + (string)target->GetName(); ! if( lang ) tmp += " in " + capitalize(lang); } else { if( msg[<1] == '?' ) tmp = "you"; else tmp = "to you"; ! if( lang ) tmp += " in " + capitalize(lang); } tmp = (string)who->GetName() + " " + pluralize(verb) + " " + tmp + ", \""; *************** *** 86,97 **** } else if( verb == "yell" ) { tmp = "%^BOLD%^GREEN%^You hear a " + (string)who->GetGender() ! + " " + (string)who->GetRace() + " yell in " + lang + " from a distance,%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); } else { ! if( lang ) tmp = pluralize(verb) + " in " + lang; else tmp = pluralize(verb); tmp = (string)who->GetName() + " " + tmp + ", \""; tmp = tmp + "%^BOLD%^CYAN%^" + msg + "%^RESET%^\""; --- 88,99 ---- } else if( verb == "yell" ) { tmp = "%^BOLD%^GREEN%^You hear a " + (string)who->GetGender() ! + " " + (string)who->GetRace() + " yell in " + capitalize(lang) + " from a distance,%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); } else { ! if( lang ) tmp = pluralize(verb) + " in " + capitalize(lang); else tmp = pluralize(verb); tmp = (string)who->GetName() + " " + tmp + ", \""; tmp = tmp + "%^BOLD%^CYAN%^" + msg + "%^RESET%^\""; *************** *** 101,113 **** case TALK_AREA: tmp = "%^BOLD%^GREEN%^" + (string)who->GetName() + " yells in " + ! lang + ",%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); break; case TALK_WORLD: tmp = "%^BOLD%^BLUE%^" + (string)who->GetName() + " shouts in " + ! lang + ",%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); break; --- 103,115 ---- case TALK_AREA: tmp = "%^BOLD%^GREEN%^" + (string)who->GetName() + " yells in " + ! capitalize(lang) + ",%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); break; case TALK_WORLD: tmp = "%^BOLD%^BLUE%^" + (string)who->GetName() + " shouts in " + ! capitalize(lang) + ",%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); break; *************** *** 126,136 **** string verb, tmp; int cols; ! if( lang ) { msg = translate(msg, GetLanguageLevel(lang)); lang = GetLanguageName(lang); } cols = GetScreen()[0]; if( msg[<1] != '?' && msg[<1] != '!' && msg[<1] != '.' ) msg = capitalize(msg) + "."; else msg = capitalize(msg); --- 128,142 ---- string verb, tmp; int cols; ! if( lang && !GetPolyglot() ) { msg = translate(msg, GetLanguageLevel(lang)); lang = GetLanguageName(lang); } cols = GetScreen()[0]; + //debug("target",target); + //debug("cls",cls); + //debug("msg",msg); + //debug("lang",lang); if( msg[<1] != '?' && msg[<1] != '!' && msg[<1] != '.' ) msg = capitalize(msg) + "."; else msg = capitalize(msg); *************** *** 143,151 **** return 1; case TALK_SEMI_PRIVATE: ! if( !target ) tmp = "%^BOLD%^CYAN%^You whisper in " + lang + ",%^RESET%^ \"" + msg + "%^RESET%^\""; ! else tmp = "%^BOLD%^CYAN%^You whisper in " + lang + " to " + (string)target->GetName() + ",%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); environment()->eventHearTalk(this_object(), target, cls, "whisper", --- 149,157 ---- return 1; case TALK_SEMI_PRIVATE: ! if( !target ) tmp = "%^BOLD%^CYAN%^You whisper in " + capitalize(lang) + ",%^RESET%^ \"" + msg + "%^RESET%^\""; ! else tmp = "%^BOLD%^CYAN%^You whisper in " + capitalize(lang) + " to " + (string)target->GetName() + ",%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); environment()->eventHearTalk(this_object(), target, cls, "whisper", *************** *** 162,176 **** } if( target && msg[<1] == '?' ) { tmp = "You " + verb + " " + (string)target->GetName(); ! if( lang ) tmp = tmp + " in " + lang; } else if( target ) { tmp = "You " + verb + " to " + (string)target->GetName(); ! if( lang ) tmp = tmp + " in " + lang; } else { tmp = "You " + verb; ! if( lang ) tmp = tmp + " in " + lang; } tmp = tmp + ", \"%^BOLD%^CYAN%^" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); --- 168,182 ---- } if( target && msg[<1] == '?' ) { tmp = "You " + verb + " " + (string)target->GetName(); ! if( lang ) tmp = tmp + " in " + capitalize(lang); } else if( target ) { tmp = "You " + verb + " to " + (string)target->GetName(); ! if( lang ) tmp = tmp + " in " + capitalize(lang); } else { tmp = "You " + verb; ! if( lang ) tmp = tmp + " in " + capitalize(lang); } tmp = tmp + ", \"%^BOLD%^CYAN%^" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); *************** *** 179,185 **** return 1; case TALK_AREA: ! tmp = "%^BOLD%^GREEN%^You yell in " + lang + ",%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); environment()->eventHearTalk(this_object(), target, cls, "yell", msg, --- 185,191 ---- return 1; case TALK_AREA: ! tmp = "%^BOLD%^GREEN%^You yell in " + capitalize(lang) + ",%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); environment()->eventHearTalk(this_object(), target, cls, "yell", msg, *************** *** 187,193 **** break; case TALK_WORLD: ! tmp = "%^BOLD%^BLUE%^You shout in " + lang + ",%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); (users() - ({ this_object() }))->eventHearTalk(this_object(), target, --- 193,199 ---- break; case TALK_WORLD: ! tmp = "%^BOLD%^BLUE%^You shout in " + capitalize(lang) + ",%^RESET%^ \"" + msg + "%^RESET%^\""; eventPrint(tmp, MSG_CONV); (users() - ({ this_object() }))->eventHearTalk(this_object(), target, diff -c -r --new-file ds2.0r18/lib/lib/teacher.c ds2.0r28/lib/lib/teacher.c *** ds2.0r18/lib/lib/teacher.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/lib/teacher.c Wed Jul 5 00:00:58 2006 *************** *** 0 **** --- 1,222 ---- + /* /lib/teacher.c + * from the Dead Souls Library + * created 960320 by Blitz@Dead Souls + * Version: @(#) teacher.c 1.3@(#) + * Last modified: 96/10/28 + */ + + #include + #include + #include "include/teacher.h" + + inherit LIB_SENTIENT; + + private string array TeachingLanguages; + private mapping Students; + private int commercial = 0; + private int teaching_fee = 50; + private string local_currency = "silver"; + + int GetCommercial(){ + return commercial; + } + + int SetCommercial(int i){ + if(i) { + commercial = i; + if(!teaching_fee) teaching_fee = 50; + } + else commercial = 0; + return commercial; + } + + string GetLocalCurrency(){ + return local_currency; + } + + string SetLocalCurrency(string str){ + local_currency = str; + return local_currency; + } + + int GetTeachingFee(){ + return teaching_fee; + } + + int SetTeachingFee(int i){ + if(i) { + teaching_fee = i; + commercial = 1; + } + else { + teaching_fee = 0; + commercial = 0; + } + return teaching_fee; + } + + /**** driver applies ****/ + + static void create() { + sentient::create(); + TeachingLanguages = ({}); + Students = ([]); + SetNoClean(1); + SetCommandResponses( ([ + "teach" : (: eventTeach :), + "teach" : (: eventTeach :), + "default" : (: eventHelp :), + "help" : (: eventHelp :), + ]) ); + SetRequestResponses( ([ + "default" : (: eventHelp :), + "help" : (: eventHelp :), + ]) ); + } + + static void init() { + string str; + sentient::init(); + if( !living(this_player()) ) return; + str = (string)this_player()->GetKeyName(); + if( Students[str] ) { + eventForce("speak You will have to start your " + "studies anew, "+(string)this_player()->GetName()); + map_delete(Students, str); + } + } + + /**** data manipulation ****/ + + mixed AddTeachingLanguages(string *args){ + string *tmp_array = ({}); + if( !args ) + error("Bad argument 1 to AddTeachingLanguages."); + foreach(string lang in args){ + tmp_array += ({ capitalize(lower_case(lang)) }); + } + return (TeachingLanguages = distinct_array(TeachingLanguages + tmp_array)); + } + + mixed RemoveTeachingLanguages(string *args...) { + if( !args || !arrayp(args) ) + error("Bad argument 1 to RemoveTeachingLanguages."); + TeachingLanguages -= args; + return TeachingLanguages; + } + + string array GetTeachingLanguages() { return copy(TeachingLanguages); } + + string Expertise(){ + string tmp, expertises; + if(!sizeof(GetTeachingLanguages())) return "none"; + else if(sizeof(GetTeachingLanguages()) == 1) { + return GetTeachingLanguages()[0]; + } + expertises = implode(GetTeachingLanguages(), ", "); + if(sizeof(GetTeachingLanguages()) == 2){ + expertises = replace_string(expertises,", "," and "); + } + else if(sizeof(GetTeachingLanguages()) > 2){ + tmp = last_string_element(expertises,","); + expertises = replace_string(expertises, tmp, " and"+tmp); + } + return expertises; + } + + mapping GetStudents() { return copy(Students); } + + /**** high-level events ****/ + + int eventHelp(object who, string unused) { + eventForce("speak I am not sure of what you are " + "asking, " + (string)who->GetName() + "."); + if(sizeof( GetTeachingLanguages() )){ + eventForce("speak My area of expertise covers " + + Expertise() + "."); + eventForce("speak You can \"ask "+GetKeyName()+" to teach " + "\" if you have training points."); + } + return 1; + } + + int eventTeach(object who, string verb, string language) { + if( !who || environment(who) != environment() ) { + return 0; + } + if( !sizeof(language) || !sizeof(verb) ) return eventHelp(who, 0); + if( verb == "teach" ) { + + language = capitalize(language); + + if( Students[ (string)who->GetKeyName() ] ) { + eventForce("speak I am already teaching you!"); + return 0; + } + if( member_array(language, this_object()->GetTeachingLanguages()) == -1 ) { + eventForce("speak I know nothing about the " +capitalize(language)+" language."); + return 0; + } + if( !commercial && (int)this_player()->GetTrainingPoints() < 1 ) { + eventForce("speak You need more training points."); + return 0; + } + if(commercial && this_player()->GetCurrency(GetLocalCurrency()) < teaching_fee){ + eventForce("speak I charge "+teaching_fee+" "+GetLocalCurrency()+" per lesson. "+ + "You don't seem to have the right amount of the right currency."); + return 0; + } + Students[ (string)who->GetKeyName() ] = language; + eventStart(who, language); + call_out((: ContinueTeaching, who, language, 0 :), TEACHING_WAIT); + return 1; + } + return 1; + } + + static int ContinueTeaching(object who, string language, int x) { + language = capitalize(language); + if( !present(who, environment()) ) return 0; + if( !Students[(string)who->GetKeyName()] ) return 0; + if( x > 4 ) { + map_delete(Students, (string)who->GetKeyName()); + eventComplete(who, language); + who->AddLanguagePoints(language,5+((who->GetStatLevel("intelligence")/10)*2)+random(10)); + if(!commercial) who->AddTrainingPoints(-1); + else who->AddCurrency(GetLocalCurrency(),-teaching_fee); + return 1; + } else { + eventContinue(who, language, ++x); + call_out((: ContinueTeaching, who, language, x :), TEACHING_WAIT); + return 1; + } + } + + /**** message handling events ****/ + + /* The three following events are purely *aesthetic*, + * Hopefully prolific coders will override them for + * more interesting teaching techniques. :) + */ + + int eventStart(object who, string language) { + who->eventPrint(GetName() + " begins teaching you " + "about the " + language + " language."); + environment()->eventPrint(GetName() + " begins teaching " + + (string)who->GetName() + "...", who); + return 1; + } + + int eventContinue(object who, string language, int x) { + who->eventPrint("You listen intently as " + GetName() + + " continues " + possessive(this_object()) + + " dissertation on " + language + "."); + return 1; + } + + int eventComplete(object who, string language) { + who->eventPrint("You feel somewhat more competent in " + language + "."); + eventForce("speak I can teach you no more for now, " + + (string)who->GetName() + "."); + return 1; + } diff -c -r --new-file ds2.0r18/lib/lib/trainer.c ds2.0r28/lib/lib/trainer.c *** ds2.0r18/lib/lib/trainer.c Sat Mar 11 11:16:42 2006 --- ds2.0r28/lib/lib/trainer.c Wed Jul 5 00:00:58 2006 *************** *** 13,24 **** private string array TrainingSkills; private mapping Students; - int eventDude(){ - return 1; - } - /**** driver applies ****/ static void create() { --- 13,21 ---- private string array TrainingSkills; private mapping Students; + int NoSpells = 0; /**** driver applies ****/ static void create() { *************** *** 30,36 **** "train" : (: eventTrain :), "teach" : (: eventTrain :), "default" : (: eventHelp :), ! "dude" : (: eventDude :), ]) ); } --- 27,36 ---- "train" : (: eventTrain :), "teach" : (: eventTrain :), "default" : (: eventHelp :), ! "help" : (: eventHelp :), ! ]) ); ! SetRequestResponses( ([ ! "help" : (: eventHelp :), ]) ); } *************** *** 46,63 **** } } /**** data manipulation ****/ - //mixed AddTrainingSkills(string *args...) { - //mixed AddTrainingSkills(string *args...) { - //varargs mixed AddTrainingSkills(string *args, string *strs...) { mixed AddTrainingSkills(string *args){ if( !args ) error("Bad argument 1 to AddTrainingSkills."); return (TrainingSkills = distinct_array(TrainingSkills + args)); } ! mixed RemoveTrainingSkills(string *args...) { if( !args || !arrayp(args) ) error("Bad argument 1 to RemoveTrainingSkills."); TrainingSkills -= args; --- 46,70 ---- } } + int SetNoSpells(int i){ + if(i) NoSpells = 1; + else NoSpells = 0; + return NoSpells; + } + + int GetNoSpells(){ + return NoSpells; + } + /**** data manipulation ****/ mixed AddTrainingSkills(string *args){ if( !args ) error("Bad argument 1 to AddTrainingSkills."); return (TrainingSkills = distinct_array(TrainingSkills + args)); } ! mixed RemoveTrainingSkills(string *args) { if( !args || !arrayp(args) ) error("Bad argument 1 to RemoveTrainingSkills."); TrainingSkills -= args; *************** *** 68,73 **** --- 75,83 ---- string Expertise(){ string tmp, expertises; + string expertises2 = ""; + mapping spellbook = this_object()->GetSpellBook(); + if(!sizeof(GetTrainingSkills())) return "none"; else if(sizeof(GetTrainingSkills()) == 1) { return GetTrainingSkills()[0]; *************** *** 80,86 **** tmp = last_string_element(expertises,","); expertises = replace_string(expertises, tmp, " and"+tmp); } ! return expertises; } mapping GetStudents() { return copy(Students); } --- 90,111 ---- tmp = last_string_element(expertises,","); expertises = replace_string(expertises, tmp, " and"+tmp); } ! ! if(sizeof(spellbook) && !GetNoSpells()){ ! expertises2 = implode(keys(spellbook), ", "); ! if(sizeof(spellbook) == 1) expertises2 = replace_string(expertises2,", ","."); ! else if(sizeof(spellbook) == 2){ ! expertises2 = replace_string(expertises2,", "," and ",1); ! expertises2 = replace_string(expertises2,", ","."); ! } ! else { ! tmp = last_string_element(expertises2,","); ! expertises2 = replace_string(expertises2,tmp," and"+tmp); ! } ! expertises2 = ". In terms of spells, I can teach you "+expertises2; ! } ! ! return expertises + expertises2; } mapping GetStudents() { return copy(Students); } *************** *** 88,135 **** /**** high-level events ****/ int eventHelp(object who, string unused) { ! eventForce("speak I am not sure of what you are " ! "asking, " + (string)who->GetName() + "."); if(sizeof( GetTrainingSkills() )){ ! eventForce("speak My area of expertise covers " + Expertise() + "."); ! eventForce("speak You can \"ask "+GetKeyName()+" to teach " "\" if you have training points."); } return 1; } int eventTrain(object who, string verb, string skill) { if( !who || environment(who) != environment() ) { return 0; } if( !sizeof(skill) || !sizeof(verb) ) return eventHelp(who, 0); ! if( verb == "train" || verb == "teach") { object ob = SPELLS_D->GetSpell(skill); ! if( ob ) { ! foreach(string sk in ob->GetTrainingSkills()) { ! if( GetSkillLevel(sk) < ob->GetRequiredSkill(sk) ) { ! eventForce("speak I don't know " + skill + "."); ! return 0; ! } ! } ! if( !who->eventLearnSpell(skill) ) { ! eventForce("speak You are no prepared for that spell!"); ! return 0; ! } ! who->eventPrint(GetName() + " touches your forehead and gives " ! "you knowledge of " + skill + "."); ! environment()->eventPrint(GetName() + " touches " + ! possessive_noun(who) + ! " forehead and gives " + ! objective(who) + " knowledge of " + ! skill + ".", who); ! return 1; } } ! skill = lower_case(skill); if( Students[ (string)who->GetKeyName() ] ) { eventForce("speak I am already training you!"); --- 113,179 ---- /**** high-level events ****/ int eventHelp(object who, string unused) { ! if(who) eventForce("speak I am not sure of what you are " ! "asking, " + (string)who->GetName() + "."); if(sizeof( GetTrainingSkills() )){ ! eventForce("speak My area of training expertise covers " + Expertise() + "."); ! eventForce("speak You can \"ask "+GetKeyName()+" to train " "\" if you have training points."); + if(sizeof(this_object()->GetSpellBook()) && !GetNoSpells()){ + eventForce("speak You can also \"ask "+GetKeyName()+ + " to teach .\""); + } } return 1; } int eventTrain(object who, string verb, string skill) { + //tc("who: "+identify(who)); + //tc("verb: "+identify(verb)); + //tc("skill: "+identify(skill)); if( !who || environment(who) != environment() ) { return 0; } + + if(who->GetLanguageLevel(this_object()->GetNativeLanguage()) < 100){ + eventForce("speak You are not fluent in my language. We can't communicate well enough for me to teach or train you anything."); + return 1; + } + if( !sizeof(skill) || !sizeof(verb) ) return eventHelp(who, 0); ! if(first(skill, 3) == "in ") skill = replace_string(skill,"in ","",1); ! if(first(skill, 6) == "me in ") skill = replace_string(skill,"me in ","",1); ! ! if( verb == "teach") { object ob = SPELLS_D->GetSpell(skill); ! if(!sizeof(GetSpellBook()) || GetNoSpells()){ ! eventForce("speak I am not able to teach spells. I only train skills."); ! this_object()->eventHelp(); ! return 0; ! } ! if(!ob){ ! eventForce("speak I've never heard of such a spell."); ! return 0; ! } ! ! if( !who->eventLearnSpell(skill) ) { ! eventForce("speak You are not prepared for that spell!"); ! return 0; } + + who->eventPrint(GetName() + " touches your forehead and gives " + "you knowledge of " + skill + "."); + environment()->eventPrint(GetName() + " touches " + + possessive_noun(who) + + " forehead and gives " + + objective(who) + " knowledge of " + + skill + ".", who); + return 1; } ! if(skill) skill = lower_case(skill); if( Students[ (string)who->GetKeyName() ] ) { eventForce("speak I am already training you!"); *************** *** 144,153 **** (string *)this_player()->GetSkills() ) == -1 ) { eventForce("speak You do not appear to be the type " "who would be skilled in " + skill + "!"); return 0; } if( (int)this_player()->GetTrainingPoints() < 1 ) { ! eventForce("speak Fool! You need training points for that!"); return 0; } Students[ (string)who->GetKeyName() ] = skill; --- 188,198 ---- (string *)this_player()->GetSkills() ) == -1 ) { eventForce("speak You do not appear to be the type " "who would be skilled in " + skill + "!"); + eventForce("speak I cannot train you in a skill you don't know at all. You may need to join a guild or a class that enables you to train in this skill."); return 0; } if( (int)this_player()->GetTrainingPoints() < 1 ) { ! eventForce("speak You need more training points!"); return 0; } Students[ (string)who->GetKeyName() ] = skill; diff -c -r --new-file ds2.0r18/lib/lib/user/autosave.c ds2.0r28/lib/lib/user/autosave.c *** ds2.0r18/lib/lib/user/autosave.c Mon Jan 16 23:03:16 2006 --- ds2.0r28/lib/lib/user/autosave.c Wed Jul 5 00:01:05 2006 *************** *** 84,90 **** } LastSave = x; save_player(GetKeyName()); ! if( !creatorp(this_object()) ) { eventPrint("Autosaving...", MSG_SYSTEM); } } --- 84,90 ---- } LastSave = x; save_player(GetKeyName()); ! if( !creatorp(this_object()) && !present("visitor pass",this_object()) ) { eventPrint("Autosaving...", MSG_SYSTEM); } } diff -c -r --new-file ds2.0r18/lib/log/chan/ds ds2.0r28/lib/log/chan/ds *** ds2.0r18/lib/log/chan/ds Sat Mar 11 21:02:45 2006 --- ds2.0r28/lib/log/chan/ds Wed Dec 31 19:00:00 1969 *************** *** 1,2208 **** - [23Feb2006-17:07:01] Cratylus Dead Souls 2.0r14 is now available. There is also a patch for convenient upgrading. http://www.mudmagic.com/codes/download/lpc/mudos/dead_souls - [27Feb2006-10:45:16] Niang@Kol hello? - [27Feb2006-10:45:22] Cratylus@Frontiers hi - [27Feb2006-10:45:31] Yen@Nightfall Hi :) - [27Feb2006-10:45:43] Niang@Kol how are you all today - [27Feb2006-10:46:13] Cratylus@Frontiers swell - [27Feb2006-10:47:15] Niang@Kol i've managed to endup with 4 unique monsters again, i think i must be doing something wrong with the set_unique flag :( - [27Feb2006-10:47:43] Cratylus@Frontiers hmm - [27Feb2006-10:48:11] Niang@Kol it dose wander, would that make a difference - [27Feb2006-10:48:48] Cratylus@Frontiers hmmm - [27Feb2006-10:49:28] Cratylus@Frontiers i thought i fixed that. i'll look at it a little later today - [27Feb2006-10:50:56] Niang@Kol i remeber the update... i think - [27Feb2006-10:52:39] Niang@Kol did you get the emails i sent, or are you hiding from your email inbox again? - [27Feb2006-10:53:11] Cratylus@Frontiers hmm - [27Feb2006-10:53:25] Cratylus@Frontiers not recently - [27Feb2006-10:53:37] Cratylus@Frontiers maybe they got tagged as junk. when did you send them? - [27Feb2006-10:54:53] Niang@Kol first was beginging of feb, about prblems of advancement - [27Feb2006-10:55:28] Niang@Kol second 16th about joining guilds - [27Feb2006-10:56:12] Niang@Kol third was a quick message to see if you were still alive as i hadn't heard from you for a while - [27Feb2006-10:56:30] Cratylus@Frontiers ok the first one you mean, it looks like i responded on jan 28 - [27Feb2006-10:57:22] Niang@Kol odd i got it down as the second - [27Feb2006-10:57:26] Cratylus@Frontiers after that, i have nothing from you in my inbox - [27Feb2006-10:57:28] Niang@Kol of feb - [27Feb2006-10:58:04] Niang@Kol there was document attached to show the probelm - [27Feb2006-10:58:36] Cratylus@Frontiers ok so on the 2nd you sent something with an attachment? - [27Feb2006-10:59:03] Niang@Kol not got anything on this computer earlyer that cos my old computer blew up and i had to get a new one - [27Feb2006-10:59:29] Niang@Kol twice ( i forgot the atttachment the first time) - [27Feb2006-10:59:53] Cratylus@Frontiers the last email i have from you is jan26 - [27Feb2006-10:59:59] Cratylus@Frontiers nothing from you in my junk folder or trash - [27Feb2006-11:00:21] Niang@Kol hmmm odd - [27Feb2006-11:01:23] Niang@Kol how many email addresses do you have? - [27Feb2006-12:56:47] Cratylus@Frontiers i still want to see yer guildmaster code. send it to me when your email thing is fixed - [27Feb2006-22:07:57] Cratylus you can use this line to ask questions like that, kristus - [27Feb2006-22:08:11] Kristus@Dead_Souls_kristus ahh - [27Feb2006-22:08:13] Cratylus it's a line that dead souls muds listen in on - [27Feb2006-22:08:24] Kristus@Dead_Souls_kristus thanks - [27Feb2006-22:08:28] Cratylus no prob - [28Feb2006-12:33:57] Cratylus hiya admin - [28Feb2006-12:34:11] Cratylus you can use this channel to ask questions, if you run into problems - [28Feb2006-12:34:25] Cratylus it's a channel dead souls muds listen to - [28Feb2006-15:27:11] Cratylus heya odin - [28Feb2006-15:27:27] Cratylus use this line for questions if you run into trouble - [28Feb2006-15:42:15] Arren@OuterSpace Crat: You're a lawyer? - [28Feb2006-15:42:33] Cratylus am i that much of a jerk? - [28Feb2006-15:42:51] Arren@OuterSpace What use are you when I get into trouble then. - [28Feb2006-15:43:13] Arren@OuterSpace I saw the best notice the other day. It said "No solicitors." - [28Feb2006-15:43:19] Arren@OuterSpace yesterday - [28Feb2006-15:43:52] Cratylus good thing it didnt say no solicitation - [28Feb2006-15:43:58] Cratylus or is that the trouble? - [28Feb2006-15:44:10] Arren@OuterSpace well, in England, a solicitor is like a lawyer. - [28Feb2006-15:44:14] Arren@OuterSpace soliciting is something else - [28Feb2006-15:44:18] Cratylus :) - [28Feb2006-15:46:14] Arren@OuterSpace goes back to A2. - [28Feb2006-15:46:58] Cratylus sorry i couldnt be of help - [28Feb2006-15:47:04] Arren@OuterSpace heh - [28Feb2006-15:47:09] Arren@OuterSpace we don't get this channel on A2. - [28Feb2006-15:47:13] Cratylus still, i'd be happy to hear all about your legal trouble - [28Feb2006-15:47:27] Cratylus liven things up around here - [28Feb2006-15:47:31] Arren@OuterSpace Well, when we got to talking, the policeman was very nice. - [28Feb2006-15:47:37] Arren@OuterSpace and we went back to his place - [28Feb2006-15:48:45] Arren@OuterSpace it gets boring after that - [28Feb2006-15:49:03] Cratylus better luck next time - [28Feb2006-15:49:33] Arren@OuterSpace snuggles with Cratylus. - [28Feb2006-15:49:45] Cratylus w00t - [28Feb2006-15:51:20] Plugh@Frontiers get a room - [28Feb2006-15:52:30] Arren@OuterSpace you're boring - [28Feb2006-15:52:54] Cratylus well yer always so mean to me - [28Feb2006-15:53:04] Cratylus i'm just waiting for the other shoe to drop - [28Feb2006-23:01:03] Cratylus hiya kirian - [28Feb2006-23:01:15] Cratylus use this intermud line for questions and stuff - [28Feb2006-23:01:21] Kirian@13 Kingdoms thanks :-) - [28Feb2006-23:01:53] Kirian@13 Kingdoms just figuring out the mudlib to decide on if we are going with it or not :) probably be asking questions tommorow when i've had chance to play around a bit :) - [28Feb2006-23:02:07] Cratylus nods. - [01Mar2006-14:35:26] Cratylus hi shemp - [01Mar2006-14:35:34] Cratylus if you have questions about dead souls, use this line - [01Mar2006-15:46:43] Cratylus ah abby. long time no see - [01Mar2006-18:40:09] Abby@Fading Summer Hey hey. - [01Mar2006-18:56:16] A shadow :) - [01Mar2006-19:13:26] Abby@Fading Summer Hmm, invis over the ds comm.... - [01Mar2006-19:13:30] Abby@Fading Summer Tsk tsk. ;) - [01Mar2006-19:39:23] Cratylus yeh - [01Mar2006-19:39:26] Cratylus accident - [01Mar2006-19:39:38] Cratylus was in the middle of trying not to get hassled by orcs - [01Mar2006-20:10:15] Cratylus :) - [01Mar2006-21:39:40] Cratylus howdy arnold - [01Mar2006-21:39:50] Cratylus use this line for questions n stuff - [02Mar2006-19:05:10] Kristus@Dead_Souls_kristus where would I edit to change how long someone can be idle before they get disconnected? - [02Mar2006-19:07:23] Cratylus /lib/secure/include/config.h - [02Mar2006-19:07:35] Cratylus LOGON_TIMEOUT - [02Mar2006-19:07:53] Cratylus oh wait thats not what you asked - [02Mar2006-19:07:59] Kristus@Dead_Souls_kristus thanks! - [02Mar2006-19:08:13] Kristus@Dead_Souls_kristus ah - [02Mar2006-19:09:07] Cratylus /lib/player.c line 47 - [02Mar2006-19:09:19] Kristus@Dead_Souls_kristus thanks - [02Mar2006-19:09:35] Cratylus though that really should be in config.h. I'll put it there in a later release - [02Mar2006-19:10:16] Cratylus you know you can change your mud name in admintool, right? - [02Mar2006-19:11:48] Kristus@Dead_Souls_kristus ahh, didnt notice that before. If I shutdown the mud will it boot back up? Or do I have to do that through my shell account? - [02Mar2006-19:12:06] Cratylus@Frontiers you're on linux? - [02Mar2006-19:12:50] Kristus@Dead_Souls_kristus Not right now, but the mud is, and I have a shell account I can log into from here. - [02Mar2006-19:13:07] Cratylus if you're on unix and you used the bin/startmud script then the mud should bounce back up. - [02Mar2006-19:13:17] Cratylus otherwise you'll need to restart it manually - [02Mar2006-19:13:35] Kristus@Dead_Souls_kristus ah, I did ./driver ./mudos.cfg - [02Mar2006-19:13:47] Cratylus then you'll need to do it again after shutting down - [02Mar2006-19:13:55] Kristus@Dead_Souls_kristus k - [02Mar2006-19:14:29] Kristus@Dead_Souls_kristus so if I do ./startmud ./mudos.cfg it will auto boot upon shutdown? - [02Mar2006-19:14:39] Cratylus no - [02Mar2006-19:15:03] Cratylus edit startmud so that export MUDHOME="" has your mud dir in it - [02Mar2006-19:15:23] Cratylus for example: export MUDHOME="/home/kristus/ds" - [02Mar2006-19:15:37] Cratylus then just type: ./startmud - [02Mar2006-19:18:40] Kristus@The Hollow there we go - [02Mar2006-22:19:15] Skout@Bragi's Song Greets all - [02Mar2006-22:19:21] Cratylus howdy! - [02Mar2006-22:20:13] Skout@Bragi's Song congratz on a nice mudlib, I am just finished with the install which was by far the easiest mudos based install I have done. - [02Mar2006-22:20:39] Cratylus thanks :) - [02Mar2006-22:30:04] Merlin@Pirates' Mud Hello - [02Mar2006-22:30:18] Merlin@Pirates' Mud yeah this mudlib rocks - [02Mar2006-22:30:32] Merlin@Pirates' Mud QCS is pretty nifty - [02Mar2006-22:31:25] Cratylus glad it's useful - [02Mar2006-22:31:33] Cratylus please let me know if you run into bugs - [02Mar2006-23:43:28] Merlin@Pirates' Mud definitely - [02Mar2006-23:44:07] Merlin@Pirates' Mud actually using v22.2b14 right now there is a b15 now right? - [03Mar2006-05:56:38] Cratylus b14 is the last supported mudos i'm aware of - [03Mar2006-12:04:52] Cratylus hi kurgan - [03Mar2006-12:05:04] Cratylus this line is for asking dead souls questions n stuff - [03Mar2006-15:00:01] Kristus@The Hollow you there, cratylus? - [03Mar2006-15:00:13] A shadow yep - [03Mar2006-15:00:21] Cratylus whats up? - [03Mar2006-15:01:07] Kristus@The Hollow I got a fatal error (illegal size read from swap file). How can I prevent this? - [03Mar2006-15:01:29] Cratylus this error is happening when you start the mud? - [03Mar2006-15:02:56] Cratylus ... - [03Mar2006-15:07:35] Cratylus ok - [03Mar2006-15:07:45] Cratylus ok - [03Mar2006-17:47:52] Cratylus we're back - [04Mar2006-05:20:32] Noose@Dead_Souls_noose tissi - [04Mar2006-05:20:42] Noose@Dead_Souls_noose pitää vittu saaha nää värit helevettiin - [04Mar2006-05:20:48] Noose@Dead_Souls_noose boottais tän - [04Mar2006-06:00:22] Noose@Dead_Souls_noose tidididi - [04Mar2006-06:00:28] Noose@Dead_Souls_noose iha paskat värit - [04Mar2006-07:32:01] Cratylus finnish is a frustrating language to me - [04Mar2006-07:32:13] Cratylus i just cannot make heads or tails of it - [04Mar2006-07:32:29] Noose@Utajaervi MUD x) - [04Mar2006-07:33:48] Cratylus i know a bunch of european languages, so i can usually decipher the general idea of a european language, even if i dont know it. but if there are white people talking and i cannot understand one single word they say, it's either finnish or hungarian - [04Mar2006-07:35:04] Cratylus only finnish i know is "haista vittu" - [04Mar2006-07:35:18] Noose@Utajaervi MUD that's a good start - [04Mar2006-07:35:38] Cratylus i thought you might appreciate it - [04Mar2006-07:35:44] Noose@Utajaervi MUD hahahah - [04Mar2006-07:44:03] Tijntje@OuterSpace Finnish and hungarian are related, IIRC. - [04Mar2006-07:45:29] Cratylus yep - [04Mar2006-07:45:59] Cratylus estonian is supposed to be similar - [04Mar2006-07:48:04] Cratylus oh i also cant decipher any basque - [05Mar2006-18:15:17] Deminix@Dead_Souls_jerin huh? - [05Mar2006-18:15:21] Cratylus :) - [05Mar2006-18:15:40] Cratylus this line is for questions n stuff, if you run into trouble with the dead souls lib - [05Mar2006-18:16:04] Deminix@Dead_Souls_jerin My appologies. Thanks! - [05Mar2006-18:16:10] Cratylus no prob - [05Mar2006-18:17:38] Jerin@Dead_Souls_jerin Ah, nifty - [05Mar2006-18:20:39] Jerin@Dead_Souls_jerin Sorry, we're both kinda tards on this - [05Mar2006-18:21:47] Cratylus well, everyones a newbie sometime - [05Mar2006-18:22:07] Cratylus dead souls is designed to be good for advanced admins, but friendly to newbies too - [05Mar2006-18:22:26] Jerin@Dead_Souls_jerin Definately been easier then some of the others - [05Mar2006-18:22:26] Cratylus if you run into bugs and stuff, please let me know - [05Mar2006-18:23:32] Jerin@Dead_Souls_jerin heh, thanks - [05Mar2006-18:24:30] Jerin@Dead_Souls_jerin What channels are available - [05Mar2006-18:25:00] Jerin@Dead_Souls_jerin Sorry, I'm a bit of a putz - [05Mar2006-18:25:02] Cratylus well as a noob, this is the only channel you should use for a while. but there is also intergossip and intercre - [05Mar2006-18:25:16] Jerin@Dead_Souls_jerin Well, within the mud I mean, sorry - [05Mar2006-18:25:24] Cratylus i discourage people from using intergossip, because it is extremely hostile to newcomers - [05Mar2006-18:25:33] Cratylus oh. type: lines - [05Mar2006-18:25:37] Jerin@Dead_Souls_jerin lines - [05Mar2006-18:25:41] Jerin@Dead_Souls_jerin whoops - [05Mar2006-18:25:43] Cratylus heh - [05Mar2006-18:25:51] Deminix@Dead_Souls_jerin Thanks Cratylus - [05Mar2006-18:25:55] Cratylus no prob - [05Mar2006-18:25:57] Jerin@Dead_Souls_jerin Sorry, Man, I'm showin my newbiness - [05Mar2006-18:26:07] Cratylus better here than intergossip i assure you - [05Mar2006-18:26:13] Jerin@Dead_Souls_jerin lol - [05Mar2006-18:26:45] Kristus@The Hollow hey cratylus...I want to add a setting in the player file that determines which plane of existence someone is on. Each plane will have altered commands and descriptions for objects and rooms. Each object file will have the data for each plane of existence contained in one file, and the SetLong, SetShort, etc will point to a function that determines which state they are in and changes its value accordingly. What do you think would be the best method of doing this? - [05Mar2006-18:27:21] Cratylus well the Right Way involves adding SetPlane() and GetPlane() methods to the player object - [05Mar2006-18:27:47] Kristus@The Hollow /lib/player.c? - [05Mar2006-18:27:47] Cratylus see SetRace() for how this works - [05Mar2006-18:27:49] Cratylus ya - [05Mar2006-18:28:31] Cratylus the lazy way is to SetProperty("plane","blah") but that should be used only temporarily, if at all - [05Mar2006-18:28:42] Kristus@The Hollow yeah - [05Mar2006-18:29:06] Kristus@The Hollow when you say to see SetRace()...where am I looking for this reference at? - [05Mar2006-18:29:14] Kristus@The Hollow in player.c? - [05Mar2006-18:29:22] Cratylus heh yeah that's not actually in player.c is it - [05Mar2006-18:29:32] Kristus@The Hollow dont think so - [05Mar2006-18:29:48] Cratylus i think SetRace() is in /lib/race.c - [05Mar2006-18:30:04] Cratylus anyway, dont forget what i'm abotu to tell you: - [05Mar2006-18:30:32] Cratylus to make your PlayerPlane variable save in each players playerfile, you must add it to the AddSave line in player.c - [05Mar2006-18:31:02] Cratylus what you're doing is adding a variable to the player object, but if it isn't an AddSave, it won't persist across logons - [05Mar2006-18:31:59] Kristus@The Hollow ahhh, thanks - [05Mar2006-18:34:21] Cratylus i suggest you start with just one plane aside from the normal default plane, so you can get an idea of the complexity involved - [05Mar2006-18:58:57] Kristus@The Hollow is there a reason why apostrophes were stripped in communication? - [05Mar2006-19:00:57] Cratylus heh - [05Mar2006-19:01:03] Cratylus that's a bug - [05Mar2006-19:01:14] Cratylus i'll fix it for the next release - [05Mar2006-19:01:28] Kristus@The Hollow I already fixed it on mine :p - [05Mar2006-19:01:36] Cratylus right on - [05Mar2006-19:02:16] Kristus@The Hollow there was a replace_string() function. How is that a bug? Seems like thats the way it was meant to be. - [05Mar2006-19:02:30] Cratylus it's a bug that it happens on comms - [05Mar2006-19:02:42] Kristus@The Hollow ahh - [05Mar2006-19:02:50] Cratylus basically stripping apostrophes is a workaround to a parsing problem - [05Mar2006-19:03:18] Cratylus if you have an item like "khadgar's pipe of insight", the parser has trouble dealing with the apostrophe - [05Mar2006-19:03:42] Cratylus until i fix that parser bug, stripping apostrophes is a quick workaround - [05Mar2006-19:03:48] Cratylus i'm just the one guy, see - [05Mar2006-19:03:50] Kristus@The Hollow ahh - [05Mar2006-19:06:07] Kristus@The Hollow parser problem on driver side? - [05Mar2006-19:06:21] Kristus@The Hollow or mudlib? - [05Mar2006-19:06:27] Cratylus dunno yet. still on the todo list to examine - [05Mar2006-19:21:22] Arnolde@Xanth Mud Sorry for the newbie question, but in long lines of description, why break it up into shorter lines with "+ ? - [05Mar2006-19:22:36] Cratylus tradition - [05Mar2006-19:23:00] Cratylus it's not needed, and in some exotic situations, even screws things up - [05Mar2006-19:23:26] Cratylus now, i'm talking about the +, not about breaking lines into shorter lines - [05Mar2006-19:23:54] Cratylus shorter lines are good for reasons of readability and to make sure there are no buffer problems with lines beeing too long - [05Mar2006-19:25:03] Arnolde@Xanth Mud Got it, thanks - [05Mar2006-19:33:31] Jerin@Jerins Folly Should the shutdown command crash when you first set it up? - [05Mar2006-19:33:55] Cratylus hmmm well no "crashing" isn't intended behavior - [05Mar2006-19:34:03] Kristus@The Hollow haha - [05Mar2006-19:34:05] Cratylus can you describe in more detail what happened? - [05Mar2006-19:34:05] Jerin@Jerins Folly Ya, I kinda thought so - [05Mar2006-19:34:42] Jerin@Jerins Folly Sure, I changed the name of the game via admintool, and tried to reboot the mud via the tool, and it errored out halfway thru - [05Mar2006-19:34:58] Cratylus can you email me the error and crash messages? - [05Mar2006-19:35:08] Cratylus cratylus@comcast.net - [05Mar2006-19:36:20] Jerin@Jerins Folly Sure, lemme see if it still does it - [05Mar2006-19:38:15] Jerin@Jerins Folly Apparently it works now - [05Mar2006-19:38:29] Cratylus if you can email me the original messages that would be great - [05Mar2006-19:39:33] Jerin@Jerins Folly I think I lost them in my back buffer, sorry - [05Mar2006-19:39:37] Cratylus k - [05Mar2006-19:40:25] Jerin@Jerins Folly My bad, I'm lying - [05Mar2006-19:40:35] Cratylus how so? - [05Mar2006-19:40:43] Jerin@Jerins Folly I didn't lose it - [05Mar2006-19:41:02] Cratylus good - [05Mar2006-19:41:02] Jerin@Jerins Folly Thought I had tried in telnet and lost it but I was wrong - [05Mar2006-19:41:36] Jerin@Jerins Folly There ya go - [05Mar2006-19:43:30] Cratylus ok, thx. that isn't really a crash - [05Mar2006-19:44:11] Cratylus what you're looking at is a successful shutdown where the system tries to forcibly log off everyone but errors on one or more - [05Mar2006-19:44:17] Jerin@Jerins Folly Sorry, didn't know the correct term - [05Mar2006-19:44:19] Cratylus i'll look into why - [05Mar2006-19:44:33] Cratylus thanks for the error report - [05Mar2006-19:45:05] Jerin@Jerins Folly Sorry, I'm a putz today - [05Mar2006-19:45:53] Cratylus yknow, i think that's enough "i suck" for today - [05Mar2006-19:46:11] Cratylus i appreciate the error report, and it really is ok to be a noob for a while - [05Mar2006-21:33:52] Cratylus hiya brodbane - [05Mar2006-21:34:02] Cratylus use this channel for questions n stuff - [05Mar2006-21:34:12] Brodbane@Dead_Souls_brodbane heya - [05Mar2006-21:34:22] Brodbane@Dead_Souls_brodbane Sorry, reorienting myself with the lib - [05Mar2006-21:35:19] Cratylus nods. - [05Mar2006-21:35:49] Brodbane@Dead_Souls_brodbane Whats the tell syntax? - [05Mar2006-21:35:55] Brodbane@Dead_Souls_brodbane tell msg? - [05Mar2006-21:36:19] Brodbane@Dead_Souls_brodbane ah yes, domain helps - [05Mar2006-21:36:35] Brodbane@Dead_Souls_brodbane Brodbane = Ken Thompson. Thanks for the emailo - [05Mar2006-21:36:39] Cratylus no prob - [05Mar2006-21:36:51] Brodbane@Dead_Souls_brodbane I'm not the founder of C++ though, thats a different Ken Thompson - [05Mar2006-21:36:53] Cratylus hope ds suits you - [05Mar2006-21:36:55] Cratylus heh - [05Mar2006-21:36:57] Brodbane@Dead_Souls_brodbane Although, I know him - [05Mar2006-21:37:22] Brodbane@Dead_Souls_brodbane The last mud I developed on was a nightmare release. I stopped in 2002 - [05Mar2006-21:37:52] Cratylus i've been trying to get descartes to donate the nightmare code to me - [05Mar2006-21:38:18] Brodbane@Dead_Souls_brodbane What is your history in all of this? - [05Mar2006-21:38:46] Brodbane@Dead_Souls_brodbane I read the faq! - [05Mar2006-21:39:00] Cratylus nothing spectacular. just a dude who wanted to revive the code - [05Mar2006-21:39:16] Brodbane@Dead_Souls_brodbane I'm happy to see it operational again - [05Mar2006-21:39:36] Cratylus it was rather trickier and more time consuming than i'd anticipated - [05Mar2006-21:39:42] Cratylus but fun to do - [05Mar2006-21:40:04] Brodbane@Dead_Souls_brodbane What was impressive was the single batch file to launch - [05Mar2006-21:40:12] Brodbane@Dead_Souls_brodbane Win32 was never a "smooth" ride - [05Mar2006-21:40:39] Cratylus getting it to work on windows was....less than easy - [05Mar2006-21:41:09] Brodbane@Dead_Souls_brodbane I plan on using Win32, because of my utter lack of linux knowledge - [05Mar2006-21:42:03] Cratylus yeah, i figured that was a big obstacle to a lot of people - [05Mar2006-21:42:23] Cratylus and these days, win32 boxes are decent servers - [05Mar2006-21:42:25] Brodbane@Dead_Souls_brodbane I've had mandrake/fedora up and running, but its difficult for me to troubleshoot - [05Mar2006-21:42:53] Brodbane@Dead_Souls_brodbane I plan on launching a dedicated server tomorrow. Our original mud was called "Eve" and it may be revived - [05Mar2006-21:43:03] Cratylus nods. - [05Mar2006-21:44:00] Brodbane@Dead_Souls_brodbane You noted a lack of database support - [05Mar2006-21:44:04] Cratylus yep - [05Mar2006-21:44:12] Cratylus i just dunno nothin about em - [05Mar2006-21:44:22] Brodbane@Dead_Souls_brodbane There will be some development done on a mysql backend. All of that work will be public domain - [05Mar2006-21:44:38] Cratylus sweet - [05Mar2006-21:45:12] Brodbane@Dead_Souls_brodbane It will be interesting coding in structured C - [05Mar2006-21:45:16] Brodbane@Dead_Souls_brodbane It has its benefits though - [05Mar2006-21:47:08] Jerin@Jerins Folly I actually run a diku mud and added database support to that - [05Mar2006-21:48:13] Brodbane@Dead_Souls_brodbane mysql/postgres? - [05Mar2006-21:48:25] Jerin@Jerins Folly MySQL - [05Mar2006-21:49:27] Brodbane@Dead_Souls_brodbane I dont know enough about Diku to understand if its mutually beneficial - [05Mar2006-21:49:55] Jerin@Jerins Folly there are a few parts that it's useful for - [05Mar2006-22:34:59] Brodbane@Eve Much better - [06Mar2006-09:33:34] Tannis@Crimson Blood po zi - [06Mar2006-09:34:08] Cratylus hello - [06Mar2006-09:34:28] Tannis@Crimson Blood greetings, I was testing channel :) - [06Mar2006-09:34:56] Cratylus nods. - [06Mar2006-11:34:16] Brodbane@Eve Good morning - [06Mar2006-11:35:40] Avatar@OuterSpace Hi Brodbane. - [06Mar2006-16:04:05] Brodbane@Eve Man i love this lib! - [06Mar2006-21:18:49] Cratylus :) glad ya like it - [06Mar2006-21:19:19] Kristus@The Hollow he said that a looong time ago :p - [06Mar2006-21:29:20] Cratylus i catch up as i can - [06Mar2006-22:44:27] Brodbane@Eve This lib has made my month - [06Mar2006-22:44:51] Jota@Eve Test - [06Mar2006-22:44:51] Cratylus cool - [06Mar2006-22:45:21] Brodbane@Eve Cratylus, I did notice some issues though. Minor - [06Mar2006-22:45:31] Cratylus go on - [06Mar2006-22:45:35] Brodbane@Eve If you die by flee/tick bite, the pronouns are off - [06Mar2006-22:45:51] Cratylus agh yes, fixing the felas and lice are on the todo list - [06Mar2006-22:45:58] Cratylus fleas - [06Mar2006-22:46:06] Brodbane@Eve And the fleas are not curable - [06Mar2006-22:46:24] Cratylus that's more of a screwup in coding an exaple than in the germ system - [06Mar2006-22:46:32] Cratylus but you're right, it needs fixing - [06Mar2006-22:46:32] Brodbane@Eve The box of tricks in each wizards room was a nice touch. It entertained me for about an hour - [06Mar2006-22:47:16] Cratylus what do you think of the manual and handbook? - [06Mar2006-22:47:52] Brodbane@Eve I haven't read the players manual. I did read the wizard manual and did find a lot of useful things there - [06Mar2006-22:47:58] Cratylus k - [06Mar2006-22:48:20] Brodbane@Eve Did the use of "my" come standard with this lib? - [06Mar2006-22:48:46] Cratylus if you mean using it to specify objects to the parser, it's a mudos thing, not a lib thing - [06Mar2006-22:49:10] Brodbane@Eve My old mud must of been an older mudos, because I was unable to use it previously - [06Mar2006-22:49:33] Cratylus yeah, mudos really did fix a lot of stuff since the old days - [06Mar2006-22:49:41] Brodbane@Eve Oh, I did find another bug. It has to do with containers - [06Mar2006-22:49:43] Cratylus too bad it's no longer being maintained - [06Mar2006-22:50:01] Cratylus container recursiveness is fuxt, if that's what you mean - [06Mar2006-22:50:15] Brodbane@Eve something else - [06Mar2006-22:50:29] Brodbane@Eve if you put your staff in your robe, then relog, you will be holding a new staff - [06Mar2006-22:50:39] Cratylus heh - [06Mar2006-22:50:43] Cratylus weird - [06Mar2006-22:50:47] Brodbane@Eve query_auto_load() a little funny - [06Mar2006-22:50:53] Cratylus i'll look into that. thank you - [06Mar2006-22:51:05] Brodbane@Eve I'll do some formal bug reports, i've been mostly playing - [06Mar2006-22:51:25] Cratylus eh, formalize it if you like, but i do ok with informal messages too - [06Mar2006-22:51:55] Brodbane@Eve Jota was in a lecture when I removed his right hand. I believe he may of drawn some attention to himself - [06Mar2006-22:53:02] Cratylus the heal comand automatically fixes both health points and amputated limbs - [06Mar2006-22:53:18] Brodbane@Eve Yeah, I repaired him with the tricorder - [06Mar2006-22:55:20] Cratylus i'm rather drunk, so please excuse me if i'm missing something obvious, but i'm not spotting query_auto_load() as a sefun or efun - [06Mar2006-23:14:58] Brodbane@Eve Whoa, that was an outage - [06Mar2006-23:15:08] Cratylus ? - [06Mar2006-23:15:14] Brodbane@Eve Lost connection for a while - [07Mar2006-10:28:11] Daelas@Moraelinost hello? - [07Mar2006-10:30:24] Daelas@Moraelinost is anyone there that can help me with a coding question? - [07Mar2006-10:31:08] Brodbane@Eve sure - [07Mar2006-10:31:28] Daelas@Moraelinost Thanks Brodbane - [07Mar2006-10:31:42] Brodbane@Eve No problem, hopefully I can help - [07Mar2006-10:31:46] Daelas@Moraelinost I'm trying to create a working stargate and have not coded much before. - [07Mar2006-10:31:58] Brodbane@Eve Just to portal you to another place in the mud? - [07Mar2006-10:32:14] Daelas@Moraelinost correct. only in my own mud, just different domain. - [07Mar2006-10:32:26] Daelas@Moraelinost like another world in my mud - [07Mar2006-10:32:36] Brodbane@Eve Ok, thats just basically an exit - [07Mar2006-10:32:52] Brodbane@Eve If you want it to be an item, like a couch that magically does that, it would be a function of the object - [07Mar2006-10:33:41] Daelas@Moraelinost Can it be something that I set? I want to 'dial earth' for instance, then set the exit to a certain location. - [07Mar2006-10:33:59] Daelas@Moraelinost after going through, I want to deactivate the item until it is dialed again. - [07Mar2006-10:34:09] Brodbane@Eve yes, thats easy enough. Let me code an example for you - [07Mar2006-10:34:19] Daelas@Moraelinost that would be cool. - [07Mar2006-10:34:29] Daelas@Moraelinost I can show you what I have so far if you want? - [07Mar2006-10:35:09] Brodbane@Eve sure, would you like me to pop over? - [07Mar2006-10:35:25] Daelas@Moraelinost you can do that? - [07Mar2006-10:35:44] Daelas@Moraelinost yes if you can - [07Mar2006-10:35:52] Brodbane@Eve IP address/port? - [07Mar2006-10:36:24] Daelas@Moraelinost on a localhost ip 127.0.0.1 port 6666 - [07Mar2006-10:36:26] Daelas@Moraelinost does that help? - [07Mar2006-10:36:38] Brodbane@Eve ah, that wont allow me to enter your mud - [07Mar2006-10:36:46] Daelas@Moraelinost how do I find my ip? - [07Mar2006-10:36:46] Brodbane@Eve it would have to be a public IP. We can work around that though - [07Mar2006-10:37:02] Brodbane@Eve email kenthompson1@gmail.com your snippet - [07Mar2006-10:37:12] Daelas@Moraelinost okay. - [07Mar2006-10:37:50] Brodbane@Eve I'm going to set up a website with examples that will compile with the dead souls lib at some point in the futuer - [07Mar2006-10:37:52] Brodbane@Eve future - [07Mar2006-10:38:55] Daelas@Moraelinost emailed. that would be cool. I also want to learn to compile my own mud, but I keep getting errors. - [07Mar2006-10:39:21] Brodbane@Eve yeah, thats not very easy - [07Mar2006-10:40:09] Brodbane@Eve Your snippet is pretty complete - [07Mar2006-10:40:45] Daelas@Moraelinost I got the second half from Cratylus and want to adjust it to allow to "dial to " a word. - [07Mar2006-10:40:57] Daelas@Moraelinost like earth, or Chulak, etc... - [07Mar2006-10:41:05] Daelas@Moraelinost but only certain places. - [07Mar2006-10:41:09] Brodbane@Eve ok, so it would dial a word, then the word would line up with a place - [07Mar2006-10:41:25] Daelas@Moraelinost correct. - [07Mar2006-10:41:39] Daelas@Moraelinost like that now, except looks for an integer. - [07Mar2006-10:42:11] Daelas@Moraelinost I also only want the gate 'open' for a certain amount of time and then deactivate. - [07Mar2006-10:42:34] Brodbane@Eve ok, you have the framework to do it fairly easily - [07Mar2006-10:42:50] Daelas@Moraelinost I know there is a way to do a preExit query, can I do a postExit? - [07Mar2006-10:43:12] Daelas@Moraelinost I can't take all the credit. Cratylus helped a lot with it. - [07Mar2006-10:43:50] Daelas@Moraelinost what I sent over to you is actually a room code. I want to actually turn it in to an object that I can drop anywhere in my mud. - [07Mar2006-10:44:14] Brodbane@Eve ahh, thats not an issue. You just cant use "exits/enters" - [07Mar2006-10:44:28] Brodbane@Eve You have to define a verb for entering the portal - [07Mar2006-10:44:52] Brodbane@Eve Let me whip up a basic portal that would do what you expect - [07Mar2006-10:45:02] Brodbane@Eve it will be a couple, few work issues here need addressing - [07Mar2006-10:45:16] Daelas@Moraelinost thought so. So I define a verb for each 'address'... - [07Mar2006-10:45:22] Daelas@Moraelinost that's okay. I appreciate the help. - [07Mar2006-10:45:47] Brodbane@Eve You really only need "dial" and "enter" - [07Mar2006-10:45:59] Brodbane@Eve and some pretty descriptions of what the portal is doing - [07Mar2006-10:46:39] Daelas@Moraelinost Ah... I've already set an enter if the gate is inactive so when someone enters the gate, it says they need to dial an address first. - [07Mar2006-10:46:51] Brodbane@Eve "You place your hand on the portals dial and slowly navigate to what appears to be an 'A'' - [07Mar2006-10:47:37] Daelas@Moraelinost that could work!! - [07Mar2006-10:47:49] Brodbane@Eve i'll make it an object you drop - [07Mar2006-10:48:03] Daelas@Moraelinost You would be a life-saver!!! - [07Mar2006-10:48:05] Kriton@Emerald MUD lurves writing portal code... gateways, pocket dimension spells, etc. - [07Mar2006-10:48:54] Daelas@Moraelinost cool. Spells are great, they just won't work with my technological world. - [07Mar2006-10:49:04] Kriton@Emerald MUD heh true - [07Mar2006-10:49:18] Daelas@Moraelinost I should email this to you when we get done. - [07Mar2006-10:50:08] Brodbane@Eve I really enjoy this community that Cratylus setup - [07Mar2006-10:50:34] Daelas@Moraelinost I do to. - [07Mar2006-10:50:58] Daelas@Moraelinost The quick creation system is awesome and easy to do for basic rooms, etc... - [07Mar2006-10:51:38] Brodbane@Eve Its breathed new life into a very neglected system - [07Mar2006-10:51:52] Daelas@Moraelinost who knows what the portal does in the Arch room? It keeps taking me to the wiz room. - [07Mar2006-10:52:06] Brodbane@Eve go to the arch room and do a 'cat here' - [07Mar2006-10:52:15] Daelas@Moraelinost I've seen some code for another mud and it is definately not as simple as this mud. - [07Mar2006-10:54:03] Daelas@Moraelinost it just says the muds online and stuff. - [07Mar2006-10:54:13] Brodbane@Eve its a long file, do a "tail here" - [07Mar2006-10:55:46] Daelas@Moraelinost it's set to go to the wix_hall. I thought, based on the screen, that it would allow travel to the muds on the screen. - [07Mar2006-10:56:02] Brodbane@Eve nah, its just a way of seeing who uses this lib - [07Mar2006-10:56:26] Daelas@Moraelinost ahh. It is cool though. There are a lot of muds. - [07Mar2006-10:56:34] Kriton@Emerald MUD what object does that? - [07Mar2006-10:56:40] Brodbane@Eve 'arch' - [07Mar2006-10:56:42] Kriton@Emerald MUD lets you know who uses the lib? - [07Mar2006-10:56:44] Brodbane@Eve read screen - [07Mar2006-10:57:02] Daelas@Moraelinost It's cool. In the Arch Room. - [07Mar2006-10:57:26] Kriton@Emerald MUD what's the filename of the arch itself? - [07Mar2006-10:57:34] Daelas@Moraelinost I wish the client room allowed other muds to be connected to. - [07Mar2006-10:57:42] Daelas@Moraelinost arch.c - [07Mar2006-10:57:50] Daelas@Moraelinost /secure/room/arch.c - [07Mar2006-10:58:18] Kriton@Emerald MUD ahh - [07Mar2006-10:58:22] Brodbane@Eve /secure/room/arch.c - [07Mar2006-10:58:46] Kriton@Emerald MUD was just curious to see if it used a custom connection or just intermud. - [07Mar2006-10:59:05] Brodbane@Eve These channels are Cratylus's own design - [07Mar2006-10:59:39] Daelas@Moraelinost Speaking of channels, I saw a list of channels that can be added to the mud. Does anyone know what the value part means? - [07Mar2006-10:59:53] Daelas@Moraelinost Cratylus is a GOD! - [07Mar2006-11:00:07] Brodbane@Eve He is one of a kind - [07Mar2006-11:00:17] Daelas@Moraelinost or how to add them? - [07Mar2006-11:00:45] Kriton@Emerald MUD wonders if he'll receive such high praise when he releases his lib... you sure you're not him in disguise and just advertising? ;-) - [07Mar2006-11:00:53] Brodbane@Eve Intermud, or more of DS channels? - [07Mar2006-11:01:31] Brodbane@Eve I'm not him. I'm just a guy who shares his passion - [07Mar2006-11:01:33] Daelas@Moraelinost not him. He's idle I think. I was under the impression that it was Intermud. - [07Mar2006-11:01:46] Brodbane@Eve This is not intermud - [07Mar2006-11:01:52] Daelas@Moraelinost oh. - [07Mar2006-11:02:00] Brodbane@Eve I could be wrong - [07Mar2006-11:02:10] Daelas@Moraelinost sorry.. I'm a newbie. - [07Mar2006-11:02:26] Brodbane@Eve Netstat is reporting198.144.203.194:9000 - [07Mar2006-11:02:38] Brodbane@Eve we can ask him - [07Mar2006-11:02:44] Daelas@Moraelinost what is Netstat? - [07Mar2006-11:02:46] Kriton@Emerald MUD its intermud - [07Mar2006-11:03:00] Brodbane@Eve netstat is your way of seeing what is open socket wise - [07Mar2006-11:03:08] Kriton@Emerald MUD Intermud3 to be exact - [07Mar2006-11:03:14] Brodbane@Eve thanks Kriton - [07Mar2006-11:03:26] Daelas@Moraelinost yeah. thanks. - [07Mar2006-11:03:46] Kriton@Emerald MUD although it could be that this channel is being routed by some gateway - [07Mar2006-11:03:58] Kriton@Emerald MUD it appears as I3 to me anyway ;-) - [07Mar2006-11:04:16] Daelas@Moraelinost :) - [07Mar2006-11:04:20] Kriton@Emerald MUD I'm not on a DS mudlib - [07Mar2006-11:04:28] Kriton@Emerald MUD just subscribes to the channel. - [07Mar2006-11:04:38] Daelas@Moraelinost How do you subscribe? - [07Mar2006-11:04:38] Kriton@Emerald MUD although I do have a copy of the lib itself. - [07Mar2006-11:05:11] Kriton@Emerald MUD well, it depends on the lib... let me look at the ds lib and see if I can figure it out. - [07Mar2006-11:05:35] Brodbane@Eve I'm pretty sure in the FAQ it says he is using the intermud repeater - [07Mar2006-11:05:39] Kriton@Emerald MUD I have a channel that tells me what channels I'm not subscribed to... then i add mappings in my intermud daemon. - [07Mar2006-11:06:25] Daelas@Moraelinost cool. - [07Mar2006-11:06:27] Daelas@Moraelinost How many people do you guys have on your muds? - [07Mar2006-11:08:16] Brodbane@Eve Our current creator number is 4, two being the lib guys - [07Mar2006-11:08:28] Daelas@Moraelinost ah. - [07Mar2006-11:08:38] Daelas@Moraelinost Just me here and my test character :( - [07Mar2006-11:10:22] Daelas@Moraelinost hist - [07Mar2006-11:10:26] Daelas@Moraelinost sorry. - [07Mar2006-11:10:38] Daelas@Moraelinost a little backwords. - [07Mar2006-11:11:23] Kriton@Emerald MUD my mud peaked back in the mid 90's with 40-60 players online - [07Mar2006-11:11:41] Daelas@Moraelinost WOW. What kind of theme do you have? - [07Mar2006-11:11:47] Kriton@Emerald MUD I shut it down with the intent of re-opening but I've been stuck in redesign mode ever since. - [07Mar2006-11:12:09] Kriton@Emerald MUD Its based entirely on the Wheel of Time by Robert Jordan. - [07Mar2006-11:12:19] Daelas@Moraelinost Good series. - [07Mar2006-11:12:21] Kriton@Emerald MUD (along with a bazillion other muds) - [07Mar2006-11:12:23] Kriton@Emerald MUD heh - [07Mar2006-11:12:53] Daelas@Moraelinost Two Towers mud is a good Lord of the Rings mud, from what my girlfriend says. - [07Mar2006-11:13:05] Kriton@Emerald MUD I tried to come up with some unique features tho. professions and player government (players build cities on a virtual landscape, form kingdoms, go to war with NPC armies, etc) - [07Mar2006-11:13:21] Daelas@Moraelinost that would be cool. - [07Mar2006-11:14:05] Kriton@Emerald MUD yeah, its fun ... I just need to finish the current version and stop tweaking with it. - [07Mar2006-11:14:32] Daelas@Moraelinost :) - [07Mar2006-11:14:38] Kriton@Emerald MUD hehe - [07Mar2006-11:15:00] Kriton@Emerald MUD lpc is such a fun medium to work with, too. - [07Mar2006-11:15:26] Kriton@Emerald MUD thats why I favor it so much over C/Diku... you can create far more complex code in less time (imo) - [07Mar2006-11:15:42] Daelas@Moraelinost yes it is. The only problem I face when trying to learn to code with this lib is when there is an error, it doesn't explain what the error is. - [07Mar2006-11:16:22] Daelas@Moraelinost as a newbie, I get errors a lot :) - [07Mar2006-11:16:27] Kriton@Emerald MUD well, takes a little time to interpret... but usually - [07Mar2006-11:16:39] Kriton@Emerald MUD you'll be able to discern something from it. - [07Mar2006-11:16:49] Kriton@Emerald MUD are these runtime errors or compile errors? - [07Mar2006-11:17:41] Kriton@Emerald MUD should write a fuzzy logic lpc error interpreter. - [07Mar2006-11:17:51] Daelas@Moraelinost compile i think. - [07Mar2006-11:18:51] Kriton@Emerald MUD syntax errors and whatnot. - [07Mar2006-11:18:55] Daelas@Moraelinost It references lines that are higher than the line of code that I am working on. - [07Mar2006-11:19:17] Kriton@Emerald MUD thats usually from a runaway " or something - [07Mar2006-11:19:29] Kriton@Emerald MUD i.e. you didn't close a string out - [07Mar2006-11:19:40] Daelas@Moraelinost Error in loading object '/domains/town/room/town_stargate' - [07Mar2006-11:19:40] Daelas@Moraelinost Object: /secure/cmds/creators/update at line 148 - [07Mar2006-11:19:40] Daelas@Moraelinost '' at /secure/save/creators/d/daelas () at /:0 - [07Mar2006-11:19:40] Daelas@Moraelinost 'cmdAll' at /secure/save/creators/d/daelas (/lib/command.c) at line 76 - [07Mar2006-11:19:40] Daelas@Moraelinost 'do_reload_word' at /verbs/creators/reload at line 55 - [07Mar2006-11:19:40] Daelas@Moraelinost 'do_reload_obj' at /verbs/creators/reload at line 45 - [07Mar2006-11:19:42] Daelas@Moraelinost 'reload' at /secure/sefun/sefun at /secure/sefun/reload.c:54 - [07Mar2006-11:19:42] Daelas@Moraelinost 'unguarded' at /secure/sefun/sefun at /secure/sefun/security.c:72 - [07Mar2006-11:19:42] Daelas@Moraelinost 'apply_unguarded' at /secure/daemon/master at line 407 - [07Mar2006-11:19:42] Daelas@Moraelinost 'CATCH' at /secure/daemon/master at line 407 - [07Mar2006-11:19:58] Daelas@Moraelinost oh. okay. - [07Mar2006-11:20:20] Kriton@Emerald MUD does ds have a command to go through the stack frame by frame? - [07Mar2006-11:20:36] Daelas@Moraelinost not sure. - [07Mar2006-11:21:02] Kriton@Emerald MUD so you might have been working on town_stargate.c on line 12 and had "marry had a little lamb - [07Mar2006-11:21:22] Daelas@Moraelinost :) - [07Mar2006-11:21:26] Kriton@Emerald MUD and then line 148 has something like SetLong("bob was here") - [07Mar2006-11:22:28] Kriton@Emerald MUD mudos would see there was no closing " on line 12 and skip all the way down to 148 (treating lines 12-148 as one big string) before it got confused. - [07Mar2006-11:22:42] Kriton@Emerald MUD just an example tho - [07Mar2006-11:22:57] Daelas@Moraelinost makes sense, I think. - [07Mar2006-11:22:59] Kriton@Emerald MUD of why the line numbers may seem odd - [07Mar2006-11:23:33] Daelas@Moraelinost Just threw me for a loop when I only have 97 lines in my code. - [07Mar2006-11:23:57] Kriton@Emerald MUD grins - [07Mar2006-11:24:05] Kriton@Emerald MUD now *that* is odd - [07Mar2006-11:24:39] Daelas@Moraelinost I think it is because it is calling other files when it runs, that it conflicts with the lib code. - [07Mar2006-11:24:41] Kriton@Emerald MUD you're using some sort of wizard tho/creator assistant? - [07Mar2006-11:25:15] Daelas@Moraelinost Just using Ultra Edit Studio to code a room, then try and update or reload the file in the mud. - [07Mar2006-11:25:43] Kriton@Emerald MUD oh... after looking at the error dump it looks like it might be referring to the update command itself - [07Mar2006-11:25:57] Kriton@Emerald MUD hard to read the stack trace over the channel - [07Mar2006-11:26:08] Daelas@Moraelinost ah.. That is true. - [07Mar2006-11:27:06] Daelas@Moraelinost I like the wizard creator objects in this lib. Like the room maker. It is menu driven and makes things much easier. - [07Mar2006-11:28:04] Kriton@Emerald MUD has written many, many type systems hehe - [07Mar2006-11:28:16] Kriton@Emerald MUD such things rather - [07Mar2006-11:28:38] Kriton@Emerald MUD has even found his maker systems on other muds :p - [07Mar2006-11:29:10] Daelas@Moraelinost :) If it works and you don't get a profit, I don't see the problem. - [07Mar2006-11:29:31] Daelas@Moraelinost I wish more muds were compatible code-wise. - [07Mar2006-11:29:39] Kriton@Emerald MUD heh - [07Mar2006-11:29:53] Kriton@Emerald MUD no problem, I just like to know when people take the code ;-) - [07Mar2006-11:30:07] Daelas@Moraelinost I'm sure they could be modified for my mud, I just don't know how. - [07Mar2006-11:30:15] Kriton@Emerald MUD nods - [07Mar2006-11:30:27] Daelas@Moraelinost yeah. code is code, eventually they would figure it out on their own. - [07Mar2006-11:30:37] Daelas@Moraelinost it's just polite though. - [07Mar2006-11:30:45] Kriton@Emerald MUD yeah, I wrote one for windows using MFC. it had a 'definitions' file to create custom output for any mudlib. - [07Mar2006-11:30:59] Daelas@Moraelinost really? - [07Mar2006-11:31:05] Kriton@Emerald MUD nods - [07Mar2006-11:31:31] Daelas@Moraelinost nod - [07Mar2006-11:31:41] Kriton@Emerald MUD I don't know if it would still run very well... I might have to re-create it / bring it up to the .net era - [07Mar2006-11:32:02] Kriton@Emerald MUD it was my first real win32 app - [07Mar2006-11:32:08] Daelas@Moraelinost for the mud being so old, it still is fun. - [07Mar2006-11:32:16] Kriton@Emerald MUD nods - [07Mar2006-11:32:22] Daelas@Moraelinost I don't know how to program outside of the mud. - [07Mar2006-11:32:32] Daelas@Moraelinost can't even compile. - [07Mar2006-11:32:36] Kriton@Emerald MUD yeah, I play world of warcraft, but MMORPGs still don't have the depth you can get on a mud. - [07Mar2006-11:33:18] Daelas@Moraelinost heard world of warcraft was a fun game. A co-worker plays it and raves about it. - [07Mar2006-11:34:14] Kriton@Emerald MUD yeah the thing that annoys me about it is that those game worlds are pretty static. - [07Mar2006-11:34:32] Kriton@Emerald MUD i.e. no matter how powerful you get, you cannot really change the world - [07Mar2006-11:34:44] Kriton@Emerald MUD which is where my player government system comes in - [07Mar2006-11:35:08] Kriton@Emerald MUD when a player lays the foundation for a city hall, he/she changes the landscape. - [07Mar2006-11:35:12] Daelas@Moraelinost True. How do you set up a government, or guild. I noticed a file that is called guild in this lib, just not sure how to use it. - [07Mar2006-11:35:43] Daelas@Moraelinost they can do that without causing errors? Or do you have a creation system? - [07Mar2006-11:35:47] Kriton@Emerald MUD guilds on most libs are an object loaded onto the player - [07Mar2006-11:36:09] Kriton@Emerald MUD yeah its whats called a virtual system - [07Mar2006-11:36:29] Kriton@Emerald MUD i write a framework of objects like buildings, npc servants, etc - [07Mar2006-11:36:59] Kriton@Emerald MUD the player says 'i want to build a house'. it clones the house and takes the descriptions from the player and stores them in a mysql database. - [07Mar2006-11:37:11] Daelas@Moraelinost that's cool - [07Mar2006-11:37:27] Kriton@Emerald MUD the location and descriptions are stored in the database and when the mud reboots and that location is reloaded, the house appears again in the room. - [07Mar2006-11:37:49] Kriton@Emerald MUD so the player doesn't really code anything per se - [07Mar2006-11:37:49] Daelas@Moraelinost what lib do you use? - [07Mar2006-11:37:55] Kriton@Emerald MUD they just modify a template. - [07Mar2006-11:38:09] Daelas@Moraelinost brodbane are you still here? - [07Mar2006-11:38:09] Kriton@Emerald MUD its my own lib... way back in '93 it was Nightmare 3.2 - [07Mar2006-11:38:21] Daelas@Moraelinost Ah. Isn't Dead Souls based on that? - [07Mar2006-11:38:26] Brodbane@Eve sorry, i'm here - [07Mar2006-11:38:40] Kriton@Emerald MUD well, Nightmare 3.2 led to Nightmare IV which led to Dead Souls. - [07Mar2006-11:38:44] Daelas@Moraelinost Know you're working. Just missed you. - [07Mar2006-11:38:54] Daelas@Moraelinost thought you left. - [07Mar2006-11:38:56] Brodbane@Eve :) Darn work! So ditracting - [07Mar2006-11:39:04] Daelas@Moraelinost :( - [07Mar2006-11:39:06] Brodbane@Eve distracting - [07Mar2006-11:39:16] Brodbane@Eve finger brodbane@eve - [07Mar2006-11:39:32] Kriton@Emerald MUD or maybe Nightmare IV->Foundation->Dead Souls - [07Mar2006-11:39:32] Daelas@Moraelinost okay. - [07Mar2006-11:40:38] Kriton@Emerald MUD LP Mud->TMI->TMI II->Nightmare 2/3->Nightmare IV->Foundation I/II->Dead Souls? - [07Mar2006-11:40:40] Brodbane@Eve My old mud was foundation II - [07Mar2006-11:41:20] Daelas@Moraelinost this is my first mud. - [07Mar2006-11:41:49] Kriton@Emerald MUD does my finger daemon work btw? :p - [07Mar2006-11:42:03] Daelas@Moraelinost sorry. yes it did. - [07Mar2006-11:42:05] Kriton@Emerald MUD doesn't know how well his mud works. - [07Mar2006-11:42:13] Kriton@Emerald MUD snickers - [07Mar2006-11:42:33] Daelas@Moraelinost no plan? - [07Mar2006-11:42:55] Kriton@Emerald MUD its not included in the intermud finger return... I could modify it pretty quick to include it - [07Mar2006-11:43:37] Daelas@Moraelinost oh. it said 'this is an empty plan file' - [07Mar2006-11:44:45] Kriton@Emerald MUD maybe I'm missing something from the I3 spec - [07Mar2006-11:46:24] Kriton@Emerald MUD did it show you my lack of spouse, best kill, etc? - [07Mar2006-11:47:04] Daelas@Moraelinost sing,e best kill, arch foe. - [07Mar2006-11:50:55] Daelas@Moraelinost sorry, I was looking at brodbane when I saw the empty plan. - [07Mar2006-11:50:55] Daelas@Moraelinost my mistake. - [07Mar2006-11:50:55] Daelas@Moraelinost your's doesn't have one. - [07Mar2006-11:50:55] Kriton@Emerald MUD ? - [07Mar2006-11:50:55] Kriton@Emerald MUD ahh - [07Mar2006-11:50:55] Kriton@Emerald MUD I modified my daemon to return my .project and .plan - [07Mar2006-11:50:57] Daelas@Moraelinost Cool plan. - [07Mar2006-11:50:57] Kriton@Emerald MUD hehehe - [07Mar2006-11:56:57] Brodbane@Eve How long before your baby is born? - [07Mar2006-11:57:05] Brodbane@Eve We just had ours - [07Mar2006-12:01:30] Kriton@Emerald MUD congratulations ;-) - [07Mar2006-12:01:39] Kriton@Emerald MUD ours is due in late june - [07Mar2006-12:01:45] Kriton@Emerald MUD ~25th - [07Mar2006-12:03:19] Brodbane@Eve first one? - [07Mar2006-12:04:11] Kriton@Emerald MUD yeah :) - [07Mar2006-12:04:24] Kriton@Emerald MUD it took a while but yeah - [07Mar2006-12:04:30] Kriton@Emerald MUD good timing though - [07Mar2006-12:04:50] Kriton@Emerald MUD we just bought our first house and a week later we found out we were pregnant - [07Mar2006-12:05:12] Brodbane@Eve hhahahha, thats exactly what happened to us - [07Mar2006-12:05:16] Brodbane@Eve exactly. I kid you not - [07Mar2006-12:05:26] Kriton@Emerald MUD hehe cool ;-) - [07Mar2006-12:25:50] Brodbane@Eve went ld - [07Mar2006-12:29:49] Daelas@Moraelinost sorry guys. Need to go to work. I'll have to talk to you later. Any help you can give my on the Stargate Brodbane would be appreciated. If you want to email me some suggestions or tips, just reply to the email. - [07Mar2006-12:30:01] Brodbane@Eve i'll do that - [07Mar2006-12:30:05] Brodbane@Eve see you later:) - [07Mar2006-14:43:37] Brodbane@Eve Anyone alive? Testing.. - [07Mar2006-14:43:52] Kriton@Emerald MUD we're all still here... you didn't kill us. - [07Mar2006-14:44:06] Ptah@Eve last - [07Mar2006-14:44:10] Ptah@Eve who - [07Mar2006-14:44:10] Brodbane@Eve Just showing Ptah, Eve's most recent addition the DS channel - [07Mar2006-14:44:26] Brodbane@Eve Ptah is a dev from my old mud - [07Mar2006-15:40:37] Oriam@Age of Darkness anyone out there? - [07Mar2006-15:40:45] Brodbane@Eve yes - [07Mar2006-15:40:49] Oriam@Age of Darkness finally - [07Mar2006-15:40:59] Oriam@Age of Darkness thought i would never find someone - [07Mar2006-15:41:03] Brodbane@Eve hehe - [07Mar2006-15:41:29] Ptah@Eve you didnt find anyone, we dont exist - [07Mar2006-15:41:41] Oriam@Age of Darkness oh darn, more automated servers? - [07Mar2006-15:41:49] Brodbane@Eve Cratylus made us. Welcome Oriam $N - [07Mar2006-15:42:07] Oriam@Age of Darkness wow, you ALMOST sound like humans :) - [07Mar2006-15:42:11] Ptah@Eve ahaha - [07Mar2006-15:42:39] Oriam@Age of Darkness so, are you all very familiar with this codebase? - [07Mar2006-15:42:59] Brodbane@Eve Ptah and I are LPC people - [07Mar2006-15:43:30] Oriam@Age of Darkness i know lpc pretty well. could yall tell me how to add/remove emotes? - [07Mar2006-15:43:58] Brodbane@Eve just delete them from the verb directory - [07Mar2006-15:44:20] Ptah@Eve well, you could override the command in the player object to do nothing, remove the emote.c file... - [07Mar2006-15:45:44] Oriam@Age of Darkness wheres the emote.c file located? - [07Mar2006-15:46:12] Ptah@Eve try /cmds/players/emote.c - [07Mar2006-15:46:41] Oriam@Age of Darkness ahh okay, i was trying to find it in verbs - [07Mar2006-15:46:51] Ptah@Eve which emote - [07Mar2006-15:46:57] Ptah@Eve useful command - [07Mar2006-15:46:59] Oriam@Age of Darkness in general - [07Mar2006-15:47:11] Ptah@Eve no, the command, type which emote - [07Mar2006-15:47:19] Oriam@Age of Darkness ah okay - [07Mar2006-15:48:29] Oriam@Age of Darkness so, how do i add emotes here - [07Mar2006-15:49:11] Ptah@Eve They dont currently work? - [07Mar2006-15:49:29] Oriam@Age of Darkness i want to change the nod emote, but im not quite sure how - [07Mar2006-15:49:38] Brodbane@Eve do a which nod - [07Mar2006-15:49:48] Ptah@Eve not a .c command - [07Mar2006-15:49:52] Ptah@Eve just a sec - [07Mar2006-15:49:52] Brodbane@Eve darn - [07Mar2006-15:49:54] Oriam@Age of Darkness says nod: not found - [07Mar2006-15:50:56] Avatar@OuterSpace (bad humour warning) "Nod found"? - [07Mar2006-15:51:04] Oriam@Age of Darkness .... - [07Mar2006-15:51:12] Ptah@Eve I am thinking it's part of the living object, checking - [07Mar2006-15:51:32] Oriam@Age of Darkness Thats kind of funny - [07Mar2006-15:51:42] Ptah@Eve no it's nod - [07Mar2006-15:51:54] Oriam@Age of Darkness so i type 'which nod' - [07Mar2006-15:53:15] Brodbane@Eve no, its not a standard verb - [07Mar2006-15:53:37] Oriam@Age of Darkness That means? - [07Mar2006-15:53:45] Brodbane@Eve verb = action - [07Mar2006-15:53:53] Oriam@Age of Darkness so, how do i change it? - [07Mar2006-15:53:55] Brodbane@Eve standard verb = who, look - [07Mar2006-15:54:05] Oriam@Age of Darkness ahh okay - [07Mar2006-15:55:42] Oriam@Age of Darkness where would i find the file to edit nod - [07Mar2006-15:56:14] Ptah@Eve it's part of one of the objects that made your character - [07Mar2006-15:56:18] Ptah@Eve but not living.c - [07Mar2006-15:56:32] Oriam@Age of Darkness sorry, im a little confused here - [07Mar2006-15:56:46] Oriam@Age of Darkness which object are we talking about? - [07Mar2006-15:58:24] Brodbane@Eve not sure, haven't found where nod is being called - [07Mar2006-15:58:36] Oriam@Age of Darkness oh okay, i thought you meant you had found it - [07Mar2006-16:01:07] Jerin@Jerins Folly There's a reference in lib/save/soul.o - [07Mar2006-16:01:17] Oriam@Age of Darkness ill check it out - [07Mar2006-16:01:29] Jerin@Jerins Folly You can't edit, or shouldn't be able to edit .o files - [07Mar2006-16:03:00] Oriam@Age of Darkness hrmm, indeed there is - [07Mar2006-16:03:54] Jerin@Jerins Folly But, that's a point of reference for going backwards - [07Mar2006-16:05:39] Oriam@Age of Darkness egh nvm - [07Mar2006-16:05:51] Oriam@Age of Darkness how would i add a completely new emote? - [07Mar2006-16:06:13] Jerin@Jerins Folly That's kinda the whole thing there. If we knew one, we'd know the other - [07Mar2006-16:06:29] Oriam@Age of Darkness sorry got lost there - [07Mar2006-16:11:28] Oriam@Age of Darkness blargh - [07Mar2006-16:11:52] Jerin@Jerins Folly From all I can tell, it's only getting pushed into soul.o - [07Mar2006-16:12:09] Jerin@Jerins Folly Mind you LP muds aren't my specialty so - [07Mar2006-16:12:19] Oriam@Age of Darkness ill ask an admin on my normal mud - [07Mar2006-16:12:29] Jerin@Jerins Folly As an example, if you look at help feelings - [07Mar2006-16:12:53] Jerin@Jerins Folly look for the most obscure one you can find, such as shellshock, when you do a search through the lib, it only appears in soul.o - [07Mar2006-16:14:19] Jerin@Jerins Folly Well, my guess now is that soul.o isn't an object file, so looks like you'll need to edit it from there - [07Mar2006-16:14:57] Jerin@Jerins Folly Lemme try something real quick and I'll let you know - [07Mar2006-16:15:09] Oriam@Age of Darkness i got a high wiz from my normal mud lookin into it - [07Mar2006-16:20:37] Oriam@Age of Darkness kay, hes on right now - [07Mar2006-16:20:55] Jerin@Jerins Folly Alright - [07Mar2006-16:25:23] Oriam@Age of Darkness hrmm, he says its something about feelings - [07Mar2006-16:46:13] Oriam@Age of Darkness okay, the command is addemote but it gives me an error - [07Mar2006-16:46:53] Ave@Age of Darkness looks like you've got a good problem to start off your career with - [07Mar2006-16:47:03] Ptah@Eve you have to be of a certain level to use this command - [07Mar2006-16:47:13] Oriam@Age of Darkness im arch - [07Mar2006-16:47:15] Ave@Age of Darkness it's an admin command - [07Mar2006-16:47:57] Oriam@Age of Darkness i get everything entered right, but it gives me an error - [07Mar2006-16:48:09] Oriam@Age of Darkness has something to do with the parser - [07Mar2006-17:56:38] Ashon@Stargate Atlantis: Evolution I just dl'd DS, waddya you guys think of it for development purposes? - [07Mar2006-17:58:18] Jerin@Jerins Folly Seems pretty decent to me, although I'm more of a Diku person tryin to get away from that - [07Mar2006-17:58:51] Brodbane@Eve you guys reading this? I broke somethin - [07Mar2006-17:59:05] Jerin@Jerins Folly Yup - [07Mar2006-18:00:33] Brodbane@Eve thanks - [07Mar2006-18:00:43] Jerin@Jerins Folly Yup - [07Mar2006-18:01:49] Ashon@Stargate Atlantis: Evolution well I like LP's since you can do so much more with them, is the maillist pretty active? - [07Mar2006-18:02:12] Brodbane@Eve Taking off for a while. Catch you all later - [07Mar2006-18:02:22] Jerin@Jerins Folly later Brodbane - [07Mar2006-20:40:51] Cratylus looks like i missed a chat party - [08Mar2006-07:31:45] Cratylus test - [08Mar2006-10:43:49] Cratylus w00t - [08Mar2006-10:46:31] Daelas@Moraelinost Hello Cratylus - [08Mar2006-10:47:58] Cratylus hiya - [08Mar2006-10:50:29] Cratylus looks like intermud is back up - [08Mar2006-10:50:43] Daelas@Moraelinost why did it go down? - [08Mar2006-10:50:53] Cratylus beats me. i don't run the router - [08Mar2006-10:50:53] Ptah@Eve budget cuts - [08Mar2006-10:51:01] Daelas@Moraelinost ah. - [08Mar2006-10:52:03] Ptah@Eve Intermud was considered an entiltement program by the Bush administration and was cut - [08Mar2006-10:52:33] Brodbane@Eve I thought intermud was owned by the dubei company - [08Mar2006-10:52:39] Cratylus well, technically, they just didn't approve the funding increase for fiscal year 2006 - [08Mar2006-10:53:36] Ptah@Eve Ahhh, good humor, I love ot - [08Mar2006-10:53:38] Ptah@Eve it - [08Mar2006-10:55:30] Cratylus i'm the good humor man - [08Mar2006-10:58:25] Ashon@Stargate Atlantis can I get an Ice Cream Sandwich then? - [08Mar2006-10:58:39] Brodbane@Eve clone icecream.c - [08Mar2006-10:59:21] Brodbane@Eve Explain, you are using words that I dont use in proper context when i try and use them - [08Mar2006-10:59:51] Cratylus eval return present("ice cream",this_player())->SetType("sandwich") - [08Mar2006-11:00:28] Brodbane@Eve I think you just set that payer to type 'sandwich' - [08Mar2006-11:00:34] Brodbane@Eve player* - [08Mar2006-11:00:46] Cratylus my bad - [08Mar2006-11:00:50] Brodbane@Eve nm, formatting is all off here, stupid windows telnet - [08Mar2006-11:01:04] Brodbane@Eve daelas No problem, i had fun with it - [08Mar2006-11:01:12] Brodbane@Eve woops, mistell - [08Mar2006-11:39:42] Ashon@Stargate Atlantis are the classes all virtual? I can't seem to find any .c file for the class other then the class daemon, - [08Mar2006-11:40:00] Cratylus /secure/cfg/classes - [08Mar2006-11:40:28] Daelas@Moraelinost Ashon, are you actually in a Stargate mud? - [08Mar2006-11:40:36] Ashon@Stargate Atlantis right, those seem to just be the class definitions - [08Mar2006-11:41:18] Cratylus yes. if you want to create a new class, make a new file in that dir following the same format, then use admintool to add the class to the class daemon - [08Mar2006-11:41:34] Ashon@Stargate Atlantis Daelas- I'm trying to create one, I'm on day two of learning DS - [08Mar2006-11:41:56] Cratylus ashon, any problems with the documentation? - [08Mar2006-11:42:17] Brodbane@Eve I have a problem with the docs. They are iin english - [08Mar2006-11:42:33] Ptah@Eve Freaking Southerners - [08Mar2006-11:42:35] Ashon@Stargate Atlantis Cratylus, other then not having the documentation that I'm looking for, yes. - [08Mar2006-11:42:43] Cratylus actually they're in rigellian. by an astonishing coincidence, our two languages are exactly the same - [08Mar2006-11:42:59] Cratylus you mean the class thing? yeah, i'll add that to the faq - [08Mar2006-11:42:59] Ptah@Eve so long, thanks for the fish - [08Mar2006-11:43:03] Brodbane@Eve I speak Rigellian? - [08Mar2006-11:43:11] Daelas@Moraelinost how do you learn the languages available? - [08Mar2006-11:43:31] Brodbane@Eve I told my wife i was cultured. - [08Mar2006-11:43:39] Cratylus well, learning is done with trainers, but a creator can just add the language to himself - [08Mar2006-11:43:59] Ashon@Stargate Atlantis okay, so the classes are virtual, then I guess my question becomes, where is the code for skills? - [08Mar2006-11:44:29] Cratylus can you explain a little more what you're looking for? - [08Mar2006-11:46:06] Ashon@Stargate Atlantis well, I want to create new skills for the classes, but I can't find where the skills are defined. - [08Mar2006-11:46:38] Cratylus hmmm - [08Mar2006-11:47:18] Cratylus ya i need to explain a bit more clearly the skills system in the faq - [08Mar2006-11:47:56] Cratylus the deal is that a skill is useful only in the context of doing something the lib understands - [08Mar2006-11:48:26] Cratylus for example, the reason "blade attack" is useful is that /lib/combat.c (among others) uses it as a modifier - [08Mar2006-11:49:11] Cratylus what this means is that all the skills the lib understand are those currently listed in the files /secure/cfg/classes - [08Mar2006-11:49:51] Cratylus so that generally, if it isn't there, it isn't a skill the lib knows about - [08Mar2006-11:50:07] Cratylus however, putting one in there doesnt mean the lib can do anything with it, either - [08Mar2006-11:50:37] Cratylus for example, suppose you want to add a basketweaver class, and one of the skills is, well, weaving - [08Mar2006-11:51:27] Cratylus just because weaving is one of the skills in /secure/cfg/basketweaver doesnt mean it's in any way helpful to the player, if weaving isnt something that has a verb and lib objects that handle it - [08Mar2006-11:51:47] Brodbane@Eve Am i logging ds by default? This is some good stuff - [08Mar2006-11:51:54] Cratylus heh - [08Mar2006-11:52:02] Cratylus i think so. check /log/cha - [08Mar2006-11:52:04] Cratylus i think so. check /log/chan - [08Mar2006-11:52:18] Brodbane@Eve thanks, its there - [08Mar2006-11:52:26] Ptah@Eve sweet - [08Mar2006-11:52:42] Cratylus does that answer the question, ashon? - [08Mar2006-11:53:10] Ashon@Stargate Atlantis okay got it. so weave.c will go in the verb folder, and then make a reference to it in the class cfg files. - [08Mar2006-11:53:18] Cratylus right on - [08Mar2006-11:53:46] Cratylus though usually what'll happen is the verb acts on an object that inherits, let's sat, /lib/basjet.c - [08Mar2006-11:54:06] Cratylus or /lib/loom.c, and that object is what determines the usefulness of the skill - [08Mar2006-11:54:24] Ashon@Stargate Atlantis so if I wanted to make unique racial abilities aka vampires that suck blood, they would need a verb and then a call from the race cfg file - [08Mar2006-11:54:36] Ashon@Stargate Atlantis right understand that part of it. - [08Mar2006-11:54:44] Cratylus i wouldn't use the word "call" that way, but it sounds like you've got the idea - [08Mar2006-11:55:17] Cratylus a good example of bloodsucking would be the steal verb - [08Mar2006-11:55:21] Ashon@Stargate Atlantis a reference if you will then. The body object would 'call' the functionality. - [08Mar2006-11:55:45] Cratylus thieves have a skill for this, and their success is determined by their skill as measured by various /lib objects - [08Mar2006-11:56:49] Ashon@Stargate Atlantis right. - [08Mar2006-11:57:23] Ashon@Stargate Atlantis thanks Cratylus. - [08Mar2006-11:57:33] Cratylus no prob. thanks for pointing out the documentation gap - [08Mar2006-11:57:53] Ashon@Stargate Atlantis meh, no problem. - [08Mar2006-12:08:57] A shadow@Carnivore hang on i just noticed you said /secure/cfg/races - [08Mar2006-12:09:41] Cratylus i didnt notice that - [08Mar2006-12:10:05] Cratylus the skills thing isnt something you should try to do in a race file - [08Mar2006-12:10:51] Cratylus this raises an interesting issue - [08Mar2006-12:12:12] Cratylus you just pointed out a feature gap - [08Mar2006-12:14:00] Ashon@Stargate Atlantis so, you can't have special racial verbs? - [08Mar2006-12:14:14] Ptah@Eve I have special racial verbs but they are impolite - [08Mar2006-12:14:18] Brodbane@Eve My dwarven sexiness was inherent... - [08Mar2006-12:14:55] Cratylus dang. this is what happens when you only code lib stuff. you forget obvious shit like that - [08Mar2006-12:15:15] Ptah@Eve Craytlus, who died and cursed you with the maintenance? - [08Mar2006-12:15:19] Ashon@Stargate Atlantis I'm a trouble maker what can I say? - [08Mar2006-12:15:23] Cratylus as of now there is no good racial skill system. however this issue's pretty much rocketed to number one on my todo list - [08Mar2006-12:15:39] Ashon@Stargate Atlantis w00t! - [08Mar2006-12:16:13] Ptah@Eve so question, would a dark elf be better at dancing and a surface elf be better at math skills? - [08Mar2006-12:16:23] Ashon@Stargate Atlantis Ptah- didn't you read any of the documentation/history of DS? Cratylus CHOSE to do it! - [08Mar2006-12:17:26] Ptah@Eve then that man needs a beer - [08Mar2006-12:18:22] Brodbane@Eve Ptah, ED/BR has made us synical - [08Mar2006-12:18:48] Ptah@Eve nod, I am now an agnostic cynic - [08Mar2006-12:18:52] Brodbane@Eve Cratylus is that gem we never ran into - [08Mar2006-12:19:14] Brodbane@Eve We got Nameless, Caliel and a few others to ruin our perception of lib developers - [08Mar2006-12:19:53] Ptah@Eve Heh, ok, long story short, we had a couple of talented guys who were very arbitrary in their enhancements - [08Mar2006-12:25:28] Ashon@Stargate Atlantis lib dev is a bitch, and you've gotta really love the intense code hacking to do it. these are people who go one to program things like *nix daemons. - [08Mar2006-12:26:33] Ptah@Eve nog, and have a total disregard for formatting code - [08Mar2006-12:31:38] Ptah@Eve Heh, sorry, one of my pet peeves, I get down on my jr. programmers for formatting so bad - [08Mar2006-12:32:54] Ashon@Stargate Atlantis I've noticed the formatting is horrible. but I'm not complaining yet, I've got other work to do. - [08Mar2006-12:33:41] Cratylus for real? you guys dont like the ds formatting? - [08Mar2006-12:33:53] Cratylus are the lines too long? - [08Mar2006-12:34:41] Ptah@Eve Well, I've been looking at some of the descartes code, and man, indentation, using function declarations inside of calls, call me a purist, but it's difficult to read at times - [08Mar2006-12:35:33] Ptah@Eve I understand when LPC first came out it was partially a space issue with files, but I believe we are past that constraint nowdays - [08Mar2006-12:35:39] Cratylus interesting. if yuo don't mind, i'd love an example of what you mean. do you have a specific filename that illustrates this? - [08Mar2006-12:35:46] Ashon@Stargate Atlantis oh code formatting? I've got some serious wrapping issues on my client then - [08Mar2006-12:35:52] Ptah@Eve interactive.c - [08Mar2006-12:37:38] Ptah@Eve omg, I just realized I've been on lpc since 1992 - [08Mar2006-12:38:18] Brodbane@Eve 1992? That was the 6th grade for me, congrats - [08Mar2006-12:38:20] Cratylus yeah that is kinda ugly - [08Mar2006-12:38:30] Cratylus i guess i've just gotten used to that - [08Mar2006-12:38:53] Ptah@Eve wow... I was already a few years out of the army in 92 - [08Mar2006-12:39:01] Ptah@Eve thanks for making me feel old - [08Mar2006-12:39:21] Cratylus by the way, even if a file has descartes name on top, it's probably been modified by me in one way or another. i'm just too lazy to bother with headers - [08Mar2006-12:39:43] Brodbane@Eve I just assume you wrote everything. Easier to pass blame that way - [08Mar2006-12:39:49] Cratylus :) - [08Mar2006-12:40:05] Ptah@Eve Heh - [08Mar2006-12:40:31] Ptah@Eve Forcing me to write a code formatter utility, I suppose that could be a nice mental exercise though - [08Mar2006-12:42:24] Cratylus the way i do the formatting is this: i write my sloppy ass code any which way i feel like, then right before a code release, i use a source script and lsed to auto-indent everything - [08Mar2006-12:42:26] Ashon@Stargate Atlantis gah that's the kind of crap they make you write in c 101 type classes. - [08Mar2006-12:42:50] Cratylus which is why i was a little surprised. i figured that the default formatting spat out by ed would look pretty normal - [08Mar2006-12:43:02] Ptah@Eve fear... ed - [08Mar2006-12:43:18] Ptah@Eve You're not still on a tty term are you Cratylus? - [08Mar2006-12:43:32] Ashon@Stargate Atlantis ed is your friend. love it, want it, caress it. - [08Mar2006-12:43:44] Cratylus for coding i use vim or gvim as the mood strikes me - [08Mar2006-12:44:08] Ptah@Eve Ok, here's fear for you, I first started on a 110 baud tty term that used paper, no screen - [08Mar2006-12:45:06] Cratylus that's before my time. when i started coding i was on the actual DEC vt100 terminals hooked up by serial to the campus vax - [08Mar2006-12:45:31] Cratylus maxed out at 9600bps - [08Mar2006-12:45:45] Ptah@Eve I remember when 9600 came out I was like "OMG this is fast!!!" - [08Mar2006-12:46:25] Ptah@Eve poor apple //e, 4800 was too fast for the processor to get the info in before it lost characters - [08Mar2006-12:47:11] Cratylus though one time over xmas break i was reduced to using a c64 on a 300bps modem dialed into the campus server - [08Mar2006-12:47:21] Cratylus that was rough stuff - [08Mar2006-12:47:23] Ptah@Eve ahahah, a commode! - [08Mar2006-12:48:07] Ashon@Stargate Atlantis whoa! Watch it. c64 pm 4800 to compuserve! ahhh the days! - [08Mar2006-12:48:29] Ashon@Stargate Atlantis *pm = on a - [08Mar2006-12:48:34] Ptah@Eve Apple guy here, still am, got a nice dual G5 now, oh and some pos 3gb wintel box - [08Mar2006-12:49:04] Cratylus i use a sun ultrasparc box - [08Mar2006-12:49:32] Ptah@Eve Those are pretty sexy - [08Mar2006-12:49:52] Ptah@Eve I almost bought a sparc/10 a long while back - [08Mar2006-12:50:02] Cratylus heh - [08Mar2006-12:50:08] Ptah@Eve now I just want a cray ymp for nostalgia - [08Mar2006-12:51:27] Cratylus i saw a sun enterprise 10000 on ebay for a little over $10k, 20 procs, loads of ram. they use the cray crossbar - [08Mar2006-12:51:37] Cratylus dunno about the electricity bill tho - [08Mar2006-12:52:09] Ptah@Eve heh, ymp is not as powerful as a laptop anymore and uses huge energy - [08Mar2006-12:52:19] Cratylus my little 4-wat/6gig ram box sucks up plenty enough juice - [08Mar2006-12:52:25] Cratylus 4-way - [08Mar2006-12:52:49] Ptah@Eve yeah, my dual g5 sucks the juice so bad I crisped a processor on a brownout - [08Mar2006-12:52:57] Ptah@Eve yay yay applecare - [08Mar2006-12:53:19] Ptah@Eve and of course a line conditioner - [08Mar2006-12:55:00] Ptah@Eve I am from the land of Cray, I got to play with those bad boys in highschool and anything that compiled a program in .007843 seconds was the computer for me. - [08Mar2006-12:55:14] Kriton@Emerald MUD heh - [08Mar2006-12:55:26] Kriton@Emerald MUD had a Vax II! :P - [08Mar2006-12:55:38] Cratylus i never could stand vms - [08Mar2006-12:55:42] Kriton@Emerald MUD it couldn't do anything in .007843 seconds - [08Mar2006-12:56:00] Kriton@Emerald MUD I couldn't either, actually - [08Mar2006-12:56:10] Ptah@Eve heh, they were sexy machines for the day, now just an expensive alternative to a beowulf cluster - [08Mar2006-12:56:20] Ptah@Eve crays that is - [08Mar2006-12:56:34] Kriton@Emerald MUD the vax had a "unix board" - [08Mar2006-12:56:53] Ptah@Eve like the mac 6100 dual had a "intel board" - [08Mar2006-12:56:57] Cratylus yeah, but i didnt much like ultrix either - [08Mar2006-12:57:23] Cratylus got the job done, i guess - [08Mar2006-12:57:45] Ptah@Eve I like BSD and Linux, Linux is probably the best thing to ever happen to the net - [08Mar2006-12:57:49] Kriton@Emerald MUD didn't mind ultix so much. liked sunos more, but never managed to score any hardware. - [08Mar2006-12:58:35] Kriton@Emerald MUD runs all linux now... I have a copy of solaris for x86 but haven't used it for anything. - [08Mar2006-12:59:01] Ptah@Eve but then again, I was impressed with Minix. - [08Mar2006-13:03:49] Cratylus dont bother with solaris x86 unless you have a specific reason to use it - [08Mar2006-13:03:59] Cratylus but solaris for sparc is Teh Shit - [08Mar2006-13:20:44] Brodbane@Eve Did you guys notice a mud named 'Jedi Nights'? - [08Mar2006-13:20:54] Brodbane@Eve thds Wonder if they meant 'Knights' - [08Mar2006-13:21:02] Ptah@Eve I think Darth mud hunted it down and killed the last of it - [08Mar2006-13:22:59] Kriton@Emerald MUD maybe its where Jedi's go to part - [08Mar2006-13:23:01] Kriton@Emerald MUD part->party - [08Mar2006-13:23:11] Kriton@Emerald MUD kind of like Boogie Nights, but with Jedi - [08Mar2006-13:23:25] Ptah@Eve reserves all his lightsaber comments now in respect to that - [08Mar2006-13:24:11] Kriton@Emerald MUD heh - [08Mar2006-13:37:33] Ptah@Eve finger ptah - [08Mar2006-13:37:37] Ptah@Eve hrm - [08Mar2006-13:37:39] Cratylus no thx - [08Mar2006-13:38:01] Ptah@Eve Brokeback Mux - [08Mar2006-13:38:40] Brodbane@Eve What a great mud idea. Brokeback - [08Mar2006-13:39:06] Ptah@Eve Yeah it would be the SHIT!, er um... - [08Mar2006-13:39:44] Brodbane@Eve We would so win an oscar - [08Mar2006-13:40:12] Ptah@Eve I dont believe I could relate well enough to the subject matter to make it work - [08Mar2006-13:44:27] Kriton@Emerald MUD heh - [08Mar2006-13:45:28] Kriton@Emerald MUD $N wears his +5 buttless chaps. (eww) - [08Mar2006-13:45:50] Ptah@Eve $N lets this thing take ahold of him - [08Mar2006-13:46:28] Cratylus wtf - [08Mar2006-13:46:38] Cratylus are chan emotes fuxt? - [08Mar2006-13:46:46] Kriton@Emerald MUD no - [08Mar2006-13:47:02] Ptah@Eve ahahah, no no no no - [08Mar2006-13:47:02] Kriton@Emerald MUD didn't want to actually put HIS name in that example - [08Mar2006-13:47:06] Cratylus tests something. - [08Mar2006-13:47:26] Cratylus whew ok - [08Mar2006-13:47:50] Ptah@Eve $N wonders wtf Cratylus is talking about - [08Mar2006-13:48:00] Kriton@Emerald MUD you could hardcode the gender tho... that would make it easy... would you like to be [M]ale or m[A]le - [08Mar2006-13:48:29] Ptah@Eve Oh my - [08Mar2006-13:48:39] Kriton@Emerald MUD yeah probably better to stop now - [08Mar2006-13:49:05] Ptah@Eve Hey, I am as homo erotic as the next guy, but still - [08Mar2006-13:49:53] Kriton@Emerald MUD ? - [08Mar2006-13:53:08] Ptah@Eve that's called humor - [08Mar2006-14:11:42] Brodbane@Eve Maybe I dont want to be logging DS... - [08Mar2006-14:53:59] Cratylus hi alswyn. use this channel for questions n stuff - [08Mar2006-14:56:41] Aldwyn@Celtic Dreams alright thanks!:) - [08Mar2006-14:57:28] Brodbane@Eve welcome - [08Mar2006-15:00:16] Brodbane@Eve System A runtime error occurred to Phil - [08Mar2006-15:00:21] Brodbane@Eve strange one - [08Mar2006-15:00:51] Cratylus tail /log/player_errors - [08Mar2006-15:02:07] Brodbane@Eve Woop there it is, a bug - [08Mar2006-15:02:23] Brodbane@Eve /domains/town/room/training - [08Mar2006-15:02:27] Brodbane@Eve try and go west - [08Mar2006-15:03:05] Cratylus heh - [08Mar2006-15:03:26] Cratylus delete exit west - [08Mar2006-15:04:06] Cratylus i dont even remember what i'd been testing with that - [08Mar2006-15:07:43] Brodbane@Eve just an FYI. We are only using the town as a reference - [08Mar2006-15:08:03] Cratylus yeh. thanks - [08Mar2006-15:30:26] Brodbane@Eve testing - [08Mar2006-15:32:40] Cratylus passed - [08Mar2006-15:33:27] Brodbane@Eve whats the darn channel emote command - [08Mar2006-15:33:41] Cratylus dsemote tests something. - [08Mar2006-15:34:09] Brodbane@Eve awesome. Never would of found it - [08Mar2006-15:34:15] Cratylus :foos. - [08Mar2006-15:34:25] Cratylus never mind that last thing - [08Mar2006-15:34:29] Cratylus it's dsemote - [08Mar2006-15:34:31] Brodbane@Eve i tried that - [08Mar2006-15:34:45] Brodbane@Eve old mud was ds: tests something. - [08Mar2006-15:34:59] Cratylus yeah...i dont remember when or why that changed - [08Mar2006-15:35:29] Brodbane@Eve I was playing around with chat.c so it would be [ds] Cratylus@Dead Souls: - [08Mar2006-15:35:39] Cratylus ohhhh i rememebr actually. i let someone fix the chat daemon once - [08Mar2006-15:36:20] Cratylus yeah, they fixed a buncha stuff but woulnd up disabling the : - [08Mar2006-15:36:30] Brodbane@Eve yeah, thats ok - [08Mar2006-15:36:50] Brodbane@Eve I like the hist and list commands - [08Mar2006-15:36:58] Cratylus that's what they added :) - [08Mar2006-15:37:06] Cratylus all in all a good trade - [08Mar2006-15:58:44] Ptah@Eve is there a root command that shows you the object hierarchy of something? - [08Mar2006-15:58:50] Brodbane@Eve showtree - [08Mar2006-16:16:20] Ptah@Eve whats the largest signed integer value one can use in LPC? - [08Mar2006-16:16:44] Kriton@Emerald MUD 2^32-1? - [08Mar2006-16:17:02] Kriton@Emerald MUD donno - [08Mar2006-16:17:10] Cratylus i dunno either - [08Mar2006-16:17:20] Ptah@Eve long it? - [08Mar2006-16:17:24] Ptah@Eve er longint - [08Mar2006-16:17:52] Cratylus shrugs and looks around. - [08Mar2006-16:18:22] Kriton@Emerald MUD 2147483646 - [08Mar2006-16:18:34] Kriton@Emerald MUD err - [08Mar2006-16:18:38] Kriton@Emerald MUD 2147483647 - [08Mar2006-16:18:44] Ptah@Eve what is the identifier for that - [08Mar2006-16:18:50] Ptah@Eve int, longint, etc? - [08Mar2006-16:18:52] Kriton@Emerald MUD (1 << 31) - 1 - [08Mar2006-16:19:04] Cratylus within LPC, it's just int - [08Mar2006-16:19:20] Ptah@Eve excellent, thanks - [08Mar2006-17:03:56] Kriton@Emerald MUD wonders if the sizeof int changes with the platform - [08Mar2006-17:04:42] Kriton@Emerald MUD if i go with a 64-bit machine will I get bigger ints from mudos? - [08Mar2006-17:16:28] Cratylus how do i check int size? - [08Mar2006-17:16:40] Cratylus size limit anyway - [08Mar2006-17:17:06] Cratylus nevemind got it - [08Mar2006-17:17:48] Cratylus well i'm on a 64 bit machine and i got 2147483647, but i dont remember trying to enable compilation of a 64 bit binary - [08Mar2006-20:37:51] Ashon@Stargate Atlantis okay, on Verbs, is there some documentation on what SetRules() is for? - [08Mar2006-20:39:11] Cratylus setting rules? - [08Mar2006-20:39:21] Cratylus hang on a sec - [08Mar2006-20:41:58] Cratylus until i finish verb docs, this is a good orientation: http://www.dnd.utwente.nl/~krimud/Docs/NMAdmin/Parser/ - [08Mar2006-20:46:14] Ashon@Stargate Atlantis okay so the SetRule() in DS is equivalent to the parse_add_rule() function from MudOS? - [08Mar2006-20:49:49] Cratylus yip - [08Mar2006-20:50:07] Cratylus i think parse_add_rule() is lima syntax - [08Mar2006-20:50:37] Ashon@Stargate Atlantis okay - [08Mar2006-21:54:49] Ashon@Stargate Atlantis so when loading a verb into the system is there a special way to do it other then update .c? - [08Mar2006-21:55:01] Cratylus no - [08Mar2006-21:55:03] Cratylus why? - [08Mar2006-21:55:13] Cratylus well, you need to update the verbs daemon too - [08Mar2006-21:55:23] Cratylus /daemon/verbs.c - [08Mar2006-21:55:49] Cratylus but that's if it's a new verb - [08Mar2006-21:58:10] Ashon@Stargate Atlantis I'm an idiot, it would be nice if I remember proper syntax for c - [08Mar2006-21:59:20] Cratylus creating new verbs is pretty advanced stuff for day 2 of lpc learning - [08Mar2006-21:59:55] Cratylus you some kinda genius? - [08Mar2006-22:00:09] Ashon@Stargate Atlantis I've worked on various LPC's before, I'm not new to coding, I'm just trying to do some proof of concept stuff. - [08Mar2006-22:00:13] Cratylus k - [08Mar2006-22:00:27] Ashon@Stargate Atlantis re: Ashon from WheelMud project/Mudconnector/et all - [08Mar2006-22:00:35] Cratylus nods. - [08Mar2006-22:01:01] Ashon@Stargate Atlantis besides where's the fun in actually building? BLAH! - [08Mar2006-22:01:05] Cratylus heh - [08Mar2006-22:01:13] Cratylus i never thought i'd feel that way - [08Mar2006-22:01:23] Cratylus but its getting harder to enjoy it lately, yeah - [08Mar2006-22:15:21] Ashon@Stargate Atlantis okay so where would I find a function listing for function calls on objects/souls/? IE: CanManipulate(obj)...? - [08Mar2006-22:16:17] Cratylus help will do it, generally - [08Mar2006-22:16:29] Cratylus though theres an efun just for that. hang on - [08Mar2006-22:17:17] Cratylus eval return functions(load_object("/lib/player"),1) - [08Mar2006-22:17:57] Cratylus obviously that's more data than yer buffer will handle, but that's what you'd use in a function - [08Mar2006-22:19:56] Cratylus did i understand your question correctly? - [08Mar2006-22:20:08] Cratylus spending more, collecting less - [08Mar2006-22:20:10] Cratylus mischan - [08Mar2006-22:21:02] Ashon@Stargate Atlantis kinda - [08Mar2006-22:32:36] Ashon@Stargate Atlantis the NM documentation called them, "applies", I guess those are what I'm looking for. I saw some in /doc/applies/ but those seem more driver type - [08Mar2006-22:33:02] Cratylus hmm - [08Mar2006-22:33:36] Ashon@Stargate Atlantis does that make more sense? - [08Mar2006-22:34:04] Brodbane@Eve If it makes sense, it has no business being in a mud - [08Mar2006-22:34:20] Ashon@Stargate Atlantis bah, smurf village makes plenty of sense! - [08Mar2006-22:34:44] Cratylus it sounds like it makes sense, but i dont quite understand, because to me, applies are driver only - [08Mar2006-22:34:55] Brodbane@Eve Ashon, do you guys have a working star gate? - [08Mar2006-22:35:23] Cratylus can you point me to the sepcific docs you mean? - [08Mar2006-22:36:17] Ashon@Stargate Atlantis okay, take for example the verb: pick.c it's has function calls such as CanManipulate(), GetParalyized(), etc. - [08Mar2006-22:36:27] Cratylus right - [08Mar2006-22:36:59] Ashon@Stargate Atlantis I was wondering where I'd find a listing for those types of functions - [08Mar2006-22:37:37] Brodbane@Eve Thats all Nightmare/Dead Souls esque - [08Mar2006-22:37:41] Ashon@Stargate Atlantis Brodbane, I gotta get all my skills/classes/races/quest system done before I even think about doing any kind of building. - [08Mar2006-22:38:00] Brodbane@Eve Would you like my stargate? - [08Mar2006-22:38:28] Ashon@Stargate Atlantis wouldn't hurt to take a look at it. - [08Mar2006-22:38:38] Brodbane@Eve I did it as an example for another mud - [08Mar2006-22:39:08] Brodbane@Eve You "dial earth", or "dial e", "dial a".. etc. Opens the portal briefly, then closes it - [08Mar2006-22:39:18] Ashon@Stargate Atlantis mine however has to be much more trhen just a portal. - [08Mar2006-22:40:14] Brodbane@Eve have a preferred email? - [08Mar2006-22:43:19] Brodbane@Eve Cratylus, did you ever read the LPC manual that says "Dont use colors!!!!"? - [08Mar2006-22:43:41] Cratylus :) - [08Mar2006-22:43:47] Cratylus suck it up - [08Mar2006-22:44:03] Brodbane@Eve http://www.lysator.liu.se/mud/profword.html - [08Mar2006-22:44:23] Brodbane@Eve hehe. I've been slowly removing the calls. I like it some places thuogh - [08Mar2006-22:44:42] Cratylus lysator's been out of date for 12 years - [08Mar2006-22:44:58] Brodbane@Eve Yeah, you got me there - [08Mar2006-22:45:56] Cratylus well i dont mean to be insulting about it, but all the clients i use handle color ok, and part of my focus has been to make things easy to use from *inside* the mud - [08Mar2006-22:46:08] Cratylus this is a real problem for complex docs - [08Mar2006-22:46:28] Cratylus because all-white all-text makes peoples' eyes slide off documentation - [08Mar2006-22:46:34] Brodbane@Eve I was just curious. I dont look a gift horse in the mouth! - [08Mar2006-22:46:46] Cratylus well i feel a bit guilty about it, see - [08Mar2006-22:46:56] Cratylus because it offends my aesthetic sensibilities too - [08Mar2006-22:47:24] Cratylus it's one of those things where i think more people benefit from it than suffer - [08Mar2006-22:47:51] Brodbane@Eve when you get right down to it, i can just make it however i like - [08Mar2006-22:48:53] Ashon@Stargate Atlantis NO! Why would I want to help other people? ;) - [08Mar2006-22:49:15] Cratylus ashon, stuff like GetParalyzed are functions almost always defined in lib objects or daemon objects - [08Mar2006-22:49:55] Ashon@Stargate Atlantis nods - [08Mar2006-22:49:59] Brodbane@Eve defined as in commented? - [08Mar2006-22:50:05] Brodbane@Eve or just fleshed out - [08Mar2006-22:50:11] Cratylus the help system will usually give you a list of function in an object, including inherited functions, if it doesnt have a help func - [08Mar2006-22:50:37] Brodbane@Eve Good call, case in point: help time - [08Mar2006-22:50:39] Cratylus but it's kindof a halfassed and only sometimes works - [08Mar2006-22:51:30] Brodbane@Eve I keep all of the source on disk so i can search it when i find unknown functions - [08Mar2006-22:51:38] Cratylus it seems to me that what youre looking for is something like a getfunctions command that will report available functions in an objec tin human readable format - [08Mar2006-22:51:54] Cratylus and i think thats a hella good idea, and it's going high on the todo list - [08Mar2006-22:51:58] Ashon@Stargate Atlantis right but a help player or help this_player or a help ob doesn't find the functions most likely to be used in a verb - [08Mar2006-22:52:32] Brodbane@Eve The LPC manuals cover lots of that - [08Mar2006-22:52:46] Ashon@Stargate Atlantis or I should say used in most of the verbs available with the distro - [08Mar2006-22:52:48] Cratylus but right now, there isnt something as convenient as that available for me to point you to. the best i can do for right this minute is suggest that you can cobble up something dirty with functions() while i work on a more reliable command - [08Mar2006-22:54:41] Ashon@Stargate Atlantis in one day I've added two projects high up in your todo list, gosh I feel special. - [08Mar2006-22:54:47] Ashon@Stargate Atlantis smirks - [08Mar2006-22:54:51] Cratylus yeah wtf - [08Mar2006-22:54:59] Cratylus you dont need to be this precocious - [08Mar2006-22:55:09] Brodbane@Eve Yeah, i've got like 10 in the "do next year" stack - [08Mar2006-22:56:01] Ashon@Stargate Atlantis someones gotta help drive development, right? - [08Mar2006-22:56:29] Cratylus :) that's why i want people to use the lib. i cant find all this shit on my own - [08Mar2006-22:56:45] Cratylus dont let my grumbling fool you. i very much appreciate the comments - [08Mar2006-22:57:03] Brodbane@Eve He wouldn't hang out in this channel unless he liked the abuse - [08Mar2006-22:57:11] Cratylus :) - [08Mar2006-22:57:46] Brodbane@Eve If i can swing it, we should have a few more seasoned lpc guys here. None of my guys mind answering questions/helping - [08Mar2006-22:58:04] Ashon@Stargate Atlantis well, calling me precocious I take as a compliment. ;) - [08Mar2006-22:58:42] Brodbane@Eve Expealidocious? - [08Mar2006-22:59:36] Ashon@Stargate Atlantis I was doing work on TMI-2/Lima/Heaven 7 something like 10 years ago, and then shifted into writing my own. But b/c of certain problems that come with .NET 2.0 dev has stopped, and I've got some concept proofs to work out. - [08Mar2006-22:59:58] Ashon@Stargate Atlantis I just can't remember enough of LPC to get me where I should be. - [08Mar2006-23:00:34] Brodbane@Eve I may alias all the common reference functions. Ie this_player->() = TP() - [08Mar2006-23:00:40] Ashon@Stargate Atlantis and everything USED to be in a STD folder not broken up in a logical (to someone, I assume) file structure - [08Mar2006-23:00:49] Cratylus yknow i've been wondering if i should put that in the lib - [08Mar2006-23:01:15] Brodbane@Eve EN = environment - [08Mar2006-23:01:37] Brodbane@Eve i could get the defs file i made a while back, if it would be useful - [08Mar2006-23:01:45] Cratylus back when i was a padewan, i was on a mud where instead of this_player()->GetName() you'd do stuff like TP->GCN - [08Mar2006-23:02:01] Cratylus very convenient, but i wonder if it doesnt make lpc harder to learn - [08Mar2006-23:02:33] Brodbane@Eve yes and no, once you figure it out - its just easier - [08Mar2006-23:04:44] Cratylus hiya pulsar. you can use this channel for questions and stuff - [08Mar2006-23:05:02] Brodbane@Eve Cratylus, i'm going to email you my defs.h - [08Mar2006-23:05:14] Pulsar@Solinar ? - [08Mar2006-23:05:28] Cratylus this is an intermud channel between dead souls muds - [08Mar2006-23:05:44] Cratylus you'll hear lots of stuff that isnt directed at you specifically - [08Mar2006-23:05:54] Pulsar@Solinar right, i figured as much - how do i turn it off? - [08Mar2006-23:06:08] Brodbane@Eve ds - [08Mar2006-23:06:08] Cratylus type: ds - [08Mar2006-23:06:24] Brodbane@Eve there is a "hey nice to meet you" first question:) - [08Mar2006-23:06:32] Cratylus heh cant blame him - [08Mar2006-23:06:48] Dhavid@Chalice there's partial documentation for an 'addlimb' and 'removelimb' commandset... do those work? removed? ?? - [08Mar2006-23:06:50] Cratylus some people need total silence to develp stuff - [08Mar2006-23:06:52] Ashon@Stargate Atlantis yah some people are using it as a gossip channel! - [08Mar2006-23:07:19] Cratylus dhavid, AddLimb and RemoveLimb do indeed work - [08Mar2006-23:07:27] Pulsar@Solinar thanks, i haven't done ANYTHING in the mudding world in a loooong time, stumbled across this on Wikipedia and thought i'd check it out, but - lol - all the chatter makes it hard to read the docs... - [08Mar2006-23:07:29] Cratylus but they arent really command-based - [08Mar2006-23:08:01] Cratylus pulsar, your mud automatically logs ds channls, so you can just read what you missed in /log/chan/ds - [08Mar2006-23:08:55] Cratylus dhavid, to add limbs and remove them from a specific crature, you would use the AddLimb() and RemoveLimb() functions that exist in that creature's body - [08Mar2006-23:09:11] Cratylus but if what youre trying to do is amke humans have tails, that's something else - [08Mar2006-23:09:31] Cratylus for something like that you need to edit the race file in /secure/cfg/races - [08Mar2006-23:10:01] Cratylus then use admintool to remove humans as a race, and then add them back in - [08Mar2006-23:10:26] Cratylus does that answer your question? - [08Mar2006-23:10:28] Dhavid@Chalice well not really have tails... more along the lines of makings humans and/or all races have about 4-5 more limbs each... - [08Mar2006-23:10:36] Dhavid@Chalice yes it does... ima do that... thx - [08Mar2006-23:10:50] Cratylus ohh yes, this is the thing where you want wrists and ankles and such - [08Mar2006-23:11:00] Dhavid@Chalice heh, uh huh - [08Mar2006-23:11:22] Cratylus listen, i think that's cool and everything, but it really is a bigger project than it sounds - [08Mar2006-23:11:40] Dhavid@Chalice yeah i know... i'm just havin fun playin around... ima see what happens - [08Mar2006-23:12:38] Cratylus if you want to make it so people can wear anklets and stuff, you'll need to do modifications to /lib/body.c, /lib/std/armor.c and /include/armor_types.h - [08Mar2006-23:13:22] Ashon@Stargate Atlantis not quite as easy as adding wear location flags like in ROM. - [08Mar2006-23:13:26] Ashon@Stargate Atlantis chortles. - [08Mar2006-23:13:47] Cratylus the big problem with this is that if you hose up the body.c object, for example, if you log out, you may not be able to log back in - [08Mar2006-23:13:57] Cratylus so make sure you make lots of backups - [08Mar2006-23:14:15] Dhavid@Chalice i have a directory of about 70 backups so far...heh - [08Mar2006-23:14:21] Cratylus nods. - [08Mar2006-23:14:23] Brodbane@Eve bk command is nice - [08Mar2006-23:14:47] Cratylus it needs some finessing, but yeah, it does the job pretty well - [08Mar2006-23:15:07] Brodbane@Eve i like it because i'm lazy - [08Mar2006-23:15:15] Cratylus i made it because i'm lazy - [08Mar2006-23:18:42] Ashon@Stargate Atlantis welp, I'm going afk for a couple of hours. - [08Mar2006-23:19:33] Cratylus@Frontiers waves. - [08Mar2006-23:31:20] Brodbane@Eve I've been trying to use the ftp directory. But files suddenly become 'read only' and screw up the ftp client - [08Mar2006-23:33:21] Cratylus weird - [08Mar2006-23:33:29] Cratylus what OS? - [08Mar2006-23:33:39] Brodbane@Eve win32 - [08Mar2006-23:33:41] Brodbane@Eve xp - [08Mar2006-23:33:47] Cratylus ntfs? - [08Mar2006-23:33:49] Brodbane@Eve yes - [08Mar2006-23:34:09] Cratylus my guess is the problem might be there - [08Mar2006-23:35:56] Brodbane@Eve The mud seems to make all files read only, including directories - [08Mar2006-23:36:10] Cratylus thats a new one on me - [08Mar2006-23:36:24] Brodbane@Eve hmm - [08Mar2006-23:36:36] Cratylus but you can edit and save stuff, right? you mean the ftp client does this - [08Mar2006-23:36:50] Cratylus s/client/server - [08Mar2006-23:37:24] Brodbane@Eve i can edit stuff, yes - [08Mar2006-23:37:28] Cratylus whew ok - [08Mar2006-23:37:36] Brodbane@Eve the issues is ftp - [08Mar2006-23:37:58] Brodbane@Eve issues = issue - [08Mar2006-23:38:08] Brodbane@Eve not the internal one, a third party - [08Mar2006-23:38:20] Cratylus oh - [08Mar2006-23:38:48] Cratylus !(my code) == !(my problem) - [08Mar2006-23:40:57] Brodbane@Eve i've confirmed it on two machines. All files within c:\ds are read-only - [08Mar2006-23:41:03] Brodbane@Eve and are constantly reattribed - [08Mar2006-23:41:13] Cratylus that's interesting - [08Mar2006-23:41:31] Cratylus that tends to creep into (my problem) territory - [08Mar2006-23:41:37] Cratylus almost - [08Mar2006-23:41:47] Brodbane@Eve yes, its almost bordering on a lib issue - [08Mar2006-23:42:05] Cratylus for one thing it sounds like this is probably a source of cpu/iowait overhead - [08Mar2006-23:42:26] Brodbane@Eve i'm sure its taxing - [08Mar2006-23:42:28] Cratylus what's the cpu use on the driver process? - [08Mar2006-23:42:36] Brodbane@Eve one sec - [08Mar2006-23:42:42] Brodbane@Eve i'll get up the perf mon - [08Mar2006-23:44:26] Brodbane@Eve idle mud (no connections) is running at less then a percent - [08Mar2006-23:44:40] Cratylus mmkay - [08Mar2006-23:45:02] Cratylus well i have bad news - [08Mar2006-23:45:22] Cratylus i have nfc at all why you're making read only files - [08Mar2006-23:45:53] Cratylus hmm - [08Mar2006-23:45:55] Brodbane@Eve very strange indeed. My home computer was just reinstalled - [08Mar2006-23:45:59] Cratylus hang on - [08Mar2006-23:46:41] Cratylus well your files must be read-write for the file owner - [08Mar2006-23:47:07] Cratylus and if theyre not, ther emust be some sort of win32 feature that forces read write for owners - [08Mar2006-23:47:17] Cratylus otherwise you couldnt run at all - [08Mar2006-23:47:41] Brodbane@Eve ok, i can understand that much - [08Mar2006-23:47:53] Cratylus the proble you're describing just might also exist on the unix version - [08Mar2006-23:48:31] Cratylus this third party app, is it running under the same user as your mud process? - [08Mar2006-23:48:54] Brodbane@Eve the server is filezilla, its running as a service under local system - [08Mar2006-23:49:10] Brodbane@Eve i checked my file permissions. Owner/Creator has no rights checked - [08Mar2006-23:49:24] Cratylus i dont know that terminology, but it sounds like theres a user id conflict - [08Mar2006-23:49:46] Brodbane@Eve true, very true - [08Mar2006-23:49:50] Brodbane@Eve i can change its user - [08Mar2006-23:49:56] Cratylus basically, my gues is that if your ftp server ran as administrator or as the mud file owner, you'd have no prob - [08Mar2006-23:50:36] Cratylus from looking at the unix version of dead souls, the same problem would probably occur there if an unprivileged user tried to wrote to the ds directory - [08Mar2006-23:50:56] Cratylus thing is, i'm not sure that's a "problem" so much as intended behavior - [08Mar2006-23:51:40] Brodbane@Eve yeah yeah, its a feature - [08Mar2006-23:51:44] Brodbane@Eve security feature - [08Mar2006-23:52:00] Cratylus i dont think it's OS specific or DS specific - [08Mar2006-23:52:17] Brodbane@Eve You would think "local system" trumps users - [08Mar2006-23:52:33] Cratylus ahh now we're into the metaphysics of windows - [08Mar2006-23:52:47] Cratylus thats well beyond my capacity to understand - [08Mar2006-23:52:47] Brodbane@Eve well that worked - [08Mar2006-23:53:01] Cratylus groovy - [08Mar2006-23:53:17] Brodbane@Eve ok, new faq section. Third party ftp support - [08Mar2006-23:53:31] Brodbane@Eve Filezilla: Run it as the same user you launch the mud from - [08Mar2006-23:53:31] Cratylus heh. i dont even support the built in ftp server - [08Mar2006-23:53:45] Brodbane@Eve i know, but its vital and a half - [08Mar2006-23:53:45] Cratylus but yeah, i'll throw it into the faq - [08Mar2006-23:53:59] Brodbane@Eve Filezilla = free, on source forge as well - [08Mar2006-23:54:15] Cratylus nods. - [09Mar2006-01:24:13] Brodbane@Eve Anyone notice how cryptic the error messages are? My old mudos mud had actual line references.. - [09Mar2006-02:00:01] Ashon@Stargate Atlantis yah. - [09Mar2006-07:55:25] Cratylus do you mean you're used to more output that what's described here? http://dead-souls.sourceforge.net/debugging.html - [09Mar2006-11:46:36] Ashon@Stargate Atlantis *yawn* morning. - [09Mar2006-14:12:39] Ashon@Stargate Atlantis quiet day today? - [09Mar2006-14:38:39] Ashon@Stargate Atlantis is there a reason that there isn't a base obj.h that all the other objects inherit? - [09Mar2006-15:37:09] Cratylus most tangible objects inherit /lib/std/item.c - [09Mar2006-15:46:26] Ashon@Stargate Atlantis nods. - [09Mar2006-15:46:52] Ashon@Stargate Atlantis found it by following the inheritance scheme. - [09Mar2006-15:57:07] Ashon@Stargate Atlantis that's where 95% of the lfuns that are relevant to verbs are anyhow. - [09Mar2006-15:57:15] Ashon@Stargate Atlantis that's two problems down for me. - [09Mar2006-19:01:22] Ashon@Stargate Atlantis the error logs need a timestamp! - [09Mar2006-19:07:32] Cratylus heh - [09Mar2006-19:07:40] Cratylus i just coded that 30 minutes ago - [09Mar2006-19:07:48] Cratylus it'll be in the next release - [09Mar2006-19:08:22] Ashon@Stargate Atlantis sweet. - [09Mar2006-19:08:32] Kristus@The Hollow what did you code? - [09Mar2006-19:08:42] Ashon@Stargate Atlantis Cratylus(tm) now the with Precognition abilities. - [09Mar2006-19:09:15] Cratylus http://dead-souls.net/master.c - [09Mar2006-19:09:35] Cratylus you can pop that over your current master.c and your error logs will have timestamps - [09Mar2006-19:09:49] Cratylus but you should bk /secure/daemon/master just in case - [09Mar2006-19:13:36] Cratylus another new feature in that master.c is what brodbane was requesting before: mor explicit error messages on update - [09Mar2006-19:29:57] Ashon@Stargate Atlantis okay, quick I hope question. I got my verb finally compiling. But it keeps spitting out results from an copy of the verb - [09Mar2006-19:30:27] Ashon@Stargate Atlantis and I can't figure out how to get the phantasmal result from haunting me. - [09Mar2006-19:31:04] Ashon@Stargate Atlantis do I have unload/dest the verb daemon or something? - [09Mar2006-19:34:23] Kristus@The Hollow try rehashing it - [09Mar2006-19:34:35] Kristus@The Hollow the verb dir that is - [09Mar2006-19:34:41] Ashon@Stargate Atlantis nods - [09Mar2006-19:35:55] Ashon@Stargate Atlantis still no - [09Mar2006-19:38:30] Kristus@The Hollow did that work? - [09Mar2006-19:38:38] Ashon@Stargate Atlantis nope. - [09Mar2006-19:38:48] Kristus@The Hollow then reboot :p - [09Mar2006-19:55:01] Cratylus ok i'm back - [09Mar2006-19:55:11] Cratylus can you explain the problem in more detail? - [09Mar2006-19:55:43] Ashon@Stargate Atlantis un segunda - [09Mar2006-19:57:16] Ashon@Stargate Atlantis okay, so I've been trying to get this verb to just put out some test responses. - [09Mar2006-19:57:28] Ashon@Stargate Atlantis which I've gotten to work. - [09Mar2006-19:57:56] Cratylus mkay - [09Mar2006-19:57:56] Ashon@Stargate Atlantis but I'm getting the failure message at the same time, which no longer exists in the current .c file - [09Mar2006-19:58:12] Cratylus what's the name of the verb? - [09Mar2006-19:58:20] Ashon@Stargate Atlantis repair - [09Mar2006-19:58:28] Cratylus hmm - [09Mar2006-19:59:08] Cratylus sometimes, if a verb is updated in one location, then moved to another, then updated again, this can happen - [09Mar2006-19:59:14] Cratylus does that sound plausible in this case? - [09Mar2006-19:59:41] Ashon@Stargate Atlantis yes, for someone reason it appeared in cmd/players - [09Mar2006-19:59:55] Cratylus does that file exist currently? - [09Mar2006-19:59:59] Ashon@Stargate Atlantis no - [09Mar2006-20:00:29] Cratylus try: update /daemon/verbs - [09Mar2006-20:00:55] Ashon@Stargate Atlantis still getting the phantam response. - [09Mar2006-20:01:17] Cratylus give me 5 minutes - [09Mar2006-20:01:53] Ashon@Stargate Atlantis nods - [09Mar2006-20:02:45] Jezu@The Hollow are you behind a firewall, ashon? - [09Mar2006-20:03:24] Ashon@Stargate Atlantis might be - [09Mar2006-20:05:00] Cratylus i'm reproducing the problem. so far so good - [09Mar2006-20:05:58] Cratylus hmmm - [09Mar2006-20:06:19] Cratylus when i create conflicting verbs, the lst one updated appears to take precedence - [09Mar2006-20:06:33] Cratylus do you have shell access to your mud platform? - [09Mar2006-20:07:01] Ashon@Stargate Atlantis just running the windows version @ home for dev - [09Mar2006-20:07:09] Cratylus heh - [09Mar2006-20:07:31] Cratylus would you mind opening an explorer window and searching the ds dir for repair.c? - [09Mar2006-20:07:43] Cratylus i'd like to know how many currently exist - [09Mar2006-20:08:01] Kristus@The Hollow does the windows version actually work well? - [09Mar2006-20:08:05] Cratylus just like unix - [09Mar2006-20:08:15] Ashon@Stargate Atlantis haven't had any problems with it yet. - [09Mar2006-20:08:21] Cratylus a player or creator sees no diffrerence unless they run the version command - [09Mar2006-20:08:33] Kristus@The Hollow nice - [09Mar2006-20:08:47] Kristus@The Hollow so ls and stuff is still there? - [09Mar2006-20:08:55] Cratylus it's the exact same mud - [09Mar2006-20:09:01] Ashon@Stargate Atlantis of course. - [09Mar2006-20:12:04] Cratylus ok, run this: eval return load_object("/daemon/verbs")->GetVerbs()["use"] - [09Mar2006-20:12:10] Cratylus ok, run this: eval return load_object("/daemon/verbs")->GetVerbs()["repair"] - [09Mar2006-20:12:18] Cratylus sorry, "use" was my test verb over here - [09Mar2006-20:12:28] Cratylus ok, run this: eval return load_object("/daemon/verbs")->GetVerbs()["zap"] - [09Mar2006-20:12:37] Cratylus Oh fer FUCK sake - [09Mar2006-20:13:03] Ashon@Stargate Atlantis Result = "/verbs/players/repair.c - [09Mar2006-20:13:37] Cratylus did you do a search for repair.c ? - [09Mar2006-20:14:11] Ashon@Stargate Atlantis yah, it's only in the /verbs/players, except for a .bak made by the bk cmd - [09Mar2006-20:14:27] Cratylus ok, here's what i think should happen - [09Mar2006-20:15:17] Cratylus erm - [09Mar2006-20:15:29] Cratylus mind if i log into yer mud? - [09Mar2006-20:16:04] Ashon@Stargate Atlantis np - [09Mar2006-20:16:54] Cratylus i think jezu is right. i think you're firewalled - [09Mar2006-20:17:20] Cratylus the reason i want to log in is that i'm not able to replicate your exact problem - [09Mar2006-20:17:20] Ashon@Stargate Atlantis 216.254.22.116 - [09Mar2006-20:17:36] Cratylus i can make divergent versions of verbs, but the last one i update is the one that takes precedence - [09Mar2006-20:18:20] Ashon@Stargate Atlantis lemme reconfig my firewall - [09Mar2006-20:20:59] Kristus@The Hollow are you using a router? - [09Mar2006-20:21:55] Ashon@Stargate Atlantis yah, just gotta do some port fowarding - [09Mar2006-20:22:01] Kristus@The Hollow cool - [09Mar2006-20:24:54] Ashon@Stargate Atlantis okay should be fowarded now. - [09Mar2006-20:25:45] Cratylus i'm trying 216.254.22.113 6666 and 216.254.22.116 6666 but no dice - [09Mar2006-20:27:17] Ashon@Stargate Atlantis try again - [09Mar2006-20:27:41] Ashon@Stargate Atlantis on the .113 - [09Mar2006-20:39:25] Ashon@Stargate Atlantis okay, I got bubmped around by all the portable devices in the house, should work now - [09Mar2006-20:59:13] Cratylus for those interested, it's a documentation issue. i will make things clearer in upcoming verb creation docs - [09Mar2006-20:59:29] Ashon@Stargate Atlantis UPCOMING? - [09Mar2006-20:59:35] Cratylus hey im just the one guy - [09Mar2006-21:00:13] Ashon@Stargate Atlantis I'm just disappointed that there really isn't any help on the web about doing lpc verbs. - [09Mar2006-21:00:21] Cratylus you're not the only one - [09Mar2006-21:00:37] Cratylus lack of verb documentation is thing #2 that killed lpc development - [09Mar2006-21:00:45] Cratylus thing #1, imo, is ed - [09Mar2006-21:01:05] Ashon@Stargate Atlantis I think ed is fine, once you learn how to use it. - [09Mar2006-21:01:27] Cratylus thats because your brain has integrated with it - [09Mar2006-21:01:37] Cratylus for new people, it's not so grokkable - [09Mar2006-21:01:41] Ashon@Stargate Atlantis I had to write my first massive game in ed for my comp sci weeder class back in college so I learned how to operate it pretty smoothly. - [09Mar2006-21:01:47] Ashon@Stargate Atlantis true. - [09Mar2006-21:02:28] Ashon@Stargate Atlantis don't go far cratylus, I got some more verb related questions, but I gotta grab a quick smoke. - [09Mar2006-21:02:42] Cratylus k. i'm afk for a few minutes too - [09Mar2006-21:05:26] Jerin@Jerins Folly Meh, I skip ed and use shell, makes life a lot easier when you're used to that in other projects - [09Mar2006-21:05:37] Jerin@Jerins Folly I did all my coding on a diku mud thru shell pretty much - [09Mar2006-21:06:33] Cratylus for standard stuff i use vi, for complex projects i use gvim. ed is a last resort to me - [09Mar2006-21:06:57] Ashon@Stargate Atlantis yah, well I chose a windows based lib so I can just use visual studio and multitask while I'm at it. - [09Mar2006-21:06:57] Cratylus i figure i'm an old fart and *i* feel that way, new people must despise it - [09Mar2006-21:07:01] Cratylus hence, qcs - [09Mar2006-21:07:11] Ashon@Stargate Atlantis mmmm vi - [09Mar2006-21:07:23] Jerin@Jerins Folly man, you guys like hurtin yourself :p - [09Mar2006-21:07:35] Cratylus no i actually really like vi - [09Mar2006-21:07:51] Jerin@Jerins Folly lemme correct myself, I'll use pico for somethin quick, and jedit for somethin large - [09Mar2006-21:07:55] Cratylus once you get a feel for it, it's awesome for code development - [09Mar2006-21:08:03] Jerin@Jerins Folly I see vi like I see ed I think - [09Mar2006-21:08:13] Cratylus well let me make a correction - [09Mar2006-21:08:27] Cratylus "official" vi lacks stuff - [09Mar2006-21:08:31] Cratylus vim r0x - [09Mar2006-21:08:48] Jerin@Jerins Folly lol - [09Mar2006-21:09:28] Cratylus i went from vi to vim and was floored to discover that if you highlight a bracket, then type "%", your cursor jumps to the matching opposite bracket in the code - [09Mar2006-21:09:40] Cratylus i pretty much creamed my pants right there - [09Mar2006-21:09:56] Jerin@Jerins Folly holy crap, ya, that's nice, that's why I like jedit - [09Mar2006-21:19:45] Ashon@Stargate Atlantis okay so I put the repair.c in event, just basically cp'd bury.c from that folder and changed the text from direct_bury_obj_... to direct_repair_obj, rebooted the mud (so I didn't have to reload everything) and am still getting the same error. - [09Mar2006-21:32:59] Cratylus ya - [09Mar2006-21:33:57] Ashon@Stargate Atlantis -_- - [09Mar2006-21:33:59] Cratylus any object that inherits /lib/events/repair needs a recursive update or reload for the new inheritable to take effect - [09Mar2006-21:34:42] Ashon@Stargate Atlantis which is why I did the reboot. - [09Mar2006-21:34:46] Cratylus oh - [09Mar2006-21:34:52] Cratylus hang on - [09Mar2006-21:35:48] Ashon@Stargate Atlantis I gotta add a call from lib.h and LIB_REPAIR to item.c don't I? - [09Mar2006-21:36:26] Cratylus hmmmmmmmm - [09Mar2006-21:53:41] Cratylus woohoo sixteen ds muds online at once. a record. - [09Mar2006-21:53:47] Cratylus mudlist -m dead - [09Mar2006-21:55:26] Jerin@Jerins Folly Nice - [09Mar2006-22:10:20] Ashon@Stargate Atlantis I must say that Cratylus here is one of the best lib dev's I've had the joy of working with. - [09Mar2006-22:11:13] Ashon@Stargate Atlantis he will start hating me soon, if he hasn't already, because I'm trying to get past the learning curve so quickly. - [09Mar2006-22:14:09] Cratylus heh - [09Mar2006-22:14:32] Cratylus well yer way way way way ahead of anything i expected at this point - [09Mar2006-22:14:46] Cratylus good motivator - [09Mar2006-22:15:34] Ashon@Stargate Atlantis I'm just trying to get a prove that with lpc one can create a quest based mud where all of the quest are interesting and dynamically created. - [09Mar2006-22:15:46] Ashon@Stargate Atlantis nothing big. - [09Mar2006-22:15:50] Ashon@Stargate Atlantis sighs. - [09Mar2006-22:16:02] Cratylus i have zero knowledge of rom/circle/diku/smaug/etc - [09Mar2006-22:16:26] Cratylus so i cant say lpc is better - [09Mar2006-22:16:30] Cratylus but i like it - [09Mar2006-22:16:48] Jerin@Jerins Folly Eh, personal preference, it's kinda like which programming language is better or who's hotter - [09Mar2006-22:16:50] Ashon@Stargate Atlantis LPC is better b/c of the interpreted code. - [09Mar2006-22:18:43] Ashon@Stargate Atlantis okay well I'm gonna log, let things stew. But I'm having trouble getting lfuns to work in my verbs. - [09Mar2006-22:18:49] Ashon@Stargate Atlantis waves. - [09Mar2006-22:20:53] Cratylus waves. - [09Mar2006-23:59:09] Cratylus looks like intermud is back up - [10Mar2006-02:51:14] Ashon@Stargate Atlantis does it always go down late at night? - [10Mar2006-05:56:24] Cratylus not normally - [10Mar2006-05:56:54] Cratylus it's been extra flaky the past couple of weeks - [10Mar2006-09:49:32] Brodbane@Eve Good morning guys - [10Mar2006-09:51:22] Cratylus hiya - [10Mar2006-09:52:08] Brodbane@Eve Hey Cratylus, if you make a change to interactive.c, and then do a update -r interactive.c... what would you be missing to get the changes to propogate - [10Mar2006-09:52:27] Cratylus it depends on what you're trying to do - [10Mar2006-09:52:37] Brodbane@Eve eventDescribeEnvironment - [10Mar2006-09:53:01] Cratylus if you want your character to use the new stuff, you need to update -r /lib/creator, then log out and log back in - [10Mar2006-09:54:03] Brodbane@Eve excellent. I knew i missed something - [10Mar2006-09:54:11] Cratylus btw to see what changes have been implemented in the development mud, log into dead-souls.net 6666 and read /doc/RELEASE_NOTES - [10Mar2006-09:55:17] Brodbane@Eve Oh my gosh, your level of throughness threatens me - [10Mar2006-09:55:27] Cratylus heh - [10Mar2006-09:55:46] Ptah@Eve I am threatened by an strong male - [10Mar2006-09:55:56] Cratylus the RELEASE_NOTES on dead-souls.net have stuff not on your mud - [10Mar2006-10:02:46] Ptah@Eve I guess Crats is a similar age to me for that reference - [10Mar2006-10:02:56] Cratylus smirks. - [10Mar2006-10:03:06] Cratylus walk this way... - [10Mar2006-10:03:24] Ptah@Eve ahahah, the more brilliant piece of comic genius ever filmed - [10Mar2006-10:03:26] Brodbane@Eve hmm, i'm going to have to start noting our changes Ptah. Every mudlib upgrade is going to be abear - [10Mar2006-10:03:38] Ptah@Eve lets just not upgrade then - [10Mar2006-10:03:46] Cratylus unfortunately yes, if you make a lot of lib customization - [10Mar2006-10:03:48] Brodbane@Eve But i like whats in his notes - [10Mar2006-10:04:18] Ptah@Eve Damnit, now I have to rent that movie this weekend - [10Mar2006-10:04:36] Brodbane@Eve When we do upgrades i'm not going to jump on them - [10Mar2006-10:04:42] Brodbane@Eve i'm going to setup a mirror server - [10Mar2006-10:04:46] Brodbane@Eve so we can review - [10Mar2006-10:04:52] Cratylus you're not the only one this bothers - [10Mar2006-10:05:04] Cratylus there are a couple of muds still at r8 - [10Mar2006-10:05:41] Cratylus they tend to drop off the mudlist because r8 doesnt have the intermud keepalive - [10Mar2006-10:07:27] Cratylus still, i figure i'd rather be obnoxious for too many fixes and updates than not enough - [10Mar2006-10:08:09] Ptah@Eve We could write something that would re-apply our changes Brod. Kinda an upgrade engine - [10Mar2006-10:08:44] Ptah@Eve do a dif, we segment our code off with specific comments - [10Mar2006-10:12:29] Brodbane@Eve Zmud V7.21 is very nice. If anyone was looking into *buying* it. - [10Mar2006-10:13:31] Cratylus yeh, when i have to use windows, i use an old zmud from pre-nazi days - [10Mar2006-10:13:45] Ptah@Eve Nazi's didnt charge for their services - [10Mar2006-10:13:51] Brodbane@Eve I was using it, but i found it to do a couple of things that really irratated me - [10Mar2006-10:13:55] Cratylus doesnt try to authenticate with Big Money Guy - [10Mar2006-10:14:17] Ptah@Eve Powah to the people! Down with whitey! - [10Mar2006-10:14:36] Cratylus when the revolution comes, zugg will be first up against the wall - [10Mar2006-10:14:50] Brodbane@Eve Mine doesnt communicate with him.. how odd - [10Mar2006-10:15:20] Ptah@Eve Man... the Dennis Milleresque references from the past, I am gonna have to keep on my toes around you - [10Mar2006-10:15:44] Brodbane@Eve i'm a welp, so i'll just overlook your grown up references - [10Mar2006-10:16:10] Ptah@Eve Brodbane is like a doughboy with a Chenault when it comes to our witty repertoire - [10Mar2006-10:16:30] Cratylus i'm not engaging in some kinda cultural reference arms race - [10Mar2006-10:16:56] Brodbane@Eve I have google you know - [10Mar2006-10:17:12] Ptah@Eve and now, google has you - [10Mar2006-10:17:31] Brodbane@Eve http://www.kmtdesigns.com/kenandheidi.jpg - [10Mar2006-10:17:57] Ptah@Eve Sexy! Very hot! And the girls' ok too - [10Mar2006-10:18:09] Brodbane@Eve Yeah, she just had a baby - [10Mar2006-10:18:23] Ptah@Eve you poor poor fool - [10Mar2006-10:18:37] Brodbane@Eve that picture is now 4 years old - [10Mar2006-10:18:41] Brodbane@Eve i was sexier then - [10Mar2006-10:20:27] Ptah@Eve after 3 kids and the loss of 4 years of sleep between those babies... I have nothing but evil delight at the pain new parents go through - [10Mar2006-10:20:27] Brodbane@Eve Pain? My wife does all the work - [10Mar2006-10:20:27] Ptah@Eve That'll change - [10Mar2006-10:20:27] Ptah@Eve or you'll be single, either or, still pain - [10Mar2006-10:22:12] Brodbane@Eve Our baby is easssy-mode. I'm convinced that i'm not her father - [10Mar2006-10:22:32] Ptah@Eve ok, not touching that one - [10Mar2006-10:23:42] Ashon@Stargate Atlantis morning folks. - [10Mar2006-10:24:00] Brodbane@Eve Hello - [10Mar2006-10:24:03] Ptah@Eve Who are you, I do not recognize your IDC - [10Mar2006-10:24:29] Ashon@Stargate Atlantis oh I've been around for quite awhile. - [10Mar2006-10:24:53] Brodbane@Eve Which one is McGuyver on? - [10Mar2006-10:24:57] Ptah@Eve CLOSE THE IRIS! - [10Mar2006-10:25:01] Ptah@Eve yeah - [10Mar2006-10:25:05] Ptah@Eve er, sg1 - [10Mar2006-10:27:00] Ptah@Eve er mistell - [10Mar2006-10:28:24] Cratylus ashon was just workin on yer email - [10Mar2006-10:28:34] Cratylus ill send you what ive done so far - [10Mar2006-10:29:06] Ashon@Stargate Atlantis w00t! - [10Mar2006-10:29:16] Cratylus i think you need to add a check to that line 21 - [10Mar2006-10:29:38] Cratylus something like if(ob && ob->GetDamagePoints()) - [10Mar2006-10:30:59] Ashon@Stargate Atlantis okay but in the can_ I wanna check if the damagepoints() > 0 before they actually do anything to it. - [10Mar2006-10:31:23] Cratylus@Frontiers i think that can_ functions tend to distort the arg type they get...it's not clear to me that it will be a reliable thing to try to do in a can_ - [10Mar2006-10:32:03] Cratylus some checks have to happen in do_ funcs, as counterintuitive as it seems - [10Mar2006-10:32:17] Cratylus read: "stupid as it seems" - [10Mar2006-10:33:40] Ptah@Eve mooch da nooch - [10Mar2006-10:33:44] Ashon@Stargate Atlantis but a quick check in other verbs seems that most of them are doing some to a lot of checks in the can - [10Mar2006-10:33:48] Cratylus yes - [10Mar2006-10:33:52] Cratylus simple checks - [10Mar2006-10:34:06] Cratylus stuff with this_player() and stuff - [10Mar2006-10:34:26] Cratylus not usually with non-string types as arguments - [10Mar2006-10:35:06] Cratylus if you do see that, either it is irrelevant to the logic of the check, or the verb author got lucky and wrote a bug that works - [10Mar2006-10:35:56] Ashon@Stargate Atlantis that doesn't make sense! - [10Mar2006-10:36:04] Ashon@Stargate Atlantis starts sobbing. - [10Mar2006-10:36:04] Cratylus it *almost* does - [10Mar2006-10:36:24] Cratylus i'm not going to defend a parser design that isnt mine, but i think i know what they were getting at - [10Mar2006-10:37:17] Cratylus the can_ funcs are supposed to do basic checks of the type "can the person calling this verb physically access the object being worked on, and/or is there something hosed/wrong about this person that should invalidate the verb" - [10Mar2006-10:37:37] Ashon@Stargate Atlantis the can_ functionality should handle int returns just as easy as string returns - [10Mar2006-10:37:57] Cratylus mmm i'll need more information to understand that - [10Mar2006-10:38:09] Cratylus oh you mean args - [10Mar2006-10:38:15] Cratylus yeah, "should" - [10Mar2006-10:38:55] Cratylus but i dont rely on them to do so. maybe you'll find some feature of them i missed - [10Mar2006-10:39:13] Cratylus but if you dont. just do your complex checks in the do_funcs - [10Mar2006-10:39:31] Ashon@Stargate Atlantis I expect this problem to be fixed in the next release. - [10Mar2006-10:39:35] Cratylus heh - [10Mar2006-10:39:49] Ptah@Eve just change every skill check to rock paper sissors - [10Mar2006-10:39:51] Cratylus parser design is way above my pay grade. it's all i can do to just understand it - [10Mar2006-10:40:18] Cratylus the last parser bug i fixed, i have no idea how i did it - [10Mar2006-10:40:20] Ashon@Stargate Atlantis okay so simple checks to this_player, and nothing else. - [10Mar2006-10:40:34] Cratylus pretty much ya - [10Mar2006-10:42:38] Ashon@Stargate Atlantis Agggh! It worked moving it too the do_ - [10Mar2006-10:43:06] Ashon@Stargate Atlantis Now I must hunt down Descartes and kill him slowly. George Reese, I am coming for you! - [10Mar2006-10:43:36] Cratylus heh he's not smart enough to design the parser either - [10Mar2006-10:43:43] Cratylus its mudos stuff - [10Mar2006-10:46:07] Ashon@Stargate Atlantis so now that I've gotten over the "little" bumps in the road, I should be cranking out verbs like crazy today. Good. - [10Mar2006-10:46:31] Cratylus i'm not scheduled to go anywhere today so i'll prolly be around to help - [10Mar2006-10:46:55] Cratylus i must say that's the fastest verb learning curve climb i've ever seen - [10Mar2006-10:47:18] Cratylus took me months to sweat it out - [10Mar2006-10:48:00] Brodbane@Eve shuuu, wait till you get to adverbs - [10Mar2006-10:48:02] Ashon@Stargate Atlantis Today verbs, tomorrow the Parser! - [10Mar2006-10:48:26] Cratylus damn dud, if you get leet enough to play with the parser i'll friggin pay you a salary - [10Mar2006-10:49:00] Cratylus hope you accept gummy bears and pocket lint and legal tender - [10Mar2006-10:49:16] Cratylus s/and legal/as legal - [10Mar2006-10:49:22] Brodbane@Eve Do what I do, pay your guys with the money tree.. - [10Mar2006-10:49:26] Ashon@Stargate Atlantis I wrote the command parser for my Wheelmud project. - [10Mar2006-10:49:52] Cratylus c++? - [10Mar2006-10:50:00] Ashon@Stargate Atlantis which is not an interpreted code parser. - [10Mar2006-10:50:10] Ashon@Stargate Atlantis yah right. VB - [10Mar2006-10:50:14] Cratylus heh - [10Mar2006-10:50:45] Ptah@Eve Heh, I did the same thing as a Proof of concept for a rules engine - [10Mar2006-10:50:45] Ashon@Stargate Atlantis with .net it's a viable programming language. so let's not go there. - [10Mar2006-10:50:49] Cratylus i'd look into the parser myself for real but it involves knowing what i'm doing with c++ and i only have this one lifetime - [10Mar2006-10:51:11] Brodbane@Eve You're in luck, all I do is C++ - [10Mar2006-10:51:21] Cratylus smiles. - [10Mar2006-10:51:29] Ptah@Eve real men use C and nothing but pointers - [10Mar2006-10:51:31] Cratylus you better hope i forget you said that - [10Mar2006-10:51:57] Brodbane@Eve Is mudos source with the lib? - [10Mar2006-10:52:03] Cratylus yip - [10Mar2006-10:52:13] Brodbane@Eve ohhh, pandora's box is calling me - [10Mar2006-10:52:21] Ptah@Eve I wont mention I do C unix programming then either - [10Mar2006-10:52:23] Cratylus the cygwin-modified source comes with the windows version too - [10Mar2006-10:52:53] Brodbane@Eve its worth checking out - [10Mar2006-10:52:53] Ashon@Stargate Atlantis FEATURE REQUEST: Have the previous days ds channels renamed and backed up for easy reference! - [10Mar2006-10:52:59] Cratylus its practically the same as the unix source, just a few lines changed here and there - [10Mar2006-10:54:40] Brodbane@Eve If i'm going to burn time, i'm going to do a mud socket project - [10Mar2006-10:54:56] Brodbane@Eve and revamp our intermud communication with some peer to peer activity - [10Mar2006-10:55:22] Cratylus that would be worth a dispensation - [10Mar2006-10:55:30] Ptah@Eve does the current mudos use interrupts for connections and incoming data events? - [10Mar2006-10:55:38] Cratylus heh - [10Mar2006-10:55:44] Cratylus let me know when you find out - [10Mar2006-10:56:04] Brodbane@Eve i doubt its asynchronous - [10Mar2006-10:56:18] Ashon@Stargate Atlantis ack, sockets, might as well go through recode the mudos sockets and throw in some apartment threading while your at it. - [10Mar2006-10:56:22] Cratylus if you ask in a non-lazy sounding way, intercre sometimes has people with helpful answers to such qustions - [10Mar2006-10:56:30] Ptah@Eve Well, if you just pound read() it pegs the cpu - [10Mar2006-10:56:46] Cratylus do not mention threading and mudos in the same breath on intercre tho - [10Mar2006-10:56:59] Ptah@Eve FORK() that! - [10Mar2006-10:57:09] Brodbane@Eve FYI, board 'read' is bugged - [10Mar2006-10:57:23] Brodbane@Eve if you just do a 'read' it throws a nice error - [10Mar2006-10:57:23] Cratylus yeh? doesnt surprise me - [10Mar2006-10:57:33] Cratylus i think it still uses an add_action, right? - [10Mar2006-10:57:55] Ptah@Eve Yes - [10Mar2006-10:58:03] Ptah@Eve read and post are add_actions - [10Mar2006-10:58:09] Brodbane@Eve The mud needs a better efun then add_action - [10Mar2006-10:58:17] Brodbane@Eve such as add_checked_action - [10Mar2006-10:58:19] Cratylus i'll verbidy boards. not top priority tho - [10Mar2006-10:58:25] Brodbane@Eve that actually does the idiot proofing in advance - [10Mar2006-10:58:27] Cratylus verbify - [10Mar2006-10:58:37] Ptah@Eve what idiots are wizards that are coding? - [10Mar2006-10:58:45] Ptah@Eve Er um, nvm, too many examples - [10Mar2006-10:59:17] Brodbane@Eve i'm going to write in a new add_action that simply checks to make sure the action is directed at that object/room - [10Mar2006-11:03:46] Cratylus ok, next release now includes a workaround for that board bug - [10Mar2006-12:27:02] Brodbane@Eve When is the next version scheduled for a release? - [10Mar2006-12:27:40] Cratylus heh - [10Mar2006-12:28:10] Cratylus well i dunno i been flirting with the idea of doing it soon - [10Mar2006-12:28:44] Cratylus but i hate to release a bunch of compat busters only to do it again shortly after - [10Mar2006-12:29:02] Brodbane@Eve we haven't even touched compat yet - [10Mar2006-12:36:22] Brodbane@Eve Cratylus, if you were going to improve intermud what feature set would you add in? - [10Mar2006-12:36:57] Cratylus can you give me an example of what you mean? - [10Mar2006-12:37:31] Brodbane@Eve What would you change about intermud to make it more usable. Not talking reliable here - [10Mar2006-12:37:49] Cratylus well - [10Mar2006-12:38:43] Cratylus if you mean the intermud subsystem on a mud, i've been meaning to implement intermud mail - [10Mar2006-12:38:53] Cratylus but it is a lot more complicated than it sounds - [10Mar2006-12:39:09] Brodbane@Eve you might as well rewrite intermud - [10Mar2006-12:39:19] Kriton@Emerald MUD but why? - [10Mar2006-12:39:23] Cratylus nah actually theres intermud support for it, it's just a real pain in the ass - [10Mar2006-12:39:29] Kriton@Emerald MUD whats wrong with it? - [10Mar2006-12:40:07] Kriton@Emerald MUD I2 was flakey as hell (loved being able to do call_other on someone else's mud with a bad I2 implementation) - [10Mar2006-12:40:11] Cratylus dead souls doesnt have any intermud mail support at all, and no oob either, meaning i have to put all that shit together, and it's a lot of work for the payoff - [10Mar2006-12:40:18] Kriton@Emerald MUD but I3 seems alright. - [10Mar2006-12:40:28] Kriton@Emerald MUD nods - [10Mar2006-12:42:08] Cratylus plus, each mud sending/receiving mail has to either be dirently on the internet or have extra firewall ports opened - [10Mar2006-12:42:26] Cratylus so, it's a pain to implement. but it would be nice to have - [10Mar2006-12:42:46] Kriton@Emerald MUD oh mail is oob? i guess that makes sense - [10Mar2006-12:42:52] Cratylus yeah - [10Mar2006-12:43:00] Brodbane@Eve oob exits? - [10Mar2006-12:43:03] Kriton@Emerald MUD hasn't implemented mail yet either ;-) - [10Mar2006-12:43:03] Brodbane@Eve lies - [10Mar2006-12:43:07] Cratylus its a good idea. tells kinda otta be too, if u aask me - [10Mar2006-12:43:35] Brodbane@Eve oob = out of band? - [10Mar2006-12:43:41] Cratylus ya - [10Mar2006-12:43:43] Kriton@Emerald MUD is working on a mud mail with the ability to use normal smtp - [10Mar2006-12:43:55] Brodbane@Eve i've seen muds with it - [10Mar2006-12:44:19] Ptah@Eve I think Everdark does an inbetween translation from the mail files to files the mud can read - [10Mar2006-12:44:21] Kriton@Emerald MUD is using exim+mysql+imap courier - [10Mar2006-12:44:43] Cratylus basically dead souls sends eve an auth request. eve sends back an id token. then dead souls connects directly to eve through the oob port, and sends an oob request. etc and so on, eventually my mail gets to your user via oob - [10Mar2006-12:45:23] Ptah@Eve Crats, that just sounded liked chapter 3 of my Cryptography and security book - [10Mar2006-12:45:51] Cratylus which is inconvenient, but it's reasonable to want to avoid private mail floting about someone elses router - [10Mar2006-12:46:50] Cratylus ds didnt have auth support either until recently. i put it in as part of a keepalive - [10Mar2006-12:46:54] Ptah@Eve so why not just piggy back it on DS chan? - [10Mar2006-12:47:00] Cratylus heh - [10Mar2006-12:47:14] Cratylus i'd rather not *broadcast* private mail - [10Mar2006-12:47:16] Ptah@Eve wasn't joking - [10Mar2006-12:48:06] Ptah@Eve You could tie it in to the @address for the chan, and only that place could read it... hrm, I suppose you could spoof that though - [10Mar2006-12:48:10] Cratylus i guess you could crypt it, but doing so is more complicated and impractical than just getting oob to work - [10Mar2006-12:48:20] Ashon@Stargate Atlantis do we really need intermud mail? - [10Mar2006-12:48:24] Cratylus no - [10Mar2006-12:48:26] Brodbane@Eve nope - [10Mar2006-12:48:32] Avatar@OuterSpace No. - [10Mar2006-12:48:40] Kriton@Emerald MUD it is nice though - [10Mar2006-12:48:46] Cratylus yep - [10Mar2006-12:48:48] Ptah@Eve I love how anything I have a potential solution for becomes "naw, nvm" - [10Mar2006-12:48:50] Kriton@Emerald MUD especially for creators needing help - [10Mar2006-12:48:56] Ptah@Eve feels so useful! - [10Mar2006-12:49:06] Ashon@Stargate Atlantis comforts Ptah. - [10Mar2006-12:49:17] Cratylus ptah i'd gladly welcome your input on this - [10Mar2006-12:49:21] Avatar@OuterSpace Normal mail works fine and if players are asked to submit a working mail addy then I see no reason to have in-mud mail. - [10Mar2006-12:49:27] Brodbane@Eve Oh lord, youve done it now Cratylus - [10Mar2006-12:49:29] Cratylus this particular idea of using a channel just isn't workable - [10Mar2006-12:49:33] Ptah@Eve One of these days, I'll have an idea that will be revolutionary - [10Mar2006-12:49:59] Avatar@OuterSpace In fact, till now I've only seen in-mud mails used for bug reports. And those can be sent to a normal mail box. - [10Mar2006-12:50:05] Ashon@Stargate Atlantis Ptah, it just means that you've got ideas that are great but not applicable. You're like a true *nix hacker. - [10Mar2006-12:50:19] Ptah@Eve well, in theory, everything is like a channel - [10Mar2006-12:50:23] Cratylus check out http://www.intermud.org/i3/specs/ for i3 specifications - [10Mar2006-12:50:27] Ptah@Eve Ahson, heh - [10Mar2006-12:50:55] Ptah@Eve ponders an email only channel - [10Mar2006-12:51:01] Kriton@Emerald MUD we used in-mud mail for tons of stuff besides bugs... we have a seperate system for bugs anyway - [10Mar2006-12:51:31] Ptah@Eve Bah, here I am trying to re-invent the wheel, I am a *nix hacker - [10Mar2006-12:51:43] Cratylus take a look at how channels work. it makes privacy exceedingly difficult - [10Mar2006-12:51:47] Brodbane@Eve Eve has like 6 versions of the 'wheel' - [10Mar2006-12:52:23] Ptah@Eve I'd just inherit the chan, encrypt, and deal with it that way in my high level type of hack attack solution - [10Mar2006-12:52:30] Avatar@OuterSpace is currently on a mud where all wizards receive *all* intermud channels by default. (unless specifically turned off) - [10Mar2006-12:52:36] Brodbane@Eve I love being able to use ' here, but not in regular chat - [10Mar2006-12:53:16] Cratylus you could crypt it but in order for it to be decryptable to the recipient it has to be decryptable to everyone else too, unless you use keys - [10Mar2006-12:53:18] Kriton@Emerald MUD shudders... I think its time to work - [10Mar2006-12:53:24] Cratylus in which case we're talking oob again - [10Mar2006-12:54:02] Kriton@Emerald MUD wouldn't want to bog the driver down the encrypting/decrypting blowfish data or whatever anyway - [10Mar2006-12:54:04] Ptah@Eve heh, I should just run a freaking cron job to transfer regular pine email to a folder and have a mime reader in game then - [10Mar2006-12:54:30] Brodbane@Eve forget reinventing email. Just have pop3/smtp - [10Mar2006-12:54:46] Brodbane@Eve oh wait, lets really do it OOG. Out of game. hmm - [10Mar2006-12:54:48] Cratylus that would be mighty cool - [10Mar2006-12:55:55] Kriton@Emerald MUD exim/mysql/courier ... exim writes out mail messages to individual files which are easy for a mud to read ;-) - [10Mar2006-12:56:07] Brodbane@Eve exim you say? - [10Mar2006-12:56:09] Brodbane@Eve hmm - [10Mar2006-12:56:17] Ptah@Eve Ok, good, someone thinks like I do then, I'm not insane - [10Mar2006-12:56:33] Kriton@Emerald MUD the mail would be totally seperate from the mud tho - [10Mar2006-12:56:37] Brodbane@Eve no comment. - [10Mar2006-12:56:59] Kriton@Emerald MUD maybe that would be a nice addition to I3... a mud address to smtp address resolver - [10Mar2006-12:57:07] Ptah@Eve I think that's the best approach, trying to get pop3 or smtp services INSIDE of the mudos would be a pain in the butt - [10Mar2006-12:57:23] Brodbane@Eve yeah, just have a translated for sure - [10Mar2006-12:57:23] Kriton@Emerald MUD i.e. kriton@emerald.mud resolves to kriton@mud.gameworkshop.com - [10Mar2006-12:57:55] Ptah@Eve well... then we could use a channel for all those aliases to update that new service - [10Mar2006-12:58:01] Ptah@Eve a non vis channel - [10Mar2006-12:58:18] Ptah@Eve much like how dns updates work - [10Mar2006-12:58:24] Kriton@Emerald MUD just add a new service/packet type - [10Mar2006-12:58:40] Brodbane@Eve you wouldn't need to use channels, just a translator daemon - [10Mar2006-12:58:42] Ptah@Eve Let me fantasize about my overly complicated solutions! - [10Mar2006-12:58:48] Kriton@Emerald MUD smtp-resolve-q / smtp-resolve-q or whatever - [10Mar2006-13:01:04] Avatar@OuterSpace Ptah, lets do email over ipv6 in game :) - [10Mar2006-13:01:49] Ptah@Eve Heh, now you are talking my level of crazy complexity! - [10Mar2006-13:02:05] Ptah@Eve ponders a 50k .c email object ingame - [10Mar2006-13:02:29] Brodbane@Eve 50? Thats if I wrote it, you *nix guys will have 6-12 files totaling 1.5MB - [10Mar2006-13:02:35] Kriton@Emerald MUD says '3l1te' and then keels over and dies. - [10Mar2006-13:02:53] Kriton@Emerald MUD emotes too. - [10Mar2006-13:03:25] Kriton@Emerald MUD writes it in 225 bytes of perl. - [10Mar2006-13:19:34] Cratylus remind me where the " ' " problem is happening? - [10Mar2006-13:19:46] Brodbane@Eve standard speech - [10Mar2006-13:20:05] Cratylus heh ok - [10Mar2006-13:20:13] Ptah@Eve yes you lose that when you just use that char for say - [10Mar2006-13:20:17] Ptah@Eve like in dont - [10Mar2006-13:21:27] Brodbane@Eve I dont speak english on Dead Souls, so i cant talk - [10Mar2006-13:21:43] Cratylus heh yeah thats a feature - [10Mar2006-13:22:17] Cratylus call me->SetLanguage("English",100) - [10Mar2006-13:25:10] Ptah@Eve sigh... where is the lpc manual online at? - [10Mar2006-13:32:27] Ashon@Stargate Atlantis which one? - [10Mar2006-13:32:39] Brodbane@Eve Hes all set, i believe - [10Mar2006-13:32:51] Ashon@Stargate Atlantis sweet. - [10Mar2006-13:32:53] Ptah@Eve Neg, I am Ptah, Set is another god - [10Mar2006-13:32:57] Brodbane@Eve Sometimes we are on the same mud, other times he pretends to not know me - [10Mar2006-14:07:52] Ptah@Eve Hrm... sscanf will not properly convert a negative number eh? - [10Mar2006-14:08:14] Cratylus what's the syntax yer using? - [10Mar2006-14:08:26] Ptah@Eve sscanf(str,"%d",aln) - [10Mar2006-14:08:48] Ptah@Eve %-d? - [10Mar2006-14:08:48] Cratylus i presum aln is an int - [10Mar2006-14:09:06] Ptah@Eve It's numeric yeah - [10Mar2006-14:09:14] Ptah@Eve 100 works fine, -100 doesnt - [10Mar2006-14:09:16] Cratylus is it a float or an int? - [10Mar2006-14:09:22] Ptah@Eve float - [10Mar2006-14:09:32] Cratylus see what happens with an int - [10Mar2006-14:09:48] Cratylus i bet it works. with a float you might try a different token, lemme doublecheck - [10Mar2006-14:09:56] Ptah@Eve %f? - [10Mar2006-14:11:07] Ptah@Eve int doesnt work either - [10Mar2006-14:11:29] Ptah@Eve It just doesn't like negs - [10Mar2006-14:11:51] Kriton@Emerald MUD it should - [10Mar2006-14:11:59] Cratylus yeah this doesnt sound right - [10Mar2006-14:12:37] Ptah@Eve nvm, I am a tard - [10Mar2006-14:15:24] Cratylus yeah it's working fine for me - [10Mar2006-14:16:24] Ptah@Eve hrm... does k=0 + -1000 work? - [10Mar2006-14:16:53] Cratylus@Frontiers heh - [10Mar2006-14:17:11] Cratylus@Frontiers are you getting 1 as output? - [10Mar2006-14:17:15] Ptah@Eve yes - [10Mar2006-14:17:27] Cratylus@Frontiers this is because thats effectively a modal - [10Mar2006-14:17:43] Ptah@Eve so that's the problem... - [10Mar2006-14:17:45] Cratylus@Frontiers you need something like k = (0 + -1000) - [10Mar2006-14:18:15] Ptah@Eve force it to resolve before it interprets eh? - [10Mar2006-14:18:35] Cratylus@Frontiers otherwise you're evaluating whether the arithmetic occurred, not the value of the arithmetic - [10Mar2006-14:19:55] Ptah@Eve ok, then what about k=-1000 - 0? - [10Mar2006-14:20:12] Ptah@Eve er I mean k=(-1000 - 0) - [10Mar2006-14:20:22] Cratylus what about it? - [10Mar2006-14:20:30] Ptah@Eve well, it's still giving a 1 - [10Mar2006-14:21:14] Cratylus let me test that - [10Mar2006-14:22:52] Cratylus you're doing something wrong - [10Mar2006-14:22:56] Cratylus i'm not getthing that - [10Mar2006-14:23:20] Cratylus can you show me the line doing this calculation? - [10Mar2006-14:23:27] Ptah@Eve well, it's in reality k=(p - j) where p=-1000 and j=0 - [10Mar2006-14:24:59] Ptah@Eve Hrm... bugger - [10Mar2006-14:25:33] Cratylus nope. - [10Mar2006-14:25:41] Cratylus i'm not replicating your result - [10Mar2006-14:25:53] Ptah@Eve Ok, this conditional is being odd with those values if(j > p && p < 0 && j = 0) - [10Mar2006-14:26:11] Ptah@Eve and I just noticed its = not == - [10Mar2006-14:26:11] Cratylus well there ya go - [10Mar2006-14:27:36] Cratylus in my tests so far, btw, k=-1000 - 0 is the same as k = (-1000 - 0) - [10Mar2006-14:27:54] Cratylus so it isnt actually modal as i'd first thought - [10Mar2006-14:28:40] Cratylus though my variables are so cryptic and easy to confuse as the ones yer using - [10Mar2006-16:51:57] Ashon@Stargate Atlantis debugger question, I've got some code that is not kicking up any kind of useful debug info. no logs, and dbxwhere/frame just tell me that it's crashing during the update.c call - [10Mar2006-16:52:27] Cratylus filename? - [10Mar2006-16:52:33] Ashon@Stargate Atlantis I am not quite sure how to track down the error from there. - [10Mar2006-16:52:59] Ashon@Stargate Atlantis itembackground.c in /props - [10Mar2006-16:53:07] Ashon@Stargate Atlantis ;) - [10Mar2006-16:53:14] Cratylus elog lib doesnt help? - [10Mar2006-16:53:19] Ashon@Stargate Atlantis elog lib - [10Mar2006-16:54:08] Ashon@Stargate Atlantis huh, thought that I'd already checked the lib log. - [10Mar2006-19:50:16] Cratylus hi tao. you can use this line for questions n stuff - [10Mar2006-19:50:32] Cratylus it's shared between dead souls muds - [10Mar2006-19:50:32] Tao@Dead_Souls_tao thanks - [10Mar2006-19:50:40] Oriam@Age of Darkness Woohoo new admin - [10Mar2006-19:50:54] Oriam@Age of Darkness great, now i have someone to help me :) - [10Mar2006-19:51:02] Tao@Dead_Souls_tao i have never tried anything like this before..and am just finding my feet - [10Mar2006-19:51:12] Oriam@Age of Darkness Your amoung friends tao - [10Mar2006-19:51:20] Oriam@Age of Darkness im only 2 days old :) - [10Mar2006-19:51:52] Brodbane@Eve hehe, i've got 200 days of logged mud time - [10Mar2006-19:51:57] Brodbane@Eve i have no life - [10Mar2006-19:52:11] Tao@Dead_Souls_tao is there anything i should know..like if my mistakes can affect anyone else's machine etc? - [10Mar2006-19:52:25] Tao@Dead_Souls_tao i am a complete newbie at this :D - [10Mar2006-19:52:25] Cratylus nothing you do will affect us unless you start spamming this line - [10Mar2006-19:52:59] Oriam@Age of Darkness Hey cratylus, i can modify the mudlib right? - [10Mar2006-19:53:07] Cratylus it's yours to do what you want with - [10Mar2006-19:53:17] Oriam@Age of Darkness Yay - [10Mar2006-19:53:21] Tao@Dead_Souls_tao cool, :D - [10Mar2006-19:53:29] Oriam@Age of Darkness to bad i have no clue where to start :( - [10Mar2006-19:53:33] Jerin@Jerins Folly lol, ya got the source bud, do whatever you want :p - [10Mar2006-19:53:45] Cratylus start by reading the players handbook - [10Mar2006-19:53:49] Jerin@Jerins Folly My suggestion would be to read a lot of the stuff that he's put together - [10Mar2006-19:53:55] Oriam@Age of Darkness I never got past chapter 3 in C++, For Dummies - [10Mar2006-19:54:07] Cratylus also read all the faqs on the mud homepage - [10Mar2006-19:54:19] Oriam@Age of Darkness oh no, i know lpc and such up the wazoo - [10Mar2006-19:54:37] Oriam@Age of Darkness its stuff like changing the command 'score' that i want to do, but have no clue - [10Mar2006-19:55:01] Cratylus practice and experience. but you know that, i'm sure - [10Mar2006-19:55:16] Jerin@Jerins Folly which is a wonderful command that I learned about on here the other day :p - [10Mar2006-19:55:22] Oriam@Age of Darkness i also want to make quests completely optional as well, not required to level up - [10Mar2006-19:55:34] Oriam@Age of Darkness although i could just change dirk to get rid of the qp requirement - [10Mar2006-19:56:14] Oriam@Age of Darkness wink wink - [10Mar2006-19:56:14] Cratylus i added the quest requirement cuz i figured it was easier to remove than to implement from scratch for new people - [10Mar2006-19:56:34] Oriam@Age of Darkness Sorry, im a bit of a newb, as well as a n00b, at this stuff - [10Mar2006-19:56:56] Cratylus however, you could just not use dirk and use some other method of advancement - [10Mar2006-19:57:16] Jerin@Jerins Folly Eh, here's another thing to try, look at the other items and such to get an idea how to do things - [10Mar2006-19:57:28] Oriam@Age of Darkness true, i like dirk, and its easy to modify to allow no qp for level - [10Mar2006-19:57:42] Jerin@Jerins Folly Crat, you were talkin about vim, what was the thing you were sayin about it and going to the end brace or whatnot? - [10Mar2006-19:57:58] Cratylus highlight a brace, pracket or parenthesis - [10Mar2006-19:58:02] Cratylus then type: % - [10Mar2006-19:58:12] Cratylus you jump to that thing's partner - [10Mar2006-19:58:36] Oriam@Age of Darkness brb guys - [10Mar2006-19:58:45] Cratylus k - [10Mar2006-19:58:49] Jerin@Jerins Folly Interesting, I think I'll have to print out a cheatsheet then try it again - [10Mar2006-20:00:31] Cratylus $ puts you at the end of a line. ^ puts you at the start. ctrl-g tells you where you are - [10Mar2006-20:01:07] Cratylus dd deletes a line. yyp copies the line above. o adds a line below. O adds a line above - [10Mar2006-20:01:27] Cratylus those are the ones i use most, aside from the obvious a i x - [10Mar2006-20:01:45] Jerin@Jerins Folly Ya - [10Mar2006-20:02:07] Oriam@Age of Darkness okay, could someone help me understand the score.c file? - [10Mar2006-20:02:18] Cratylus what do you need to know? - [10Mar2006-20:02:38] Oriam@Age of Darkness umm, lots of this stuff - [10Mar2006-20:02:46] Cratylus that's a little vague - [10Mar2006-20:02:58] Jerin@Jerins Folly what do you want to do first of all - [10Mar2006-20:02:58] Brodbane@Eve Give him a line number - [10Mar2006-20:03:02] Brodbane@Eve like 1-ALL OF THEM - [10Mar2006-20:03:04] Oriam@Age of Darkness like i said, i never did get into c++ much, so alot of this is unfamiliar to me - [10Mar2006-20:03:14] Oriam@Age of Darkness yeah, what brodbane said - [10Mar2006-20:03:28] Cratylus you should probably read the creators manual - [10Mar2006-20:03:34] Jerin@Jerins Folly no, Oriam, I think that was to you. - [10Mar2006-20:03:40] Oriam@Age of Darkness first of all, like this - [10Mar2006-20:03:42] Oriam@Age of Darkness (string)this_player()->GetReligion() - [10Mar2006-20:03:46] Cratylus even though you may know a lot of it, a reviw will help - [10Mar2006-20:03:50] Oriam@Age of Darkness where can i find a list of these commands - [10Mar2006-20:04:00] Brodbane@Eve I can explain some Oriam - [10Mar2006-20:04:02] Oriam@Age of Darkness functions rather, you know what i mean - [10Mar2006-20:04:18] Brodbane@Eve You are a player, and an object - [10Mar2006-20:04:26] Cratylus there are too many to list. those are functions, and the way to understand them is to know what types of functions look like what and what they do - [10Mar2006-20:04:30] Oriam@Age of Darkness i know - [10Mar2006-20:04:44] Cratylus take a look at /doc/efun - [10Mar2006-20:04:46] Oriam@Age of Darkness i mean, is there a list i can find in the mudlib? - [10Mar2006-20:05:02] Cratylus there are too many functions to list the way you mean - [10Mar2006-20:05:17] Oriam@Age of Darkness how about some of the common ones - [10Mar2006-20:05:23] Cratylus the most important ones ar emostly documented in /doc/sefun and /doc/efun - [10Mar2006-20:05:33] Cratylus you can look there - [10Mar2006-20:05:35] Oriam@Age of Darkness kay, ill look through em - [10Mar2006-20:06:03] Oriam@Age of Darkness i dont suppose that there are more files available for example on the web are there? - [10Mar2006-20:06:15] Cratylus what you see is what you get - [10Mar2006-20:06:23] Brodbane@Eve Cratylus stuck a gold mine in here - [10Mar2006-20:06:27] Jerin@Jerins Folly There are a few, but they're mostly for other libs - [10Mar2006-20:06:27] Oriam@Age of Darkness yeah - [10Mar2006-20:06:37] Oriam@Age of Darkness i just like to see lots of examples - [10Mar2006-20:06:43] Cratylus /domains/town - [10Mar2006-20:06:47] Oriam@Age of Darkness i do have to say by far this is my favorit mudlib - [10Mar2006-20:06:53] Brodbane@Eve Instead of trying to understand components of the lib, try actually making a few rooms/npcs/objects - [10Mar2006-20:07:01] Brodbane@Eve that do things, like move, create other objects - [10Mar2006-20:07:07] Oriam@Age of Darkness ive done that, ive made an entire wiz palace - [10Mar2006-20:07:19] Jerin@Jerins Folly Cratylus, how far off is this from NM 3? - [10Mar2006-20:07:23] Oriam@Age of Darkness hrmm, create other objects, intresting - [10Mar2006-20:07:33] Jerin@Jerins Folly Oriam, can you interact with your npc's and objects? - [10Mar2006-20:07:43] Cratylus i would especially recommend reading http://dead-souls.net/example.html - [10Mar2006-20:07:47] Brodbane@Eve Try making a 'remote' without looking at Crat's remote code - [10Mar2006-20:08:05] Oriam@Age of Darkness not really, but based on my interpretation of dirk, i can make it respnd to simple things. - [10Mar2006-20:08:19] Cratylus jerin, this is to nm3 like german is to english - [10Mar2006-20:08:32] Jerin@Jerins Folly lol, k - [10Mar2006-20:08:36] Cratylus not exaclty mutually intelligible, but very very similar - [10Mar2006-20:08:58] Jerin@Jerins Folly Ya, I thought I read somewhere that they were close or some hoopla like that - [10Mar2006-20:09:28] Cratylus dead souls 1 is basically the last iteration of nightmare IV, which was a leap forward from nm3 - [10Mar2006-20:09:48] Cratylus http://dead-souls.net/ds-faq.html - [10Mar2006-20:10:38] Jerin@Jerins Folly Ahh, ya, sorry, musta been half asleep when I read that the first time - [10Mar2006-20:12:39] Oriam@Age of Darkness i took a brief look at crats remote contol and that thing is way to complicated - [10Mar2006-20:13:07] Jerin@Jerins Folly Then keep on workin on an area til it isn't complicated :p - [10Mar2006-20:13:19] Oriam@Age of Darkness lol - [10Mar2006-20:13:35] Brodbane@Eve The remote can be used to make pets, players LOVE pets - [10Mar2006-20:13:45] Brodbane@Eve well, its the basis for pet code - [10Mar2006-20:13:45] Oriam@Age of Darkness okay, before i do that, i need to know something - [10Mar2006-20:14:29] Cratylus the secret to the remote control isnt the device itself, it's the drone shadow that it creates - [10Mar2006-20:14:45] Oriam@Age of Darkness how do i make quests. im a bit confused on that - [10Mar2006-20:14:53] Cratylus that's in the advanced lpc text descartes never got around to writing - [10Mar2006-20:15:01] Cratylus ah quests - [10Mar2006-20:15:11] Cratylus anything can be a quest - [10Mar2006-20:15:34] Cratylus if you code an object to do so, just picking it up can give you quest points and a quest title - [10Mar2006-20:15:36] Oriam@Age of Darkness so, basically i make an npc - [10Mar2006-20:15:46] Oriam@Age of Darkness and its like hey, go get - [10Mar2006-20:15:48] Cratylus take a look at /domains/town/npc/leo for guidance - [10Mar2006-20:15:56] Oriam@Age of Darkness then you get and and come back, and it gives you qp? - [10Mar2006-20:16:14] Cratylus quest it whatever you make it. it can be as boring as what you just said - [10Mar2006-20:16:24] Cratylus or it can be deeply complex and metaphysical - [10Mar2006-20:16:26] Oriam@Age of Darkness lol - [10Mar2006-20:16:42] Cratylus in the end what matters is you coding a mechanism for an object giving a player quest points and a quest title - [10Mar2006-20:16:46] Brodbane@Eve You know, my first pet commander object thing didnt use shadows - [10Mar2006-20:17:34] Cratylus mine didnt either. the first generation of the control did this ghastly thing where the original npc was destroyed and a subservient duplicate put in its place - [10Mar2006-20:17:48] Cratylus it worked, but it was inelegant - [10Mar2006-20:18:29] Brodbane@Eve ah, i had mine spawn a 'familiar' if the player rubbed an idol shaped like the animal - [10Mar2006-20:18:39] Brodbane@Eve so i didn't have to commandeer the npc - [10Mar2006-20:19:37] Oriam@Age of Darkness is there a command i can use to show me where an npc exists? - [10Mar2006-20:19:57] Cratylus the question makes assumptions that are not valid - [10Mar2006-20:20:13] Cratylus but, generally speaking, try findobj dirk - [10Mar2006-20:20:19] Oriam@Age of Darkness kay - [10Mar2006-20:21:15] Oriam@Age of Darkness hrmm, it seems leo is nonexistant - [10Mar2006-20:21:23] Cratylus that's the part with invalid assumptions - [10Mar2006-20:21:42] Cratylus no objects are "existing" until they are loaded onto memory - [10Mar2006-20:22:06] Cratylus so until someone walks into leo's room and thereby loads his file, there is no leo on the mud - [10Mar2006-20:22:06] Oriam@Age of Darkness i mean i need to the room in which a npc exists - [10Mar2006-20:22:24] Oriam@Age of Darkness hrmm, then why does it show leo and i havent visited him yet? - [10Mar2006-20:22:34] Oriam@Age of Darkness ahh nvm - [10Mar2006-20:22:42] Cratylus is there a number after leo's filename? - [10Mar2006-20:22:44] Oriam@Age of Darkness one of the guys on my mud ran through his room - [10Mar2006-20:22:52] Oriam@Age of Darkness nope - [10Mar2006-20:23:18] Cratylus that's the master copy of leo. it doesnt actually exist anywhere - [10Mar2006-20:23:32] Oriam@Age of Darkness i see - [10Mar2006-20:24:31] Oriam@Age of Darkness so could i clone leo anywhere and he work properly? - [10Mar2006-20:24:51] Cratylus not quite - [10Mar2006-20:25:15] Oriam@Age of Darkness where is leo located? - [10Mar2006-20:25:17] Cratylus well, ok the short answer is yes, with a complicated exception - [10Mar2006-20:25:33] Cratylus /domains/town/npc/leo.c - [10Mar2006-20:25:41] Oriam@Age of Darkness i mean roomwise - [10Mar2006-20:25:41] Cratylus /domains/town/room/basement.c - [10Mar2006-20:26:03] Oriam@Age of Darkness howd you find that? memory? - [10Mar2006-20:26:13] Cratylus heh no, i coded him. i know where he lives - [10Mar2006-20:26:29] Oriam@Age of Darkness thats what i mean - [10Mar2006-20:27:40] Oriam@Age of Darkness how do i ask leo bout quests - [10Mar2006-20:27:56] Oriam@Age of Darkness i dont see anything in the code that would seem to allow him to interact with me - [10Mar2006-20:28:14] Cratylus hmmm - [10Mar2006-20:28:26] Cratylus can you tell me what you exected to see? - [10Mar2006-20:28:38] Oriam@Age of Darkness hes muttering about the orcslayer - [10Mar2006-20:29:10] Oriam@Age of Darkness in the code, it says if you have completed the orcslayer quest, then it will tell you. how do i get it to display that message - [10Mar2006-20:29:46] Cratylus you're confusing me. isn't the messagein the code you're reading? - [10Mar2006-20:30:00] Brodbane@Eve this_player()->eventPrint("blah") - [10Mar2006-20:30:12] Oriam@Age of Darkness blargh - [10Mar2006-20:30:31] Brodbane@Eve or write() - [10Mar2006-20:30:41] Cratylus i dont think that's what he's asking - [10Mar2006-20:30:57] Oriam@Age of Darkness okay, hes muttering about the orcslayer. is there anyway to get him to say more about it, or do i have to solve the rest on my own? - [10Mar2006-20:31:13] Cratylus what you see is what you get - [10Mar2006-20:31:15] Brodbane@Eve oh hes your npc Crat, yeah,hmm - [10Mar2006-20:31:23] Cratylus i strongly urge you to read the players handbook - [10Mar2006-20:31:25] Oriam@Age of Darkness well aint that a barrel of fun - [10Mar2006-20:31:27] Oriam@Age of Darkness i ahve - [10Mar2006-20:31:37] Oriam@Age of Darkness have* - [10Mar2006-20:31:45] Cratylus i want to help you, but i cant just make you understand code over a channel - [10Mar2006-20:32:03] Brodbane@Eve Crat, if you have two muds on intermud with the same name, who wins? - [10Mar2006-20:32:07] Cratylus the orcslayer quest is explained in detail in the handbook - [10Mar2006-20:32:13] Cratylus the first one to boot - [10Mar2006-20:42:08] Brodbane@Eve testing - [10Mar2006-20:42:12] Cratylus passed - [10Mar2006-20:42:18] Oriam@Age of Darkness loud and clear - [10Mar2006-20:42:36] Brodbane@Eve ok - [10Mar2006-20:42:52] Brodbane@Eve afk, must perform fatherly obligations - [10Mar2006-20:57:01] Oriam@Age of Darkness aight, im off to work on my server comp - [10Mar2006-20:57:04] Oriam@Age of Darkness later guys - [10Mar2006-20:57:09] Oriam@Age of Darkness and thanks for the help - [10Mar2006-21:02:52] Brodbane@Eve Man, i wish i developed on a nightmare mud previous, everything is not where i'm expecting it - [10Mar2006-21:03:00] Cratylus by oriam - [10Mar2006-21:03:23] Cratylus brodbane, yeah there were lots of changes between nm3 and nm IV - [10Mar2006-21:09:16] Brodbane@Eve /lib/guild.c is faulty - [10Mar2006-21:09:24] Cratylus is it ever - [10Mar2006-21:10:04] Cratylus its pretty much totally fuxt. guilds will probably look very different by the time i'm done - [10Mar2006-21:10:52] Brodbane@Eve Ok, so i change GenerateObviousExits(), and then a update /lib/* and /lib/std/*, and -r of course and still no propogation - [10Mar2006-21:11:30] Cratylus whatever room oyu want to have the new functionality: update -r /path/to/room.c - [10Mar2006-21:12:39] Brodbane@Eve It helps when i'm in a room that isn't circumventing my change by calling it itself - [10Mar2006-21:12:39] Cratylus rooms not yet loaded will then have the functionality when you do load them - [10Mar2006-21:32:41] Brodbane@Eve doesnt inherit LIB_OBJECT give you object::init access? - [10Mar2006-21:32:51] Cratylus no - [10Mar2006-21:33:03] Cratylus erm wait iread that wrong - [10Mar2006-21:33:11] Brodbane@Eve i've got an object - [10Mar2006-21:33:19] Cratylus object::init(); - [10Mar2006-21:33:51] Cratylus unless theres good reason for it, that should be the first line in the init() fun of the object - [10Mar2006-21:34:07] Cratylus unless theres good reason for doing otherwise, that should be the first line in the init() fun of the object - [10Mar2006-21:34:15] Brodbane@Eve /open/Brodbane/poolTable.c line 181: No such inherited function object::init - [10Mar2006-21:34:23] Brodbane@Eve thats in my init() for the object - [10Mar2006-21:34:37] Brodbane@Eve oh btw, thats a working poolTable:) - [10Mar2006-21:44:24] Brodbane@Eve what an utterly disgusting amount of math - [10Mar2006-21:44:30] Brodbane@Eve vectors, collisions - [10Mar2006-21:44:50] Jerin@Jerins Folly Better you then me :p - [10Mar2006-22:28:32] Brodbane@Eve hmm TEAL isn't an available ansi color - [10Mar2006-22:29:38] Cratylus colors - [10Mar2006-22:33:33] Brodbane@Eve hmm, can you or them together to get a lighter... say blue? - [10Mar2006-22:33:41] Brodbane@Eve or them together* - [10Mar2006-22:36:24] Cratylus BOLD - [10Mar2006-22:36:36] Cratylus grep for BOLD in /lib/* - [10Mar2006-22:36:50] Cratylus grep BOLD /lib/* - [10Mar2006-22:37:00] Cratylus oh heh that wont work will it - [10Mar2006-22:37:08] Cratylus hang on - [10Mar2006-22:37:18] Brodbane@Eve holy crap, i love grep! - [10Mar2006-22:37:32] Brodbane@Eve the source looks like a light bright, but i like it - [10Mar2006-22:37:50] Cratylus ya anyway look for examples of color use in lib - [10Mar2006-22:38:05] Brodbane@Eve My old mud had a teal, but i just cant locate it - [10Mar2006-22:38:17] Cratylus what does teal look like? - [10Mar2006-22:38:43] Kristus@The Hollow thats regular cyan, isnt it? - [10Mar2006-22:38:51] Brodbane@Eve nah, cyan is very bright - [10Mar2006-22:38:57] Brodbane@Eve its a dull cyan - [10Mar2006-22:38:57] Kristus@The Hollow no, thats bold cyan - [10Mar2006-22:39:07] Kristus@The Hollow regular cyan isnt bright, bold cyan is - [10Mar2006-22:39:07] Ashon@Stargate Atlantis Teal is a yellowish green - [10Mar2006-22:39:21] Kristus@The Hollow teal is a blueish green isnt it? - [10Mar2006-22:39:25] Cratylus sounds like a bunch of goddamn interior decorators in here - [10Mar2006-22:39:33] Brodbane@Eve teal is blueish green - [10Mar2006-22:39:35] Ashon@Stargate Atlantis Brod, you wrote a pool table in lpc? - [10Mar2006-22:39:41] Kristus@The Hollow then thats regular cyan - [10Mar2006-22:39:49] Brodbane@Eve Not my pool table, its another guy's - [10Mar2006-22:40:05] Brodbane@Eve when i do 'colors' the cyan i see is offensive - [10Mar2006-22:40:15] Ashon@Stargate Atlantis :http://noz.day-break.net/webcolor/teal.html - [10Mar2006-22:40:47] Kristus@The Hollow dont go by that - [10Mar2006-22:41:01] Brodbane@Eve 006666 - [10Mar2006-22:41:05] Brodbane@Eve that one - [10Mar2006-22:41:16] Kristus@The Hollow regular cyan - [10Mar2006-22:41:32] Brodbane@Eve +points to Kirstus - [10Mar2006-22:41:54] Kristus@The Hollow eval return write("%^CYAN%^test%^RESET%^") - [10Mar2006-22:41:56] Brodbane@Eve side note, the 'colors' command needs to reflect the actual color of cyan - [10Mar2006-22:42:22] Brodbane@Eve thats more blue then 006666 - [10Mar2006-22:42:40] Kristus@The Hollow thats pretty damn close - [10Mar2006-22:42:58] Brodbane@Eve given the few choices, that must be it - [10Mar2006-22:45:43] Ashon@Stargate Atlantis Crat can I make a suggestion on the clone cmd? If the obj you are trying to clone isn't in the directory, it should output something a little more helpful, then: Failed to clone file: blah - [10Mar2006-22:45:57] Cratylus for example? - [10Mar2006-22:46:07] Brodbane@Eve It should read your mind - [10Mar2006-22:46:19] Cratylus right. clone what i meant not what i typed - [10Mar2006-22:46:29] Cratylus the parser isnt there yet - [10Mar2006-22:46:39] Ashon@Stargate Atlantis it should say something like: Failed to clone: file not in current directory. - [10Mar2006-22:46:41] Brodbane@Eve my VB.NET mudlib so assumes what i meant - [10Mar2006-22:46:55] Cratylus well why dont you marry it, then? - [10Mar2006-22:46:57] Ashon@Stargate Atlantis poking fun at me? - [10Mar2006-22:47:03] Brodbane@Eve no, at Ptah - [10Mar2006-22:47:25] Ashon@Stargate Atlantis okay, b/c my other project is a vb.net mud too. - [10Mar2006-22:47:46] Brodbane@Eve hehe, I didn't know that. Sometimes i forget their may be other VB programmers in the room - [10Mar2006-22:47:52] Brodbane@Eve their = there - [10Mar2006-22:48:32] Brodbane@Eve There are only a few conditions for the standard "failed to clone file:" message - [10Mar2006-22:48:44] Brodbane@Eve if they aren't prefixed with compile errors, its a directory issue - [10Mar2006-22:48:54] Brodbane@Eve compile = runtime - [10Mar2006-22:49:36] Ashon@Stargate Atlantis nods in understanding. - [10Mar2006-22:51:55] Brodbane@Eve Anyone know of a function that converts ints to string representation? I think I had to write one last time - [10Mar2006-22:52:11] Brodbane@Eve ie 1 = one - [10Mar2006-22:52:33] Cratylus itoa() - [10Mar2006-22:52:37] Cratylus on - [10Mar2006-22:52:41] Cratylus oh - [10Mar2006-22:52:55] Cratylus cardinal - [10Mar2006-22:52:57] Brodbane@Eve yeah a little more tricky - [10Mar2006-22:53:11] Cratylus cardinal(42) - [10Mar2006-22:53:36] Brodbane@Eve cardinal(42) == "Forty Two"? - [10Mar2006-22:53:48] Cratylus eval return cardinal(42) - [10Mar2006-22:54:00] Brodbane@Eve excellent - [10Mar2006-22:55:55] Kristus@The Hollow billion is as high as it goes? - [10Mar2006-22:56:10] Cratylus heh - [10Mar2006-22:56:22] Brodbane@Eve It can't handle over a billion? I'm so going to rewrite mudos - [10Mar2006-22:56:58] Ashon@Stargate Atlantis damn right. Teach mudos a lesson! - [10Mar2006-22:57:08] Brodbane@Eve eval return cardinal(999999999), i can't imagine how they did it - [10Mar2006-22:58:02] Ashon@Stargate Atlantis wow. - [10Mar2006-23:05:13] Brodbane@Eve bug: down doesn't alias to d - [10Mar2006-23:05:25] Brodbane@Eve ie, 'down' gets you no where - [10Mar2006-23:06:21] Kristus@The Hollow sure it does - [10Mar2006-23:06:23] Ashon@Stargate Atlantis VICTORY! - [10Mar2006-23:06:27] Cratylus neither does east - [10Mar2006-23:06:33] Cratylus "go down", "go east" - [10Mar2006-23:08:08] Brodbane@Eve hrmm, you got me there - [10Mar2006-23:10:46] Ashon@Stargate Atlantis DS accepts !=NULL as an evaluation for an if statement, yes? - [10Mar2006-23:12:25] Cratylus i've never tried it, i'd be surprised if it did - [10Mar2006-23:12:47] Cratylus if(!thing) - [10Mar2006-23:12:53] Cratylus if(thing == "") - [10Mar2006-23:13:49] Cratylus obviously the opposites are if(thing), if(thing != "") - [10Mar2006-23:14:27] Ashon@Stargate Atlantis nods. - [10Mar2006-23:35:18] Jerin@Jerins Folly Where can I find what is compiled in? - [10Mar2006-23:35:49] Ashon@Stargate Atlantis sweet, now I can add properties to items and verbs with the speed of my typing. - [10Mar2006-23:36:03] Ashon@Stargate Atlantis Jerin, waddya mean compiled in? - [10Mar2006-23:36:51] Jerin@Jerins Folly I was looking at pow in /doc/efun/floats and it said if PACKAGE_MATH is compiled in - [10Mar2006-23:37:51] Brodbane@Eve hmm. eventDescribeEnvironment and look do not contain the line that prints out the path of the room you are in - [10Mar2006-23:38:23] Ashon@Stargate Atlantis they were talking about floats earlier, I'm pretty sure it's part of the distro - [10Mar2006-23:38:35] Brodbane@Eve we have floats - [10Mar2006-23:38:50] Jerin@Jerins Folly I assumed as much - [10Mar2006-23:39:26] Cratylus ds2.0r14/v22.2b14/local_options - [10Mar2006-23:39:36] Cratylus ds2.0r14/v22.2b14/options.h - [10Mar2006-23:39:40] Brodbane@Eve eval return 1.45+2.5 - [10Mar2006-23:40:32] Brodbane@Eve eval return 1.544+2 - [10Mar2006-23:41:10] Jerin@Jerins Folly cool, thank ya much - [10Mar2006-23:41:20] Cratylus eval return 21.99/7.0 - [10Mar2006-23:41:32] Jerin@Jerins Folly or eval return pow( 2, 4 ) - [10Mar2006-23:41:58] Jerin@Jerins Folly that's the one I was specifically lookin at - [10Mar2006-23:42:04] Brodbane@Eve Cratylus, where the hell is the path being printed when 'look' is called - [10Mar2006-23:42:23] Cratylus players don't see that. only creators - [10Mar2006-23:42:27] Brodbane@Eve right - [10Mar2006-23:42:57] Brodbane@Eve I've checked out look and eventDescribeEnvironment expecting to find an if(creatorp()) - [10Mar2006-23:50:43] Cratylus /lib/creator line 105 - [10Mar2006-23:51:47] Brodbane@Eve ahhh, thanks - [10Mar2006-23:53:06] Ashon@Stargate Atlantis god, we'd all be lost if cratylus wasn't around as much as he is, wouldn't we? - [10Mar2006-23:53:18] Brodbane@Eve i'd just waste a lot more time - [10Mar2006-23:53:34] Ashon@Stargate Atlantis guffaws. - [11Mar2006-00:33:57] Cratylus heh. locates are for people on the intermud - [11Mar2006-00:34:17] Jerin@Jerins Folly lol - [11Mar2006-00:34:23] Jerin@Jerins Folly Whoops :p - [11Mar2006-00:34:31] Jerin@Jerins Folly Sorry bout that - [11Mar2006-00:35:01] Cratylus header files are usually in /include or /secure/include - [11Mar2006-00:35:01] Jerin@Jerins Folly 'spose I should read the help file before I type a new command then - [11Mar2006-00:35:15] Jerin@Jerins Folly Ya, that was my next spot to check - [11Mar2006-01:08:30] Brodbane@Eve Is there a function that will convert an int to a time format? ie, 123 = 2m3s? - [11Mar2006-01:08:46] Cratylus nope - [11Mar2006-01:13:30] Brodbane@Eve you know, you should have a convert_age() in time.c, so if a player sends you a tell and you are idle they get some indication back - [11Mar2006-01:13:56] Cratylus idle cratylus - [11Mar2006-01:14:04] Cratylus also rwho dead souls - [11Mar2006-01:14:42] Brodbane@Eve ah, that works too - [11Mar2006-01:20:08] Brodbane@Eve what function are you using to convert query_idle into that nice string? - [11Mar2006-01:20:30] Cratylus dunno. what's it look like? - [11Mar2006-01:21:04] Brodbane@Eve Recluse has been idle for eighteen minutes and seventeen seconds. - [11Mar2006-01:21:20] Cratylus heh - [11Mar2006-01:21:30] Cratylus which idle - [11Mar2006-01:21:38] Brodbane@Eve 'idle' - [11Mar2006-01:21:42] Cratylus more /cmds/players/idle.c - [11Mar2006-01:22:23] Cratylus that will show you where the command is, and what it contains - [11Mar2006-01:24:33] Cratylus and yes i'm the lib maintainer :) - [11Mar2006-01:24:39] Cratylus damn. mischan - [11Mar2006-01:26:24] Brodbane@Eve hehe - [11Mar2006-01:35:21] Brodbane@Eve ok, done with the who command now - [11Mar2006-01:35:51] Brodbane@Eve it now reports idleness, if people are tell blocking, if people are in ed - [11Mar2006-01:35:53] Brodbane@Eve the works - [11Mar2006-01:40:18] Jerin@Jerins Folly Now just a hypothetical, if people reworked commands, would you make something such as a snippets page? - [11Mar2006-01:42:53] Cratylus mmhmmm...? - [11Mar2006-01:42:59] Cratylus oh - [11Mar2006-01:43:07] Cratylus well sure i can do that - [11Mar2006-01:43:19] Jerin@Jerins Folly I doubt it'd happen, but just asking in general - [11Mar2006-01:43:43] Jerin@Jerins Folly Like for myself, I'm trying to create a blank command that I can refer to later on when and if I want to - [11Mar2006-01:44:09] Cratylus take a look in cmds/ in your homedir - [11Mar2006-01:44:17] Jerin@Jerins Folly Yup, doin that now - [11Mar2006-01:45:10] Jerin@Jerins Folly k, after adding in a so-called command, what else do I need to do? - [11Mar2006-01:45:42] Cratylus update /daemon/command - [11Mar2006-01:46:06] Jerin@Jerins Folly Awesome, thanks - [11Mar2006-01:46:12] Cratylus no prob - [11Mar2006-01:54:20] Brodbane@Eve i'd have no problem sharing any or all of Eve's modifications - [11Mar2006-02:03:57] Ashon@Stargate Atlantis the problem becomes maintaining all the inheritance schemes, and all that stuff to do snippets. I think that is one of the biggest reasons that LP is not as popular (other then those talked about yesterday) - [11Mar2006-02:04:11] Ashon@Stargate Atlantis IRT: sharing lib mods. - [11Mar2006-02:04:15] Jerin@Jerins Folly Well, if they were generic enough - [11Mar2006-02:05:51] Brodbane@Eve some are, some aren't - [11Mar2006-02:05:58] Ashon@Stargate Atlantis It would become a headache to maintain. Just getting upgrades out from the core development lib is going to cause headaches. - [11Mar2006-02:06:00] Brodbane@Eve commands are fairly abstract enough - [11Mar2006-02:06:22] Ashon@Stargate Atlantis sure but they have to be applicable too. - [11Mar2006-02:07:00] Jerin@Jerins Folly Well just being able to see the thought processes of other people though, they may be able to modify it to suit their needs or make something that accomplishes the same - [11Mar2006-03:44:29] Ashon@Stargate Atlantis anyone on who knows where the save function is? preferably the player/soul one? - [11Mar2006-10:09:22] Cratylus yer prolly looking for one of the functions in /doc/efun/general - [11Mar2006-11:16:07] Ashon@Stargate Atlantis yah, I was actually looking for the code. - [11Mar2006-11:33:04] Cratylus unfortunately that's in the guts of the driver - [11Mar2006-11:41:28] Ashon@Stargate Atlantis throws his hands up in disgust. - [11Mar2006-11:42:20] Ashon@Stargate Atlantis that's allright, I shuffled my todo list last night, b/c I realized that that wasn't what I wanted to do next. I want to do Dynamic Descriptions next! - [11Mar2006-12:30:23] Cratylus i can't think of any way to save/manipulate files without efuns...some stuff just belongs in the driver - [11Mar2006-12:30:49] Cratylus if it's i/o, you want it happening as fast and efficiently as possible to avoid lag - [11Mar2006-12:34:20] Ashon@Stargate Atlantis nods. - [11Mar2006-13:17:25] Brodbane@Eve hist - [11Mar2006-13:26:08] Ashon@Stargate Atlantis -erectomy! - [11Mar2006-13:26:40] Ashon@Stargate Atlantis fails to chuckle at his own joke. - [11Mar2006-14:28:33] Brodbane@Eve quiet here today - [11Mar2006-14:34:45] Jerin@Jerins Folly Yup - [11Mar2006-14:35:17] Jerin@Jerins Folly On three different muds I play/work on the player numbers are low - [11Mar2006-14:42:39] Cratylus intermud went down - [11Mar2006-14:42:47] Cratylus just came back up a few minutes ago - [11Mar2006-14:45:12] Brodbane@Eve i hate a great time with the 9mm pistol last night - [11Mar2006-14:45:20] Brodbane@Eve little saddened by its reload bug - [11Mar2006-14:45:30] Brodbane@Eve i had* - [11Mar2006-14:45:36] Brodbane@Eve man i cant type as of late - [11Mar2006-14:48:09] Cratylus havent played with the pistol in a while - [11Mar2006-14:48:27] Cratylus its part of a ranged weapon project thats dormant for now - [11Mar2006-15:04:54] Brodbane@Eve it wont be used in our mud - [11Mar2006-15:05:00] Brodbane@Eve just a fun pulp fiction distraction - [11Mar2006-16:57:02] Alensin@Dead_Souls_alensin Is it possible to change descriptions for races so they don't just reflect the number and types of limbs they have? For RP and such? - [11Mar2006-16:57:48] Niang@Kol no idea but i like the sound of it :) - [11Mar2006-16:59:24] Niang@Kol Can you remember which way round the SetMelee flag gose is it 1 for does normally use weapon of 0 for dose normally use weapon? - [11Mar2006-17:00:25] Cratylus melee is non weapon - [11Mar2006-17:00:49] Cratylus melee 1 makes the thing good at unarmed combat - [11Mar2006-17:01:23] Niang@Kol ahh so my rabbit should be melee 1 then - [11Mar2006-17:01:25] Alensin@Dead_Souls_alensin Where are the race descriptions and such autogenerated from? - [11Mar2006-17:01:29] Cratylus as to race descriptions, sure. you can put descriptions in /doc/help - [11Mar2006-17:01:45] Niang@Kol thanx cratylus - [11Mar2006-17:01:49] Cratylus np - [11Mar2006-17:01:51] Alensin@Dead_Souls_alensin Ah. - [11Mar2006-17:03:20] Alensin@Dead_Souls_alensin I'm not sure, where do the extant race help files come from? - [11Mar2006-17:03:26] Alensin@Dead_Souls_alensin I can't see them in /doc/help/races - [11Mar2006-17:03:46] Cratylus nope theyre not there - [11Mar2006-17:03:52] Cratylus oh thats not files - [11Mar2006-17:04:04] Cratylus those are autogenerated byt he races daemon - [11Mar2006-17:04:14] Alensin@Dead_Souls_alensin Ah... - [11Mar2006-17:04:42] Alensin@Dead_Souls_alensin Any way to fiddle with that short of rewriting the daemon entirely? - [11Mar2006-17:05:48] Cratylus no need. next release will output the file in help/races instead of the autogenerated stuff, if the file is there - [11Mar2006-17:06:17] Alensin@Dead_Souls_alensin Oh, good. - [11Mar2006-17:06:51] Oriam@Age of Darkness Hello everyone. - [11Mar2006-17:06:55] Cratylus howdy - [11Mar2006-17:07:03] Niang@Kol hello - [11Mar2006-17:07:13] Oriam@Age of Darkness Hey crat, I finally got a working quest up. - [11Mar2006-17:07:21] Oriam@Age of Darkness It sucks, but works none the less. - [11Mar2006-17:07:23] Cratylus awesome - [11Mar2006-17:07:41] Niang@Kol cheers - [11Mar2006-17:07:57] Niang@Kol sorry not very good with emote yet - [11Mar2006-17:08:29] Oriam@Age of Darkness can you emote over ds? - [11Mar2006-17:08:58] Niang@Kol no idea, force of habit from playing on other muds - [11Mar2006-17:09:00] Alensin@Dead_Souls_alensin Perhaps the racial description could be part of the race file format? - [11Mar2006-17:09:02] Cratylus dsemote cheers. - [11Mar2006-17:09:14] Niang@Kol cheers - [11Mar2006-17:09:20] Niang@Kol thanx - [11Mar2006-17:09:22] Cratylus np - [11Mar2006-17:09:26] Oriam@Age of Darkness cheers. - [11Mar2006-17:09:28] Oriam@Age of Darkness cool - [11Mar2006-17:09:34] Alensin@Dead_Souls_alensin cackles. - [11Mar2006-17:10:00] Niang@Kol thing is every mud i've every played on dose it diffently - [11Mar2006-17:11:30] Oriam@Age of Darkness same here - [11Mar2006-17:11:42] Niang@Kol ahhh i've got a poor likkle goblin sentry with no armour or weapons - [11Mar2006-17:11:57] Oriam@Age of Darkness but then again, ive only played on two other muds, and by definition the one doesnt qualify as a mud - [11Mar2006-17:12:47] Niang@Kol i've played on a few, i started (and still play elephant mud) i've also played starmud and nightmare - [11Mar2006-17:13:05] Oriam@Age of Darkness im active on Ages of Despair, but i use to play Nightmist - [11Mar2006-17:15:46] Oriam@Age of Darkness hey crat, you programmed all the pre loaded areas right? - [11Mar2006-17:17:14] Cratylus Ylsrim is not mine - [11Mar2006-17:17:20] Cratylus but town and default are - [11Mar2006-17:17:55] Cratylus Ylsrim is from the original 1.1 release, though i did have to work on it to get it to work - [11Mar2006-17:22:28] Oriam@Age of Darkness where are the efuns located? - [11Mar2006-17:23:32] Niang@Kol next to the dfuns andjust before the ffuns? - [11Mar2006-17:23:40] Oriam@Age of Darkness ... - [11Mar2006-17:24:28] Niang@Kol sorry i'm in a very silly mood this evening - [11Mar2006-17:25:35] Cratylus heh - [11Mar2006-17:26:23] Cratylus http://dead-souls.sourceforge.net/ds-admin-faq.html - [11Mar2006-17:34:40] Oriam@Age of Darkness kay i got a question about vendors - [11Mar2006-17:35:36] Oriam@Age of Darkness anything in the room i designate as a storage room is sold by the vendor correct? - [11Mar2006-17:36:10] Oriam@Age of Darkness nvm - [11Mar2006-17:41:58] Cratylus ok intermud is back i guess - [11Mar2006-17:42:04] Cratylus damn its been really flaky lately - [11Mar2006-17:42:10] Oriam@Age of Darkness lol its all good - [11Mar2006-17:42:38] Cratylus anyway, oriam, please read the admin faq at http://dead-souls.sourceforge.net/ds-admin-faq.html for an explanation of efuns - [11Mar2006-17:42:52] Oriam@Age of Darkness i know what they are, i just didnt know where to find em - [11Mar2006-17:42:58] Cratylus and yes anything in the vebdors storage room is sellable by them - [11Mar2006-17:43:12] Cratylus they're in the driver, not findable on the lib - [11Mar2006-17:43:38] Cratylus you'll have to go through the C++ code in v22.2b14 - [11Mar2006-17:43:58] Niang@Kol sooner you than me oriam :) - [11Mar2006-17:44:13] Oriam@Age of Darkness what are estates? - [11Mar2006-17:44:35] Oriam@Age of Darkness i cant seem to find any files directly describing them - [11Mar2006-17:45:01] Cratylus that's legacy or unimplemented functionality, depending on yer point of view. theres nothing set up for it now, but that's where player rooms go - [11Mar2006-17:45:11] Cratylus in nightmare, players could buy houses n stuff - [11Mar2006-17:45:13] Oriam@Age of Darkness ahh okay - [11Mar2006-17:45:19] Oriam@Age of Darkness yeah, you can do that in my other mud - [11Mar2006-17:45:41] Oriam@Age of Darkness i just planned on taking direct requests for them then hand coding it. - [11Mar2006-17:46:13] Oriam@Age of Darkness god bless the QCS - [11Mar2006-17:46:23] Niang@Kol amen to that - [11Mar2006-17:47:21] Niang@Kol i think they should create a new nobel prize of muds and That would most definatly get the first prize - [11Mar2006-17:47:42] Oriam@Age of Darkness whats that? - [11Mar2006-17:48:00] Niang@Kol the QCS - [11Mar2006-17:48:38] Oriam@Age of Darkness well im out guys, see ya later - [11Mar2006-17:48:46] Niang@Kol bye - [11Mar2006-17:49:10] Cratylus seeya - [11Mar2006-17:51:25] Niang@Kol ok a little direction here please, i'm looking for the coding that does the checking to see if you can wield a weapon. I know i can alter it for each weapon but i wanted to look at the one that is already there, any ideas which files i should be looking at? - [11Mar2006-17:52:25] Cratylus hmm - [11Mar2006-17:52:59] Niang@Kol i did a serch looking for wield and got about 30 result :( - [11Mar2006-17:53:13] Cratylus type: read chapter 29 in manual - [11Mar2006-17:55:12] Avatar@OuterSpace likes the sound of tbat (up to date documentation rocks) - [11Mar2006-18:02:18] Cratylus yeah i'm just finishing up docs now in preparation for the next release. prolly tonight or tomorrow - [11Mar2006-18:02:48] Jerin@Jerins Folly and this'll be r15, correct? - [11Mar2006-18:02:56] Cratylus actually r16 - [11Mar2006-18:03:20] Cratylus some releases are just for sanity checking and not released into the wild - [11Mar2006-18:03:26] Avatar@OuterSpace will happily explore the new release next weekend. - [11Mar2006-18:03:30] Jerin@Jerins Folly Ah - [11Mar2006-18:03:55] Niang@Kol it alway gose in twos :), you'll get used to it - [11Mar2006-18:04:33] Cratylus yeah actually, i guess they are but it isnt really on purpose. it's jus tthat i usually fuck up one last thing and catch it in time - [11Mar2006-18:05:47] Jerin@Jerins Folly Let's say I was working on an area, would I be able to just drop that in with minimal effort? - [11Mar2006-18:05:49] Niang@Kol you can't stop doing it now, you'd really throw me - [11Mar2006-18:06:33] Cratylus heh - [11Mar2006-18:06:37] Niang@Kol almost certainly if the last releases are anything to go by :) - [11Mar2006-18:07:16] Cratylus yeah well i really dont recommend trying to upgrade to a new release by copying it over the old one. i release patches for that - [11Mar2006-18:07:40] Cratylus the patches are important because they contain special files that make corrections that just overwriting cannot - [11Mar2006-18:08:02] Cratylus but niang is right, i try to make it as painless as possible to upgrade - [11Mar2006-18:08:32] Jerin@Jerins Folly k - [11Mar2006-18:09:14] Niang@Kol it's very painless and i've been 'upgrading' for quite a while now, if i can do then most people can - [11Mar2006-18:09:36] Cratylus it's painful for maniacs like brodbane and ashon because patches often contain files like player.c etc which theyve been working on themselves - [11Mar2006-18:09:54] Cratylus but if youve only been coding areas n stuff, you'll prolly only notice goodness - [11Mar2006-18:10:09] Cratylus you should do a full backup anyway, though - [11Mar2006-18:10:33] Niang@Kol for which you also supply good insturctions - [11Mar2006-18:10:43] Niang@Kol well for the unix version anyway - [11Mar2006-18:10:53] Cratylus my best instruction is "do the backup" - [11Mar2006-18:11:07] Jerin@Jerins Folly k - [11Mar2006-18:11:13] Niang@Kol i still have to read how to do the tar bit - [11Mar2006-18:11:29] Jerin@Jerins Folly That's pretty easy :p - [11Mar2006-18:11:57] Niang@Kol unix/linux isn't really my element, - [11Mar2006-18:12:27] Niang@Kol i was primarily a Oracle pl/sql database programmer - [11Mar2006-18:12:49] Niang@Kol rollback and commit, i can cope with - [11Mar2006-18:13:44] Niang@Kol select * from User where id = 'Smith' ..... that sort of thing anything else i have to really think about - [11Mar2006-18:14:28] Ashon@Stargate Atlantis NOOOOOOOOOOOOOOOOOOOOOOOO! - [11Mar2006-18:14:38] Jerin@Jerins Folly Ya, that's an easy query :p - [11Mar2006-18:15:14] Niang@Kol it most certainly is, - [11Mar2006-18:15:22] Ashon@Stargate Atlantis cratylus, you'd best give me a diff report for each release! - [11Mar2006-18:16:10] Niang@Kol pl/sql is quite close to c/C++ and lpc so i can cope with this - [11Mar2006-18:16:26] Cratylus heh - [11Mar2006-18:17:17] Cratylus well, you dont HAVE to upgrade - [11Mar2006-18:17:37] Cratylus but youd be missing out on some nifty new stuff - [11Mar2006-18:21:38] Niang@Kol i'm soory i started that search now :( .. i was hoping to find a nice little formual that, baised on your skills, calulated a max class to the weapon you can wield .... - [11Mar2006-18:22:16] Niang@Kol unfourtunatly what i've found is if your a newbie and the class is >30 you can't wield it :( - [11Mar2006-18:25:07] Cratylus you stop being a newbie at level 4 or so - [11Mar2006-18:25:31] Cratylus basically if you finish the newbie mansion quest, you can advance past newbieness - [11Mar2006-18:25:51] Cratylus but if you dislike the newbie concept, just disable it in /secure/include/config.h - [11Mar2006-18:27:02] Niang@Kol no... i wanted to link the max weapons class to weapon skill, the higher youre skill the better the weapon you can use - [11Mar2006-18:27:14] Cratylus oh - [11Mar2006-18:27:18] Cratylus why cant you? - [11Mar2006-18:28:10] Cratylus you'd have to code it in LIB_WEAPON - [11Mar2006-18:28:18] Niang@Kol i can, i was just looking to see if there wassomething like that already. I didn't want to reinvent the wheel - [11Mar2006-18:28:26] Cratylus nods. - [11Mar2006-18:30:49] Niang@Kol well it's rapiadly appraoching midnight (although i've just had this 'The sun appears just over the horizon.' appear :) ) and i'm on dinner duty tommorow, so i got to get up early :( - [11Mar2006-18:30:59] Niang@Kol see ya all around - [11Mar2006-18:31:25] Niang@Kol waves - [11Mar2006-18:31:41] Jerin@Jerins Folly Later - [11Mar2006-18:31:51] Avatar@OuterSpace do I recognize a bit of elephant style in that idea Miang? - [11Mar2006-18:32:07] Niang@Kol nods solemnly. - [11Mar2006-18:32:33] Avatar@OuterSpace is an elemud player gto ;) - [11Mar2006-18:32:33] Niang@Kol i am an elephant mudder - [11Mar2006-18:32:58] Niang@Kol really, who if i maybe so bold? - [11Mar2006-18:34:04] Avatar@OuterSpace dolenlhaw - [11Mar2006-18:34:42] Niang@Kol mmmm don't reconise the name, what class are you? - [11Mar2006-18:34:54] Avatar@OuterSpace ranger. - [11Mar2006-18:35:00] Niang@Kol i'v played many characters over teh years, - [11Mar2006-18:35:28] Niang@Kol ahhh, i'm playing knife the rogue at the moment - [11Mar2006-18:35:44] Niang@Kol although i'm also known as Nosmo the monk - [11Mar2006-18:35:46] Avatar@OuterSpace I only play ele sincd last years or so. (t years in mud time) - [11Mar2006-18:36:39] Niang@Kol i have played rangers, i helped play test them when they first came online, changed alot since those days - [11Mar2006-18:37:27] Niang@Kol ho well i got to go to bed now maybe i'll see you on ele someday. Be carefule outthere - [11Mar2006-18:38:17] Avatar@OuterSpace waves. - [11Mar2006-20:15:00] Jerin@Jerins Folly intermud must be down again - [11Mar2006-20:22:04] Ashon@Stargate Atlantis you can always go to the arch room and check the printout - [11Mar2006-20:23:55] Jerin@Jerins Folly ? - [11Mar2006-20:24:55] Cratylus that can be deceptive - [11Mar2006-20:24:57] Ashon@Stargate Atlantis the ds channel uses the intermud protocols, so if intermud is down, ds wouldn't work either, - [11Mar2006-20:25:11] Cratylus the next release has a ping feature that lets you test intermud connectivity - [11Mar2006-20:25:58] Ashon@Stargate Atlantis woot! - [11Mar2006-20:27:14] Ashon@Stargate Atlantis just a quick lib question for you Cratylus. - [11Mar2006-20:28:22] Ashon@Stargate Atlantis eventFunctions, ie eventBlessing in /lib/std/item.c are handled just like any other function right? or is there actually an event handler? - [11Mar2006-20:33:08] Cratylus normal - [11Mar2006-20:33:12] Cratylus no special handler - [11Mar2006-20:33:18] Cratylus the format is just a convention - [11Mar2006-20:33:48] Cratylus makes code a bit more understandable - [11Mar2006-20:38:35] Ashon@Stargate Atlantis sweet. excellent. - [11Mar2006-20:38:51] Ashon@Stargate Atlantis pets his cat in an evil master type way. --- 0 ---- diff -c -r --new-file ds2.0r18/lib/log/domain_stats ds2.0r28/lib/log/domain_stats *** ds2.0r18/lib/log/domain_stats Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/log/domain_stats Wed Jul 5 00:00:58 2006 *************** *** 0 **** --- 1,5 ---- + town 0 0 + default 0 0 + Ylsrim 0 0 + BACKBONE 0 0 + NONAME 0 0 diff -c -r --new-file ds2.0r18/lib/news/creator ds2.0r28/lib/news/creator *** ds2.0r18/lib/news/creator Thu Jan 5 12:18:39 2006 --- ds2.0r28/lib/news/creator Wed Jul 5 00:00:58 2006 *************** *** 1,18 **** Creator news /news/creator - New! Dead Souls Quick Creation System. - For info on the QCS, go to: ! ---------------------------------------------- ! http://dead-souls.sourceforge.net/example.html ! ---------------------------------------------- ! Dead Souls FAQ: http://dead-souls.sourceforge.net/ds-faq.html ! Dead Souls Admin FAQ: http://dead-souls.sourceforge.net/ds-admin-faq.html ! ! Editor tutorial: http://dead-souls.sourceforge.net/editor.html The Creators Manual has been updated and revised! --- 1,12 ---- Creator news /news/creator ! Dead Souls Admin FAQ: http://dead-souls.net/ds-admin-faq.html ! Dead Souls Creator FAQ: http://dead-souls.net/ds-creator-faq.html ! Editor tutorial: http://dead-souls.net/editor.html The Creators Manual has been updated and revised! diff -c -r --new-file ds2.0r18/lib/news/deadsouls ds2.0r28/lib/news/deadsouls *** ds2.0r18/lib/news/deadsouls Fri Mar 24 14:36:39 2006 --- ds2.0r28/lib/news/deadsouls Wed Jul 5 00:00:58 2006 *************** *** 5,16 **** ____/ \___| \__,_| \__,_| _____/ \___/ \__,_| _| ____/ The Dead Souls Development and Demo MUD ! This software is GPL. Any code you create ! here is automatically GPL and may be considered ! for inclusion in the Dead Souls distribution. * Intermud channels are restricted here * ---------------------------------------------------------- *-> This demo MUD grants creator powers to guests. The <-* *-> regular, downloadable version does not do this. <-* ---------------------------------------------------------- ! For more info: http://dead-souls.sourceforge.net/ --- 5,14 ---- ____/ \___| \__,_| \__,_| _____/ \___/ \__,_| _| ____/ The Dead Souls Development and Demo MUD ! This software is copyrighted and not GPL. * Intermud channels are restricted here * ---------------------------------------------------------- *-> This demo MUD grants creator powers to guests. The <-* *-> regular, downloadable version does not do this. <-* ---------------------------------------------------------- ! For more info: http://dead-souls.net/ diff -c -r --new-file ds2.0r18/lib/news/hints.txt ds2.0r28/lib/news/hints.txt *** ds2.0r18/lib/news/hints.txt Sun Dec 18 12:51:00 2005 --- ds2.0r28/lib/news/hints.txt Wed Jul 5 00:00:58 2006 *************** *** 1,7 **** CREATOR TIPS * For details on the Quick Creation System: ! http://dead-souls.sourceforge.net/example.html * Admins: there is a new command: admintool --- 1,13 ---- CREATOR TIPS * For details on the Quick Creation System: ! http://dead-souls.net/example.html ! ! * If you get stuck in the editor type a single dot on ! a blank line, then enter, then Q, then enter, like this: ! ! . ! Q * Admins: there is a new command: admintool *************** *** 21,28 **** you evaluate functions. For example: ------------------------ eval return this_player()->GetName() ! eval find_player("cratylus") ! eval present("sword",find_player("testylus"))->GetClass() ------------------------ --- 27,34 ---- you evaluate functions. For example: ------------------------ eval return this_player()->GetName() ! eval return find_player("cratylus") ! eval return present("sword",find_player("testylus"))->GetClass() ------------------------ *************** *** 89,92 **** /secure directories. You can't read anything in other creators' home dirs. Your read access to some items in the /secure directory is limited. ! If you're admin, of course, you have full access to everything. --- 95,98 ---- /secure directories. You can't read anything in other creators' home dirs. Your read access to some items in the /secure directory is limited. ! If you're full admin, of course, you have full access to everything. diff -c -r --new-file ds2.0r18/lib/news/reminders.txt ds2.0r28/lib/news/reminders.txt *** ds2.0r18/lib/news/reminders.txt Sun Dec 18 12:51:03 2005 --- ds2.0r28/lib/news/reminders.txt Wed Jul 5 00:00:58 2006 *************** *** 38,44 **** Destroy an object: dest example: dest key ! NOTE: Desting players or other creators is extrememly rude. Look in your current directory (your current folder): ls --- 38,44 ---- Destroy an object: dest example: dest key ! NOTE: Desting players or other creators is extremely rude. Look in your current directory (your current folder): ls diff -c -r --new-file ds2.0r18/lib/news/welcome ds2.0r28/lib/news/welcome *** ds2.0r18/lib/news/welcome Wed Jan 11 23:10:27 2006 --- ds2.0r28/lib/news/welcome Wed Jul 5 00:00:58 2006 *************** *** 1,11 **** ! The Dead Souls Object Library ! Version 2 for MudOS v22.2b14 ! Released 18 DEC 2005 by the Frontiers LPC Foundation, ! dedicated to the preservation of Old School Code. ! ! This software is GPL. ! ! For more info: http://dead-souls.sourceforge.net/ --- 1,6 ---- ! The Dead Souls Object Library version 2 ! This software is copyrighted and not GPL. ! For more info: http://dead-souls.net diff -c -r --new-file ds2.0r18/lib/obj/README ds2.0r28/lib/obj/README *** ds2.0r18/lib/obj/README Wed Dec 7 14:22:44 2005 --- ds2.0r28/lib/obj/README Wed Jul 5 00:00:58 2006 *************** *** 2,4 **** --- 2,12 ---- systems. Removing this directory or its contents, or modifying its contents may generate unexpected behavior from your mud. + + Do not try to use these objects directly, and do not + copy them into your area directories as templates. + QCS uses these rooms in very special ways, and having them + in your area directories may confuse it and give you + errors you don't understand. + + diff -c -r --new-file ds2.0r18/lib/obj/stargate.c ds2.0r28/lib/obj/stargate.c *** ds2.0r18/lib/obj/stargate.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/obj/stargate.c Wed Jul 5 00:00:58 2006 *************** *** 0 **** --- 1,83 ---- + #include + #include + #include "/lib/include/stargate.h" + + /** + * based on portal.c by Brodbane - March 2006 + * + * $Id: stargate.c,v 1.1 2006/04/05 05:48:39 jam Exp $ + * + * The desired functionality is much like a "star gate": users dialed + * letters or full words that lined up with destinations. A portal opens to + * that destination briefly. To define destinations you must setup a + * constant below then add it to the switch statement in the cmdDial + * function. This object is crude and basic, but gets the job done. + * + * 2006-03-22, jonez + * - original version of this file is from Daelas@Moraelinost + * 2006-03-23, jonez + * - altered so code uses existing verbs (touch, enter) where possible. last add_action is for dial command. + * - added single mapping called "database" and made the "dial" command use it. + * - dial command no longer uses switch/case, making adding a new destination simpler + * - made use of SetPreventGet() / SetPreventPut() + * - made use of new stargate daemon + * - made use of LIB_STARGATE + * - made use of STARGATE_D + * + * IDEAS: + * - create a daemon that holds the stargate network [DONE] + * - allow for stargate failure + * - add dhd object + * - change the code so that it uses a single mapping of names and + * destinations, perhaps in a database file. currently an update to the + * object requires an update for all the objects. [DONE] + * - dhd skill (thanks plato) + * - delay when dialing gate. destination dhd lights up? + * - player should not be able to dial earth if earth is already connected elsewhere (need daemon) [DONE] + * - make use of existing verbs (enter, touch) instead of doing our own thing. [DONE] + * - daemon should contain a class that maps the various gates to each other. see lib/include/door.h [DONE] + * - shout "off world activation" into the gateroom when the gate engages. + * - track status as "incoming" or "outgoing".. you can only "enter" an outgoing gate (rhk) [DONE] + * - if room is empty, shut down the gate (rhk) + * - change callout time when someone goes through the gate (rhk) + */ + + /* + Cratylus@Dead Souls but let me give you a quick outline + Cratylus@Dead Souls i type dial thing + Cratylus@Dead Souls the thing inherits LIB_DIAL + Cratylus@Dead Souls which is in /lib/events/dial.c + Cratylus@Dead Souls and all that contains is like direct_dial_ob() return 1; this kind of thing + Cratylus@Dead Souls take a look at LIB_TURN + Cratylus@Dead Souls what LIB_DIAL does is provide the object with hooks, so it *can* be dialed + Cratylus@Dead Souls so, when i type dial thing, the thing goes, yeah i + can be dialed, and then the parser enters the can_dial and do_dial funcs + in the verb + Cratylus@Dead Souls tellya what. i'd like to work with you on this one. i think it's less straightforward than it + seems, and i need to test some ideas before i can say "do it this way" + + */ + inherit LIB_STARGATE; + + int readScreen(); + + void create() + { + ::create(); + setOrigin("default", "/obj/room"); + // SetRead(([ ({ "screen" }) : (: readScreen :) ]) ); + // SetItems(([ ({ "screen" }) : "a computer screen which shows the status of the gate network" ]) ); + } + + void init() + { + ::init(); + } + + int readScreen() + { + write("stargate network status\n"); + write("-----------------------\n"); + write("\n"); + + } diff -c -r --new-file ds2.0r18/lib/realms/template/area/npc/fighter.c ds2.0r28/lib/realms/template/area/npc/fighter.c *** ds2.0r18/lib/realms/template/area/npc/fighter.c Mon Nov 7 13:31:47 2005 --- ds2.0r28/lib/realms/template/area/npc/fighter.c Wed Jul 5 00:01:15 2006 *************** *** 2,7 **** --- 2,8 ---- #include "../../customdefs.h" inherit LIB_NPC; + static void create(){ npc::create(); SetKeyName("fighter"); *************** *** 19,21 **** --- 20,25 ---- MY_WEAP "/sword.c" : "wield sword", ])); } + void init(){ + ::init(); + } \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/realms/template/area/obj/case.c ds2.0r28/lib/realms/template/area/obj/case.c *** ds2.0r18/lib/realms/template/area/obj/case.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/realms/template/area/obj/case.c Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,26 ---- + #include + #include "../../customdefs.h" + + inherit LIB_STORAGE; + + void create() { + ::create(); + SetKeyName("case"); + SetId( ({ "container" }) ); + SetAdjectives( ({ "generic","nondescript" }) ); + SetShort("a glass case"); + SetLong("This is an expensive looking, ornamented glass case. It looks perfect for storing trophies or jewelry for display."); + SetInventory(([ + MY_AREA "/obj/watch" : 1, + ])); + SetOpacity(10); + SetCanClose(1); + SetMass(274); + SetBaseCost("silver",1); + SetMaxCarry(500); + } + void init(){ + ::init(); + } + + mixed CanGet(object ob) { return "The case does not budge.";} diff -c -r --new-file ds2.0r18/lib/realms/template/area/obj/key.c ds2.0r28/lib/realms/template/area/obj/key.c *** ds2.0r18/lib/realms/template/area/obj/key.c Mon Nov 7 13:31:47 2005 --- ds2.0r28/lib/realms/template/area/obj/key.c Wed Jul 5 00:01:15 2006 *************** *** 2,7 **** --- 2,8 ---- inherit LIB_ITEM; + static void create() { item::create(); SetKeyName("key"); *************** *** 13,16 **** SetBaseCost(1); SetDisableChance(100); } ! --- 14,19 ---- SetBaseCost(1); SetDisableChance(100); } ! void init(){ ! ::init(); ! } \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/realms/template/area/obj/table.c ds2.0r28/lib/realms/template/area/obj/table.c *** ds2.0r18/lib/realms/template/area/obj/table.c Sun Dec 11 21:16:17 2005 --- ds2.0r28/lib/realms/template/area/obj/table.c Wed Jul 5 00:01:15 2006 *************** *** 3,8 **** --- 3,9 ---- inherit LIB_TABLE; + void create() { ::create(); SetKeyName("sample table"); *************** *** 16,18 **** --- 17,22 ---- MY_OBJ "/key" : 1, ]) ); } + void init(){ + ::init(); + } \ No newline at end of file diff -c -r --new-file ds2.0r18/lib/realms/template/area/obj/watch.c ds2.0r28/lib/realms/template/area/obj/watch.c *** ds2.0r18/lib/realms/template/area/obj/watch.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/realms/template/area/obj/watch.c Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,68 ---- + #include + #include + #include + #include + #include + + inherit LIB_ARMOR; + + int eventReadWatch(); + + static void create(){ + armor::create(); + SetKeyName("pocket watch"); + SetId(({"watch","pocketwatch","pocket watch","timepiece"})); + SetShort("a pocket watch"); + SetLong("This is a beautifully decorated and intricately carved "+ + "pocket watch. It glows with a bright, polished bronze "+ + "luster. It is quietly ticking the seconds, and it looks like you can get the "+ + "accurate time by reading the watch."); + SetMass(10); + SetBaseCost("silver",40); + SetProtection(BLUNT,1); + SetProtection(BLADE,1); + SetProtection(KNIFE,1); + SetArmorType(A_AMULET); + SetDefaultRead( (: eventReadWatch :) ); + } + void init(){ + ::init(); + } + + int eventReadWatch(){ + int hour, minutes; + int *time_of_day; + string hour_string, minute_string; + + time_of_day = SEASONS_D->GetMudTime(); + hour = time_of_day[0]; + minutes = time_of_day[1]; + + if(hour > 12) hour -= 12; + + hour_string = cardinal(hour); + switch(minutes){ + case 0 : minute_string ="o'clock"; break; + case 1 : minute_string = hour_string;hour_string ="one minute past"; break; + case 2 : minute_string = hour_string;hour_string ="two minutes past"; break; + case 3 : minute_string = hour_string;hour_string ="three minutes past"; break; + case 4 : minute_string = hour_string;hour_string ="four minutes past"; break; + case 5 : minute_string = hour_string;hour_string ="five past"; break; + case 6 : minute_string = hour_string;hour_string ="six minutes past"; break; + case 7 : minute_string = hour_string;hour_string ="seven minutes past"; break; + case 8 : minute_string = hour_string;hour_string ="eight minutes past"; break; + case 9 : minute_string = hour_string;hour_string ="nine minutes past"; break; + case 10 : minute_string = hour_string;hour_string ="ten past"; break; + case 15 : minute_string = hour_string;hour_string ="quarter past"; break; + case 45 : minute_string = cardinal(hour+1);hour_string ="quarter of"; break; + case 50 : minute_string = cardinal(hour+1);;hour_string ="ten of"; break; + case 55 : minute_string = cardinal(hour+1);hour_string ="five of"; break; + default : minute_string = cardinal(minutes);break; + } + + if(minute_string == "thirteen") minute_string = "one"; + + write("According to the watch, it is "+hour_string+" "+minute_string+"."); + + return 1; + } diff -c -r --new-file ds2.0r18/lib/realms/template/area/room/sample_room.c ds2.0r28/lib/realms/template/area/room/sample_room.c *** ds2.0r18/lib/realms/template/area/room/sample_room.c Sun Dec 11 21:16:17 2005 --- ds2.0r28/lib/realms/template/area/room/sample_room.c Wed Jul 5 00:01:15 2006 *************** *** 14,21 **** ]) ); SetExits( ([ "west" : MY_DIR "/workroom", ]) ); - SetObviousExits("w"); SetInventory( ([ MY_OBJ "/table" : 1, MY_NPC "/fighter" : 1, --- 14,21 ---- ]) ); SetExits( ([ "west" : MY_DIR "/workroom", + "east" : MY_ROOM "/sample_two.c", ]) ); SetInventory( ([ MY_OBJ "/table" : 1, MY_NPC "/fighter" : 1, *************** *** 23,27 **** } void init(){ ! ::init(); } --- 23,27 ---- } void init(){ ! ::init(); } diff -c -r --new-file ds2.0r18/lib/realms/template/area/room/sample_two.c ds2.0r28/lib/realms/template/area/room/sample_two.c *** ds2.0r18/lib/realms/template/area/room/sample_two.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/realms/template/area/room/sample_two.c Wed Jul 5 00:01:15 2006 *************** *** 0 **** --- 1,26 ---- + #include + #include "../../customdefs.h" + + inherit LIB_ROOM; + + static void create() { + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Second Sample Room"); + SetLong("This is another sample room."); + SetItems( ([ + "template" : "That's what this is.", + ]) ); + SetInventory(([ + MY_OBJ "/case" :1, + ])); + SetExits(([ + "west" : MY_AREA "/room/sample_room", + ])); + + } + + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/realms/template/workroom.c ds2.0r28/lib/realms/template/workroom.c *** ds2.0r18/lib/realms/template/workroom.c Sun Dec 18 01:57:11 2005 --- ds2.0r28/lib/realms/template/workroom.c Wed Jul 5 00:01:05 2006 *************** *** 31,43 **** ]) ); SetInventory( ([ "/domains/default/obj/chest" : 1, ! "/domains/default/obj/bbucket" :1, ]) ); - SetObviousExits("e,d"); SetExits( ([ "down" : "/domains/default/room/wiz_hall.c", "east" : MY_ROOM "/sample_room" ]) ); ! SetNoModify(1); } int ReadSign(){ --- 31,42 ---- ]) ); SetInventory( ([ "/domains/default/obj/chest" : 1, ! "/domains/default/obj/bbucket" :1, ]) ); SetExits( ([ "down" : "/domains/default/room/wiz_hall.c", "east" : MY_ROOM "/sample_room" ]) ); ! SetNoModify(0); } int ReadSign(){ diff -c -r --new-file ds2.0r18/lib/save/economy.o ds2.0r28/lib/save/economy.o *** ds2.0r18/lib/save/economy.o Wed Feb 22 15:32:58 2006 --- ds2.0r28/lib/save/economy.o Wed Jul 5 00:00:58 2006 *************** *** 1,3 **** #/secure/daemon/economy.c ! Currencies (["gold":(["rate":1000,"weight":0.100000,"inflation":0.000000,]),"silver":(["rate":100,"weight":0.800000,"inflation":0.000000,]),"electrum":(["rate":500,"weight":0.004000,"inflation":0.000000,]),"copper":(["rate":1,"weight":0.010000,"inflation":0.000000,]),"platinum":(["rate":10000,"weight":0.200000,"inflation":0.000000,]),]) ! LastInflation 1140637513 --- 1,3 ---- #/secure/daemon/economy.c ! Currencies (["dollars":(["rate":100.000000,"weight":0.001000,"inflation":0.000000,]),"silver":(["rate":100,"weight":0.800000,"inflation":0.000000,]),"electrum":(["rate":500,"weight":0.004000,"inflation":0.000000,]),"platinum":(["rate":10000,"weight":0.200000,"inflation":0.000000,]),"copper":(["rate":1,"weight":0.010000,"inflation":0.000000,]),"gold":(["rate":1000,"weight":0.100000,"inflation":0.000000,]),]) ! LastInflation 1150654990 diff -c -r --new-file ds2.0r18/lib/save/events.o ds2.0r28/lib/save/events.o *** ds2.0r18/lib/save/events.o Fri Mar 24 14:37:42 2006 --- ds2.0r28/lib/save/events.o Wed Jul 5 00:00:58 2006 *************** *** 1,3 **** #/secure/daemon/events.c RebootInterval 1000 ! Events ([1143229968:(["regular":7200,"function":"RotateLogs","args":({}),"interval":7200,"creator":"/secure/daemon/log","object":"/secure/daemon/log",]),]) --- 1,3 ---- #/secure/daemon/events.c RebootInterval 1000 ! Events ([1151333254:(["interval":7200,"args":({}),"object":"/secure/daemon/log","function":"RotateLogs","regular":7200,"creator":"/secure/daemon/log",]),]) diff -c -r --new-file ds2.0r18/lib/save/races.o ds2.0r28/lib/save/races.o *** ds2.0r18/lib/save/races.o Fri Mar 24 14:37:42 2006 --- ds2.0r28/lib/save/races.o Wed Jul 5 00:00:58 2006 *************** *** 1,7 **** #/daemon/races.c ! Races (["human":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),}),([]),(["luck":(/3,50,/),"intelligence":(/3,50,/),"durability":(/3,50,/),"charisma":(/3,50,/),"strength":(/3,50,/),"speed":(/3,50,/),"agility":(/3,50,/),"wisdom":(/3,50,/),"coordination":(/3,50,/),]),(["right hand":5,"left hand":5,]),({25,75,}),1,1,"English",(["psionic defense":({"2","3","4","5",}),]),/),"gnoll":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"high",32:"high",16:"low",2:"medium",]),(["luck":(/2,31,/),"intelligence":(/2,31,/),"durability":(/2,31,/),"charisma":(/2,31,/),"strength":(/2,31,/),"speed":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"wisdom":(/2,31,/),]),([]),({20,80,}),1,0,"Gnollish",([]),/),"unicorn":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/2,31,/),"intelligence":(/2,31,/),"durability":(/2,31,/),"charisma":(/2,31,/),"strength":(/2,31,/),"speed":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"wisdom":(/2,31,/),]),([]),({20,80,}),1,0,"Unicornish",([]),/),"gargoyle":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left arm","torso",3,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",3,({8,4096,131072,1048576,65536,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right arm","torso",3,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",3,({8,4096,131072,1048576,65536,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left wing","torso",3,({}),}),({"left wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",16:"low",2:"low",]),(["luck":(/2,31,/),"intelligence":(/2,31,/),"durability":(/2,31,/),"charisma":(/2,31,/),"strength":(/2,31,/),"speed":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"wisdom":(/2,31,/),]),([]),({20,80,}),1,0,"Gargoyleish",([]),/),"kender":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["luck":(/4,7,/),"intelligence":(/4,7,/),"durability":(/4,7,/),"charisma":(/4,7,/),"strength":(/4,7,/),"speed":(/4,7,/),"agility":(/4,7,/),"wisdom":(/4,7,/),"coordination":(/4,7,/),]),(["right hand":5,"left hand":5,]),({23,78,}),1,0,"Kendrall",(["stealing":({"1","5","5","5",}),]),/),"insect":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"4th leg","torso",3,({32,1048576,1024,128,}),}),({"4th leg","torso",3,({32,1048576,1024,128,}),}),({"6th leg","torso",3,({32,1048576,1024,128,}),}),({"6th leg","torso",3,({32,1048576,1024,128,}),}),({"5th leg","torso",3,({32,1048576,1024,128,}),}),({"5th leg","torso",3,({32,1048576,1024,128,}),}),({"1st leg","torso",3,({32,1048576,1024,128,}),}),({"1st leg","torso",3,({32,1048576,1024,128,}),}),({"3rd leg","torso",3,({32,1048576,1024,128,}),}),({"3rd leg","torso",3,({32,1048576,1024,128,}),}),({"2nd leg","torso",3,({32,1048576,1024,128,}),}),({"2nd leg","torso",3,({32,1048576,1024,128,}),}),}),([64:"low",32:"high",16:"low",2:"medium",]),(["luck":(/3,21,/),"intelligence":(/3,21,/),"durability":(/3,21,/),"charisma":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"wisdom":(/3,21,/),]),([]),({20,80,}),1,0,"Insectish",([]),/),"satyr":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right hoof","right leg",4,({16,32,64,128,}),}),({"right hoof","right leg",4,({16,32,64,128,}),}),({"left hoof","left leg",4,({16,32,64,128,}),}),({"left hoof","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["luck":(/1,80,/),"intelligence":(/1,80,/),"durability":(/1,80,/),"charisma":(/1,80,/),"strength":(/1,80,/),"speed":(/1,80,/),"agility":(/1,80,/),"wisdom":(/1,80,/),"coordination":(/1,80,/),]),(["right hand":4,"left hand":4,]),({27,77,}),1,0,"Wulinaxian",([]),/),"demi-god":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"low",32:"high",]),(["luck":(/2,31,/),"intelligence":(/2,31,/),"durability":(/2,31,/),"charisma":(/2,31,/),"strength":(/2,31,/),"speed":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"wisdom":(/2,31,/),]),(["right hand":5,"left hand":5,]),({20,80,}),1,0,"Demi-godish",([]),/),"bear":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["luck":(/5,1,/),"intelligence":(/5,1,/),"durability":(/5,1,/),"charisma":(/5,1,/),"strength":(/5,1,/),"speed":(/5,1,/),"agility":(/5,1,/),"coordination":(/5,1,/),"wisdom":(/5,1,/),]),([]),({20,80,}),1,0,"Bearish",([]),/),"horse":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),}),([64:"low",32:"high",16:"low",2:"medium",]),(["luck":(/4,10,/),"intelligence":(/4,10,/),"durability":(/4,10,/),"charisma":(/4,10,/),"strength":(/4,10,/),"speed":(/4,10,/),"agility":(/4,10,/),"coordination":(/4,10,/),"wisdom":(/4,10,/),]),([]),({20,80,}),1,0,"Horseish",([]),/),"deer":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["luck":(/4,10,/),"intelligence":(/4,10,/),"durability":(/4,10,/),"charisma":(/4,10,/),"strength":(/4,10,/),"speed":(/4,10,/),"agility":(/4,10,/),"coordination":(/4,10,/),"wisdom":(/4,10,/),]),([]),({20,80,}),1,0,"Deerish",([]),/),"tortoise":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/2,31,/),"intelligence":(/2,31,/),"durability":(/2,31,/),"charisma":(/2,31,/),"strength":(/2,31,/),"speed":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"wisdom":(/2,31,/),]),([]),({20,80,}),1,0,"Tortoiseish",([]),/),"cow":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["luck":(/3,21,/),"intelligence":(/3,21,/),"durability":(/3,21,/),"charisma":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"wisdom":(/3,21,/),]),([]),({20,80,}),1,0,"Cowish",([]),/),"half-orc":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["luck":(/5,10,/),"intelligence":(/5,10,/),"durability":(/5,10,/),"charisma":(/5,10,/),"strength":(/5,10,/),"speed":(/5,10,/),"agility":(/5,10,/),"wisdom":(/5,10,/),"coordination":(/5,10,/),]),(["right hand":4,"left hand":4,]),({12,62,}),1,1,"Tangetto",([]),/),"dwarf":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([64:"low",2:"low",]),(["luck":(/3,20,/),"intelligence":(/3,20,/),"durability":(/3,20,/),"charisma":(/3,20,/),"strength":(/3,20,/),"speed":(/3,20,/),"agility":(/3,20,/),"wisdom":(/3,20,/),"coordination":(/3,20,/),]),(["right hand":4,"left hand":4,]),({15,65,}),1,1,"Malkierien",([]),/),"halfling":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["luck":(/4,10,/),"intelligence":(/4,10,/),"durability":(/4,10,/),"charisma":(/4,10,/),"strength":(/4,10,/),"speed":(/4,10,/),"agility":(/4,10,/),"wisdom":(/4,10,/),"coordination":(/4,10,/),]),(["right hand":5,"left hand":5,]),({15,65,}),1,1,"Ersi",([]),/),"dragon":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left wing","torso",3,({}),}),({"left wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["luck":(/3,21,/),"intelligence":(/3,21,/),"durability":(/3,21,/),"charisma":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"wisdom":(/3,21,/),]),([]),({20,80,}),1,0,"Dragonish",([]),/),"primate":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/3,21,/),"intelligence":(/3,21,/),"durability":(/3,21,/),"charisma":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"wisdom":(/3,21,/),]),([]),({20,80,}),1,0,"Primateish",([]),/),"pegasus":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left wing","torso",3,({}),}),({"left wing","torso",3,({}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/2,31,/),"intelligence":(/2,31,/),"durability":(/2,31,/),"charisma":(/2,31,/),"strength":(/2,31,/),"speed":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"wisdom":(/2,31,/),]),([]),({20,80,}),1,0,"Pegasusish",([]),/),"dog":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["luck":(/4,10,/),"intelligence":(/4,10,/),"durability":(/4,10,/),"charisma":(/4,10,/),"strength":(/4,10,/),"speed":(/4,10,/),"agility":(/4,10,/),"coordination":(/4,10,/),"wisdom":(/4,10,/),]),([]),({20,80,}),1,0,"Dogish",([]),/),"orc":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["luck":(/5,3,/),"intelligence":(/5,3,/),"durability":(/5,3,/),"charisma":(/5,3,/),"strength":(/5,3,/),"speed":(/5,3,/),"agility":(/5,3,/),"wisdom":(/5,3,/),"coordination":(/5,3,/),]),(["right hand":6,"left hand":6,]),({21,71,}),1,1,"Tangetto",([]),/),"artrell":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,}),}),({"head","torso",1,({256,512,262144,}),}),({"head","torso",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"first arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"first arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"second arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"second arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"third arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"third arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"fourth arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"fourth arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"first hand","first arm",4,({2,4,8,32768,65536,}),}),({"first hand","first arm",4,({2,4,8,32768,65536,}),}),({"second hand","second arm",4,({2,4,8,32768,65536,}),}),({"second hand","second arm",4,({2,4,8,32768,65536,}),}),({"third hand","third arm",4,({2,4,8,32768,65536,}),}),({"third hand","third arm",4,({2,4,8,32768,65536,}),}),({"fourth hand","fourth arm",4,({2,4,8,32768,65536,}),}),({"fourth hand","fourth arm",4,({2,4,8,32768,65536,}),}),}),([64:"low",32:"high",]),(["luck":(/5,5,/),"intelligence":(/5,5,/),"durability":(/5,5,/),"charisma":(/5,5,/),"strength":(/5,5,/),"speed":(/5,5,/),"agility":(/5,5,/),"wisdom":(/5,5,/),"coordination":(/5,5,/),]),(["third hand":2,"fourth hand":2,"second hand":2,"first hand":2,]),({7,61,}),1,0,"Artrexcian",([]),/),"griffin":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left wing","torso",3,({}),}),({"left wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"high",32:"high",16:"low",2:"medium",]),(["luck":(/2,31,/),"intelligence":(/2,31,/),"durability":(/2,31,/),"charisma":(/2,31,/),"strength":(/2,31,/),"speed":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"wisdom":(/2,31,/),]),([]),({20,80,}),1,0,"Griffinish",([]),/),"bird":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right wing","torso",4,({}),}),({"right wing","torso",4,({}),}),({"left wing","torso",4,({}),}),({"left wing","torso",4,({}),}),}),([64:"low",32:"high",]),(["luck":(/4,10,/),"intelligence":(/4,10,/),"durability":(/4,10,/),"charisma":(/4,10,/),"strength":(/4,10,/),"speed":(/4,10,/),"agility":(/4,10,/),"coordination":(/4,10,/),"wisdom":(/4,10,/),]),([]),({20,80,}),1,0,"Birdish",([]),/),"half-elf":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["luck":(/2,33,/),"intelligence":(/2,33,/),"durability":(/2,33,/),"charisma":(/2,33,/),"strength":(/2,33,/),"speed":(/2,33,/),"agility":(/2,33,/),"wisdom":(/2,33,/),"coordination":(/2,33,/),]),(["right hand":4,"left hand":4,]),({12,62,}),1,1,"Edhellen",([]),/),"ogre":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),}),([8:"low",2:"low",4:"low",]),(["luck":(/5,1,/),"intelligence":(/5,1,/),"durability":(/5,1,/),"charisma":(/5,1,/),"strength":(/5,1,/),"speed":(/5,1,/),"agility":(/5,1,/),"wisdom":(/5,1,/),"coordination":(/5,1,/),]),(["right hand":6,"left hand":6,]),({25,70,}),1,0,"Shangtai",([]),/),"god":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"high",32:"high",16:"low",2:"medium",]),(["luck":(/1,43,/),"intelligence":(/1,43,/),"durability":(/1,43,/),"charisma":(/1,43,/),"strength":(/1,43,/),"speed":(/1,43,/),"agility":(/1,43,/),"coordination":(/1,43,/),"wisdom":(/1,43,/),]),([]),({20,80,}),1,0,"Godish",([]),/),"viper":(/({({"torso",0,1,({16384,}),}),({"torso",0,1,({16384,}),}),({"head","torso",1,({256,}),}),({"head","torso",1,({256,}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/5,1,/),"intelligence":(/5,1,/),"durability":(/5,1,/),"charisma":(/5,1,/),"strength":(/5,1,/),"speed":(/5,1,/),"agility":(/5,1,/),"coordination":(/5,1,/),"wisdom":(/5,1,/),]),([]),({20,80,}),1,0,"Aspish",([]),/),"faerie":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([16:"low",]),(["luck":(/2,15,/),"intelligence":(/2,15,/),"durability":(/2,15,/),"charisma":(/2,15,/),"strength":(/2,15,/),"speed":(/2,15,/),"agility":(/2,15,/),"wisdom":(/2,15,/),"coordination":(/2,15,/),]),(["right hand":5,"left hand":5,]),({30,80,}),1,0,"Elcharean",([]),/),"avidryl":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,}),}),({"head","torso",1,({256,512,262144,}),}),({"head","torso",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,8192,}),}),({"right leg","torso",2,({32,128,1024,1048576,8192,}),}),({"left leg","torso",2,({32,128,1024,1048576,8192,}),}),({"left leg","torso",2,({32,128,1024,1048576,8192,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right wing","torso",4,({}),}),({"right wing","torso",4,({}),}),({"left wing","torso",4,({}),}),({"left wing","torso",4,({}),}),}),([]),(["luck":(/5,10,/),"intelligence":(/5,10,/),"durability":(/5,10,/),"charisma":(/5,10,/),"strength":(/5,10,/),"speed":(/5,10,/),"agility":(/5,10,/),"wisdom":(/5,10,/),"coordination":(/5,10,/),]),(["right hand":5,"left hand":5,]),({15,85,}),1,0,"Avidryl",([]),/),"elf":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),}),([]),(["luck":(/1,30,/),"intelligence":(/1,30,/),"durability":(/1,30,/),"charisma":(/1,30,/),"strength":(/1,30,/),"speed":(/1,30,/),"agility":(/1,30,/),"wisdom":(/1,30,/),"coordination":(/1,30,/),]),(["right hand":5,"left hand":5,]),({17,73,}),1,1,"Edhellen",([]),/),"lizard":(/({({"torso",0,1,({262144,}),}),({"torso",0,1,({262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"medium",32:"high",16:"low",128:"medium",8:"medium",2:"medium",4:"medium",]),(["luck":(/3,21,/),"intelligence":(/3,21,/),"durability":(/3,21,/),"charisma":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"wisdom":(/3,21,/),]),([]),({20,80,}),1,0,"Lizardish",([]),/),"giant":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([2:"medium",]),(["luck":(/5,1,/),"intelligence":(/5,1,/),"durability":(/5,1,/),"charisma":(/5,1,/),"strength":(/5,1,/),"speed":(/5,1,/),"agility":(/5,1,/),"wisdom":(/5,1,/),"coordination":(/5,1,/),]),(["right hand":6,"left hand":6,]),({27,65,}),1,0,"Loyavenku",([]),/),"plant":(/({({"trunk",0,1,({}),}),({"trunk",0,1,({}),}),({"1st branch","trunk",3,({}),}),({"1st branch","trunk",3,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/5,1,/),"intelligence":(/5,1,/),"durability":(/5,1,/),"charisma":(/5,1,/),"strength":(/5,1,/),"speed":(/5,1,/),"agility":(/5,1,/),"coordination":(/5,1,/),"wisdom":(/5,1,/),]),([]),({20,80,}),1,0,"Plantish",([]),/),"dryad":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"low",32:"high",]),(["luck":(/3,21,/),"intelligence":(/3,21,/),"durability":(/3,21,/),"charisma":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"wisdom":(/3,21,/),]),(["right hand":5,"left hand":5,]),({20,80,}),1,0,"Dryadish",([]),/),"gnome":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["luck":(/1,40,/),"intelligence":(/1,40,/),"durability":(/1,40,/),"charisma":(/1,40,/),"strength":(/1,40,/),"speed":(/1,40,/),"agility":(/1,40,/),"wisdom":(/1,40,/),"coordination":(/1,40,/),]),(["right hand":4,"left hand":4,]),({8,61,}),1,0,"Nibelungen",([]),/),"chimera":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"lion head","torso",2,({1048576,512,256,8192,}),}),({"lion head","torso",2,({1048576,512,256,8192,}),}),({"goat head","torso",2,({1048576,512,256,8192,}),}),({"goat head","torso",2,({1048576,512,256,8192,}),}),({"dragon head","torso",2,({1048576,512,256,8192,}),}),({"dragon head","torso",2,({1048576,512,256,8192,}),}),({"right wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"left wing","torso",3,({}),}),({"left wing","torso",3,({}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["luck":(/4,10,/),"intelligence":(/4,10,/),"durability":(/4,10,/),"charisma":(/4,10,/),"strength":(/4,10,/),"speed":(/4,10,/),"agility":(/4,10,/),"coordination":(/4,10,/),"wisdom":(/4,10,/),]),([]),({20,80,}),1,0,"Chimeraish",([]),/),"goblin":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"high",32:"high",16:"low",2:"medium",]),(["luck":(/3,21,/),"intelligence":(/3,21,/),"durability":(/3,21,/),"charisma":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"wisdom":(/3,21,/),]),([]),({20,80,}),1,0,"Goblinish",([]),/),"tree":(/({({"trunk",0,1,({}),}),({"trunk",0,1,({}),}),({"1st branch","trunk",3,({}),}),({"1st branch","trunk",3,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/5,1,/),"intelligence":(/5,1,/),"durability":(/5,1,/),"charisma":(/5,1,/),"strength":(/5,1,/),"speed":(/5,1,/),"agility":(/5,1,/),"coordination":(/5,1,/),"wisdom":(/5,1,/),]),([]),({20,80,}),1,0,"Treeish",([]),/),"elemental":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),}),([64:"low",32:"high",2:"low",]),(["luck":(/3,21,/),"intelligence":(/3,21,/),"durability":(/3,21,/),"charisma":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"wisdom":(/3,21,/),]),([]),({20,80,}),1,0,"Elementalish",([]),/),"balrog":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),}),([128:"high",]),(["luck":(/3,10,/),"intelligence":(/3,10,/),"durability":(/3,10,/),"charisma":(/3,10,/),"strength":(/3,10,/),"speed":(/3,10,/),"agility":(/3,10,/),"wisdom":(/3,10,/),"coordination":(/3,10,/),]),(["right hand":6,"left hand":6,]),({10,67,}),1,0,"Balrog",([]),/),"android":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),}),([]),(["luck":(/3,50,/),"intelligence":(/3,50,/),"durability":(/3,50,/),"charisma":(/3,50,/),"strength":(/3,50,/),"speed":(/3,50,/),"agility":(/3,50,/),"wisdom":(/3,50,/),"coordination":(/3,50,/),]),(["right hand":5,"left hand":5,]),({25,75,}),1,0,"English",([]),/),"amphibian":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,262144,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([]),(["luck":(/2,31,/),"intelligence":(/2,31,/),"durability":(/2,31,/),"charisma":(/2,31,/),"strength":(/2,31,/),"speed":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"wisdom":(/2,31,/),]),([]),({20,80,}),1,0,"Amphibianish",([]),/),"slug":(/({({"torso",0,1,({16384,}),}),({"torso",0,1,({16384,}),}),({"head","torso",1,({256,}),}),({"head","torso",1,({256,}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/5,1,/),"intelligence":(/5,1,/),"durability":(/5,1,/),"charisma":(/5,1,/),"strength":(/5,1,/),"speed":(/5,1,/),"agility":(/5,1,/),"coordination":(/5,1,/),"wisdom":(/5,1,/),]),([]),({20,80,}),1,0,"Slugish",([]),/),"nymph":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["luck":(/4,20,/),"intelligence":(/4,20,/),"durability":(/4,20,/),"charisma":(/4,20,/),"strength":(/4,20,/),"speed":(/4,20,/),"agility":(/4,20,/),"wisdom":(/4,20,/),"coordination":(/4,20,/),]),(["right hand":5,"left hand":5,]),({26,76,}),1,0,"Nymal",([]),/),"wraith":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/2,31,/),"intelligence":(/2,31,/),"durability":(/2,31,/),"charisma":(/2,31,/),"strength":(/2,31,/),"speed":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"wisdom":(/2,31,/),]),([]),({20,80,}),1,0,"Wraithish",([]),/),"elephant":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"trunk","head",3,({}),}),({"trunk","head",3,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",2:"low",]),(["luck":(/3,21,/),"intelligence":(/3,21,/),"durability":(/3,21,/),"charisma":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"wisdom":(/3,21,/),]),([]),({20,80,}),1,0,"Elephantish",([]),/),"cat":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"tail","torso",5,({}),}),({"tail","torso",5,({}),}),}),([]),(["luck":(/3,21,/),"intelligence":(/3,21,/),"durability":(/3,21,/),"charisma":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"wisdom":(/3,21,/),]),([]),({20,80,}),1,0,"Feline",(["stealth":({"1","5","4","6",}),]),/),"rodent":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/4,10,/),"intelligence":(/4,10,/),"durability":(/4,10,/),"charisma":(/4,10,/),"strength":(/4,10,/),"speed":(/4,10,/),"agility":(/4,10,/),"coordination":(/4,10,/),"wisdom":(/4,10,/),]),([]),({20,80,}),1,0,"Rodentish",([]),/),"sheep":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/4,10,/),"intelligence":(/4,10,/),"durability":(/4,10,/),"charisma":(/4,10,/),"strength":(/4,10,/),"speed":(/4,10,/),"agility":(/4,10,/),"coordination":(/4,10,/),"wisdom":(/4,10,/),]),([]),({20,80,}),1,0,"Sheepish",([]),/),"golem":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"high",32:"high",16:"low",2:"medium",]),(["luck":(/3,21,/),"intelligence":(/3,21,/),"durability":(/3,21,/),"charisma":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"wisdom":(/3,21,/),]),([]),({20,80,}),1,0,"Golemish",([]),/),"demon":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"low",32:"high",]),(["luck":(/2,31,/),"intelligence":(/2,31,/),"durability":(/2,31,/),"charisma":(/2,31,/),"strength":(/2,31,/),"speed":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"wisdom":(/2,31,/),]),([]),({20,80,}),1,0,"Demonish",([]),/),"centaur":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"lower torso","head",1,({}),}),({"lower torso","head",1,({}),}),({"right arm","torso",2,({}),}),({"right arm","torso",2,({}),}),({"right foreleg","lower torso",3,({}),}),({"right foreleg","lower torso",3,({}),}),({"left foreleg","lower torso",3,({}),}),({"left foreleg","lower torso",3,({}),}),({"right back leg","lower torso",3,({}),}),({"right back leg","lower torso",3,({}),}),({"left back leg","lower torso",3,({}),}),({"left back leg","lower torso",3,({}),}),({"right hand","right arm",4,({}),}),({"right hand","right arm",4,({}),}),({"left hand","left arm",4,({}),}),({"left hand","left arm",4,({}),}),({"right forehoof","right foreleg",4,({}),}),({"right forehoof","right foreleg",4,({}),}),({"left forehoof","left foreleg",4,({}),}),({"left forehoof","left foreleg",4,({}),}),({"right back hoof","right back leg",4,({}),}),({"right back hoof","right back leg",4,({}),}),({"left back hoof","left back leg",4,({}),}),({"left back hoof","left back leg",4,({}),}),}),([64:"low",32:"high",]),(["luck":(/4,10,/),"intelligence":(/4,10,/),"durability":(/4,10,/),"charisma":(/4,10,/),"strength":(/4,10,/),"speed":(/4,10,/),"agility":(/4,10,/),"coordination":(/4,10,/),"wisdom":(/4,10,/),]),(["right hand":5,"left hand":5,]),({20,80,}),1,0,"Centaurish",([]),/),"kobold":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left hoof","left leg",4,({}),}),({"left hoof","left leg",4,({}),}),({"right hoof","right leg",4,({}),}),({"right hoof","right leg",4,({}),}),}),([64:"medium",32:"high",16:"low",128:"medium",8:"medium",2:"medium",4:"medium",]),(["luck":(/2,31,/),"intelligence":(/2,31,/),"durability":(/2,31,/),"charisma":(/2,31,/),"strength":(/2,31,/),"speed":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"wisdom":(/2,31,/),]),(["right hand":5,"left hand":5,]),({20,80,}),1,0,"Koboldish",([]),/),"troll":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([2:"low",]),(["luck":(/5,5,/),"intelligence":(/5,5,/),"durability":(/5,5,/),"charisma":(/5,5,/),"strength":(/5,5,/),"speed":(/5,5,/),"agility":(/5,5,/),"wisdom":(/5,5,/),"coordination":(/5,5,/),]),(["right hand":4,"left hand":4,]),({15,65,}),1,0,"Trollish",(["poison bite":({"1","3","2","4",}),]),/),"pig":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/3,21,/),"intelligence":(/3,21,/),"durability":(/3,21,/),"charisma":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"wisdom":(/3,21,/),]),([]),({20,80,}),1,0,"Pigish",([]),/),"hobbit":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([64:"low",]),(["luck":(/3,20,/),"intelligence":(/3,20,/),"durability":(/3,20,/),"charisma":(/3,20,/),"strength":(/3,20,/),"speed":(/3,20,/),"agility":(/3,20,/),"wisdom":(/3,20,/),"coordination":(/3,20,/),]),(["right hand":4,"left hand":4,]),({20,70,}),1,0,"Terrakarn",([]),/),"bat":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,}),}),({"head","torso",1,({256,512,262144,}),}),({"head","torso",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right claw","right leg",4,({16,32,64,128,}),}),({"right claw","right leg",4,({16,32,64,128,}),}),({"left claw","left leg",4,({16,32,64,128,}),}),({"left claw","left leg",4,({16,32,64,128,}),}),({"left wing","torso",2,({8,65536,8192,131072,1048576,}),}),({"left wing","torso",2,({8,65536,8192,131072,1048576,}),}),({"right wing","torso",2,({8,65536,8192,131072,1048576,}),}),({"right wing","torso",2,({8,65536,8192,131072,1048576,}),}),}),([]),(["luck":(/5,10,/),"intelligence":(/5,10,/),"durability":(/5,10,/),"charisma":(/5,10,/),"strength":(/5,10,/),"speed":(/5,10,/),"agility":(/5,10,/),"wisdom":(/5,10,/),"coordination":(/5,10,/),]),([]),({15,65,}),1,0,"Battish",([]),/),"fish":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),}),([64:"low",32:"high",16:"low",2:"low",]),(["luck":(/2,31,/),"intelligence":(/2,31,/),"durability":(/2,31,/),"charisma":(/2,31,/),"strength":(/2,31,/),"speed":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"wisdom":(/2,31,/),]),([]),({20,80,}),1,0,"Fishish",([]),/),"arachnid":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"1st leg","torso",3,({32,1048576,1024,128,}),}),({"1st leg","torso",3,({32,1048576,1024,128,}),}),({"8th leg","torso",3,({32,1048576,1024,128,}),}),({"8th leg","torso",3,({32,1048576,1024,128,}),}),({"2nd leg","torso",3,({32,1048576,1024,128,}),}),({"2nd leg","torso",3,({32,1048576,1024,128,}),}),({"5th leg","torso",3,({32,1048576,1024,128,}),}),({"5th leg","torso",3,({32,1048576,1024,128,}),}),({"7th leg","torso",3,({32,1048576,1024,128,}),}),({"7th leg","torso",3,({32,1048576,1024,128,}),}),({"4th leg","torso",3,({32,1048576,1024,128,}),}),({"4th leg","torso",3,({32,1048576,1024,128,}),}),({"3rd leg","torso",3,({32,1048576,1024,128,}),}),({"3rd leg","torso",3,({32,1048576,1024,128,}),}),({"6th leg","torso",3,({32,1048576,1024,128,}),}),({"6th leg","torso",3,({32,1048576,1024,128,}),}),}),([]),(["luck":(/1,43,/),"intelligence":(/1,43,/),"durability":(/1,43,/),"charisma":(/1,43,/),"strength":(/1,43,/),"speed":(/1,43,/),"agility":(/1,43,/),"coordination":(/1,43,/),"wisdom":(/1,43,/),]),([]),({20,80,}),1,0,"Arachnidish",([]),/),"klingon":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),}),([64:"medium",8:"medium",128:"medium",2:"medium",4:"medium",]),(["luck":(/5,1,/),"intelligence":(/5,1,/),"durability":(/5,1,/),"charisma":(/5,1,/),"strength":(/5,1,/),"speed":(/5,1,/),"agility":(/5,1,/),"wisdom":(/5,1,/),"coordination":(/5,1,/),]),(["right hand":5,"left hand":5,]),({19,65,}),1,0,"T'linghan",([]),/),"snake":(/({({"torso",0,1,({16384,}),}),({"torso",0,1,({16384,}),}),({"head","torso",1,({256,}),}),({"head","torso",1,({256,}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["luck":(/5,1,/),"intelligence":(/5,1,/),"durability":(/5,1,/),"charisma":(/5,1,/),"strength":(/5,1,/),"speed":(/5,1,/),"agility":(/5,1,/),"coordination":(/5,1,/),"wisdom":(/5,1,/),]),([]),({20,80,}),1,0,"Snakeish",([]),/),]) ! FlyingRaces ({"avidryl","bat","bird","demon","dragon","faerie","gargoyle","griffin","insect","pegasus","wraith","avidryl","bat","bird","demon","dragon","faerie","gargoyle","griffin","insect","pegasus","wraith","avidryl","bat","bird","demon","dragon","faerie","gargoyle","griffin","insect","pegasus","wraith","avidryl","bat","bird","demon","dragon","faerie","gargoyle","griffin","insect","pegasus","wraith","avidryl","bat","bird","demon","dragon","faerie","gargoyle","griffin","insect","pegasus","wraith",}) LimblessCombatRaces ({"snake","android","elemental","fish","god","plant","slug","tree",}) LimblessRaces ({"snake","elemental","fish","slug",}) ! NonBitingRaces ({"android","cow","deer","elemental","god","golem","android","cow","deer","elemental","god","golem","android","cow","deer","elemental","god","golem","android","cow","deer","elemental","god","golem","android","cow","deer","elemental","god","golem",}) ! wtf "(/({({\"torso\",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({\"torso\",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({\"neck\",\"torso\",1,({524288,262144,}),}),({\"neck\",\"torso\",1,({524288,262144,}),}),({\"head\",\"neck\",1,({256,512,262144,}),}),({\"head\",\"neck\",1,({256,512,262144,}),}),({\"left leg\",\"torso\",2,({32,1048576,1024,128,}),}),({\"left leg\",\"torso\",2,({32,1048576,1024,128,}),}),({\"left arm\",\"torso\",2,({8,4096,131072,1048576,65536,}),}),({\"left arm\",\"torso\",2,({8,4096,131072,1048576,65536,}),}),({\"right arm\",\"torso\",2,({8,4096,131072,1048576,65536,}),}),({\"right arm\",\"torso\",2,({8,4096,131072,1048576,65536,}),}),({\"right leg\",\"torso\",2,({32,1048576,1024,128,}),}),({\"right leg\",\"torso\",2,({32,1048576,1024,128,}),}),({\"right foot\",\"right leg\",4,({64,128,16,32,}),}),({\"right foot\",\"right leg\",4,({64,128,16,32,}),}),({\"right hand\",\"right arm\",4,({4,8,32768,65536,}),}),({\"right hand\",\"right arm\",4,({4,8,32768,65536,}),}),({\"left foot\",\"left leg\",4,({64,128,16,32,}),}),({\"left foot\",\"left leg\",4,({64,128,16,32,}),}),({\"left hand\",\"left arm\",4,({4,8,32768,65536,}),}),({\"left hand\",\"left arm\",4,({4,8,32768,65536,}),}),}),([64:\"medium\",32:\"high\",16:\"low\",8:\"low\",2:\"low\",4:\"low\",128:\"medium\",]),([\"luck\":(/2,31,/),\"intelligence\":(/2,31,/),\"durability\":(/2,31,/),\"charisma\":(/2,31,/),\"strength\":(/2,31,/),\"speed\":(/2,31,/),\"agility\":(/2,31,/),\"coordination\":(/2,31,/),\"wisdom\":(/2,31,/),]),([]),({20,80,}),1,0,\"Wraithish\",([]),/)" --- 1,7 ---- #/daemon/races.c ! Races (["troll":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([2:"low",]),(["durability":(/1,65,/),"speed":(/3,20,/),"intelligence":(/3,11,/),"wisdom":(/5,5,/),"agility":(/2,10,/),"coordination":(/2,10,/),"strength":(/1,50,/),"luck":(/4,15,/),"charisma":(/3,11,/),]),(["right hand":4,"left hand":4,]),({15,65,}),1,0,"Trollish",(["poison bite":({"1","3","2","4",}),]),/),"sheep":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/3,21,/),"intelligence":(/5,1,/),"speed":(/4,10,/),"wisdom":(/5,1,/),"agility":(/3,21,/),"coordination":(/4,10,/),"strength":(/3,21,/),"luck":(/5,1,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Sheepish",([]),/),"orc":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["durability":(/2,30,/),"speed":(/2,40,/),"intelligence":(/5,3,/),"wisdom":(/5,3,/),"agility":(/4,10,/),"coordination":(/3,33,/),"strength":(/2,35,/),"luck":(/4,3,/),"charisma":(/5,1,/),]),(["right hand":6,"left hand":6,]),({21,71,}),1,1,"Tangetto",([]),/),"elephant":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"trunk","head",3,({}),}),({"trunk","head",3,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",2:"low",]),(["durability":(/1,43,/),"intelligence":(/4,10,/),"speed":(/4,10,/),"wisdom":(/1,43,/),"agility":(/5,1,/),"coordination":(/3,21,/),"strength":(/1,43,/),"luck":(/3,21,/),"charisma":(/4,10,/),]),([]),({20,80,}),1,0,"Elephantish",([]),/),"satyr":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right hoof","right leg",4,({16,32,64,128,}),}),({"right hoof","right leg",4,({16,32,64,128,}),}),({"left hoof","left leg",4,({16,32,64,128,}),}),({"left hoof","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["durability":(/2,25,/),"speed":(/2,5,/),"intelligence":(/3,33,/),"wisdom":(/1,80,/),"agility":(/2,50,/),"coordination":(/1,60,/),"strength":(/4,2,/),"luck":(/1,10,/),"charisma":(/5,3,/),]),(["right hand":4,"left hand":4,]),({27,77,}),1,0,"Wulinaxian",([]),/),"bird":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right wing","torso",4,({}),}),({"right wing","torso",4,({}),}),({"left wing","torso",4,({}),}),({"left wing","torso",4,({}),}),}),([64:"low",32:"high",]),(["durability":(/5,1,/),"intelligence":(/5,1,/),"speed":(/1,43,/),"wisdom":(/4,10,/),"agility":(/1,43,/),"coordination":(/4,10,/),"strength":(/4,10,/),"luck":(/3,21,/),"charisma":(/2,31,/),]),([]),({20,80,}),1,0,"Birdish",([]),/),"halfling":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["durability":(/3,10,/),"speed":(/1,30,/),"intelligence":(/5,1,/),"wisdom":(/4,10,/),"agility":(/2,40,/),"coordination":(/3,33,/),"strength":(/3,20,/),"luck":(/2,80,/),"charisma":(/2,20,/),]),(["right hand":5,"left hand":5,]),({15,65,}),1,1,"Ersi",([]),/),"primate":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/4,10,/),"intelligence":(/3,21,/),"speed":(/3,21,/),"wisdom":(/4,10,/),"agility":(/3,21,/),"coordination":(/3,21,/),"strength":(/4,10,/),"luck":(/3,21,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Primateish",([]),/),"god":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"high",32:"high",16:"low",2:"medium",]),(["durability":(/1,43,/),"intelligence":(/1,43,/),"speed":(/1,43,/),"wisdom":(/1,43,/),"agility":(/1,43,/),"coordination":(/1,43,/),"strength":(/1,43,/),"luck":(/1,43,/),"charisma":(/1,43,/),]),([]),({20,80,}),1,0,"Godish",([]),/),"klingon":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),}),([64:"medium",8:"medium",128:"medium",2:"medium",4:"medium",]),(["durability":(/1,60,/),"speed":(/3,30,/),"intelligence":(/4,5,/),"wisdom":(/5,1,/),"agility":(/2,30,/),"coordination":(/2,10,/),"strength":(/1,60,/),"luck":(/4,1,/),"charisma":(/5,10,/),]),(["right hand":5,"left hand":5,]),({19,65,}),1,0,"T'linghan",([]),/),"half-elf":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["durability":(/5,5,/),"speed":(/1,60,/),"intelligence":(/3,33,/),"wisdom":(/2,33,/),"agility":(/2,10,/),"coordination":(/1,50,/),"strength":(/3,15,/),"luck":(/4,2,/),"charisma":(/3,3,/),]),(["right hand":4,"left hand":4,]),({12,62,}),1,1,"Edhellen",([]),/),"hobbit":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([64:"low",]),(["durability":(/2,20,/),"speed":(/2,30,/),"intelligence":(/5,10,/),"wisdom":(/3,20,/),"agility":(/1,20,/),"coordination":(/3,60,/),"strength":(/4,10,/),"luck":(/1,80,/),"charisma":(/3,33,/),]),(["right hand":4,"left hand":4,]),({20,70,}),1,0,"Terrakarn",([]),/),"deer":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["durability":(/2,31,/),"intelligence":(/5,1,/),"speed":(/2,31,/),"wisdom":(/5,1,/),"agility":(/3,21,/),"coordination":(/4,10,/),"strength":(/1,43,/),"luck":(/4,10,/),"charisma":(/3,21,/),]),([]),({20,80,}),1,0,"Deerish",([]),/),"elf":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),}),([]),(["durability":(/4,20,/),"speed":(/3,4,/),"intelligence":(/1,40,/),"wisdom":(/1,30,/),"agility":(/3,40,/),"coordination":(/2,10,/),"strength":(/5,15,/),"luck":(/1,50,/),"charisma":(/1,40,/),]),(["right hand":5,"left hand":5,]),({17,73,}),1,1,"Edhellen",([]),/),"centaur":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"lower torso","head",1,({}),}),({"lower torso","head",1,({}),}),({"right arm","torso",2,({}),}),({"right arm","torso",2,({}),}),({"right foreleg","lower torso",3,({}),}),({"right foreleg","lower torso",3,({}),}),({"left foreleg","lower torso",3,({}),}),({"left foreleg","lower torso",3,({}),}),({"right back leg","lower torso",3,({}),}),({"right back leg","lower torso",3,({}),}),({"left back leg","lower torso",3,({}),}),({"left back leg","lower torso",3,({}),}),({"right hand","right arm",4,({}),}),({"right hand","right arm",4,({}),}),({"left hand","left arm",4,({}),}),({"left hand","left arm",4,({}),}),({"right forehoof","right foreleg",4,({}),}),({"right forehoof","right foreleg",4,({}),}),({"left forehoof","left foreleg",4,({}),}),({"left forehoof","left foreleg",4,({}),}),({"right back hoof","right back leg",4,({}),}),({"right back hoof","right back leg",4,({}),}),({"left back hoof","left back leg",4,({}),}),({"left back hoof","left back leg",4,({}),}),}),([64:"low",32:"high",]),(["durability":(/1,43,/),"intelligence":(/3,21,/),"speed":(/2,31,/),"wisdom":(/2,31,/),"agility":(/3,21,/),"coordination":(/4,10,/),"strength":(/2,31,/),"luck":(/1,43,/),"charisma":(/3,21,/),]),(["right hand":5,"left hand":5,]),({20,80,}),1,0,"Centaurish",([]),/),"human":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),}),([]),(["durability":(/4,30,/),"speed":(/3,20,/),"intelligence":(/1,50,/),"wisdom":(/3,50,/),"agility":(/3,33,/),"coordination":(/2,33,/),"strength":(/4,10,/),"luck":(/3,10,/),"charisma":(/2,33,/),]),(["right hand":5,"left hand":5,]),({25,75,}),1,1,"English",(["psionic defense":({"2","3","4","5",}),]),/),"wraith":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/3,21,/),"intelligence":(/4,10,/),"speed":(/3,21,/),"wisdom":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"strength":(/3,21,/),"luck":(/1,43,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Wraithish",([]),/),"demi-god":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"low",32:"high",]),(["durability":(/2,31,/),"intelligence":(/2,31,/),"speed":(/1,43,/),"wisdom":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"strength":(/2,31,/),"luck":(/1,43,/),"charisma":(/2,31,/),]),(["right hand":5,"left hand":5,]),({20,80,}),1,0,"Demi-godish",([]),/),"lizard":(/({({"torso",0,1,({262144,}),}),({"torso",0,1,({262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"medium",32:"high",16:"low",128:"medium",8:"medium",2:"medium",4:"medium",]),(["durability":(/3,21,/),"intelligence":(/5,1,/),"speed":(/3,21,/),"wisdom":(/5,1,/),"agility":(/3,21,/),"coordination":(/3,21,/),"strength":(/3,21,/),"luck":(/4,10,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Lizardish",([]),/),"dwarf":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([64:"low",2:"low",]),(["durability":(/1,60,/),"speed":(/3,20,/),"intelligence":(/3,11,/),"wisdom":(/3,20,/),"agility":(/2,10,/),"coordination":(/2,10,/),"strength":(/1,40,/),"luck":(/1,60,/),"charisma":(/3,11,/),]),(["right hand":4,"left hand":4,]),({15,65,}),1,1,"Malkierien",([]),/),"plant":(/({({"trunk",0,1,({}),}),({"trunk",0,1,({}),}),({"1st branch","trunk",3,({}),}),({"1st branch","trunk",3,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/3,21,/),"intelligence":(/5,1,/),"speed":(/5,1,/),"wisdom":(/5,1,/),"agility":(/5,1,/),"coordination":(/5,1,/),"strength":(/3,21,/),"luck":(/3,21,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Plantish",([]),/),"pegasus":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left wing","torso",3,({}),}),({"left wing","torso",3,({}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/2,31,/),"intelligence":(/3,21,/),"speed":(/2,31,/),"wisdom":(/2,31,/),"agility":(/1,43,/),"coordination":(/2,31,/),"strength":(/2,31,/),"luck":(/1,43,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Pegasusish",([]),/),"cat":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"tail","torso",5,({}),}),({"tail","torso",5,({}),}),}),([]),(["durability":(/4,10,/),"intelligence":(/5,1,/),"speed":(/2,31,/),"wisdom":(/4,10,/),"agility":(/1,43,/),"coordination":(/3,21,/),"strength":(/4,10,/),"luck":(/1,43,/),"charisma":(/1,43,/),]),([]),({20,80,}),1,0,"Feline",(["stealth":({"1","5","4","6",}),]),/),"gnome":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["durability":(/4,10,/),"speed":(/2,20,/),"intelligence":(/1,50,/),"wisdom":(/1,40,/),"agility":(/3,20,/),"coordination":(/3,35,/),"strength":(/3,30,/),"luck":(/2,40,/),"charisma":(/5,1,/),]),(["right hand":4,"left hand":4,]),({8,61,}),1,0,"Nibelungen",([]),/),"tree":(/({({"trunk",0,1,({}),}),({"trunk",0,1,({}),}),({"1st branch","trunk",3,({}),}),({"1st branch","trunk",3,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/1,43,/),"intelligence":(/5,1,/),"speed":(/5,1,/),"wisdom":(/4,10,/),"agility":(/5,1,/),"coordination":(/5,1,/),"strength":(/3,21,/),"luck":(/1,43,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Treeish",([]),/),"elemental":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),}),([64:"low",32:"high",2:"low",]),(["durability":(/3,21,/),"intelligence":(/3,21,/),"speed":(/3,21,/),"wisdom":(/3,21,/),"agility":(/3,21,/),"coordination":(/3,21,/),"strength":(/3,21,/),"luck":(/3,21,/),"charisma":(/3,21,/),]),([]),({20,80,}),1,0,"Elementalish",([]),/),"horse":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),}),([64:"low",32:"high",16:"low",2:"medium",]),(["durability":(/2,31,/),"intelligence":(/5,1,/),"speed":(/2,31,/),"wisdom":(/5,1,/),"agility":(/2,31,/),"coordination":(/4,10,/),"strength":(/1,43,/),"luck":(/5,1,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Horseish",([]),/),"giant":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([2:"medium",]),(["durability":(/1,70,/),"speed":(/5,1,/),"intelligence":(/3,10,/),"wisdom":(/5,1,/),"agility":(/5,2,/),"coordination":(/3,10,/),"strength":(/1,80,/),"luck":(/4,5,/),"charisma":(/4,10,/),]),(["right hand":6,"left hand":6,]),({27,65,}),1,0,"Loyavenku",([]),/),"insect":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"4th leg","torso",3,({32,1048576,1024,128,}),}),({"4th leg","torso",3,({32,1048576,1024,128,}),}),({"6th leg","torso",3,({32,1048576,1024,128,}),}),({"6th leg","torso",3,({32,1048576,1024,128,}),}),({"5th leg","torso",3,({32,1048576,1024,128,}),}),({"5th leg","torso",3,({32,1048576,1024,128,}),}),({"1st leg","torso",3,({32,1048576,1024,128,}),}),({"1st leg","torso",3,({32,1048576,1024,128,}),}),({"3rd leg","torso",3,({32,1048576,1024,128,}),}),({"3rd leg","torso",3,({32,1048576,1024,128,}),}),({"2nd leg","torso",3,({32,1048576,1024,128,}),}),({"2nd leg","torso",3,({32,1048576,1024,128,}),}),}),([64:"low",32:"high",16:"low",2:"medium",]),(["durability":(/5,1,/),"intelligence":(/5,1,/),"speed":(/1,43,/),"wisdom":(/5,1,/),"agility":(/2,31,/),"coordination":(/3,21,/),"strength":(/5,1,/),"luck":(/1,43,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Insectish",([]),/),"arachnid":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"1st leg","torso",3,({32,1048576,1024,128,}),}),({"1st leg","torso",3,({32,1048576,1024,128,}),}),({"8th leg","torso",3,({32,1048576,1024,128,}),}),({"8th leg","torso",3,({32,1048576,1024,128,}),}),({"2nd leg","torso",3,({32,1048576,1024,128,}),}),({"2nd leg","torso",3,({32,1048576,1024,128,}),}),({"5th leg","torso",3,({32,1048576,1024,128,}),}),({"5th leg","torso",3,({32,1048576,1024,128,}),}),({"7th leg","torso",3,({32,1048576,1024,128,}),}),({"7th leg","torso",3,({32,1048576,1024,128,}),}),({"4th leg","torso",3,({32,1048576,1024,128,}),}),({"4th leg","torso",3,({32,1048576,1024,128,}),}),({"3rd leg","torso",3,({32,1048576,1024,128,}),}),({"3rd leg","torso",3,({32,1048576,1024,128,}),}),({"6th leg","torso",3,({32,1048576,1024,128,}),}),({"6th leg","torso",3,({32,1048576,1024,128,}),}),}),([]),(["durability":(/5,1,/),"intelligence":(/3,21,/),"speed":(/2,31,/),"wisdom":(/5,1,/),"agility":(/1,43,/),"coordination":(/1,43,/),"strength":(/4,10,/),"luck":(/3,21,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Arachnidish",([]),/),"demon":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"low",32:"high",]),(["durability":(/2,31,/),"intelligence":(/2,31,/),"speed":(/2,31,/),"wisdom":(/4,10,/),"agility":(/2,31,/),"coordination":(/2,31,/),"strength":(/2,31,/),"luck":(/1,43,/),"charisma":(/2,31,/),]),([]),({20,80,}),1,0,"Demonish",([]),/),"dog":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["durability":(/3,21,/),"intelligence":(/4,10,/),"speed":(/3,21,/),"wisdom":(/5,1,/),"agility":(/3,21,/),"coordination":(/4,10,/),"strength":(/3,21,/),"luck":(/4,10,/),"charisma":(/2,31,/),]),([]),({20,80,}),1,0,"Dogish",([]),/),"goblin":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"high",32:"high",16:"low",2:"medium",]),(["durability":(/1,43,/),"intelligence":(/4,10,/),"speed":(/2,31,/),"wisdom":(/3,21,/),"agility":(/1,43,/),"coordination":(/3,21,/),"strength":(/3,21,/),"luck":(/4,10,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Goblinish",([]),/),"nymph":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["durability":(/5,7,/),"speed":(/2,60,/),"intelligence":(/4,25,/),"wisdom":(/4,20,/),"agility":(/1,50,/),"coordination":(/2,20,/),"strength":(/5,3,/),"luck":(/2,50,/),"charisma":(/1,80,/),]),(["right hand":5,"left hand":5,]),({26,76,}),1,0,"Nymal",([]),/),"snake":(/({({"torso",0,1,({16384,}),}),({"torso",0,1,({16384,}),}),({"head","torso",1,({256,}),}),({"head","torso",1,({256,}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/4,10,/),"intelligence":(/4,10,/),"speed":(/4,10,/),"wisdom":(/2,31,/),"agility":(/4,10,/),"coordination":(/5,1,/),"strength":(/5,1,/),"luck":(/1,43,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Snakeish",([]),/),"slug":(/({({"torso",0,1,({16384,}),}),({"torso",0,1,({16384,}),}),({"head","torso",1,({256,}),}),({"head","torso",1,({256,}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/5,1,/),"intelligence":(/5,1,/),"speed":(/5,1,/),"wisdom":(/4,10,/),"agility":(/5,1,/),"coordination":(/5,1,/),"strength":(/4,10,/),"luck":(/5,1,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Slugish",([]),/),"ogre":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),}),([8:"low",2:"low",4:"low",]),(["durability":(/1,68,/),"speed":(/4,7,/),"intelligence":(/4,10,/),"wisdom":(/5,1,/),"agility":(/5,1,/),"coordination":(/5,2,/),"strength":(/1,50,/),"luck":(/5,1,/),"charisma":(/5,1,/),]),(["right hand":6,"left hand":6,]),({25,70,}),1,0,"Shangtai",([]),/),"pig":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/1,43,/),"intelligence":(/5,1,/),"speed":(/4,10,/),"wisdom":(/2,31,/),"agility":(/5,1,/),"coordination":(/3,21,/),"strength":(/3,21,/),"luck":(/5,1,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Pigish",([]),/),"fish":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),}),([64:"low",32:"high",16:"low",2:"low",]),(["durability":(/4,10,/),"intelligence":(/5,1,/),"speed":(/3,21,/),"wisdom":(/3,21,/),"agility":(/2,31,/),"coordination":(/2,31,/),"strength":(/4,10,/),"luck":(/5,1,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Fishish",([]),/),"android":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),}),([]),(["durability":(/4,50,/),"speed":(/3,50,/),"intelligence":(/1,50,/),"wisdom":(/3,50,/),"agility":(/3,50,/),"coordination":(/2,50,/),"strength":(/4,50,/),"luck":(/3,10,/),"charisma":(/2,50,/),]),(["right hand":5,"left hand":5,]),({25,75,}),1,0,"English",([]),/),"tortoise":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/1,43,/),"intelligence":(/3,21,/),"speed":(/5,1,/),"wisdom":(/1,43,/),"agility":(/4,10,/),"coordination":(/2,31,/),"strength":(/5,1,/),"luck":(/3,21,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Tortoiseish",([]),/),"viper":(/({({"torso",0,1,({16384,}),}),({"torso",0,1,({16384,}),}),({"head","torso",1,({256,}),}),({"head","torso",1,({256,}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/4,10,/),"intelligence":(/4,10,/),"speed":(/4,10,/),"wisdom":(/2,31,/),"agility":(/4,10,/),"coordination":(/5,1,/),"strength":(/5,1,/),"luck":(/1,43,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Aspish",([]),/),"bugbear":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["durability":(/1,43,/),"intelligence":(/3,21,/),"speed":(/5,1,/),"wisdom":(/2,31,/),"agility":(/5,1,/),"coordination":(/5,1,/),"strength":(/1,43,/),"luck":(/4,10,/),"ugliness":(/3,91,/),"charisma":(/3,21,/),]),([]),({20,80,}),1,0,"Bugbearish",([]),/),"cow":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["durability":(/1,43,/),"intelligence":(/5,1,/),"speed":(/5,1,/),"wisdom":(/5,1,/),"agility":(/5,1,/),"coordination":(/3,21,/),"strength":(/2,31,/),"luck":(/5,1,/),"charisma":(/4,10,/),]),([]),({20,80,}),1,0,"Cowish",([]),/),"kobold":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left hoof","left leg",4,({}),}),({"left hoof","left leg",4,({}),}),({"right hoof","right leg",4,({}),}),({"right hoof","right leg",4,({}),}),}),([64:"medium",32:"high",16:"low",128:"medium",8:"medium",2:"medium",4:"medium",]),(["durability":(/1,43,/),"intelligence":(/4,10,/),"speed":(/3,21,/),"wisdom":(/4,10,/),"agility":(/3,21,/),"coordination":(/2,31,/),"strength":(/1,43,/),"luck":(/3,21,/),"charisma":(/5,1,/),]),(["right hand":5,"left hand":5,]),({20,80,}),1,0,"Koboldish",([]),/),"gargoyle":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left arm","torso",3,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",3,({8,4096,131072,1048576,65536,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right arm","torso",3,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",3,({8,4096,131072,1048576,65536,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left wing","torso",3,({}),}),({"left wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",16:"low",2:"low",]),(["durability":(/1,43,/),"intelligence":(/4,10,/),"speed":(/4,10,/),"wisdom":(/2,31,/),"agility":(/5,1,/),"coordination":(/2,31,/),"strength":(/1,43,/),"luck":(/4,10,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Gargoyleish",([]),/),"chimera":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"lion head","torso",2,({1048576,512,256,8192,}),}),({"lion head","torso",2,({1048576,512,256,8192,}),}),({"goat head","torso",2,({1048576,512,256,8192,}),}),({"goat head","torso",2,({1048576,512,256,8192,}),}),({"dragon head","torso",2,({1048576,512,256,8192,}),}),({"dragon head","torso",2,({1048576,512,256,8192,}),}),({"right wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"left wing","torso",3,({}),}),({"left wing","torso",3,({}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["durability":(/2,31,/),"intelligence":(/3,21,/),"speed":(/1,43,/),"wisdom":(/3,21,/),"agility":(/2,31,/),"coordination":(/4,10,/),"strength":(/3,21,/),"luck":(/4,10,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Chimeraish",([]),/),"unicorn":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left fore-hoof","left foreleg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"left rear hoof","left rear leg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right fore-hoof","right foreleg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),({"right rear hoof","right rear leg",4,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/3,21,/),"intelligence":(/4,10,/),"speed":(/3,21,/),"wisdom":(/2,31,/),"agility":(/2,31,/),"coordination":(/2,31,/),"strength":(/3,21,/),"luck":(/1,43,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Unicornish",([]),/),"kender":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["durability":(/1,20,/),"speed":(/1,50,/),"intelligence":(/2,20,/),"wisdom":(/4,7,/),"agility":(/3,40,/),"coordination":(/2,50,/),"strength":(/5,3,/),"luck":(/3,33,/),"charisma":(/2,40,/),]),(["right hand":5,"left hand":5,]),({23,78,}),1,0,"Kendrall",(["stealing":({"1","5","5","5",}),]),/),"golem":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"head","torso",1,({1048576,512,256,8192,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"high",32:"high",16:"low",2:"medium",]),(["durability":(/2,31,/),"intelligence":(/4,10,/),"speed":(/3,21,/),"wisdom":(/2,31,/),"agility":(/3,21,/),"coordination":(/3,21,/),"strength":(/1,43,/),"luck":(/5,1,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Golemish",([]),/),"artrell":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,}),}),({"head","torso",1,({256,512,262144,}),}),({"head","torso",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"first arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"first arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"second arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"second arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"third arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"third arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"fourth arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"fourth arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"first hand","first arm",4,({2,4,8,32768,65536,}),}),({"first hand","first arm",4,({2,4,8,32768,65536,}),}),({"second hand","second arm",4,({2,4,8,32768,65536,}),}),({"second hand","second arm",4,({2,4,8,32768,65536,}),}),({"third hand","third arm",4,({2,4,8,32768,65536,}),}),({"third hand","third arm",4,({2,4,8,32768,65536,}),}),({"fourth hand","fourth arm",4,({2,4,8,32768,65536,}),}),({"fourth hand","fourth arm",4,({2,4,8,32768,65536,}),}),}),([64:"low",32:"high",]),(["durability":(/3,10,/),"speed":(/2,40,/),"intelligence":(/4,10,/),"wisdom":(/5,5,/),"agility":(/1,50,/),"coordination":(/3,40,/),"strength":(/3,10,/),"luck":(/3,33,/),"charisma":(/4,0,/),]),(["third hand":2,"second hand":2,"fourth hand":2,"first hand":2,]),({7,61,}),1,0,"Artrexcian",([]),/),"bear":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["durability":(/1,43,/),"intelligence":(/3,21,/),"speed":(/5,1,/),"wisdom":(/2,31,/),"agility":(/5,1,/),"coordination":(/5,1,/),"strength":(/1,43,/),"luck":(/4,10,/),"charisma":(/3,21,/),]),([]),({20,80,}),1,0,"Bearish",([]),/),"avidryl":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,}),}),({"head","torso",1,({256,512,262144,}),}),({"head","torso",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,8192,}),}),({"right leg","torso",2,({32,128,1024,1048576,8192,}),}),({"left leg","torso",2,({32,128,1024,1048576,8192,}),}),({"left leg","torso",2,({32,128,1024,1048576,8192,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right wing","torso",4,({}),}),({"right wing","torso",4,({}),}),({"left wing","torso",4,({}),}),({"left wing","torso",4,({}),}),}),([]),(["durability":(/2,20,/),"speed":(/3,20,/),"intelligence":(/4,15,/),"wisdom":(/5,10,/),"agility":(/1,50,/),"coordination":(/1,30,/),"strength":(/2,40,/),"luck":(/5,2,/),"charisma":(/3,20,/),]),(["right hand":5,"left hand":5,]),({15,85,}),1,0,"Avidryl",([]),/),"amphibian":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,262144,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([]),(["durability":(/3,21,/),"intelligence":(/3,21,/),"speed":(/5,1,/),"wisdom":(/1,43,/),"agility":(/4,10,/),"coordination":(/2,31,/),"strength":(/5,1,/),"luck":(/3,21,/),"charisma":(/4,10,/),]),([]),({20,80,}),1,0,"Amphibianish",([]),/),"balrog":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),}),([128:"high",]),(["durability":(/1,40,/),"speed":(/2,30,/),"intelligence":(/2,30,/),"wisdom":(/3,10,/),"agility":(/1,40,/),"coordination":(/3,30,/),"strength":(/3,30,/),"luck":(/3,20,/),"charisma":(/5,1,/),]),(["right hand":6,"left hand":6,]),({10,67,}),1,0,"Balrog",([]),/),"griffin":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left wing","torso",3,({}),}),({"left wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"high",32:"high",16:"low",2:"medium",]),(["durability":(/1,43,/),"intelligence":(/5,1,/),"speed":(/2,31,/),"wisdom":(/4,10,/),"agility":(/2,31,/),"coordination":(/2,31,/),"strength":(/1,43,/),"luck":(/1,43,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Griffinish",([]),/),"dragon":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left wing","torso",3,({}),}),({"left wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right wing","torso",3,({}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"low",32:"high",]),(["durability":(/1,43,/),"intelligence":(/2,31,/),"speed":(/3,21,/),"wisdom":(/1,43,/),"agility":(/1,43,/),"coordination":(/3,21,/),"strength":(/1,43,/),"luck":(/1,43,/),"charisma":(/2,31,/),]),([]),({20,80,}),1,0,"Dragonish",([]),/),"rodent":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"left rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right rear leg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"right foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left foreleg","torso",3,({32,1048576,1024,128,}),}),({"left forepaw","left foreleg",4,({}),}),({"left forepaw","left foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"right forepaw","right foreleg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"left rear paw","left rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),({"right rear paw","right rear leg",4,({}),}),}),([64:"medium",32:"high",16:"low",8:"low",2:"low",4:"low",128:"medium",]),(["durability":(/4,10,/),"intelligence":(/5,1,/),"speed":(/2,31,/),"wisdom":(/4,10,/),"agility":(/3,21,/),"coordination":(/4,10,/),"strength":(/5,1,/),"luck":(/5,1,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Rodentish",([]),/),"half-orc":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",2,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([]),(["durability":(/2,40,/),"speed":(/1,70,/),"intelligence":(/2,15,/),"wisdom":(/5,10,/),"agility":(/4,2,/),"coordination":(/3,20,/),"strength":(/2,20,/),"luck":(/5,1,/),"charisma":(/5,4,/),]),(["right hand":4,"left hand":4,]),({12,62,}),1,1,"Tangetto",([]),/),"faerie":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"right foot","right leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left foot","left leg",4,({16,32,64,128,}),}),({"left arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"left arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"right arm","torso",3,({8,65536,8192,131072,1048576,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"left hand","left arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),({"right hand","right arm",4,({2,4,8,32768,65536,}),}),}),([16:"low",]),(["durability":(/5,10,/),"speed":(/2,40,/),"intelligence":(/2,10,/),"wisdom":(/2,15,/),"agility":(/1,60,/),"coordination":(/1,40,/),"strength":(/5,5,/),"luck":(/2,30,/),"charisma":(/3,30,/),]),(["right hand":5,"left hand":5,]),({30,80,}),1,0,"Elcharean",([]),/),"dryad":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"low",32:"high",]),(["durability":(/5,1,/),"intelligence":(/4,10,/),"speed":(/2,31,/),"wisdom":(/2,31,/),"agility":(/2,31,/),"coordination":(/3,21,/),"strength":(/4,10,/),"luck":(/2,31,/),"charisma":(/1,43,/),]),(["right hand":5,"left hand":5,]),({20,80,}),1,0,"Dryadish",([]),/),"bat":(/({({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,}),}),({"torso",0,1,({4096,8192,16384,65536,131072,1048576,2048,}),}),({"head","torso",1,({256,512,262144,}),}),({"head","torso",1,({256,512,262144,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"right leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"left leg","torso",2,({32,128,1024,1048576,}),}),({"right claw","right leg",4,({16,32,64,128,}),}),({"right claw","right leg",4,({16,32,64,128,}),}),({"left claw","left leg",4,({16,32,64,128,}),}),({"left claw","left leg",4,({16,32,64,128,}),}),({"left wing","torso",2,({8,65536,8192,131072,1048576,}),}),({"left wing","torso",2,({8,65536,8192,131072,1048576,}),}),({"right wing","torso",2,({8,65536,8192,131072,1048576,}),}),({"right wing","torso",2,({8,65536,8192,131072,1048576,}),}),}),([]),(["durability":(/1,65,/),"speed":(/3,52,/),"intelligence":(/3,2,/),"wisdom":(/5,10,/),"agility":(/2,10,/),"coordination":(/2,10,/),"strength":(/4,13,/),"luck":(/3,24,/),"charisma":(/3,11,/),]),([]),({15,65,}),1,0,"Battish",([]),/),"gnoll":(/({({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"torso",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({"neck","torso",1,({524288,262144,}),}),({"neck","torso",1,({524288,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"head","neck",1,({256,512,262144,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left leg","torso",2,({32,1048576,1024,128,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"left arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right arm","torso",2,({8,4096,131072,1048576,65536,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right leg","torso",2,({32,1048576,1024,128,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right foot","right leg",4,({64,128,16,32,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"right hand","right arm",4,({4,8,32768,65536,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left foot","left leg",4,({64,128,16,32,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),({"left hand","left arm",4,({4,8,32768,65536,}),}),}),([64:"high",32:"high",16:"low",2:"medium",]),(["durability":(/3,21,/),"intelligence":(/4,10,/),"speed":(/3,21,/),"wisdom":(/4,10,/),"agility":(/2,31,/),"coordination":(/2,31,/),"strength":(/3,21,/),"luck":(/2,31,/),"charisma":(/5,1,/),]),([]),({20,80,}),1,0,"Gnollish",([]),/),]) ! FlyingRaces ({"avidryl","bat","bird","demon","dragon","faerie","gargoyle","griffin","insect","pegasus","wraith","avidryl","bat","bird","demon","dragon","faerie","gargoyle","griffin","insect","pegasus","wraith","avidryl","bat","bird","demon","dragon","faerie","gargoyle","griffin","insect","pegasus","wraith","avidryl","bat","bird","demon","dragon","faerie","gargoyle","griffin","insect","pegasus","wraith","avidryl","bat","bird","demon","dragon","faerie","gargoyle","griffin","insect","pegasus","wraith","avidryl","bat","bird","demon","dragon","faerie","gargoyle","griffin","insect","pegasus","wraith","avidryl","bat","bird","avidryl","bat","bird","avidryl","bat","bird","avidryl","bat","bird","avidryl","bat","bird","demon","dragon","faerie","gargoyle","griffin","insect","pegasus","wraith",}) LimblessCombatRaces ({"snake","android","elemental","fish","god","plant","slug","tree",}) LimblessRaces ({"snake","elemental","fish","slug",}) ! NonBitingRaces ({"android","cow","deer","elemental","god","golem","android","cow","deer","elemental","god","golem","android","cow","deer","elemental","god","golem","android","cow","deer","elemental","god","golem","android","cow","deer","elemental","god","golem","android","cow","deer","elemental","god","golem","android","android","android","android","android","cow","deer","elemental","god","golem",}) ! wtf "(/({({\"torso\",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({\"torso\",0,1,({131072,1048576,8192,16384,4096,262144,2048,}),}),({\"neck\",\"torso\",1,({524288,262144,}),}),({\"neck\",\"torso\",1,({524288,262144,}),}),({\"head\",\"neck\",1,({256,512,262144,}),}),({\"head\",\"neck\",1,({256,512,262144,}),}),({\"left leg\",\"torso\",2,({32,1048576,1024,128,}),}),({\"left leg\",\"torso\",2,({32,1048576,1024,128,}),}),({\"left arm\",\"torso\",2,({8,4096,131072,1048576,65536,}),}),({\"left arm\",\"torso\",2,({8,4096,131072,1048576,65536,}),}),({\"right arm\",\"torso\",2,({8,4096,131072,1048576,65536,}),}),({\"right arm\",\"torso\",2,({8,4096,131072,1048576,65536,}),}),({\"right leg\",\"torso\",2,({32,1048576,1024,128,}),}),({\"right leg\",\"torso\",2,({32,1048576,1024,128,}),}),({\"right foot\",\"right leg\",4,({64,128,16,32,}),}),({\"right foot\",\"right leg\",4,({64,128,16,32,}),}),({\"right hand\",\"right arm\",4,({4,8,32768,65536,}),}),({\"right hand\",\"right arm\",4,({4,8,32768,65536,}),}),({\"left foot\",\"left leg\",4,({64,128,16,32,}),}),({\"left foot\",\"left leg\",4,({64,128,16,32,}),}),({\"left hand\",\"left arm\",4,({4,8,32768,65536,}),}),({\"left hand\",\"left arm\",4,({4,8,32768,65536,}),}),}),([64:\"medium\",32:\"high\",16:\"low\",8:\"low\",2:\"low\",4:\"low\",128:\"medium\",]),([\"durability\":(/3,21,/),\"intelligence\":(/4,10,/),\"speed\":(/3,21,/),\"wisdom\":(/2,31,/),\"agility\":(/2,31,/),\"coordination\":(/2,31,/),\"strength\":(/3,21,/),\"luck\":(/1,43,/),\"charisma\":(/5,1,/),]),([]),({20,80,}),1,0,\"Wraithish\",([]),/)" diff -c -r --new-file ds2.0r18/lib/save/stargate.o ds2.0r28/lib/save/stargate.o *** ds2.0r18/lib/save/stargate.o Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/save/stargate.o Wed Jul 5 00:00:59 2006 *************** *** 0 **** --- 1,2 ---- + #/daemon/stargate.c + Stargates (["stargate lab":(["destination":"/domains/default/room/stargate_lab","status":"idle","endpoint":"",]),"tower":(["destination":"/domains/Ylsrim/room/tower","status":"idle","endpoint":"",]),"campus lab":(["destination":"/domains/campus/room/slab","status":"idle","endpoint":"",]),]) diff -c -r --new-file ds2.0r18/lib/secure/cfg/preload.cfg ds2.0r28/lib/secure/cfg/preload.cfg *** ds2.0r18/lib/secure/cfg/preload.cfg Fri Mar 24 14:37:42 2006 --- ds2.0r28/lib/secure/cfg/preload.cfg Wed Jul 5 00:01:05 2006 *************** *** 9,14 **** --- 9,15 ---- #/secure/daemon/remote #/secure/daemon/inet /secure/daemon/log + /secure/daemon/snoop /secure/room/arch /secure/room/control /secure/daemon/update diff -c -r --new-file ds2.0r18/lib/secure/cfg/races/bugbear ds2.0r28/lib/secure/cfg/races/bugbear *** ds2.0r18/lib/secure/cfg/races/bugbear Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/cfg/races/bugbear Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,27 ---- + RACE bugbear + PLAYER_RACE 0 + SENSITIVITY 20:80 + LANGUAGE Bugbearish + RESISTANCE SHOCK:high + RESISTANCE COLD:low + STATS charisma:21:3 + STATS ugliness:91:3 + STATS durability:43:1 + STATS intelligence:21:3 + STATS luck:10:4 + STATS agility:1:5 + STATS wisdom:31:2 + STATS speed:1:5 + STATS strength:43:1 + STATS coordination:1:5 + LIMB torso:0:1:A_ARMOR,A_BODY_ARMOR,A_CLOAK,A_VEST,A_SHIRT,A_AMULET,A_BELT + LIMB neck:torso:1:A_COLLAR,A_AMULET + LIMB head:neck:1:A_HELMET,A_VISOR,A_AMULET + LIMB left rear leg:torso:3:A_LONG_BOOT,A_BODY_ARMOR,A_PANTS,A_LONG_SOCK + LIMB right rear leg:torso:3:A_LONG_BOOT,A_BODY_ARMOR,A_PANTS,A_LONG_SOCK + LIMB right foreleg:torso:3:A_LONG_BOOT,A_BODY_ARMOR,A_PANTS,A_LONG_SOCK + LIMB left foreleg:torso:3:A_LONG_BOOT,A_BODY_ARMOR,A_PANTS,A_LONG_SOCK + LIMB left forepaw:left foreleg:4:: + LIMB right forepaw:right foreleg:4:: + LIMB left rear paw:left rear leg:4:: + LIMB right rear paw:right rear leg:4:: diff -c -r --new-file ds2.0r18/lib/secure/cfg/read.cfg ds2.0r28/lib/secure/cfg/read.cfg *** ds2.0r18/lib/secure/cfg/read.cfg Wed Jan 11 23:10:48 2006 --- ds2.0r28/lib/secure/cfg/read.cfg Wed Jul 5 00:01:05 2006 *************** *** 1,6 **** --- 1,7 ---- (/realms/) ASSIST:CMDS (/secure/etc/) ASSIST (/secure/save/) ASSIST + (/secure/save/snoop.o) SECURE (/secure/log/) ASSIST (/secure/room/) ASSIST (/secure/npc/) ASSIST diff -c -r --new-file ds2.0r18/lib/secure/cfg/write.cfg ds2.0r28/lib/secure/cfg/write.cfg *** ds2.0r18/lib/secure/cfg/write.cfg Mon Jan 2 16:14:38 2006 --- ds2.0r28/lib/secure/cfg/write.cfg Wed Jul 5 00:01:05 2006 *************** *** 14,19 **** --- 14,20 ---- (/realms/) ASSIST:CMDS (/save/) MUDLIBPRIV:ASSIST (/secure/save/) ASSIST + (/secure/save/snoop.o) SECURE (/tmp/) all (/open/) all (/verbs/) ASSIST diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/addguest.c ds2.0r28/lib/secure/cmds/admins/addguest.c *** ds2.0r18/lib/secure/cmds/admins/addguest.c Mon Nov 7 13:32:16 2005 --- ds2.0r28/lib/secure/cmds/admins/addguest.c Wed Jul 5 00:01:12 2006 *************** *** 13,19 **** mixed res; int i; ! if(!archp(previous_object())) return 0; if(!str) { notify_fail("Correct syntax: addguest [guestlist]\n"); return 0; --- 13,23 ---- mixed res; int i; ! if(!(int)master()->valid_apply(({ "SECURE", "ASSIST" }))){ ! error("Illegal attempt to add a guest."); ! //tc("foo"); ! } ! if(!str) { notify_fail("Correct syntax: addguest [guestlist]\n"); return 0; diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/addrace.c ds2.0r28/lib/secure/cmds/admins/addrace.c *** ds2.0r18/lib/secure/cmds/admins/addrace.c Mon Nov 7 13:32:16 2005 --- ds2.0r28/lib/secure/cmds/admins/addrace.c Wed Jul 5 00:01:12 2006 *************** *** 35,57 **** "races daemon. The optional second argument specifies if this " "race is a player or not. If it is omitted or it is 0, the race " "is assumed to be NPC-only. If it is 1, then it is assumed to " ! "be useable by players as well.\n" ! "The format of the file being read is:\n" ! "race_name\n" ! "min_light_sensitivity:max_light_sensitivity\n" ! "language\n" ! "resistance1:resistance_level1\n" ! "...\n" ! "resistanceN:resistance_levelN\n" ! "stat1:stat_average1:stat_class1\n" ! "...\n" ! "statN:stat_averageN:stat_classN\n" ! "limb1:limb_parent1:limb_class1:limb_armors_list1\n" ! "...\n" ! "limbN:limb_parentN:limb_classN:limb_armors_listN\n" ! "fingered_limb1:num_fingers1\n" ! "...\n" ! "fingered_limbN:num_fingersN\n\n" "An example of a human exists in /secure/cfg/races/human. " "You will notice that a human hs no special resistances. The " "number of times resistances, stats, limbs, and fingers appear " --- 35,44 ---- "races daemon. The optional second argument specifies if this " "race is a player or not. If it is omitted or it is 0, the race " "is assumed to be NPC-only. If it is 1, then it is assumed to " ! "be usable by players as well.\n" ! "NOTE: The PLAYER_RACE setting in the race file overrides that flag.\n" ! "The format of the file is explained here:\n" ! "http://dead-souls.net/ds-creator-faq.html#2.45\n\n" "An example of a human exists in /secure/cfg/races/human. " "You will notice that a human hs no special resistances. The " "number of times resistances, stats, limbs, and fingers appear " *************** *** 61,68 **** "For example, the right hand may come any time after the right " "arm, but it must come after the right arm.\n" "This system is admittedly rather complex, but it beats hard " ! "coding these values. In addition, a web-based administration " ! "client is being developed to make race creation nothing more " ! "than filling in a form.\n\n" "See also: addclass, addemote"); } --- 48,53 ---- "For example, the right hand may come any time after the right " "arm, but it must come after the right arm.\n" "This system is admittedly rather complex, but it beats hard " ! "coding these values.\n\n" "See also: addclass, addemote"); } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/admintool.c ds2.0r28/lib/secure/cmds/admins/admintool.c *** ds2.0r18/lib/secure/cmds/admins/admintool.c Fri Mar 24 14:37:46 2006 --- ds2.0r28/lib/secure/cmds/admins/admintool.c Wed Jul 5 00:01:12 2006 *************** *** 5,10 **** --- 5,16 ---- inherit LIB_DAEMON; + static private void validate() { + if(!this_player()) return 0; + if( !((int)master()->valid_apply(({ "ASSIST" }))) ) + error("Illegal attempt to access admintool: "+get_stack()+" "+identify(previous_object(-1))); + } + varargs int Menu(string str); int MainMenu(); int MainMenuChoice(); *************** *** 73,85 **** --- 79,94 ---- float rate, weight, inflation; + mixed InvalidChoice(){ + validate(); write("Invalid choice. Try again or choose q to quit.\n"); Menu(); return 1; } int PlaceHolder(){ + validate(); write("This function has not yet been defined."); Menu(); return 1; *************** *** 87,92 **** --- 96,102 ---- varargs int Menu(string str){ + validate(); if(str) menu = str; if(!menu) menu = "main"; *************** *** 104,109 **** --- 114,120 ---- string process_input(string str){ //write("Input is "+str+"."); + validate(); switch (str) { case "q" : write("Ok, quitting admintool.\nBye.\n");return " "; case "x" : write("Ok, quitting admintool.\nBye.\n");return " "; *************** *** 145,150 **** --- 156,162 ---- varargs mixed MainMenu(string str) { string tmp; + validate(); tmp = "\tDead Souls Admin Tool\n"; tmp += "\t=====================\n\n"; tmp += "\t\t1) general\n"; *************** *** 163,168 **** --- 175,181 ---- static int GeneralMenu() { string tmp; + validate(); tmp = "\tDead Souls Admin Tool General Menu\n"; tmp += "\t\n\n"; tmp += "\t\ta) toggle mud lock\n"; *************** *** 182,187 **** --- 195,201 ---- int DaemonMenu() { string tmp; + validate(); tmp = "\tDead Souls Admin Tool Daemon Menu\n"; tmp += "\t\n\n"; tmp += "\t\tf) add class\n"; *************** *** 201,207 **** int UsersMenu() { string tmp; ! tmp = "\tDead Souls Admin Tool Daemon Menu\n"; tmp += "\t\n\n"; tmp += "\t\tl) promote a player to creator\n"; tmp += "\t\tm) demote a creator to player\n"; --- 215,222 ---- int UsersMenu() { string tmp; ! validate(); ! tmp = "\tDead Souls Admin Tool Users Menu\n"; tmp += "\t\n\n"; tmp += "\t\tl) promote a player to creator\n"; tmp += "\t\tm) demote a creator to player\n"; *************** *** 220,225 **** --- 235,241 ---- int DriverMenu(){ string tmp; + validate(); tmp = "\tDead Souls Admin Tool Driver Menu\n"; tmp += "\t^^^^^^^^^^^^^^^^^^^^^^*******^^^^^\n"; tmp += "\t\n\n"; *************** *** 237,242 **** --- 253,259 ---- int GroupsMenu(){ string tmp; + validate(); tmp = "\tDead Souls Admin Tool Groups Menu\n"; tmp += "\t^^^^^^^^^^^^^^^^^^^^^^*******^^^^^\n"; tmp += "\t\n\n"; *************** *** 265,270 **** --- 282,289 ---- string *line_array; string lockline, newline, newfile, line_string, junk; int num; + + validate(); line_string = read_file("/secure/include/config.h"); if(!sizeof(line_string)) write("Couldn't read file."); line_array = explode(line_string, "\n"); *************** *** 299,304 **** --- 318,324 ---- } int ShowLock(){ + validate(); if(load_object("/secure/daemon/master")->is_locked()){ write("Mud is locked. Only admins and designated personnel can log in.\n"); } *************** *** 309,314 **** --- 329,335 ---- int SetTZ(){ + validate(); write("Please enter the desired time zone: \n"); input_to( (: eventSetTZ :) ); return 1; *************** *** 317,322 **** --- 338,344 ---- int eventSetTZ(string str){ string ret; + validate(); ret = set_tz(str); write(ret+"\n"); load_object("/secure/cmds/creators/update")->cmd("/daemon/time"); *************** *** 325,330 **** --- 347,353 ---- } int ChangeEmail(){ + validate(); write("Current admin email is: "+admin_email()); write("Please enter the new email address of the mud administrator: \n"); input_to( (: eventChangeEmail :) ); *************** *** 334,339 **** --- 357,364 ---- varargs int eventChangeEmail(string str, int auto){ string *line_array; string lockline, newline, newfile, line_string, junk, email; + + validate(); if(strsrch(str,"@") == -1 ) { write("That isn't a valid email address."); if(!auto) Menu(); *************** *** 366,371 **** --- 391,397 ---- } int SetReboot(){ + validate(); write("Current reboot interval is set to "+EVENTS_D->GetRebootInterval()+" hours."); write(load_object("/cmds/players/nextreboot")->cmd("string")); write("Please enter the new desired interval in hours:\n"); *************** *** 375,380 **** --- 401,408 ---- int eventSetReboot(mixed i){ int num; + + validate(); if(!intp(i) && !sscanf(i,"%d",num)){ write("Failed to set new interval.\n"); Menu(); *************** *** 388,393 **** --- 416,422 ---- } int AddClass(){ + validate(); write("Classes currently available: "+implode(load_object(CLASSES_D)->GetClasses()," ")); write("Please enter the name of the class you'd like to add: \n"); input_to( (: eventAddClass :) ); *************** *** 397,402 **** --- 426,433 ---- int eventAddClass(string str){ string classpath; array *classes; + + validate(); if(!str) { write("Invalid class name.\n"); Menu(); *************** *** 427,432 **** --- 458,464 ---- } int RemoveClass(){ + validate(); write("Classes currently available: "+implode(load_object(CLASSES_D)->GetClasses()," ")); write("Please enter the class you'd like to remove: \n"); input_to( (: eventRemoveClass :) ); *************** *** 434,439 **** --- 466,472 ---- } int eventRemoveClass(string str){ + validate(); if(!str){ write("That is not a valid class.\n"); Menu(); *************** *** 453,458 **** --- 486,492 ---- } int AddRace(){ + validate(); write("Races currently available: "+implode(load_object(RACES_D)->GetRaces()," ")); write("Please enter the name of the race you'd like to add: \n"); input_to( (: eventAddRace :) ); *************** *** 461,466 **** --- 495,502 ---- int eventAddRace(string str){ array *races; + + validate(); if(!str) { write("Invalid race name.\n"); Menu(); *************** *** 492,497 **** --- 528,535 ---- int PlayerRace(string str){ string *response_array = ({"yes","ok","y","yeah","yes, please"}); + + validate(); if(!str) str = "no"; if(member_array(str,response_array) != -1) RACES_D->AddRace(racepath, 1); else RACES_D->AddRace(racepath); *************** *** 502,507 **** --- 540,546 ---- } int RemoveRace(){ + validate(); write("Races currently available: "+implode(load_object(RACES_D)->GetRaces()," ")); write("Please enter the race you'd like to remove: \n"); input_to( (: eventRemoveRace :) ); *************** *** 509,514 **** --- 548,554 ---- } int eventRemoveRace(string str){ + validate(); if(!str){ write("That is not a valid race.\n"); Menu(); *************** *** 528,533 **** --- 568,574 ---- } int AddCurrency(){ + validate(); write("Currencies currently available: "+implode(ECONOMY_D->__QueryCurrencies()," ")); write("Please enter the name of the curency you'd like to add: \n"); input_to( (: eventAddCurrency :) ); *************** *** 537,542 **** --- 578,584 ---- int eventAddCurrency(string str){ string query; + validate(); currency = str; if(!str || str == "") { write("Invalid currency name.\n"); *************** *** 563,568 **** --- 605,612 ---- int CurrencyRate(string str){ string query; + + validate(); if(!str || !sscanf(str,"%f",rate) ){ write("Invalid rate. Currency not added.\n"); Menu(); *************** *** 582,587 **** --- 626,633 ---- int CurrencyWeight(string str){ string query; + + validate(); if(!str || !sscanf(str,"%f",weight) ){ write("Invalid weight. Currency not added.\n"); Menu(); *************** *** 599,604 **** --- 645,651 ---- } int CurrencyInflation(string str){ + validate(); if(!str || !sscanf(str,"%f",inflation) ){ write("Invalid inflation rate. Currency not added.\n"); Menu(); *************** *** 613,619 **** --- 660,673 ---- } int RemoveCurrency(){ + validate(); currencies = ECONOMY_D->__QueryCurrencies(); + if(sizeof(currencies) == 1) { + write("Please add a currency before removing this last one."); + write("Removing the last currency would cause the mud to "+ + "behave unexpectedly."); + return 1; + } write("Available currencies: "+ identify(currencies) +"."); write("Which currency would you like to remove?\n"); *************** *** 622,627 **** --- 676,682 ---- } int eventRemoveCurrency(string str){ + validate(); if(!str || member_array(str, currencies) == -1) { write("Invalid currency. No currency removed.\n"); Menu(); *************** *** 634,657 **** --- 689,716 ---- } int EncrePlayer(){ + validate(); write("Please enter the name of the player you'd like to promote: \n"); input_to( (: eventEncrePlayer :) ); return 1; } int eventEncrePlayer(string str){ + validate(); EnCre(str); Menu(); return 1; } int DecreCreator(){ + validate(); write("Please enter the name of the player you'd like to demote: \n"); input_to( (: eventDecreCreator :) ); return 1; } int eventDecreCreator(string str){ + validate(); DeCre(str); Menu(); return 1; *************** *** 661,666 **** --- 720,726 ---- object ob; string file, nom; + validate(); nom = convert_name(args); if( !user_exists(nom) ){ write(capitalize(nom) + " is not a member of " + *************** *** 668,691 **** Menu(); return 1; } ! if( !strsrch(file = save_file(nom), DIR_CRES) ) { ! Menu(); ! write("You cannot make "+capitalize(args)+" a creator."); ! return 1; ! } ! ! if( ob = find_player(nom) ) { ! tell_player(nom,"You are about to be promoted to creator. This requires a reset of "+ ! "your character. You will be disconnected from the mud. When you "+ ! "reconnect, you will be a creator."); ! make_workroom(ob); ! ob->eventForce("quit"); ! } ! else make_workroom(args); ! if( file_size(DIR_CRES+"/"+nom[0..0]) != -2) mkdir(DIR_CRES+"/"+nom[0..0]); ! rename(file+__SAVE_EXTENSION__, DIR_CRES+"/"+nom[0..0]+"/"+nom+__SAVE_EXTENSION__); ! if( file_size(file+__SAVE_EXTENSION__) > -1 ) rm(file+__SAVE_EXTENSION__); ! write(capitalize(args)+" is now a creator.\n"); return 1; } --- 728,735 ---- Menu(); return 1; } ! load_object("/secure/cmds/admins/encre")->cmd(nom); ! Menu(); return 1; } *************** *** 699,726 **** Menu(); return 1; } ! if( !strsrch(file = save_file(nom), DIR_PLAYERS) ) { ! Menu(); ! write("You cannot make "+capitalize(args)+" a player."); ! return 1; ! } ! if( ob = find_player(nom) ) { ! tell_player(nom,"You are about to be demoted to player status. This requires a reset of "+ ! "your character. You will be disconnected from the mud. When you "+ ! "reconnect, you will be a player."); ! ob->eventForce("quit"); ! } ! ! if( file_size(DIR_PLAYERS+"/"+nom[0..0]) != -2) ! mkdir(DIR_PLAYERS+"/"+nom[0..0]); ! rename(file+__SAVE_EXTENSION__, DIR_PLAYERS+"/"+nom[0..0]+"/"+nom+__SAVE_EXTENSION__); ! ! if( file_size(file+__SAVE_EXTENSION__) > -1 ) rm(file+__SAVE_EXTENSION__); ! write(capitalize(args)+" is now a lowly player."); return 1; } int RidUser(){ write("Please enter the name of the player you'd like to erase.\n"); //write("You will be asked to enter a reason for this ridding."); //write("When you have finished, Type a single period on a blank line, "); --- 743,755 ---- Menu(); return 1; } ! load_object("/secure/cmds/admins/decre")->cmd(nom); ! Menu(); return 1; } int RidUser(){ + validate(); write("Please enter the name of the player you'd like to erase.\n"); //write("You will be asked to enter a reason for this ridding."); //write("When you have finished, Type a single period on a blank line, "); *************** *** 730,735 **** --- 759,765 ---- } int eventRidUser(string str){ + validate(); if(!str){ write("Invalid entry.\n"); Menu(); *************** *** 747,752 **** --- 777,784 ---- int DoRid(string who) { object ob; string str; + + validate(); ridded = lower_case(who); str = convert_name(who); who = capitalize(who); *************** *** 778,783 **** --- 810,816 ---- } int LogRid(string str){ + validate(); globalstr = str; log_file("rid", "\n" + ridded + " by " + (string)this_player()->GetCapName() + "\n" + str + "\n"); //unguarded( (: write_file("/log/rid",timestamp()+" "+globalstr) :) ); *************** *** 787,798 **** --- 820,833 ---- } int BanishUser(){ + validate(); write("Please enter the name to banish: \n"); input_to( (: eventBanishUser :) ); return 1; } int evenBanishUser(string str){ + validate(); if(member_array(str,BANISH_D->query_banished()) != -1) { write("That name is already banished.\n"); Menu(); *************** *** 811,822 **** --- 846,859 ---- } int UnBanishUser(){ + validate(); write("Please enter the name to unbanish: \n"); input_to( (: eventUnBanishUser :) ); return 1; } int eventUnBanishUser(string str){ + validate(); if(member_array(str,BANISH_D->query_banished()) == -1) { write("That is not a banished name."); Menu(); *************** *** 829,834 **** --- 866,872 ---- } int ChangeName(){ + validate(); write("Current MUD name is "+mud_name()); write("Please enter the new name for your MUD:\n"); input_to( (: eventChangeName :) ); *************** *** 839,844 **** --- 877,883 ---- string *line_array; string nameline, newline, newfile, line_string, junk, name; + validate(); if(!newname || newname == "") { write("Name change cancelled.\n"); Menu(); *************** *** 894,899 **** --- 933,939 ---- } int ChangePort(){ + validate(); write("Current MUD network port is "+query_host_port()); write("Please enter the new network port for your MUD:\n"); input_to( (: eventChangePort :) ); *************** *** 905,910 **** --- 945,951 ---- string nameline, newline, newfile, line_string, junk, name; int num; + validate(); if(!newport || newport == "") { write("Port change cancelled.\n"); Menu(); *************** *** 951,956 **** --- 992,998 ---- } int ShutDownMud(){ + validate(); write("Are you sure?"); input_to( (: eventShutDownMud :) ); return 1; *************** *** 958,963 **** --- 1000,1007 ---- int eventShutDownMud(string str){ string *response_array = ({"yes","ok","y","yeah","yes, please"}); + + validate(); if(!str) str = "no"; if(member_array(str,response_array) == -1){ write("Shutdown cancelled.\n"); *************** *** 981,986 **** --- 1025,1031 ---- } int AddGroup(){ + validate(); write("\nCurrent groups file: \n"+read_file("/secure/cfg/groups.cfg")+"\n\n"); write("\nWhat is the name of the group you'd like to add?\n"); input_to( (: eventAddGroup :) ); *************** *** 993,998 **** --- 1038,1044 ---- string *top_array; string *bottom_array; + validate(); top_array = ({}); bottom_array = ({}); *************** *** 1044,1049 **** --- 1090,1096 ---- } int RemoveGroup(){ + validate(); write("\nCurrent groups file: \n"+read_file("/secure/cfg/groups.cfg")+"\n\n"); write("\nWhat is the name of the group you'd like to remove?\n"); input_to( (: eventRemoveGroup :) ); *************** *** 1056,1061 **** --- 1103,1109 ---- string *top_array; string *bottom_array; + validate(); top_array = ({}); bottom_array = ({}); *************** *** 1113,1118 **** --- 1161,1167 ---- } int ModGroup(){ + validate(); write("\nCurrent groups file: \n"+read_file("/secure/cfg/groups.cfg")+"\n\n"); write("\nWhat is the name of the group you'd like to modify?\n"); input_to( (: eventModGroup :) ); *************** *** 1122,1127 **** --- 1171,1177 ---- int eventModGroup(string str){ string config_file; + validate(); if(!str || str == "") { write("\nGroup modification cancelled.\n"); Menu(); *************** *** 1165,1170 **** --- 1215,1221 ---- string *bottom_array; string *dudes; + validate(); top_array = ({}); bottom_array = ({}); *************** *** 1173,1179 **** --- 1224,1243 ---- str = global_group_temp; global_group_temp = ""; + + if(str == "ASSIST" || str == "SECURE" ) { + if(!securep(this_player())){ + write("Only full admins may do this."); + Menu(); + return 1; + } + } + + //tc("str: "+str); + //tc("green","green"); + if(str == "SECURE"){ + validate(); if(!members || members == "") { write("You're not leaving the SECURE group empty. Modification cancelled.\n"); Menu(); *************** *** 1210,1221 **** --- 1274,1287 ---- } int ShowGroups(){ + validate(); write("\nCurrent groups file: \n"+read_file("/secure/cfg/groups.cfg")+"\n\n"); Menu(); return 1; } mixed cmd(string args) { + validate(); Menu("main"); return 1; } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/banish.c ds2.0r28/lib/secure/cmds/admins/banish.c *** ds2.0r18/lib/secure/cmds/admins/banish.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/cmds/admins/banish.c Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,36 ---- + // /bin/dev/_banish.c + // from the Dead Souls Mudlib + // prevents a name being used by a new player + // created by Descartes of Borg ??? + + #include + #include + + inherit LIB_DAEMON; + + int cmd(string str) { + if(!str || str == ""){ + write("Syntax: banish "); + return 1; + } + if(!user_exists(str = lower_case(str))) { + write(capitalize(str)+" is now banished.\n"); + catch(call_other(BANISH_D, "banish_name", str)); + } + else { + write("A player by that name already exists.\n"); + this_player()->eventPrint((string)FINGER_D->GetFinger(str)); + } + return 1; + } + + void help() { + write("Syntax: \n\n" + "Protects a name from being used by a new player.\n" + "For example, if you have created a monster named Cassandra, in order\n" + "to avoid problems with player complaining \"I typed 'kill\n" + "cassandra' meaning to kill the evil enchantress, but Cassandra\n" + "walked in and I accidentally killed her.\" It is also to be\n" + "used to keep people from using offensive names.\n" + ); + } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/chanban.c ds2.0r28/lib/secure/cmds/admins/chanban.c *** ds2.0r18/lib/secure/cmds/admins/chanban.c Wed Feb 22 15:33:33 2006 --- ds2.0r28/lib/secure/cmds/admins/chanban.c Wed Jul 5 00:01:12 2006 *************** *** 8,13 **** --- 8,14 ---- mixed cmd(string args) { string chan, mud; + if(!archp(previous_object())) return 0; if( !args || args == "" || sscanf(args,"%s %s",chan,mud) != 2) { return "Huh?"; } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/chanunban.c ds2.0r28/lib/secure/cmds/admins/chanunban.c *** ds2.0r18/lib/secure/cmds/admins/chanunban.c Wed Feb 22 15:33:33 2006 --- ds2.0r28/lib/secure/cmds/admins/chanunban.c Wed Jul 5 00:01:12 2006 *************** *** 8,13 **** --- 8,14 ---- mixed cmd(string args) { string chan, mud; + if(!archp(previous_object())) return 0; if( !args || args == "" || sscanf(args,"%s %s",chan,mud) != 2) { return "Huh?"; } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/decre.c ds2.0r28/lib/secure/cmds/admins/decre.c *** ds2.0r18/lib/secure/cmds/admins/decre.c Sat Mar 11 11:16:43 2006 --- ds2.0r28/lib/secure/cmds/admins/decre.c Wed Jul 5 00:01:12 2006 *************** *** 5,11 **** --- 5,13 ---- */ #include + #include #include + #include inherit LIB_DAEMON; *************** *** 16,21 **** --- 18,26 ---- object *inv; string nom, file; + if( !((int)master()->valid_apply(({ PRIV_ASSIST, PRIV_SECURE, LIB_CONNECT }))) ) + error("Illegal decre attempt: "+get_stack()+" "+identify(previous_object(-1))); + if( args == "" || !stringp(args) ) return "Who do you want to make a player?"; nom = convert_name(args); *************** *** 23,35 **** --- 28,55 ---- possessive_noun(mud_name()) + " reality."; if( !strsrch(file = save_file(nom), DIR_PLAYERS) ) return "You cannot make "+capitalize(args)+" a player."; + + if(!ob = find_player(nom)){ + PLAYERS_D->RemovePendingEncre(lower_case(nom)); + PLAYERS_D->AddPendingDecre(lower_case(nom)); + write(capitalize(nom)+" will be demoted on their next login."); + return 1; + } + + if(ob == this_player()){ + return "Nonsense."; + } + if( file_size(DIR_PLAYERS+"/"+nom[0..0]) != -2) mkdir(DIR_PLAYERS+"/"+nom[0..0]); if(rename(file+__SAVE_EXTENSION__, DIR_PLAYERS+"/"+nom[0..0]+"/"+nom+__SAVE_EXTENSION__)) return "You failed due to lack of write access to "+DIR_PLAYERS+"."; + PLAYERS_D->eventDecre(lower_case(nom)); + if( ob = find_player(nom) ) { PlayerName = nom; inv = deep_inventory(ob); + ob->eventMove(ROOM_FURNACE); if(sizeof(inv)) inv->eventMove(ROOM_FURNACE); catch(player_ob = (object)master()->player_object(nom)); PlayerName = 0; *************** *** 51,57 **** --- 71,90 ---- this_player()); if( file_size(file+__SAVE_EXTENSION__) > -1 ) rm(file+__SAVE_EXTENSION__); } + player_ob->eventMove(ROOM_START); return 1; } string GetKeyName() { return PlayerName; } + void help() { + message("help", + "Syntax: decre \n\n" + "Demotes the specified creator to player status. " + "If the target is not " + "logged in, they will be made a player when " + "they next log in." + "\n\n" + "See also: encre, rid", this_player() + ); + } + diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/domainadmin.c ds2.0r28/lib/secure/cmds/admins/domainadmin.c *** ds2.0r18/lib/secure/cmds/admins/domainadmin.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/cmds/admins/domainadmin.c Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,128 ---- + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string args) { + string rep, flag, domain, person; + string write_perms = read_file("/secure/cfg/write.cfg"); + string *tmp_array = explode(write_perms, "\n"); + string *admin_array = ({}); + mapping DomainsMap = ([]); + + + if(!archp(previous_object()) || this_player()->GetForced()){ + return "No."; + } + + //tc("tp_array: "+identify(tmp_array),"white"); + + if(!args || args == ""){ + write(this_object()->GetHelp()); + return 1; + } + + if(sscanf(args,"%s %s %s", flag, domain, person) != 3){ + write(this_object()->GetHelp()); + return 1; + } + + person = lower_case(person); + + if(!user_exists(person)){ + write("Invalid person."); + return 1; + } + + if(!directory_exists("/domains/"+domain)){ + write("Invalid domain."); + return 1; + } + + write_perms = replace_string(write_perms, "\n",";\n"); + + foreach(string line in tmp_array){ + string where, admins; + if(sscanf(line,"(/domains/%s/) %s", where, admins)){ + DomainsMap[where] = admins; + if(sizeof(DomainsMap[domain])) admin_array = explode(DomainsMap[domain],":"); + } + } + + if(flag == "-a"){ + + if(member_array(person, admin_array) != -1){ + write("That person already administers that domain."); + return 1; + } + + else admin_array += ({ person }); + + rep = "(/domains/"+domain+"/) "+implode(admin_array, ":"); + + //tc("rep: "+rep,"blue"); + + if(grepp(write_perms, "(/domains/"+domain+"/)")){ + write_perms = replace_matching_line(write_perms, "/domains/"+domain, rep); + write_perms = replace_string(write_perms, ";\n","\n"); + //tc("write_perms: "+write_perms, "yellow"); + } + else{ + write_perms = replace_string(write_perms, ";\n","\n"); + write_perms = newline_trim(write_perms); + write_perms += "\n(/domains/"+domain+"/) "+person+"\n"; + //tc("write_perms: "+write_perms); + } + } + + else if(flag == "-d"){ + if(member_array(person, admin_array) == -1){ + write("That person does not administer that domain."); + return 1; + } + + else admin_array -= ({ person }); + //tc("admin_array: "+identify(admin_array),"cyan"); + //tc("domain: "+domain,"cyan"); + //tc("erite_terms: "+write_perms,"cyan"); + + if(!sizeof(admin_array)){ + write_perms = remove_matching_line(write_perms, "(/domains/"+domain+"/)",1); + write_perms = replace_string(write_perms, ";\n","\n"); + //tc("write_perms: "+write_perms); + } + else { + rep = "(/domains/"+domain+"/) "+implode(admin_array, ":"); + //tc("rep: "+rep,"blue"); + write_perms = replace_matching_line(write_perms, "/domains/"+domain, rep); + write_perms = replace_string(write_perms, ";\n","\n"); + //tc("write_perms: "+write_perms); + } + } + + else { + write("Invalid flag."); + return 1; + } + + //tc("write_perms: "+write_perms,"green"); + write_file("/secure/cfg/write.cfg", write_perms, 1); + update("/secure/daemon/master"); + write("Ok."); + return 1; + } + + string GetHelp(string args) { + return ("Syntax: domainadmin [-a | -d] \n\n" + "This command manages the write permissions to a specified " + "domain. For example, to give a creator named Snuffy write " + "privileges to /domains/SnuffLand, you would type: " + "\ndomainadmin -a SnuffLand snuffy\n" + "To revoke those privileges:\n" + "\domainadmin -d SnuffLand snuffy\n" + "This permits the creator to use QCS within the domain's " + "directories. " + "Write privileges are listed in /secure/cfg/write.cfg" + "\n\n" + "See also: domaincreate, admintool"); + } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/domaincreate.c ds2.0r28/lib/secure/cmds/admins/domaincreate.c *** ds2.0r18/lib/secure/cmds/admins/domaincreate.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/cmds/admins/domaincreate.c Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,65 ---- + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string args) { + string domain_path; + string *subdirs = ({"room","weap","armor","npc","etc","adm","doors","meals","obj"}); + string *alphabet = ({",", "#", ";", "^", "&", "(", ")","\"","\'","\`","?", " " }); + subdirs += ({"txt","virtual"}); + alphabet += ({ "@", "!", "$", "%", "=", "{", "}", "[", "]", ":", "<", ">", "\*" }); + alphabet += ({ "\\", "\/", "\|" }); + + if(!archp(previous_object()) || this_player()->GetForced()){ + return "No."; + } + + if(!args || args == "" || args == "/domains" || args == "/domains/" || + args == "domain"){ + write(this_object()->GetHelp()); + return 1; + } + + if(first(args, 9) == "/domains/"){ + domain_path = args; + } + else domain_path = "/domains/"+args; + + if(sscanf(domain_path,"/domains/%s",args) != 1) return 0; + if(last(args,1) == "/") args = truncate(args,1); + + foreach(string booboo in alphabet){ + args = replace_string(args, booboo, "_"); + } + + domain_path = "/domains/"+args; + + write("Domain path is: "+domain_path); + + if(directory_exists(domain_path)){ + write("That domain already exists."); + return 1; + } + + mkdir(domain_path); + + foreach(string dir in subdirs){ + string newdir = domain_path + "/" + dir; + write("Creating: "+newdir); + mkdir(newdir); + } + + cp("/obj/room.c",domain_path+"/room/start.c"); + + write("Ok."); + return 1; + } + + string GetHelp(string args) { + return ("Syntax: domaincreate DOMAIN\n\n" + "This command creates a new directory in the /domains dir, " + "and adds the appropriate subdirs needed by a domain." + "\n\n" + "See also: domainadmin, admintool"); + } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/encre.c ds2.0r28/lib/secure/cmds/admins/encre.c *** ds2.0r18/lib/secure/cmds/admins/encre.c Wed Feb 22 15:33:33 2006 --- ds2.0r28/lib/secure/cmds/admins/encre.c Wed Jul 5 00:01:12 2006 *************** *** 4,9 **** --- 4,11 ---- */ #include + #include + #include #include inherit LIB_DAEMON; *************** *** 14,19 **** --- 16,24 ---- object ob, cre_ob, jeans, shirt, robe, hat, book, staff; string file, nom; + if( !((int)master()->valid_apply(({ PRIV_ASSIST, PRIV_SECURE, LIB_CONNECT }))) ) + error("Illegal encre attempt: "+get_stack()+" "+identify(previous_object(-1))); + if( args == "" || !stringp(args) ) return "Who do you want to make a creator?"; nom = convert_name(args); *************** *** 21,29 **** --- 26,47 ---- possessive_noun(mud_name()) + " reality."; if( !strsrch(file = save_file(nom), DIR_CRES) ) return "You cannot make "+capitalize(args)+" a creator."; + + if(!ob=find_player(nom)){ + if(member_array(nom, PLAYERS_D->GetPendingEncres()) != -1){ + write("That person is already pending creatorship."); + return 1; + } + PLAYERS_D->RemovePendingDecre(lower_case(nom)); + PLAYERS_D->AddPendingEncre(lower_case(nom)); + write(capitalize(nom)+" will be a creator next time they log in."); + return 1; + } + if( file_size(DIR_CRES+"/"+nom[0..0]) != -2) mkdir(DIR_CRES+"/"+nom[0..0]); if(rename(file+__SAVE_EXTENSION__, DIR_CRES+"/"+nom[0..0]+"/"+nom+__SAVE_EXTENSION__)) return "You failed due to lack of write access to "+DIR_CRES+"."; + PLAYERS_D->eventCre(lower_case(nom)); if( ob = find_player(nom) ) { ob->SetProperty("brand_spanking_new",0); PlayerName = nom; *************** *** 62,67 **** --- 80,86 ---- book = new("/domains/default/obj/manual"); if(book && !present("manual",cre_ob)) book->eventMove(cre_ob); else if(book) book->eventMove(ROOM_FURNACE); + cre_ob->save_player((string)cre_ob->GetKeyName()); //message("system", "You will now be logged off.", cre_ob); //message("system", "Please log back in to use your new powers.", cre_ob); //cre_ob->eventForce("quit"); *************** *** 70,72 **** --- 89,103 ---- } string GetKeyName() { return PlayerName; } + + void help() { + message("help", + "Syntax: encre \n\n" + "Makes the target a creator. If the target is not " + "logged in, they will be made a creator when " + "they next log in." + "\n\n" + "See also: decre, rid", this_player() + ); + } + diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/end.c ds2.0r28/lib/secure/cmds/admins/end.c *** ds2.0r18/lib/secure/cmds/admins/end.c Mon Nov 7 13:32:16 2005 --- ds2.0r28/lib/secure/cmds/admins/end.c Wed Jul 5 00:01:12 2006 *************** *** 12,17 **** --- 12,18 ---- mixed cmd(string args) { int x; + if(!archp(previous_object())) return 0; if( !args || args == "" ) return "You must specify a delay in minutes."; if( !(x = to_int(args)) ) return "You must specify a delay in minutes."; if( x < 2 ) return "The delay must be at least 2 minutes."; diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/notify.c ds2.0r28/lib/secure/cmds/admins/notify.c *** ds2.0r18/lib/secure/cmds/admins/notify.c Mon Nov 7 13:32:16 2005 --- ds2.0r28/lib/secure/cmds/admins/notify.c Wed Jul 5 00:01:12 2006 *************** *** 12,17 **** --- 12,19 ---- mixed cmd(string str) { object ob = previous_object(); string who; + + if(!archp(previous_object())) return 0; if( !ob ) return 0; who = (string)ob->GetKeyName(); if( sizeof(str) ) { diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/register.c ds2.0r28/lib/secure/cmds/admins/register.c *** ds2.0r18/lib/secure/cmds/admins/register.c Mon Nov 7 13:32:16 2005 --- ds2.0r28/lib/secure/cmds/admins/register.c Wed Jul 5 00:01:12 2006 *************** *** 14,20 **** void abort(); int cmd(string str) { ! if(!archp(this_player())) return 0; if(!str) { notify_fail("Syntax: register \n\n"); return 0; --- 14,20 ---- void abort(); int cmd(string str) { ! if(!archp(previous_object())) return 0; if(!str) { notify_fail("Syntax: register \n\n"); return 0; diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/resetall.c ds2.0r28/lib/secure/cmds/admins/resetall.c *** ds2.0r18/lib/secure/cmds/admins/resetall.c Fri Mar 24 14:37:46 2006 --- ds2.0r28/lib/secure/cmds/admins/resetall.c Wed Jul 5 00:01:12 2006 *************** *** 12,18 **** rooms = filter(objects(), (: inherits(LIB_ROOM, $1) :) ); ! if(archp(this_player())){ foreach(object room in rooms){ write("Updating: "+base_name(room)); --- 12,18 ---- rooms = filter(objects(), (: inherits(LIB_ROOM, $1) :) ); ! if(archp(previous_object())){ foreach(object room in rooms){ write("Updating: "+base_name(room)); diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/resetpasswd.c ds2.0r28/lib/secure/cmds/admins/resetpasswd.c *** ds2.0r18/lib/secure/cmds/admins/resetpasswd.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/cmds/admins/resetpasswd.c Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,96 ---- + #include + #include + #include + #include + + inherit LIB_DAEMON; + + static void NewPass(string pass); + static void ConfirmPass(string str, string newpass); + + string savefile; + + mixed cmd(string args) { + + if(!archp(previous_object())) { + write("No."); + return 1; + } + + args = lower_case(args); + + if(args == "me" || args == this_player()->GetKeyName()){ + write("To reset your own password, use the command: passwd"); + return 1; + } + + if( (int)previous_object()->GetForced() ) + return "You cannot be forced to change a password."; + if( previous_object() != this_player() ) + return "You're being sploited to reset someone's password."; + + if(!user_exists(args)){ + write("That person does not exist on this mud."); + return 1; + } + + if(find_player(args)){ + write("That player is currently logged on. Please use " + "the passwd command to reset their password."); + return 1; + } + + savefile = DIR_CRES + "/" + args[0..0] + "/" + args + ".o"; + if(!file_exists(savefile)) { + write("Couldn't find "+savefile+". Looking for alternate."); + savefile = DIR_PLAYERS + "/" + args[0..0] + "/"+ args + ".o"; + } + + if(!file_exists(savefile)){ + write("Save file could not be found. Exiting."); + return 1; + } + + write("Found "+savefile+"."); + + previous_object()->eventPrint("New password: ", MSG_PROMPT); + input_to( (: NewPass :), I_NOECHO | I_NOESC, previous_object() || args); + return 1; + } + + static void NewPass(string pass) { + if( !pass || strlen(pass) < 5 ) { + this_player()->eventPrint("Password must be at least 5 " + "characters, password change failed.", + MSG_SYSTEM); + return; + } + this_player()->eventPrint("\nConfirm: ", MSG_PROMPT); + input_to( (: ConfirmPass :), I_NOECHO | I_NOESC, pass); + } + + static void ConfirmPass(string str, string newpass) { + string *lines; + if( str != newpass ) { + this_player()->eventPrint("Passwords do not match.", MSG_SYSTEM); + return; + } + + lines = explode(unguarded((: read_file, savefile :)),"\n"); + unguarded((: rm, savefile :)); + foreach(string line in lines) { + string val; + + if( sscanf(line, "Password %s", val) ) + line = "Password \"" + crypt(newpass, 0) + "\""; + unguarded((: write_file, savefile, line + "\n" :)); + } + this_player()->eventPrint("\nPassword changed.", MSG_SYSTEM); + } + + void help() { + message("help", "Syntax: resetpasswd \n\n" + "Allows you to change someone's password if they " + "are not logged on.\n\n" + "See also: passwd", this_player()); + } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/rid.c ds2.0r28/lib/secure/cmds/admins/rid.c *** ds2.0r18/lib/secure/cmds/admins/rid.c Mon Nov 7 13:32:16 2005 --- ds2.0r28/lib/secure/cmds/admins/rid.c Wed Jul 5 00:01:12 2006 *************** *** 6,11 **** --- 6,12 ---- #include #include + #include #include inherit LIB_DAEMON; *************** *** 16,21 **** --- 17,23 ---- object ob; string str, file; + if(!archp(previous_object())) return 0; if( !who || who == "" ) { write("Rid whom?"); return 1; *************** *** 62,67 **** --- 64,70 ---- log_file("rid", "\n" + who + " by " + (string)this_player()->GetCapName() + "\n" + str + "\n"); write(who + " has been ridded from " + mud_name() + "."); + PLAYERS_D->RemoveUser(lower_case(who)); } void help() { diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/router.c ds2.0r28/lib/secure/cmds/admins/router.c *** ds2.0r18/lib/secure/cmds/admins/router.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/cmds/admins/router.c Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,45 ---- + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string args) { + string subcmd, arg1, arg2; + + if(!archp(previous_object())) return 0; + if(find_object(ROUTER_D)) + write("I3 router daemon is loaded."); + else { + write("I3 router daemon is not loaded."); + return 1; + } + + if(!args || args == ""){ + return 1; + } + + if(args == "show"){ + write("Router config: \n"+ROUTER_D->get_info()); + return 1; + } + + if(sscanf(args,"%s %s",subcmd, arg1) != 2){ + write("Invalid router subcommand."); + return 1; + } + + if(arg1 == "mudlist"){ + mapping mudlist = ROUTER_D->query_mudinfo(); + write("Mudlist: \n"+identify(mudlist)); + } + + + write("Router command completed."); + return 1; + } + + string GetHelp(string args) { + return ("Syntax: \n\n" + "\n\n" + ""); + } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/sconvert.c ds2.0r28/lib/secure/cmds/admins/sconvert.c *** ds2.0r18/lib/secure/cmds/admins/sconvert.c Mon Jan 16 23:03:39 2006 --- ds2.0r28/lib/secure/cmds/admins/sconvert.c Wed Jul 5 00:01:12 2006 *************** *** 11,16 **** --- 11,17 ---- string s1, s2, cut, n, tmp; int a, b, val; + if(!archp(previous_object())) return 0; while( (a = strsrch(str, search)) > -1 ) { tmp = str[a..]; b = strsrch(tmp, ")"); *************** *** 35,40 **** --- 36,42 ---- string *files, *tmp; int i; + if(!archp(previous_object())) return 0; if( !sizeof(s) ) args = "*.c"; else args = s; files = (string *)this_player()->wild_card(args); *************** *** 69,74 **** --- 71,78 ---- mixed cmd(string str) { string files; int change; + + if(!archp(previous_object())) return 0; if( !sizeof(str) || (sscanf(str, "%s %d", files, change) != 2) || !change) { GetHelp(0); return 1; diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/setreboot.c ds2.0r28/lib/secure/cmds/admins/setreboot.c *** ds2.0r18/lib/secure/cmds/admins/setreboot.c Mon Nov 7 13:32:16 2005 --- ds2.0r28/lib/secure/cmds/admins/setreboot.c Wed Jul 5 00:01:12 2006 *************** *** 6,13 **** int cmd(string str) { int x; ! if(!str || !archp(previous_object())) return 0; ! sscanf(str, "%d", x); x = (int)EVENTS_D->SetRebootInterval(x); message("info", "Reboot interval set to "+x+" hours.", this_player()); return 1; --- 6,18 ---- int cmd(string str) { int x; ! if( !((int)master()->valid_apply(({ "ASSIST" }))) ){ ! return 0; ! } ! ! if(!str || str == "" || !sscanf(str, "%d", x)){ ! this_object()->help(); ! } x = (int)EVENTS_D->SetRebootInterval(x); message("info", "Reboot interval set to "+x+" hours.", this_player()); return 1; diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/snoopreport.c ds2.0r28/lib/secure/cmds/admins/snoopreport.c *** ds2.0r18/lib/secure/cmds/admins/snoopreport.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/cmds/admins/snoopreport.c Wed Jul 5 19:58:20 2006 *************** *** 0 **** --- 1,16 ---- + // This command is only useful if you own an intermud channel + + #include + #include + + inherit LIB_DAEMON; + + mixed cmd(string args) { + string chan, mud; + + if(!this_player() || !archp(this_player())) return 0; + + SNOOP_D->Report(); + + return 1; + } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/switchrouter.c ds2.0r28/lib/secure/cmds/admins/switchrouter.c *** ds2.0r18/lib/secure/cmds/admins/switchrouter.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/cmds/admins/switchrouter.c Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,71 ---- + #include + #include + + inherit LIB_DAEMON; + + string file; + + mixed cmd(string args) { + string ip, name; + int port, octet1, octet2, octet3, octet4; + + if(!archp(previous_object())) return "No."; + + if(find_object(INTERMUD_D))find_object(INTERMUD_D)->eventClearVars(); + if(find_object(INTERMUD_D))find_object(INTERMUD_D)->eventDestruct(); + //rm("/save/intermud.o"); + + if(!args || args == ""){ + write("Reloading intermud daemon."); + if( load_object(INTERMUD_D) ) write("Intermud daemon reloaded."); + else write("Failed to reload intermud daemon."); + return 1; + } + + if(sscanf(args,"%s %s %d", name, ip, port) != 3 || port > 65534 || + sscanf(ip,"%d.%d.%d.%d", octet1, octet2, octet3, octet4) != 4){ + write("Invalid router reference. \nTry: switchrouter "); + write("For example: switchrouter yatmim 149.152.218.102 23"); + if( load_object(INTERMUD_D) ) write("Intermud daemon reloaded."); + else write("Failed to reload intermud daemon."); + return 1; + } + + file = read_file(INTERMUD_D+".c"); + //write_file("/tmp/1.txt",file,1); + + file = replace_matching_line(file, "//Nameservers", ""); + + //write_file("/tmp/2.txt",file,1); + if(first(name,1) != "*") name = "*"+name; + + file = replace_matching_line(file, "Nameservers = ({", + " Nameservers = ({ ({ \""+name+"\", \""+ip+" "+port+"\" }) });", 1); + + //write_file("/tmp/3.txt",file,1); + + unguarded( (: write_file(INTERMUD_D+".c",file,1) :) ); + + if( load_object(INTERMUD_D) ) write("Intermud daemon reloaded."); + else write("Failed to reload intermud daemon."); + + write("Done."); + return 1; + } + + + string GetHelp(string args) { + return ("Syntax: switchrouter \n\n" + "Stops the intermud daemon, changes the default intermud " + "router to the ip and port you specify, wipes the previous " + "router data, and reloads INTERMUD_D. Without arguments, " + "this command will clear your intermud cache and reload " + "the daemon. Known routers are:\n" + "*gjs 198.144.203.194 9000 (The \"official\" intermud.org router)\n" + "*yatmim 149.152.218.102 23 (The \"official\" Dead Souls router)\n" + "The official current Dead Souls router's IP will always be " + "available at:\n" + "http://dead-souls.net/router.html" + "\n\n" + "See also: router, mudlist"); + } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/tempban.c ds2.0r28/lib/secure/cmds/admins/tempban.c *** ds2.0r18/lib/secure/cmds/admins/tempban.c Mon Nov 7 13:32:16 2005 --- ds2.0r28/lib/secure/cmds/admins/tempban.c Wed Jul 5 00:01:12 2006 *************** *** 14,20 **** string site; int time; ! if(!archp(this_player())) return 0; if(!str) { write("The following sites are on temporary registration:\n"+ --- 14,20 ---- string site; int time; ! if(!archp(previous_object())) return 0; if(!str) { write("The following sites are on temporary registration:\n"+ diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/ticktock.c ds2.0r28/lib/secure/cmds/admins/ticktock.c *** ds2.0r18/lib/secure/cmds/admins/ticktock.c Wed Jan 11 23:16:35 2006 --- ds2.0r28/lib/secure/cmds/admins/ticktock.c Wed Jul 5 00:01:12 2006 *************** *** 9,14 **** --- 9,15 ---- string meridiem = " am"; string nulle = ""; + if(!archp(previous_object())) return 0; if(!args) args = 0; if(stringp(args)){ if(sscanf(args,"%d",integer) != 1) return "Failed."; diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/unmonitor.c ds2.0r28/lib/secure/cmds/admins/unmonitor.c *** ds2.0r18/lib/secure/cmds/admins/unmonitor.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/cmds/admins/unmonitor.c Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,34 ---- + #include + #include + + inherit LIB_DAEMON; + + int cmd(string str) { + object ob; + + if(!archp(previous_object())) { + write("Only an arch may halt a monitoring process."); + return 0; + } + if( !str || str == "" ) { + write("Unmonitor whom?\n"); + } + else if(!user_exists(str)) + write(str+": no such player.\n"); + else{ + SNOOP_D->RemoveMonitor(this_player(), str); + write("The snoop daemon has received your request."); + } + return 1; + } + + int help() + { + write( @EndText + Syntax: unmonitor + Effect: Stops the logging of a user's input and output. + See also: monitor, snoop, unsnoop + EndText + ); + return 1; + } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/unrid.c ds2.0r28/lib/secure/cmds/admins/unrid.c *** ds2.0r18/lib/secure/cmds/admins/unrid.c Mon Jan 16 23:03:39 2006 --- ds2.0r28/lib/secure/cmds/admins/unrid.c Wed Jul 5 00:01:12 2006 *************** *** 10,15 **** --- 10,16 ---- mixed cmd(string str) { string file; + if(!archp(previous_object())) return 0; if( !sizeof(str) ) return "Unrid whom?"; str = convert_name(str); file = DIR_RID + "/" + str + __SAVE_EXTENSION__; *************** *** 24,29 **** --- 25,31 ---- return 1; } this_player()->eventPrint("Unrid successful."); + PLAYER_D->AddPlayerInfo(str); return 1; } diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/unwatch.c ds2.0r28/lib/secure/cmds/admins/unwatch.c *** ds2.0r18/lib/secure/cmds/admins/unwatch.c Mon Nov 7 13:32:16 2005 --- ds2.0r28/lib/secure/cmds/admins/unwatch.c Wed Jul 5 00:01:12 2006 *************** *** 6,11 **** --- 6,12 ---- int cmd(string str) { string which, nom; + if(!archp(previous_object())) return 0; if(!str) { notify_fail("Unwatch which name or site?\n"); return 0; diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/usage.c ds2.0r28/lib/secure/cmds/admins/usage.c *** ds2.0r18/lib/secure/cmds/admins/usage.c Fri Nov 11 12:31:31 2005 --- ds2.0r28/lib/secure/cmds/admins/usage.c Wed Jul 5 00:01:12 2006 *************** *** 9,14 **** --- 9,15 ---- string ret; float x, fraction; + if(!archp(previous_object())) return 0; info = rusage(); cles = keys(info); diff -c -r --new-file ds2.0r18/lib/secure/cmds/admins/watch.c ds2.0r28/lib/secure/cmds/admins/watch.c *** ds2.0r18/lib/secure/cmds/admins/watch.c Mon Nov 7 13:32:16 2005 --- ds2.0r28/lib/secure/cmds/admins/watch.c Wed Jul 5 00:01:12 2006 *************** *** 6,11 **** --- 6,12 ---- int cmd(string str) { string which, nom; + if(!archp(previous_object())) return 0; if(!str) { notify_fail("Watch which name or site?\n"); return 0; diff -c -r --new-file ds2.0r18/lib/secure/cmds/creators/about.c ds2.0r28/lib/secure/cmds/creators/about.c *** ds2.0r18/lib/secure/cmds/creators/about.c Wed Jan 4 20:42:56 2006 --- ds2.0r28/lib/secure/cmds/creators/about.c Wed Jul 5 00:01:12 2006 *************** *** 21,26 **** --- 21,32 ---- if(!thing) thing = present(str, environment(this_player())); if(thing->GetDoor()) thing = load_object(thing->GetDoor()); if(!thing) return notify_fail("Uh oh, error.\n"); + if(interactive(thing)){ + message( "info","Players do not have files with LPC code. " + "Player save files are not subject to examination with this command.", + this_player()); + return 1; + } name = base_name(thing) + ".c"; message( "info", name + "\n", this_player() ); return (mixed)this_player()->eventPage(name, MSG_SYSTEM | MSG_NOCOLOUR); diff -c -r --new-file ds2.0r18/lib/secure/cmds/creators/banish.c ds2.0r28/lib/secure/cmds/creators/banish.c *** ds2.0r18/lib/secure/cmds/creators/banish.c Mon Nov 7 13:32:16 2005 --- ds2.0r28/lib/secure/cmds/creators/banish.c Wed Dec 31 19:00:00 1969 *************** *** 1,34 **** - // /bin/dev/_banish.c - // from the Dead Souls Mudlib - // prevents a name being used by a new player - // created by Descartes of Borg ??? - - #include - #include - - inherit LIB_DAEMON; - - int cmd(string str) { - if(!user_exists(str = lower_case(str))) { - write(capitalize(str)+" is now banished.\n"); - //seteuid(UID_BANISH); - catch(call_other(BANISH_D, "banish_name", str)); - //seteuid(getuid()); - } - else { - write("A player by that name already exists.\n"); - this_player()->eventPrint((string)FINGER_D->GetFinger(str)); - } - return 1; - } - - void help() { - write("Syntax: \n\n" - "Protects a name from being used by a new player.\n" - "For example, if you have created a monster named Cassandra, in order\n" - "to avoid problems with player complaining \"I typed 'kill\n" - "cassandra' meaning to kill the evil enchantress, but Cassandra\n" - "walked in and I accidentally killed her.\" It is also to be\n" - "used to keep people from using offensive names.\n" - ); - } --- 0 ---- diff -c -r --new-file ds2.0r18/lib/secure/cmds/creators/cp.c ds2.0r28/lib/secure/cmds/creators/cp.c *** ds2.0r18/lib/secure/cmds/creators/cp.c Mon Nov 7 13:32:16 2005 --- ds2.0r28/lib/secure/cmds/creators/cp.c Wed Jul 5 00:01:12 2006 *************** *** 6,11 **** --- 6,12 ---- // Help added by Brian (1/28/92) // Single arg cp added by Scythe@Dead Souls (1/25/93) // Bug in single arg cp fixed by Pallando (5/26/93) + // Added wild card support by Brodbane@Eve (4/3/06) */ #include *************** *** 13,24 **** int help(); ! int ! cmd(string str) { string line; string file1; string file2; int localdest; if(this_player()->GetForced()) { write("Someone has tried forcing you to cp " + str); return 1; --- 14,29 ---- int help(); ! string rmSlash(string str) { return replace_string(str,"//","/"); } ! ! int cmd(string str) { string line; string file1; string file2; int localdest; + string * files; + int ow; + if(this_player()->GetForced()) { write("Someone has tried forcing you to cp " + str); return 1; *************** *** 33,38 **** --- 38,45 ---- return 1; } } + + if( str && sscanf( str, "-o %s", str)) ow = 1; /* check for last parameter == "." */ if (file2 == ".") { localdest = 1; /* It's a local destination */ *************** *** 43,125 **** file1 = absolute_path(this_player()->query_cwd(), file1); file2 = absolute_path(this_player()->query_cwd(), file2); ! /* This used to give and lstat error, fixed 930208 by Plura */ ! if(file_size(file1) < 1) ! { ! notify_fail("cp: couldn't find "+file1+"\n"); ! return 0; } ! /* Check if the destination is a directory */ ! if (!localdest) { ! if (file_size(file2) == -2) localdest = 1; ! } ! if (localdest) { ! /* Extract the root file name from the source and use ! it for the destination. file2 should be just a ! directory path at this point so that the rootname can ! be appended. */ ! string newroot; ! string path; ! string rootname; ! rootname = file1; ! while(sscanf(rootname, "%s/%s", path, newroot) == 2) { ! rootname = newroot; } - file2 = file2 + "/" + rootname; - } - if(file_size(file1) == -2) /*Plura 930120*/ - { - notify_fail("cp: "+file1+" is a directory.\n"); - return 0; - } - #if 0 - if(file_size(file2) > 0) /* Plura 930120 */ - { - notify_fail("cp: "+file2+" already exists.\n"); - return 0; } - #endif - if (file1 == file2) { - notify_fail("cp: can not copy a file on top of itself!\n"); - return 0; - } - if(!master()->valid_read(file1, this_player(), "cp")) - { - notify_fail(file1 + ": Permission denied.\n"); - return 0; - } - if(!master()->valid_write(file2, this_player(), "cp")) - { - notify_fail(file2 + ": Permission denied.\n"); - return 0; - } - line = read_file(file1); - if (line == 0) { - /* Uhoh. Can't read source file. */ - notify_fail("cp: file not found: " + file1 + "\n"); - return 0; - } - if (file_size(file2) == -2) - { - notify_fail("Tried to overwrite the directory "+ file2 + "\n"); - return 0; - } - rm(file2); - write_file(file2, line); - message("system", "Copied: " + file1 + " to " + file2, this_player()); return 1; } int help() { message("help", "Command: cp\nSyntax: cp [pathname]\n" "This command makes a copy of the file using the new name " "and location passed. If a new pathname is not specified " ! "then the copy is put into the present working directory.", this_player()); return 1; } /* EOF */ --- 50,108 ---- file1 = absolute_path(this_player()->query_cwd(), file1); file2 = absolute_path(this_player()->query_cwd(), file2); ! /* Added by Brodbane to handle wild card options, 3/3/06 */ ! if( !sizeof( files = wild_card( file1 ) ) ) ! files = ({ file1 }); ! if( sizeof(files) > 1 ) ! { ! switch( file_size(file2) ) ! { ! case -1: ! this_player()->eventForce("mkdir "+file2); ! break; ! case -2: ! break; ! default: ! return(write("Cannot copy wild card to a single file."),1); ! } } ! foreach( string file in files ) { ! string dest = (file_size(file2)==-2 ? rmSlash(file2+"/"+ ! explode( file, "/")[<1]) : file2 ); ! ! ! if( file_size( file ) == -2 ) { localdest = 1; ! if( sizeof(files) > 1 ) ! continue; ! else write( "cp: "+file+" is a directory." ); ! } ! else if( file_size(file) < 1 ) { write( "cp: couldn't find "+file ); } ! else if( file == dest ) write( "cp: You cant copy a file on to itself!" ); ! else if( file_size(dest) > 0 && !ow && !sscanf(dest, "%*s.save" )) write( "cp: "+dest+" already exists." ); ! else if( !master()->valid_read( file, this_player(), "cp" ) ) write( file+": Permission denied." ); ! else if( !master()->valid_write( dest, this_player(), "cp" ) ) write( dest+": Permission denied." ); ! else { ! write_file( dest, read_file(file), 1 ); ! write( "Copied: "+file+" to "+dest ); } } return 1; } + int help() { message("help", "Command: cp\nSyntax: cp [pathname]\n" "This command makes a copy of the file using the new name " "and location passed. If a new pathname is not specified " ! "then the copy is put into the present working directory." ! "Optionally, wild cards can be used by employing the * operator.", this_player()); return 1; } /* EOF */ + + diff -c -r --new-file ds2.0r18/lib/secure/cmds/creators/dsversion.c ds2.0r28/lib/secure/cmds/creators/dsversion.c *** ds2.0r18/lib/secure/cmds/creators/dsversion.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/cmds/creators/dsversion.c Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,277 ---- + /* /secure/cmds/creators/dsversion.c + * Created by Brodbane of Eve + * Date Created: 4/1/06 + */ + + #include + #include + #include + #include + + inherit LIB_DAEMON; + + #define HTTP_ADDRESS "149.152.218.102" + #define HTTP_HOST "www.dead-souls.net" + #define HTTP_PORT 80 + #define HTTP_PATH "/RELEASE_NOTES" + #define NOTES_DELIM "----" + + #define SAVE_FILE "/doc/RELEASE_NOTES_HTTP" + + + #define SOCK_FIND 0 + #define SOCK_CONNECTING 1 + #define SOCK_CONNECTED 2 + #define SOCK_DISCONNECTED 3 + #define SOC_ERROR 4 + + //#define _DEBUG + + int socket; + int status; + object player; + object person; + + string results; + + void sendHTTPGet(); + + int http_file_found; + + private string args_list; + + void ProcessHTTPResult() + { + int i = 0; + string * parts; + string * arg_array; + string * temp; + + //player->eventPrint(results); + parts = explode( results, NOTES_DELIM ); + //player->eventPrint( "Size of elements "+sizeof(parts) ); + + //found = regexp( parts, args_list+" +" ); + //player->eventPrint( sizeof( found ) ); + //if( !args_list ){ + //player->eventPrint( parts[0] ); + temp = explode( parts[0], "---" ); + player->eventPrint( "Current Version of "+mud_name()+": " + mudlib_version() ); + player->eventPrint( "Latest Version of Dead Souls: %^RED%^"+trim(temp[0])+ "%^RESET%^" ); + write_file( SAVE_FILE, results, 1 ); + //player->eventPrint( "\nFor complete release notes refer to "+SAVE_FILE ); + //return; + //} + + arg_array = explode( args_list, " " ); + foreach( string str in arg_array ){ + temp = regexp( parts, args_list+" +" ); + if( sizeof( temp ) > 3 ){ + player->eventPrint( "Too many results, truncating..." ); + player->eventPrint( temp[0]+temp[1]+temp[2] ); + } + else{ + foreach( string s in temp ) + { + player->eventPrint( "---- "+s ); + i++; + } + } + } + + + write_file( SAVE_FILE, results, 1 ); + player->eventPrint( "For complete release notes refer to "+SAVE_FILE ); + } + + void read_callback( int fd, mixed message ) + { + if( !http_file_found ){ + if( message[9..11] != "200" ){ + player->eventPrint( "Error, unable to locate page requested." ); + + http_file_found = 3; + } + else + { + //player->eventPrint( message ); Uncomment this to see http header debug + http_file_found = 1; + } + } + else if( http_file_found == 1 ){ + //player->eventPrint( message ); + results += message; + } + else{ + + } + //player->eventPrint( message ); + //results += message; + //player->eventPrint( message ); + //player->eventPrint( "------------------" ); + } + + void write_callback( int fd ) + { + #ifdef _DEBUG + player->eventPrint("Connected!"); + #endif + status = SOCK_CONNECTED; + http_file_found = 0; + sendHTTPGet(); + } + + void close_callback( int fd ) + { + if( status == SOCK_CONNECTED ) + { + // Process HTML here + #ifdef _DEBUG + player->eventPrint("Connection closed by host."); + #endif + ProcessHTTPResult(); + } + if( status == SOCK_CONNECTING ) + { + player->eventPrint("Connection attempt failed."); + } + socket_close( fd ) ; + status = SOCK_DISCONNECTED; + } + + void sendHTTPGet() + { + string str ="GET "+HTTP_PATH+" HTTP/1.0\r\n"+ + "Host: "+HTTP_HOST+"\r\n" + + "User-Agent: "+ player->GetName() + "@" + mud_name() + " " + + mudlib()+ "/" + mudlib_version() +" ("+ query_os_type()+";) "+ + version() + "\r\n\r\n"; + int result = 0; + results = ""; + #ifdef _DEBUG + player->eventPrint("Sending HTTP get request..." ); + #endif + if( status == SOCK_CONNECTED ) + { + result = socket_write( socket, (string)str ); + #ifdef _DEBUG + player->eventPrint( "HTTP request sent to " + socket + " result = "+result ); + #endif + } + } + + int openHTTPConnection() + { + + int sock, sc_result; + string error; + status = SOCK_FIND; + + + status = SOCK_CONNECTING; + sock = socket_create( STREAM, "read_callback", "close_callback" ) ; + if (sock < 0) { + switch( sock ) + { + case EEMODENOTSUPP : + error = "Socket mode not supported.\n" ; + break ; + case EESOCKET : + error = "Problem creating socket.\n" ; + break ; + case EESETSOCKOPT : + error = "Problem with setsockopt.\n" ; + break ; + case EENONBLOCK : + error = "Problem with setting non-blocking mode.\n" ; + break ; + case EENOSOCKS : + error = "No more available efun sockets.\n" ; + break ; + case EESECURITY : + error = "Security violation attempted.\n" ; + break ; + default : + error = "Unknown error code: " + sock + ".\n" ; + break ; + } + notify_fail( "Unable to connect, problem with socket_create.\n" + "Reason: " + error ) ; + return 0 ; + } + #ifdef _DEBUG + write("Attempting to connect to "+HTTP_HOST+ " on port "+ HTTP_PORT + "\n"); + #endif + sc_result = socket_connect( sock, HTTP_ADDRESS + " " + HTTP_PORT, + "read_callback", "write_callback" ) ; + if( sc_result != EESUCCESS ) + { + status = SOCK_DISCONNECTED; + notify_fail( "Failed to connect.\n" ) ; + return 0 ; + } + else{ + #ifdef _DEBUG + player->eventPrint( "Socket connecting..." ); + #endif + } + + socket = sock; + return 1; + } + + void hostResolved( string address, string resolved, int key ) + { + if( !resolved ){ + #ifdef _DEBUG + player->eventPrint( "Unable to resolve "+address ); + #endif + return; + } + #ifdef _DEBUG + player->eventPrint( "Resolved "+address+" to "+ resolved ); + #endif + player->eventPrint( "Retrieving updated release notes from: http://www.dead-souls.net\n" ); + openHTTPConnection(); + } + + void resolveHost() + { + resolve( HTTP_HOST, "hostResolved" ); + } + + + mixed cmd(string args) { + player = previous_object(); + if(args) args_list = args; + else args_list = ""; + //resolveHost(); + openHTTPConnection(); + return 1; + } + + string GetErorMessage() { + return "There was a problem"; + } + + string GetHelp() { + return ("Syntax: dsversion [version]\n\n" + + "Shows the latest version of Dead Souls and release notes.\n"+ + "e.g. dsversion, dsversion r1, dsversion 2.0r1"); + } + + + + + + + + + + + + + + + + diff -c -r --new-file ds2.0r18/lib/secure/cmds/creators/ed.c ds2.0r28/lib/secure/cmds/creators/ed.c *** ds2.0r18/lib/secure/cmds/creators/ed.c Sat Mar 11 11:16:59 2006 --- ds2.0r28/lib/secure/cmds/creators/ed.c Wed Jul 5 00:01:12 2006 *************** *** 18,23 **** --- 18,31 ---- identify(previous_object(-1)), this_player()); return 0; } + + if(!this_player()->GetProperty("EdWarned")){ + write("This is the first time you've used ed. If you get stuck, simply " + "hit return a few times, then enter a dot on a blank line, hit return, " + "then type Q, then enter. Then visit this page to learn more about " + "using the ed editor: http://dead-souls.net/editor.html"); + this_player()->SetProperty("EdWarned", 1); + } args = absolute_path( (string)this_player()->query_cwd(), args ); if( (x = file_size(args)) == -2 ) return "You cannot edit a directory!"; diff -c -r --new-file ds2.0r18/lib/secure/cmds/creators/eval.c ds2.0r28/lib/secure/cmds/creators/eval.c *** ds2.0r18/lib/secure/cmds/creators/eval.c Fri Mar 24 14:38:48 2006 --- ds2.0r28/lib/secure/cmds/creators/eval.c Wed Jul 5 00:01:12 2006 *************** *** 28,33 **** --- 28,34 ---- file = ""+ "#include \n"+ + "#include \n"+ "#include \n"+ "#include \n"+ "#include \n"+ *************** *** 48,63 **** } filename += "CMD_EVAL_TMP_FILE.c"; if(securep(previous_object())) filename = "/secure/tmp/"+previous_object()->GetKeyName()+"_CMD_EVAL_TMP_FILE.c"; // long name so won't coincide with file already in your directory by accident rm( filename ); if( ret = find_object( filename ) ) destruct( ret ); ! write_file( filename, file ); // if( err = catch( ret = (mixed)call_other( filename, "eval" ) ) ) // write( "Error = " + err ); // else ret = (mixed)call_other(filename, "eval"); write( wrap( "Result = " + identify( ret ) ) ); ! rm( filename ); if( ret = find_object( filename ) ) destruct( ret ); // Some muds prefer to change these lines so filename isn't deleted if --- 49,66 ---- } filename += "CMD_EVAL_TMP_FILE.c"; if(securep(previous_object())) filename = "/secure/tmp/"+previous_object()->GetKeyName()+"_CMD_EVAL_TMP_FILE.c"; + //tc("filename: "+filename); + //tc("previous_object: "+identify(previous_object())); // long name so won't coincide with file already in your directory by accident rm( filename ); if( ret = find_object( filename ) ) destruct( ret ); ! write_file( filename, file,1 ); // if( err = catch( ret = (mixed)call_other( filename, "eval" ) ) ) // write( "Error = " + err ); // else ret = (mixed)call_other(filename, "eval"); write( wrap( "Result = " + identify( ret ) ) ); ! //rm( filename ); if( ret = find_object( filename ) ) destruct( ret ); // Some muds prefer to change these lines so filename isn't deleted if diff -c -r --new-file ds2.0r18/lib/secure/cmds/creators/heal.c ds2.0r28/lib/secure/cmds/creators/heal.c *** ds2.0r18/lib/secure/cmds/creators/heal.c Wed Dec 7 14:24:50 2005 --- ds2.0r28/lib/secure/cmds/creators/heal.c Wed Jul 5 00:01:12 2006 *************** *** 18,23 **** --- 18,24 ---- string cmd = args; object who; mapping stumps; + string *limb_arr = ({}); int i, mhp, msp, mmp, self; if( !cmd || cmd == "" ) { *************** *** 50,55 **** --- 51,60 ---- who->AddMagicPoints(mmp); if(who->GetPoison() > 0) who->AddPoison(0 - who->GetPoison()); eventRegenerate(who); + limb_arr = who->GetLimbs(); + foreach(string limb in limb_arr) { + who->HealLimb(limb); + } return 1; } diff -c -r --new-file ds2.0r18/lib/secure/cmds/creators/indent.c ds2.0r28/lib/secure/cmds/creators/indent.c *** ds2.0r18/lib/secure/cmds/creators/indent.c Wed Dec 7 14:24:50 2005 --- ds2.0r28/lib/secure/cmds/creators/indent.c Wed Jul 5 00:01:12 2006 *************** *** 39,44 **** --- 39,45 ---- if(sizeof(paths)) foreach(string path in paths){ //tc("path: "+path); load_object("/secure/cmds/creators/lsed")->cmd(rulefile + " "+ path + "/*.c"); + load_object("/secure/cmds/creators/lsed")->cmd(rulefile + " "+ path + "/*.h"); } } diff -c -r --new-file ds2.0r18/lib/secure/cmds/creators/monitor.c ds2.0r28/lib/secure/cmds/creators/monitor.c *** ds2.0r18/lib/secure/cmds/creators/monitor.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/cmds/creators/monitor.c Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,31 ---- + #include + #include + + inherit LIB_DAEMON; + + int cmd(string str) { + object ob; + + if( !str || str == "" ) { + write("Monitor whom?\n"); + } + else if(!user_exists(str)) + write(str+": no such player.\n"); + else{ + SNOOP_D->AddMonitor(this_player()->GetKeyName(), str); + write("The snoop daemon has received your request."); + } + return 1; + } + + int help() + { + write( @EndText + Syntax: monitor + Effect: Logs to a file everything sees or types. + To stop monitoring, an admin must type "unmonitor " + See also: unmonitor, snoop, unsnoop + EndText + ); + return 1; + } diff -c -r --new-file ds2.0r18/lib/secure/cmds/creators/mv.c ds2.0r28/lib/secure/cmds/creators/mv.c *** ds2.0r18/lib/secure/cmds/creators/mv.c Mon Nov 7 13:32:17 2005 --- ds2.0r28/lib/secure/cmds/creators/mv.c Wed Jul 5 00:01:12 2006 *************** *** 23,35 **** /* We should add checks for flags here. */ return help(); } else { ! #if 0 if(file_size(t2=absolute_path((string)this_player()->query_cwd(),t2)) > 0) { notify_fail("mv: "+t2+" already exists.\n"); return 0; } ! #endif t2=absolute_path((string)this_player()->query_cwd(),t2); rename(t1=absolute_path(this_player()->query_cwd(),t1),t2); if(file_size(t2) == -2) { --- 23,35 ---- /* We should add checks for flags here. */ return help(); } else { ! //#if 0 if(file_size(t2=absolute_path((string)this_player()->query_cwd(),t2)) > 0) { notify_fail("mv: "+t2+" already exists.\n"); return 0; } ! //#endif t2=absolute_path((string)this_player()->query_cwd(),t2); rename(t1=absolute_path(this_player()->query_cwd(),t1),t2); if(file_size(t2) == -2) { diff -c -r --new-file ds2.0r18/lib/secure/cmds/creators/snoop.c ds2.0r28/lib/secure/cmds/creators/snoop.c *** ds2.0r18/lib/secure/cmds/creators/snoop.c Mon Nov 7 13:32:17 2005 --- ds2.0r28/lib/secure/cmds/creators/snoop.c Wed Jul 5 00:01:12 2006 *************** *** 5,10 **** --- 5,11 ---- */ #include + #include inherit LIB_DAEMON; *************** *** 12,26 **** object ob; if( !str || str == "" ) { ! if(snoop(this_player())) ! write("Ok.\n"); ! else write("Couldn't stop snoop\n"); } else if(!(ob=find_player(str=lower_case(str)))) write(str+": no such player.\n"); else ! write(snoop(this_player(), ob)?"Now snooping.\n":str+": snoop failed.\n"); ! return 1; } --- 13,29 ---- object ob; if( !str || str == "" ) { ! write("Snoop whom?\n"); ! } ! else if(str == this_player()->GetKeyName()){ ! write("That would be very foolish."); ! return 1; } else if(!(ob=find_player(str=lower_case(str)))) write(str+": no such player.\n"); else ! SNOOP_D->AddWatcher(this_player()->GetKeyName(), str); ! write("The snoop daemon has received your request."); return 1; } *************** *** 28,36 **** { write( @EndText Syntax: snoop ! Effect: Echos to your screen everything sees or types. ! To stop snooping, type just "snoop" ! See also: snoopable EndText ); return 1; --- 31,39 ---- { write( @EndText Syntax: snoop ! Effect: Echoes to your screen everything sees or types. ! To stop snooping, type just "unsnoop " ! See also: unsnoop, monitor, unmonitor EndText ); return 1; diff -c -r --new-file ds2.0r18/lib/secure/cmds/creators/unsnoop.c ds2.0r28/lib/secure/cmds/creators/unsnoop.c *** ds2.0r18/lib/secure/cmds/creators/unsnoop.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/cmds/creators/unsnoop.c Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,29 ---- + #include + #include + + inherit LIB_DAEMON; + + int cmd(string str) { + object ob; + + if( !str || str == "" ) { + write("Unsnoop whom?\n"); + } + else if(!(ob=find_player(str=lower_case(str)))) + write(str+": no such player.\n"); + else + SNOOP_D->RemoveWatcher(this_player()->GetKeyName(), str); + write("The snoop daemon has received your request."); + return 1; + } + + int help() + { + write( @EndText + Syntax: unsnoop + Effect: Stops snooping the specified user. + See also: snoop, monitor, unmonitor + EndText + ); + return 1; + } diff -c -r --new-file ds2.0r18/lib/secure/cmds/players/peer.c ds2.0r28/lib/secure/cmds/players/peer.c *** ds2.0r18/lib/secure/cmds/players/peer.c Sat Mar 11 11:16:59 2006 --- ds2.0r28/lib/secure/cmds/players/peer.c Wed Jul 5 00:01:12 2006 *************** *** 16,21 **** --- 16,33 ---- object env, *livings, *items; if( !sizeof(str) ) return "Syntax: peer "; + switch(str){ + case "n" : str = "north";break; + case "ne" : str = "northeast";break; + case "nw" : str = "northwest";break; + case "s" : str = "south";break; + case "se" : str = "southeast";break; + case "sw" : str = "southwest";break; + case "e" : str = "east";break; + case "w" : str = "west";break; + case "u" : str = "up";break; + case "d" : str = "down";break; + } env = environment(this_player()); if( !file = (string)env->GetExit(str) ) file = (string)env->GetEnter(str); if( !sizeof(file) ) diff -c -r --new-file ds2.0r18/lib/secure/cmds/players/suicide.c ds2.0r28/lib/secure/cmds/players/suicide.c *** ds2.0r18/lib/secure/cmds/players/suicide.c Sun Dec 18 01:59:08 2005 --- ds2.0r28/lib/secure/cmds/players/suicide.c Wed Jul 5 00:01:12 2006 *************** *** 8,13 **** --- 8,14 ---- #include #include #include + #include #include #include *************** *** 84,89 **** --- 85,92 ---- string tmp, file, newfile; object *ob; + if(!directory_exists(DIR_TMP + "/suicide/")) mkdir (DIR_TMP + "/suicide/"); + file = DIR_TMP + "/" + who; newfile = DIR_TMP + "/suicide/" + who; if( file_size(file) > 0 ) { *************** *** 106,111 **** --- 109,115 ---- if( sizeof( ob = filter(users(), (: archp :)) ) ) ob->eventPrint("["+(string)this_player()->GetName()+" has " "comitted suicide]"); + PLAYERS_D->RemoveUser((string)this_player()->GetKeyName()); this_player()->eventMove(ROOM_FURNACE); this_player()->eventDestruct(); return; diff -c -r --new-file ds2.0r18/lib/secure/cmds/players/tell.c ds2.0r28/lib/secure/cmds/players/tell.c *** ds2.0r18/lib/secure/cmds/players/tell.c Sat Mar 11 11:16:59 2006 --- ds2.0r28/lib/secure/cmds/players/tell.c Wed Jul 5 00:01:12 2006 *************** *** 15,24 **** mixed mud; object ob, machine; int i, maxi; ! string who, msg, tmp, machine_message; if(!str) return notify_fail("Syntax: \n"); ! if(this_player()->GetMagicPoints() < 15) { write("You lack sufficient magic to tell to anyone right now."); return 1; } --- 15,24 ---- mixed mud; object ob, machine; int i, maxi; ! string who, msg, tmp, tmp2, machine_message; if(!str) return notify_fail("Syntax: \n"); ! if(!creatorp(this_player()) && this_player()->GetMagicPoints() < 15) { write("You lack sufficient magic to tell to anyone right now."); return 1; } *************** *** 29,36 **** maxi = sizeof(words = explode(words[1], " ")); for(i=0; iGetMudName(tmp) ) { mud = tmp; if(i+1 < maxi) msg = implode(words[i+1..maxi-1], " "); else msg = ""; --- 29,38 ---- maxi = sizeof(words = explode(words[1], " ")); for(i=0; iGetMudName(tmp) ! && !((string)INTERMUD_D->GetMudName(tmp2)) ) { mud = tmp; if(i+1 < maxi) msg = implode(words[i+1..maxi-1], " "); else msg = ""; *************** *** 58,64 **** if(msg == "") return notify_fail("What do you wish to tell?\n"); } else { ! this_player()->AddMagicPoints(-15); SERVICES_D->eventSendTell(who, mud, msg); return 1; } --- 60,66 ---- if(msg == "") return notify_fail("What do you wish to tell?\n"); } else { ! if(!creatorp(this_player())) this_player()->AddMagicPoints(-15); SERVICES_D->eventSendTell(who, mud, msg); return 1; } diff -c -r --new-file ds2.0r18/lib/secure/daemon/autoexec.c ds2.0r28/lib/secure/daemon/autoexec.c *** ds2.0r18/lib/secure/daemon/autoexec.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/autoexec.c Wed Jul 5 00:01:05 2006 *************** *** 0 **** --- 1,23 ---- + #include + #include + + inherit LIB_DAEMON; + + int hasrun = 0; + + static void eventRun() { + load_object("/secure/cmds/creators/update")->cmd("-r /lib/creator"); + if(RESET_INTERMUD){ + rm("/save/intermud.o"); + update("/daemon/intermud"); + } + load_object("/secure/cmds/creators/dsversion")->cmd(); + } + + static void create() { + daemon::create(); + if(hasrun) return; + call_out((: eventRun :), 10); + hasrun = 1; + } + diff -c -r --new-file ds2.0r18/lib/secure/daemon/bboard.c ds2.0r28/lib/secure/daemon/bboard.c *** ds2.0r18/lib/secure/daemon/bboard.c Mon Jan 16 23:03:39 2006 --- ds2.0r28/lib/secure/daemon/bboard.c Wed Jul 5 19:58:20 2006 *************** *** 49,56 **** static private int valid_access() { string str; ! ! if(__Owner == PRIV_SECURE && !((int)master()->valid_access(({})))) return 0; str = query_privs(previous_object(0)); if(member_array(PRIV_SECURE, explode(str, ":")) != -1) return 1; --- 49,56 ---- static private int valid_access() { string str; ! if(this_player() && archp(this_player())) true(); ! else if(__Owner == PRIV_SECURE && !((int)master()->valid_apply(({})))) return 0; str = query_privs(previous_object(0)); if(member_array(PRIV_SECURE, explode(str, ":")) != -1) return 1; diff -c -r --new-file ds2.0r18/lib/secure/daemon/chat.c ds2.0r28/lib/secure/daemon/chat.c *** ds2.0r18/lib/secure/daemon/chat.c Fri Mar 24 14:39:55 2006 --- ds2.0r28/lib/secure/daemon/chat.c Wed Jul 5 00:01:05 2006 *************** *** 14,29 **** inherit LIB_DAEMON; ! string plainmsg,chan,foo,bar,baz; static private mapping Channels; static private mapping chanlast; ! static private string *local_chans = ({"newbie","cre","gossip","admin"}); static void create() { object pl; ! daemon::create(); SetNoClean(1); Channels = ([]); --- 14,30 ---- inherit LIB_DAEMON; ! string suspect,site,plainmsg,chan,foo,bar,baz; static private mapping Channels; static private mapping chanlast; ! static private string *local_chans = ({"newbie","cre","gossip","admin","error", ! "priest", "mage", "explorer", "thief", "fighter", "death" }); static void create() { object pl; ! string *tmp_arr = ({}); daemon::create(); SetNoClean(1); Channels = ([]); *************** *** 37,42 **** --- 38,48 ---- Channels[channel] = distinct_array(Channels[channel] + ({ pl })); } } + foreach( string channel in local_chans ){ + tmp_arr += ({ channel + "emote" }); + } + + local_chans += tmp_arr; } varargs int CanListen(object who, string canal){ *************** *** 89,98 **** return chans; } ! int cmdLast(string feep) ! { ! if(!chanlast||!Channels[feep]||member_array(this_player(), Channels[feep])==-1) ! { this_player()->eventPrint(mud_name() + " does not have that channel on record.", MSG_ERROR); return 1; } --- 95,104 ---- return chans; } ! int cmdLast(string feep){ ! ! if(!chanlast||!Channels[feep]||member_array(this_player(), Channels[feep])==-1){ ! this_player()->eventPrint(mud_name() + " does not have that channel on record.", MSG_ERROR); return 1; } *************** *** 101,106 **** --- 107,116 ---- this_player()->eventPrint("That channel has no backlog.", MSG_ERROR); return 1; } + if(!CanListen(this_player(),feep)){ + write("You lack privileges to that channel."); + return 1; + } this_player()->eventPrint(implode(chanlast[feep], "\n")); return 1; } *************** *** 123,129 **** if(pchan && pchan != "admin"){ unguarded( (: write_file("/log/chan/"+chan,"["+timestamp()+"] "+plainmsg+"\n") :) ); if( file_size("/log/chan/"+chan) > 200000) { ! unguarded( (: rename("/log/chan/"+chan,"/log/chan/"+chan+"."+timestamp("est") ) :) ); } } else { --- 133,139 ---- if(pchan && pchan != "admin"){ unguarded( (: write_file("/log/chan/"+chan,"["+timestamp()+"] "+plainmsg+"\n") :) ); if( file_size("/log/chan/"+chan) > 200000) { ! unguarded( (: rename("/log/chan/"+chan,"/log/chan/"+chan+"."+timestamp() ) :) ); } } else { *************** *** 140,154 **** object ob = 0; int emote; if(grepp(verb, "emote")) varb = replace_string(verb,"emote",""); ! else if(grepp(verb, ":")) varb = replace_string(verb,":",""); else varb = verb; - if(!CanTalk(this_player(),varb)){ - write("You lack privileges to that channel."); - return 1; - } - if( verb == "hist" ) { if( !Channels[str] ) return 0; if( member_array(this_player(), Channels[str]) == -1 ) return 0; --- 150,164 ---- object ob = 0; int emote; + if(first(str,1) == ":" && sizeof(str) > 3){ + if(!grepp(verb,"emote")) verb += "emote"; + str = trim(replace_string(str,":","",1)); + } + if(grepp(verb, "emote")) varb = replace_string(verb,"emote",""); ! else if(last(verb, 1) == ":") varb = replace_string(verb,":",""); else varb = verb; if( verb == "hist" ) { if( !Channels[str] ) return 0; if( member_array(this_player(), Channels[str]) == -1 ) return 0; *************** *** 160,196 **** string *who; string ch, mud; ! if( !str ) return 0; if( sscanf(str, "%s@%s", ch, mud) == 2 ) { mud = trim(mud); if(!alphap(last(mud,1))) mud = truncate(mud,1); ! if( !Channels[ch] ) return 0; ! if( member_array(this_player(), Channels[ch]) == -1 ) return 0; ! if( ch == (ch = GetRemoteChannel(ch)) ) return 0; if( !(mud = (string)INTERMUD_D->GetMudName(mud)) ) { this_player()->eventPrint(mud_name() + " is not aware of " "such a place.", MSG_ERROR); return 1; } SERVICES_D->eventSendChannelWhoRequest(ch, mud); this_player()->eventPrint("Remote listing request sent.", MSG_SYSTEM); return 1; } else ch = str; ! if( !Channels[ch] ) return 0; ! if( member_array(this_player(), Channels[str]) == -1 ) return 0; who = GetChannelList(str); msg = "Online: " + implode(who, " "); //tc("msg1"); this_player()->eventPrint(msg, MSG_SYSTEM); return 1; } if( !Channels[verb] ) { if( sscanf(verb, "%semote", verb) || sscanf(verb, "%s:", verb) ) { string emote_cmd, remains; mixed array msg_data; int i; if( !Channels[verb] ) { return 0; } --- 170,231 ---- string *who; string ch, mud; ! if( !str ) { ! return 0; ! } if( sscanf(str, "%s@%s", ch, mud) == 2 ) { mud = trim(mud); if(!alphap(last(mud,1))) mud = truncate(mud,1); ! if( !Channels[ch] ) { ! return 0; ! } ! if( member_array(this_player(), Channels[ch]) == -1 ) { ! return 0; ! } ! if( ch == (ch = GetRemoteChannel(ch)) ) { ! if(!creatorp(this_player())){ ! write("Remote channel information is not available to players."); ! return 1; ! } ! } if( !(mud = (string)INTERMUD_D->GetMudName(mud)) ) { this_player()->eventPrint(mud_name() + " is not aware of " "such a place.", MSG_ERROR); return 1; } + if(!CanTalk(this_player(),verb)){ + write("You lack privileges to that channel."); + return 1; + } SERVICES_D->eventSendChannelWhoRequest(ch, mud); this_player()->eventPrint("Remote listing request sent.", MSG_SYSTEM); return 1; } else ch = str; ! if( !Channels[ch] ) { ! return 0; ! } ! if( member_array(this_player(), Channels[str]) == -1 ) { ! return 0; ! } who = GetChannelList(str); msg = "Online: " + implode(who, " "); //tc("msg1"); this_player()->eventPrint(msg, MSG_SYSTEM); return 1; } + if(!CanTalk(this_player(),verb)){ + write("You lack privileges to that channel."); + return 1; + } + if( !Channels[verb] ) { if( sscanf(verb, "%semote", verb) || sscanf(verb, "%s:", verb) ) { string emote_cmd, remains; mixed array msg_data; int i; + //tc("we seem to think it's an emote"); if( !Channels[verb] ) { return 0; } *************** *** 360,381 **** if(!grepp(str,"$N") && emote) str = "$N "+str; eventSendChannel(name, verb, str, emote, target, target_msg); ! if( rc != verb ) { ! if( ob ) { ! SERVICES_D->eventSendChannel(name, rc, str, emote, target, ! target_msg); ! } ! else { ! SERVICES_D->eventSendChannel(name, rc, str, emote, targetkey, ! target_msg); ! } } return 1; } varargs void eventSendChannel(string who, string ch, string msg, int emote, string target, string targmsg) { ! string pchan,pmsg,pwho; pchan=ch; if( file_name(previous_object()) == SERVICES_D) { --- 395,414 ---- if(!grepp(str,"$N") && emote) str = "$N "+str; eventSendChannel(name, verb, str, emote, target, target_msg); ! if( ob ) { ! SERVICES_D->eventSendChannel(name, rc, str, emote, target, ! target_msg); ! } ! else { ! SERVICES_D->eventSendChannel(name, rc, str, emote, targetkey, ! target_msg); } return 1; } varargs void eventSendChannel(string who, string ch, string msg, int emote, string target, string targmsg) { ! string pchan,pmsg; pchan=ch; if( file_name(previous_object()) == SERVICES_D) { *************** *** 409,414 **** --- 442,450 ---- case "intercre": this_msg = "%^YELLOW%^"; break; + case "ds": + this_msg = "%^YELLOW%^"; + break; case "newbie": this_msg = "%^B_YELLOW%^"; break; *************** *** 418,424 **** default: this_msg = "%^BLUE%^"; } - this_msg += "<" + ch + ">%^RESET%^ "; msg = replace_string(msg, "$N", who); if( target ) { --- 454,459 ---- *************** *** 432,444 **** eventAddLast(ch, tmp, pchan, msg); foreach(object listener in obs) { int ignore; if( listener == ob ) continue; foreach(string jerk in listener->GetMuffed()){ ! //tc("tmp: "+tmp); ! //tc("pchan: "+pchan); //tc("msg: "+msg); ! sscanf(tmp,"%s %s %s", foo, bar, baz); ! if(jerk && grepp(lower_case(bar),lower_case(jerk))) ignore = 1; } //tc("msg2","red"); if(!ignore && CanListen(listener,ch)) listener->eventPrint(tmp, MSG_CONV); --- 467,487 ---- eventAddLast(ch, tmp, pchan, msg); foreach(object listener in obs) { int ignore; + if(sscanf(who,"%s@%s",suspect,site) < 2) { + suspect = who; + site = "@"+mud_name(); + } + else site = "@"+site; if( listener == ob ) continue; foreach(string jerk in listener->GetMuffed()){ ! //tc("suspect: "+suspect); ! //tc("site: "+site); ! //tc("jerk: "+jerk); //tc("msg: "+msg); ! //sscanf(tmp,"%s %s %s", foo, bar, baz); ! //if(jerk && grepp(lower_case(bar),lower_case(jerk))) ignore = 1; ! if(jerk && lower_case(suspect) == lower_case(jerk)) ignore = 1; ! if(jerk && lower_case(site) == lower_case(jerk)) ignore = 1; } //tc("msg2","red"); if(!ignore && CanListen(listener,ch)) listener->eventPrint(tmp, MSG_CONV); *************** *** 449,461 **** int ignore; tmp = this_msg + targmsg; foreach(string jerk in ob->GetMuffed()){ ! if(jerk && grepp(lower_case(tmp),lower_case(jerk))) ignore = 1; } //tc("msg3","green"); if(!ignore && CanListen(ob,ch)) ob->eventPrint(tmp, MSG_CONV); ignore = 0; } } } else { object *obs; --- 492,507 ---- int ignore; tmp = this_msg + targmsg; foreach(string jerk in ob->GetMuffed()){ ! if(jerk && lower_case(suspect) == lower_case(jerk)) ignore = 1; ! if(jerk && lower_case(site) == lower_case(jerk)) ignore = 1; } //tc("msg3","green"); if(!ignore && CanListen(ob,ch)) ob->eventPrint(tmp, MSG_CONV); ignore = 0; } } + suspect = ""; + site = ""; } else { object *obs; *************** *** 479,484 **** --- 525,533 ---- case "intercre": tmsg += "%^YELLOW%^"; break; + case "ds": + tmsg += "%^YELLOW%^"; + break; case "newbie": tmsg += "%^B_YELLOW%^"; break; *************** *** 491,509 **** tmsg += "<"+ch+">%^RESET%^ " + msg; pmsg = msg; - pwho = who; msg = tmsg; //ch = GetLocalChannel(ch); ! eventAddLast(ch, msg, pchan, pmsg, pwho); obs = filter(Channels[ch], (: $1 && !((int)$1->GetBlocked($(ch))) :)); foreach(object ob in obs){ int ignore; foreach(string jerk in ob->GetMuffed()){ ! if(jerk && grepp(lower_case(msg),lower_case(jerk))) ignore = 1; } //tc("msg4","blue"); if(!ignore && CanListen(ob,ch)) ob->eventPrint(msg, MSG_CONV); ignore = 0; } } --- 540,570 ---- tmsg += "<"+ch+">%^RESET%^ " + msg; pmsg = msg; msg = tmsg; //ch = GetLocalChannel(ch); ! eventAddLast(ch, msg, pchan, pmsg, who); obs = filter(Channels[ch], (: $1 && !((int)$1->GetBlocked($(ch))) :)); foreach(object ob in obs){ int ignore; + if(sscanf(who,"%s@%s",suspect,site) < 2) { + suspect = who; + site = "@"+mud_name(); + } + else site = "@"+site; + foreach(string jerk in ob->GetMuffed()){ ! //if(jerk) tc("jerk: "+jerk,"red"); ! if(jerk && lower_case(suspect) == lower_case(jerk)) ignore = 1; ! if(jerk && lower_case(site) == lower_case(jerk)) ignore = 1; } //tc("msg4","blue"); + //tc("who: "+who); + //tc("suspect: "+suspect); + //tc("site: "+site); if(!ignore && CanListen(ob,ch)) ob->eventPrint(msg, MSG_CONV); ignore = 0; + suspect =""; + site = ""; } } diff -c -r --new-file ds2.0r18/lib/secure/daemon/finger.c ds2.0r28/lib/secure/daemon/finger.c *** ds2.0r18/lib/secure/daemon/finger.c Mon Jan 16 23:04:22 2006 --- ds2.0r28/lib/secure/daemon/finger.c Wed Jul 5 00:01:05 2006 *************** *** 17,23 **** private int LoginTime, Level, BirthTime, CreatorBirth, WhereBlock; private string CurrentUser, Short, CapName, RealName, Email; private string Town, Race, Gender, HostSite; ! private string Class, Guild, Long; private string Rank, WebPage; private string array Titles, Religion; private class marriage array Marriages; --- 17,23 ---- private int LoginTime, Level, BirthTime, CreatorBirth, WhereBlock; private string CurrentUser, Short, CapName, RealName, Email; private string Town, Race, Gender, HostSite; ! private string Class, Clan, Long; private string Rank, WebPage; private string array Titles, Religion; private class marriage array Marriages; *************** *** 100,106 **** int yr; ret += CapName+" the "+Gender+" "+Race+" "+(Class || "drifter"); ! if( Guild ) ret += " of the " + pluralize(Guild); if( creatorp(this_player()) && Level ) ret += " ("+Level+")"; ret += " is a " + Rank+" of " + Town + ".%^BR%^\n"; BirthTime = BirthTime - (18 * YEAR); --- 100,106 ---- int yr; ret += CapName+" the "+Gender+" "+Race+" "+(Class || "drifter"); ! if( Clan ) ret += " of the " + pluralize(Clan); if( creatorp(this_player()) && Level ) ret += " ("+Level+")"; ret += " is a " + Rank+" of " + Town + ".%^BR%^\n"; BirthTime = BirthTime - (18 * YEAR); diff -c -r --new-file ds2.0r18/lib/secure/daemon/folders.c ds2.0r28/lib/secure/daemon/folders.c *** ds2.0r18/lib/secure/daemon/folders.c Mon Nov 7 13:32:07 2005 --- ds2.0r28/lib/secure/daemon/folders.c Wed Jul 5 00:01:05 2006 *************** *** 85,91 **** if(folder != "new") return; if((pl=find_player(who)) && (int)OPTIONS_D->query_option(who, "notify")) { msg = (string)OPTIONS_D->query_option(who, "message"); ! if( !stringp(msg) ) msg = "New mail from $N!!!\n"; msg = replace_string(replace_string(msg, "$S", borg["subject"]), "$N", capitalize(borg["from"])); message("system", msg, pl); --- 85,91 ---- if(folder != "new") return; if((pl=find_player(who)) && (int)OPTIONS_D->query_option(who, "notify")) { msg = (string)OPTIONS_D->query_option(who, "message"); ! if( !stringp(msg) ) msg = "New mail from $N!\n"; msg = replace_string(replace_string(msg, "$S", borg["subject"]), "$N", capitalize(borg["from"])); message("system", msg, pl); diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/broadcast_chanlist.h ds2.0r28/lib/secure/daemon/i3router/broadcast_chanlist.h *** ds2.0r18/lib/secure/daemon/i3router/broadcast_chanlist.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/broadcast_chanlist.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,31 ---- + // This file written completely by Tim Johnson (Tim@TimMUD) + + // broadcast the chanlist-reply when a channel just now got changed... + static void broadcast_chanlist(string channame){ + string name; // channel name in first loop, then mud name in later loop + #ifdef SEND_WHOLE_CHANLIST + mapping out=([]); // only used if whole chanlist is sent + trr("broadcasting chanlist to let them know about "+channame); + foreach(name in keys(channel_updates)){ + if(!channels[channame]) + out[name]=0; + else + out[name]=({ channels[name][1], channels[name][0] }); + } + #else + if(!channels[channame]) + out = ([ channame:0 ]); + else + out = ([ channame:({ channels[channame][1], channels[channame][0] }) ]); + #endif + foreach(name in keys(connected_muds)){ + trr("inside loop with "+name); + if(member_array("channel", keys(mudinfo[name]["services"]))!=-1){ + // only tell muds that have the "channel" service... + write_data(connected_muds[name], ({ + "chanlist-reply",5,router_name,0,name,0,channel_update_counter,out + })); + } + trr("done with: "+name); + } + } diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/broadcast_mudlist.h ds2.0r28/lib/secure/daemon/i3router/broadcast_mudlist.h *** ds2.0r18/lib/secure/daemon/i3router/broadcast_mudlist.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/broadcast_mudlist.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,66 ---- + // This file written completely by Tim Johnson (Tim@TimMUD) + + // broadcast the mudlist when a mud just now got changed... + void broadcast_mudlist(string mudname){ + string targ_mudname; + mixed *packet1; // for muds that use protocol 1 or 2 + mixed *packet3; // for muds that use protocol 3 + trr("broadcasting mudlist to let them know about "+mudname,"red"); + packet1 = ({ "mudlist", 5, router_name, 0, "dummy", 0, mudinfo_update_counter,([ + mudname:({ + connected_muds[mudname] ? -1 : 0, + // -1=up, 0=down, n=down for n secs + mudinfo[mudname]["ip"], // ip_addr + mudinfo[mudname]["player_port"], // player_port + mudinfo[mudname]["imud_tcp_port"], // imud_tcp_port + mudinfo[mudname]["imud_udp_port"], // imud_udp_port + mudinfo[mudname]["mudlib"], // mudlib + mudinfo[mudname]["base_mudlib"], // base_mudlib + mudinfo[mudname]["driver"], // driver + mudinfo[mudname]["mud_type"], // mud_type + mudinfo[mudname]["open_status"], // open_status + mudinfo[mudname]["services"], // services + }) + ]) }); + packet3 = ({ "mudlist", 5, router_name, 0, "dummy", 0, mudinfo_update_counter,([ + mudname:({ + (connected_muds[mudname] ? -1 : 0), + // -1=up, 0=down, n=down for n secs + mudinfo[mudname]["ip"], // ip_addr + mudinfo[mudname]["player_port"], // player_port + mudinfo[mudname]["imud_tcp_port"], // imud_tcp_port + mudinfo[mudname]["imud_udp_port"], // imud_udp_port + mudinfo[mudname]["mudlib"], // mudlib + mudinfo[mudname]["base_mudlib"], // base_mudlib + mudinfo[mudname]["driver"], // driver + mudinfo[mudname]["mud_type"], // mud_type + mudinfo[mudname]["open_status"], // open_status + mudinfo[mudname]["admin_email"], // admin_email + mudinfo[mudname]["services"], // services + mudinfo[mudname]["other_data"], // other_data + }) + ]) }); + if(!mudinfo[mudname]){ // deleted mud... + // just send a 0 to everyone + foreach(targ_mudname in keys(connected_muds)){ + write_data(connected_muds[targ_mudname], ({ + "mudlist", 5, router_name, 0, targ_mudname, + 0, mudinfo_update_counter, ([mudname:0]) + }) ); + } + return; + } + foreach(targ_mudname in keys(connected_muds)){ + switch(mudinfo[targ_mudname]["protocol"]){ + case 1: + case 2: + packet1[4]=targ_mudname; + write_data(connected_muds[targ_mudname], packet1); + break; + case 3: + packet3[4]=targ_mudname; + write_data(connected_muds[targ_mudname], packet3); + break; + } + } + } diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/core_stuff.h ds2.0r28/lib/secure/daemon/i3router/core_stuff.h *** ds2.0r18/lib/secure/daemon/i3router/core_stuff.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/core_stuff.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,74 ---- + // This file written completely by Tim Johnson (Tim@TimMUD) + #include + #include + + static void create(){ + SetNoClean(1); + sockets = ([]); + connected_muds = ([]); + if(!mudinfo) mudinfo = ([]); + if(!mudinfo_updates) mudinfo_updates = ([]); + if(!mudinfo_update_counter) mudinfo_update_counter = 1; + if(!listening) listening = ([]); + if(!channels) channels = ([]); + if(!channel_updates) channel_updates = ([]); + if(!channel_update_counter) channel_update_counter = 1; + if(!router_name) router_name = "*crossing"; + router_list = ({ ({"*crossing", "192.168.0.5 9000"}) }); + log_file("server", "Created when uptime = " + uptime() + "\n"); + trr("server got created"); + log_file("i3router",timestamp()+" router object created."); + call_out("setup", 5); + call_out("LocalHostedChans", 15); + set_heart_beat(10); + } + + void heart_beat(){ + trr("BING!","white"); + this_object()->clear_discs(); + } + + + static void setup(){ + trr("setup got called"); + if( file_size( SAVE_ROUTER __SAVE_EXTENSION__ ) > 0 ) + unguarded( (: restore_object, SAVE_ROUTER, 1 :) ); + if ((router_socket = socket_create(MUD, "read_callback", "close_callback")) < 0){ + log_file("server", "setup: Failed to create socket.\n"); + trr("setup: Failed to create socket.\n"); + return; + } + if (socket_bind(router_socket, MYSERVER) < 0) { + socket_close(router_socket); + log_file("server", "setup: Failed to bind socket to port.\n"); + trr("setup: Failed to bind socket to port.\n"); + return; + } + if (socket_listen(router_socket, "listen_callback") < 0) { + socket_close(router_socket); + log_file("server", "setup: Failed to listen to socket.\n"); + trr("setup: Failed to listen to socket.\n"); + } + trr("setup ended"); + } + + void remove(){ + string mudname; + log_file("server", "Being removed by: "+identify(previous_object())+"\n"); + trr("Being removed by: "+identify(previous_object())+"\n","red"); + log_file("server", "sockets:"+identify(sockets)+"\n"); + trr("sockets:"+identify(sockets)+"\n"); + log_file("server", "Starting to destruct at uptime = " + uptime() + "\n"); + trr("Starting to destruct at uptime = " + uptime() + "\n"); + mudinfo_update_counter++; // just increment once... all the connected muds + // getting simultaneously disconnected is okay to count as one change :) + foreach(mudname in keys(connected_muds)){ + mudinfo_updates[mudname]; + mudinfo[mudname]["disconnect_time"]=time(); + map_delete(connected_muds,mudname); // unneeded: connected_muds isn't saved anyway + } + log_file("server", "Successfully destructed when uptime = " + uptime() + "\n"); + trr("Successfully destructed when uptime = " + uptime() + "\n"); + destruct(this_object()); + } + int query_prevent_shadow(object ob){ return 1; } diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/debug.h ds2.0r28/lib/secure/daemon/i3router/debug.h *** ds2.0r18/lib/secure/daemon/i3router/debug.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/debug.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,24 ---- + // This file written completely by Tim Johnson (Tim@TimMUD) + + varargs void Debug(string str, int level){ + if(find_player(DEBUGGER_GUY)) + switch(level){ + case DEB_IN: + message("trr", "%^BOLD%^%^WHITE%^SERVER INCOMING: %^MAGENTA%^"+str+"%^RESET%^\n", + find_player(DEBUGGER_GUY)); + break; + case DEB_OUT: + message("trr", "%^BOLD%^%^WHITE%^SERVER OUTGOING: %^CYAN%^"+str+"%^RESET%^\n", + find_player(DEBUGGER_GUY)); + break; + case DEB_INVALID: + message("trr", "%^BOLD%^%^WHITE%^SERVER THINKS THIS IS INVALID: %^RED%^"+str+"%^RESET%^\n", + find_player(DEBUGGER_GUY)); + break; + case DEB_OTHER: + default: + message("trr", "%^BOLD%^%^WHITE%^SERVER INFO: %^GREEN%^"+str+"%^RESET%^\n", + find_player(DEBUGGER_GUY)); + break; + } + } diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/funcs.h ds2.0r28/lib/secure/daemon/i3router/funcs.h *** ds2.0r18/lib/secure/daemon/i3router/funcs.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/funcs.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,10 ---- + // This file written completely by Tim Johnson (Tim@TimMUD) + + static mapping muds_on_this_fd(int fd){ + return filter_mapping(connected_muds,"value_equals",this_object(),fd); + } + int value_equals(string a,int b, int c){ return b==c; } + static mapping muds_not_on_this_fd(int fd){ + return filter_mapping(connected_muds,"value_equals",this_object(),fd); + } + int value_not_equals(string a,int b, int c){ return b!=c; } diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/hosted_channels.h ds2.0r28/lib/secure/daemon/i3router/hosted_channels.h *** ds2.0r18/lib/secure/daemon/i3router/hosted_channels.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/hosted_channels.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,27 ---- + int LocalHostedChans(){ + process_channel(1, ({ "channel-add", 5, + mud_name(), "cratylus", + "yatmim", 0, "dead_souls", 0 }) ); + + process_channel(1, ({ "channel-add", 5, + mud_name(), "cratylus", + "yatmim", 0, "dead_test4", 0 }) ); + + //process_channel(1, ({ "channel-add", 5, + //mud_name(), "cratylus", + //"yatmim", 0, "dead_test5", 0 }) ); + + process_channel(1, ({ "channel-add", 5, + mud_name(), "cratylus", + "yatmim", 0, "imud_gossip", 0 }) ); + + process_channel(1, ({ "channel-add", 5, + mud_name(), "cratylus", + "yatmim", 0, "imud_code", 0 }) ); + + process_channel(1, ({ "channel-add", 5, + "LPUni Outpost", "tacitus", + "yatmim", 0, "lpuni", 0 }) ); + + return 1; + } diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/process_channel.h ds2.0r28/lib/secure/daemon/i3router/process_channel.h *** ds2.0r18/lib/secure/daemon/i3router/process_channel.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/process_channel.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,240 ---- + // This file written completely by Tim Johnson (Tim@TimMUD) + #include + + static void process_channel(int fd, mixed *info){ + string mudname; + trr("extra stuff is ["+info[0][8..]+"]"); + switch(info[0][8..]){ // what is after the "channel-" + case "m": // message + case "e": // emote + case "t": // targetted emote + trr("they want to do a message..."); + // (drop-through from m/e is intentional) + // Probably should check if the target is 0@0 like it should be, + // and give a warning if it's not... I don't carethough, I'll just + // ignore the target and save some CPU. + // Check if string parts are strings... + if(info[0][8..]=="t"){ + if(sizeof(info)!=13 || !stringp(info[9]) || !stringp(info[10]) || + !stringp(info[11]) || !stringp(info[12])){ + send_error(info[2],info[3],"bad-pkt","Bad packet format.",info); + return; + } + } + else{ // m, e + if(sizeof(info)!=9){ + send_error(info[2],info[3],"bad-pkt","Bad packet format.",info); + return; + } + } + if(info[4]!=0 || info[5]!=0 || !stringp(info[6]) || + !stringp(info[7]) || !stringp(info[8])){ + send_error(info[2],info[3],"bad-pkt","Bad packet format.",info); + return; + } + if(!channels[info[6]]){ // error, channel is not registered! + send_error(info[2],info[3],"unk-channel", + "Unknown channel: "+info[6],info); + return; + } + if(member_array(info[2],listening[info[6]])==-1){ + // if mud is not listening, then make them listen + // and let them know they weren't listening. + send_error(info[2],info[3],"warning", + // No applicable message codes... change + // "warning" to something else if you want. + "Your mud wasn't listening to "+info[6]+ + ", so I'll start you listening right now.",info); + // Could do all the listen stuff, or could just + // pretend they requested it... I'm gonna pretend... + process_channel(fd,({ "channel-listen", 5, info[2], 0, + router_name, 0, info[6], 1 })); + return; + } + if(channels[info[6]][0]==2){ // filtered channel + if(channels[info[6]][1]!=info[2]){ // not from chan owner + // if from anybody else other than the owner, + // check if the owner is online, then either give + // an error, or forward to the owner... + if(!connected_muds[channels[info[6]][1]]){ + send_error(info[2],info[3],"unk-dst", + channels[info[6]][1]+" is not online to filter "+info[6], + info); + return; + } + if(info[4]!=0 || info[5]!=0 || !stringp(info[6]) || + !stringp(info[7]) || !stringp(info[8])){ + send_error(info[2],info[3],"bad-pkt","Bad packet format",info); + return; + } + write_data(connected_muds[channels[info[6]][1]],({ + "chan-filter-req", + 5, + router_name, + 0, + channels[info[6]][1], // mud name of chan owner + 0, + info[6], + info + })); + return; + } + // IS from chan owner, just broadcast it... + // drop through and broadcast like the other types do... + } + trr("CHAN: I think it's a good message at this point..."); + // at this point, they're wanting to do a message on a + // selective banned/allowed channel, or else are the owner + // of a filtered channel and they have not been + // blocked, so I will just do it... + foreach(mudname in keys(connected_muds)){ + if(member_array(mudname, listening[info[6]])!=-1) + write_data(connected_muds[mudname],info); + } + //broadcast_data(muds_not_on_this_fd(fd), info); + // send to all the other fd's that have a mud listening + // write_data(fd,info); + // also send the message to the connection that this mud is on + // from too... why do this? 'cause I'm allowing multiple muds to + // log on from the same connection :) + // I think the normal I3 server does this too, but I don't know + // since I can't test at the moment. + return; + case "add": + // check if already exists... + // check if a valid channel name (illegal characters?) + // check if other stuff is valid, like channel_type is 0,1,2 + // at this point, is being successfully added... + channel_update_counter++; + channels[info[6]]=({ info[7], info[2], ({}) }); + channel_updates[info[6]] = channel_update_counter; + trr(info[3]+"@"+info[2]+" created the channel: "+info[6],"yellow"); + // broadcast an update saying that this channel is added or changed now + // chanlist-reply packet to everybody (who has a channel service?) + broadcast_chanlist(info[6]); + // broadcast_data(muds_not_on_this_fd(fd), ({ + // "chanlist-reply",5,router_name,0, + // 0, // should be mudname, I think 0 would work just as well? + // 0, channel_update_counter, + // ([ info[6]:({ info[2], info[7] }) ]) + // })); + // write_data(fd,({ + // "chanlist-reply",5,router_name,0, + // 0, // should be mudname, I think 0 would work just as well? + // 0, channel_update_counter, + // ([ info[6]:({ info[2], info[7] }) ]) + // })); + save_object(SAVE_ROUTER); + return; + case "remove": + if(!channels[info[6]]){ // error, channel is not registered! + send_error(info[2],info[3],"unk-channel", + "Unknown channel: "+info[6],info); + return; + } + if(channels[info[6]][1]!=info[2]){ // error, not owner! + send_error(info[2],info[3],"not-allowed","Channel "+ + info[6]+" owned by: "+channels[info[6]][1],info); + return; + } + // at this point, is being removed by the owner... + channel_update_counter++; + map_delete(channels,info[6]); + channel_updates[info[6]] = channel_update_counter; + trr(info[3]+"@"+info[2]+" deleted the channel: "+info[6],"yellow"); + // broadcast an update saying that this channel is gone now + save_object(SAVE_ROUTER); + return; + case "admin": + // add/delete muds from the 2 lists... + if(!listening[info[6]]) listening[info[6]] = ({}); + if(info[7]){ // add to list... + channels[info[6]][2] += info[7]; + // if add to ban list, unlisten... + if(channels[info[6]][0]==0) // type 0 means selective ban + listening[info[6]] -= info[7]; + } + if(info[8]){ // remove from list... + channels[info[6]][2] += info[8]; + if(channels[info[6]][0]!=0) // type 0 means selective ban... + // selective allow and filtered are the same though... + // so if not selective ban, then act like selective allow... + // if removed from allow list, unlisten... + listening[info[6]] -= info[8]; + } + save_object(SAVE_ROUTER); + return; + case "listen": // mudname=info[2], channame=info[6], on_or_off=info[7] + if(!channels[info[6]]){ // error, channel is not registered! + send_error(info[2],info[3],"unk-channel", + "Unknown channel: "+info[6],info); + return; + } + if(!listening) listening=([ ]); + if(!listening[info[6]]) listening[info[6]]=({ }); // first MUD to listen + if(info[7]){ // on_or_off is on + if(member_array(info[2],listening[info[6]])!=-1) + return; // already listening, ignore them + } + else{ // on_or_off is on + if(member_array(info[2],listening[info[6]])==-1) + return; // already NOT listening, ignore them + } + trr("listening change on chan:"+info[6]+", mud="+info[2]+", on_or_off="+info[7]); + // only CHANGES should get to this point + switch(channels[info[6]][0]){ + case 0: // selectively banned + if(member_array(info[2],channels[info[6]][2])!=-1){ + // in list, you're banned... + send_error(info[2],0,"not-allowed", + "Banned from "+info[6],info); + save_object(SAVE_ROUTER); + return; + } + // not in ban list at this point + if(info[7]) + listening[info[6]] += ({ info[2] }); + else + listening[info[6]] -= ({ info[2] }); + save_object(SAVE_ROUTER); + return; + case 1: // selectively allowed + if(member_array(info[2],channels[info[6]][2])==-1 && + info[2] != channels[info[6]][1]){ + // NOT in list, you're banned! + send_error(info[2],0,"not-allowed", + "Not in allow list for "+info[6],info); + return; + } + // in allow list at this point + if(info[7]) + listening[info[6]] += ({ info[2] }); + else + listening[info[6]] -= ({ info[2] }); + save_object(SAVE_ROUTER); + return; + case 2: // filtered... act like selectively allowed + if(member_array(info[2],channels[info[6]][2])==-1 && + info[2] != channels[info[6]][1]){ + // NOT in list, you're banned! + send_error(info[2],0,"not-allowed", + "Not in allow list for "+info[6], + info); + return; + } + // in allow list at this point + if(info[7]) + listening[info[6]] += ({ info[2] }); + else + listening[info[6]] -= ({ info[2] }); + save_object(SAVE_ROUTER); + return; + } // switch + default: // trying to do "channel-blah" + send_error(info[2],info[3],"unk-type","I don't know what "+info[0]+ + " means.",info); + trr("Don't know what the ["+info[0]+"] packet means.", "yellow"); + return; + } + trr("can't get here?"); + } diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/process_startup_req.h ds2.0r28/lib/secure/daemon/i3router/process_startup_req.h *** ds2.0r18/lib/secure/daemon/i3router/process_startup_req.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/process_startup_req.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,221 ---- + // This file written completely by Tim Johnson (Tim@TimMUD) + + string *banned_muds = ({}); + + static void process_startup_req(int protocol, mixed info, int fd){ + // Handles startup stuff. + // Loads info into newinfo mapping. + // Error if mud is already connected. + mapping newinfo; + string site_ip, junk; + // router name is info[4], I'll just pretend I'm every router though, ha-ha! + // also, should verify that all the fields are the right type + + trr("info: "+identify(info)); + trr("process_startup_req: protocol="+protocol+", mud="+info[2],"blue"); + + if(member_array(info[2], banned_muds) != -1) return; + + if(sizeof(info)<18){ + // smallest protocol is protocol 1/2 which have size 18 + trr("THIS SHOULDNT BE HERE"); + write_data(fd,({ + "error", + 5, + router_name, + 0, + info[2], + 0, + "bad-pkt", + "Bad startup_req packet", + info + })); + return; + } + trr("fd is:" +fd); + + site_ip=socket_address(fd); + trr("site_ip: "+site_ip); + newinfo = ([ + "name":info[2], + "ip":site_ip, + "connect_time":time(), + "disconnect_time":0, + "password":info[6], + "old_mudlist_id":info[7], + "old_chanlist_id":info[8], + "player_port":info[9], + "imud_tcp_port":info[10], + "imud_udp_port":info[11], + "mudlib":info[12], + "base_mudlib":info[13], + "driver":info[14], + "mud_type":info[15], + "open_status":info[16], + "protocol":protocol, + "restart_delay":-1, + ]); + trr("newinfo: "+identify(newinfo)); + switch(protocol){ + case 1: + case 2: + if(sizeof(info)!=18){ + trr("error"); + write_data(fd,({ + "error", + 5, + router_name, + 0, + info[2], + 0, + "bad-pkt", + "Bad startup_req packet", + info + })); + return; + } + newinfo["services"]=info[17]; + newinfo["admin_email"]="Unknown"; // only in protocol 3 + newinfo["other_data"]=0; // only in protocol 3 + break; + case 3: + if(sizeof(info)!=20){ + trr("error"); + + write_data(fd,({ + "error", + 5, + router_name, + 0, + info[2], + 0, + "bad-pkt", + "Bad startup_req packet", + info + })); + return; + } + newinfo["admin_email"]=info[17]; + newinfo["services"]=info[18]; + newinfo["other_data"]=info[19]; + break; + default: + trr("error"); + + write_data(fd,({ + "error", + 5, + router_name, + 0, + info[2], // mud name + 0, + "not-imp", + "unknown protocol: "+protocol, + info + })); + return; + } + // Check valid values... + if( + !stringp(newinfo["open_status"]) || + !stringp(newinfo["admin_email"]) || + !stringp(newinfo["mud_type"]) || + !stringp(newinfo["driver"]) || + !stringp(newinfo["base_mudlib"]) || + !stringp(newinfo["mudlib"]) || + !mapp(newinfo["services"]) || + !intp(newinfo["imud_udp_port"]) || + !intp(newinfo["imud_tcp_port"]) || + !intp(newinfo["player_port"]) || + !intp(newinfo["password"]) || + !intp(newinfo["old_chanlist_id"]) || + !intp(newinfo["old_mudlist_id"]) || + (!mapp(newinfo["other_data"]) && newinfo["other_data"]!=0) + ){ + write_data(fd,({ + "error", + 5, + router_name, + 0, + info[2], + 0, + "bad-pkt", + "Bad startup_req packet", + info + })); + return; + } + if(connected_muds[info[2]]){ + // if MUD is already connected + trr("mud already connected"); + write_data(fd,({ + "error", + 5, + router_name, + 0, + info[2], // mud name + 0, + "bad-proto", // doesn't seem to me like it should be bad-proto... + // see what the official one uses for this + // it might just boot the earlier MUD off? + "MUD already connected", // Error message + info + })); + return; + } + if(mudinfo[info[2]] && sizeof(mudinfo[info[2]]) && mudinfo[info[2]]["password"] != newinfo["password"]){ + // if MUD is already known, not connected, and wrong password + if(newinfo["ip"]==mudinfo[info[2]]["ip"]){ + // same IP as last time... let's just trust 'em... + trr("Wrong password, but right IP","green"); + write_data(fd,({ + "error",5,router_name,0,info[2],0, + "warning", // nothing in error summary that seems applicable? + // Change later if I find a better error code + "wrong password, but I'll allow you since it's the same IP as last time",0 + })); + } + else{ + trr("wrong password, and from a new IP","red"); + write_data(fd,({ + "error", + 5, + router_name, + 0, + info[2], // mud name + 0, + "not-allowed", // Change later! + "wrong password, and from a new IP", // Error message + info + })); + return; + } + } + //trr("Right IP.","green"); + if(!mudinfo[info[2]] || !newinfo["password"] || mudinfo[info[2]]["password"] != newinfo["password"] ){ + // if new MUD, assign it a password + newinfo["password"]=random(9999)+1; + trr("Assigning password "+newinfo["password"],"white"); + // Change this maybe... see if the password is supposed to be in a certain range + } + else trr("Right password. Known: "+mudinfo[info[2]]["password"]+", current: "+newinfo["password"],"green"); + // MUD should be okay at this point. + trr("about to update the mudinfo..."); + mudinfo[info[2]]=newinfo; // update the mudinfo + connected_muds[info[2]] = fd; // add this MUD to list of connected muds + trr("about to send the startup reply..."); + send_startup_reply(info[2]); // reply to MUD + mudinfo_update_counter++; + mudinfo_updates[info[2]]=mudinfo_update_counter; + send_mudlist_updates(info[2], newinfo["old_mudlist_id"]); + broadcast_mudlist(info[2]); + if(member_array("channel", keys(newinfo["services"])) != -1) + send_chanlist_reply(info[2], ( newinfo["old_chanlist_id"]) ? newinfo["old_chanlist_id"] : (random(1138) * 1138) ); + else { + trr("-------------------------------","blue"); + trr("It looks like "+info[2]+" doesn't have a channel service?!?","blue"); + trr("These are the services reported: "+identify(newinfo["services"]),"blue"); + trr("This is what newinfo looks like: "+identify(newinfo),"blue"); + trr("-------------------------------","blue"); + } + } diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/read_callback.h ds2.0r28/lib/secure/daemon/i3router/read_callback.h *** ds2.0r18/lib/secure/daemon/i3router/read_callback.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/read_callback.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,160 ---- + // This file written completely by Tim Johnson (Tim@TimMUD) + + static void read_callback(int fd, mixed info){ + // This is called when messages come in from a MUD. + // Should reject all messages if they have not done a (successful) startup-req, + // Should check to make sure the fd matches with the mud they are claiming to be, else error. + // because all packets require an originator_mudname. + + // If target is the name of the router, then call the function in this object. + // if target is 0, then broadcast to muds. + // Do an error if target mudname is not known. + // + + // According to: http://www.intermud.org/i3/specs/formats.php3 + // Transmissions are LPC arrays with a predefined set of six initial elements: + // ({ type, ttl, originator mudname, originator username, target mudname, target username, ... }). + // info[0]=type + // info[1]=ttl + // info[2]=originator mudname + // info[3]=originator username + // info[4]=target mudname + // info[5]=target username + + string mudname; + int i; + trr("Received from fd("+fd+"), fd("+socket_address(fd)+")\n"+identify(info),((info[0] == "auth-mud-req" || info[0] == "auth-mud-reply") ? "magenta" : "green")); + // Base info in a packet is of size 6. + if(sizeof(info)<6 || + !stringp(info[0]) || + !intp(info[1]) || !stringp(info[2]) || + (!stringp(info[3]) && info[3]!=0) || + (!stringp(info[4]) && info[4]!=0) || + (!stringp(info[5]) && info[5]!=0) ) { + write_data(fd,({ + // okay, their initial data isn't fully there... + // careful about array out of bounds... + "error",5,router_name,0, + (sizeof(info)>=3 ? info[2] : 0), // mud name + (sizeof(info)>=4 ? info[3] : 0), // user name + "bad-pkt","Invalid initial data",info + })); + return; + } + if(info[4]!=0 && !connected_muds[info[4]] && info[4]!=router_name){ + // if target mud is not 0 (broadcasting), not the router name, + // and not a connected MUD + write_data(fd,({ + "error", + 5, + router_name, + 0, + info[2], + info[3], + "unk-dst", // same as I3 + "destination unknown", // same as I3 + info + })); + trr("Error [unk-dst], because target is "+info[4]+" and thus invalid."); + return; + } + if(sscanf(info[0],"startup-req-%d",i)==1){ + // special condition for startup-req... + trr("calling process_startup_req, i="+i+", fd="+fd+" which is: "+socket_address(fd)); + //call_other(this_object(),"process_startup_req",i,info,fd); + this_object()->process_startup_req(i,info,fd); + return; + } + if(!connected_muds[info[2]] || (connected_muds[info[2]]!=fd)){ + // MUD hasn't done a startup-req yet + write_data(fd,({ + "error", + 5, + router_name, + 0, // originator username + info[2], // mud name + info[3], // user name + "unk-src", // error code + "Your MUD hasn't registered as "+info[2]+" yet", // Error message + info + })); + trr("They have not done a startup-req for fd="+fd+", mudname="+info[2]); + return; + } + // at this point, I guess it has a valid origin and stuff + if(sscanf(info[0],"channel-%*s")==1){ // command has a "channel-" prefix + // special case for channel stuff + trr("calling process_channel..."); + process_channel(fd,info); + return; + } + if(info[0]=="chan-filter-reply"){ + if(!stringp(info[6]) || sizeof(info[7])<9 ){ + // avoid out-of-bounds + send_error(info[2],info[3],"bad-pkt", + "Invalid chan-filter-reply packet.",info); + } + if(channels[info[6]][1]!=info[2]){ + send_error(info[2],info[3],"not-allowed", + "You are not the owner of "+info[6],info); + return; + } + if(member_array(info[7][6],({ "channel-a", "channel-e", "channel-t"}))==-11){ + // Not a valid channel packet. + send_error(info[2],info[3],"not-allowed","*giggles*",info); + } + if(info[6]!=info[7][6]){ + // They're trying to trick me into broadcasting + // fake messages on another channel! + // That's pretty funny :P + // I'll have to remember to check if the official router falls for it. + send_error(info[2],info[3],"not-allowed","Hehe!",info); + return; + } + if(member_array(info[7][6],({ "channel-a", "channel-e", "channel-t"}))){ + + } + // Broadcast the message... + foreach(mudname in keys(connected_muds)){ + if(member_array(mudname, listening[info[6]])!=-1) + write_data(connected_muds[mudname],info[7]); + } + return; + } + + if(info[4]==0){ // if broadcasting this... + broadcast_data(connected_muds,info); + return; + } + if(info[4]==router_name) { + // Something meant for the router but not handled by now! + send_error(info[2],info[3],"not-imp","Unknown command sent to router: "+info[0],info); + trr("unhandled packet meant for router: "+info[0],"red"); + log_file("server","UNHANDLED PACKET:\n"+identify(info)+"\n"); + return; + } + // at this point, I guess you should forward it to the destination... + if(info[0]=="locate-reply"){ + // Special case for locate-reply, because protocol 3 has a larger packet... + if(sizeof(info)==8 && mudinfo[info[4]]["protocol"]>2){ + // originator mud is sending a protocol 1/2 response, + // but target understands 3, so add the extra info + write_data(connected_muds[info[4]], ({ + info[0],info[1],info[2],info[3],info[4],info[5], + info[6],info[7],0,0 + })); + return; + } + if(sizeof(info)==10 && mudinfo[info[4]]["protocol"]<=2){ + // target mud is being sent a protocol 3 response, + // but only understands 1 & 2, so strip the extra info + write_data(connected_muds[info[4]], ({ + info[0],info[1],info[2],info[3],info[4],info[5], + info[6],info[7] + })); + return; + } + } + write_data(connected_muds[info[4]], info); + return; + } diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/readme.txt ds2.0r28/lib/secure/daemon/i3router/readme.txt *** ds2.0r18/lib/secure/daemon/i3router/readme.txt Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/readme.txt Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,23 ---- + // This I3 router code was written completely by Tim Johnson (Tim@TimMUD, + // Tim@The Eternal Fantasy) + // To use it, #include the server.h file or else just rename it to server.c + // + // If you use it yourself, I'd like you to mention in whatever appropriate + // (if your I3 network or your primary MUD has a web site or board for example) + // place that I wrote all this and you're welcome to list what you may have + // changed on it after downloading mine. I'd actually prefer there to be a + // list somewhere simply because I'm curious what kinds of ideas people add. + // If it's something good, other people would probably be curious about it as + // well. + // + // I haven't done any router-to-router communications, so don't expect this to + // hook you up to the main network. This will only be useful for private I3 + // networks. + // Also, this is LPC code and needs to be on a MUD for it to run. It works + // good on a stock TMI-2 MUD, one day I'll make a stripped-down mudlib solely + // for running my router on (without code for players to log in and such). + // Until then, just download TMI-2 and put these files on your MUD and it + // should work. + // + // -Tim (Last edited February 16, 2004) + diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/remove_mud.h ds2.0r28/lib/secure/daemon/i3router/remove_mud.h *** ds2.0r18/lib/secure/daemon/i3router/remove_mud.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/remove_mud.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,13 ---- + // This file written completely by Tim Johnson (Tim@TimMUD) + + static void remove_mud(string mudname){ + if(connected_muds[mudname]){ + trr("Cannot remove mud ["+mudname+"] because it is still online right now.\n"); + return; + } + if(!mudinfo[mudname]){ + trr("Cannot remove mud ["+mudname+"] because it is not in the mudinfo list.\n"); + return; + } + map_delete(mudinfo, mudname); + } diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/send_chanlist_reply.h ds2.0r28/lib/secure/daemon/i3router/send_chanlist_reply.h *** ds2.0r18/lib/secure/daemon/i3router/send_chanlist_reply.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/send_chanlist_reply.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,36 ---- + // This file written completely by Tim Johnson (Tim@TimMUD) + + static void send_chanlist_reply(string mudname, int old_chanid){ + string channame; // channel name + // string *output; // array of which channel names to tell them about + mapping out=([ ]); // mapping to send + int i; // counter + trr("send_chanlist_reply, mudname="+mudname+", old_chanid="+old_chanid); + foreach(channame in keys(channel_updates)){ + //#ifndef SEND_WHOLE_CHANLIST + // if(channel_updates[channame]>old_chanid){ // needs updating + //#endif + if(!channels[channame]){ // add to output; + out[channame] = 0; + } + else{ + out[channame] = ({ channels[channame][1], + channels[channame][0] }); // host, type + } + //#ifndef SEND_WHOLE_CHANLIST + // } + //#endif + } + trr("Chanlist: "+identify(out),"blue"); + write_data(connected_muds[mudname],({ + "chanlist-reply", + 5, + router_name, + 0, + mudname, + 0, + channel_update_counter, + out, + })); + mudinfo[mudname]["old_chanlist_id"]=channel_update_counter; + } diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/send_error.h ds2.0r28/lib/secure/daemon/i3router/send_error.h *** ds2.0r18/lib/secure/daemon/i3router/send_error.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/send_error.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,21 ---- + // This file written completely by Tim Johnson (Tim@TimMUD) + + static void send_error(string mud, string user, string errcode, string errmsg, mixed *info){ + if(!connected_muds[mud]){ + trr("Can't send error to "+mud+" because they're not connected."); + return; + } + write_data(connected_muds[mud],({ + "error", + 5, + router_name, + 0, + mud, // mud name + user, // user name + 0, + errcode, + errmsg, + info + })); + return; + } diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/send_mudlist_updates.h ds2.0r28/lib/secure/daemon/i3router/send_mudlist_updates.h *** ds2.0r18/lib/secure/daemon/i3router/send_mudlist_updates.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/send_mudlist_updates.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,113 ---- + // This file written completely by Tim Johnson (Tim@TimMUD) + + static void send_mudlist_updates(string updating_mudname, int old_mudlist_id){ + string mudname; // mud name + string *kys; // array of strings for keys that need to be sent + mapping out=([ ]); // mapping to send + int i; // counter + trr("old_mudlist_id: "+old_mudlist_id,"blue"); + trr("updating_mudname: "+updating_mudname,"blue"); + trr("send_mudlist_updates, updating_mudname="+updating_mudname+", old_mudlist_id="+old_mudlist_id,"blue"); + foreach(mudname in keys(mudinfo_updates)){ + #ifndef SEND_WHOLE_MUDLIST + if(mudinfo_updates[mudname]>old_mudlist_id){ // needs updating + #endif + if(!mudinfo[mudname]){ // deleted mud; + out[mudname] = 0; + } + else{ + switch(mudinfo[updating_mudname]["protocol"]){ + case 1: + case 2: + out[mudname] = ({ + connected_muds[mudname] ? -1 : 0, + // -1=up, 0=down, n=down for n secs + mudinfo[mudname]["ip"], // ip_addr + mudinfo[mudname]["player_port"], // player_port + mudinfo[mudname]["imud_tcp_port"], // imud_tcp_port + mudinfo[mudname]["imud_udp_port"], // imud_udp_port + mudinfo[mudname]["mudlib"], // mudlib + mudinfo[mudname]["base_mudlib"], // base_mudlib + mudinfo[mudname]["driver"], // driver + mudinfo[mudname]["mud_type"], // mud_type + mudinfo[mudname]["open_status"], // open_status + mudinfo[mudname]["services"], // services + }); + break; + case 3: + out[mudname] = ({ + (connected_muds[mudname] ? -1 : 0), + // -1=up, 0=down, n=down for n secs + mudinfo[mudname]["ip"], // ip_addr + mudinfo[mudname]["player_port"], // player_port + mudinfo[mudname]["imud_tcp_port"], // imud_tcp_port + mudinfo[mudname]["imud_udp_port"], // imud_udp_port + mudinfo[mudname]["mudlib"], // mudlib + mudinfo[mudname]["base_mudlib"], // base_mudlib + mudinfo[mudname]["driver"], // driver + mudinfo[mudname]["mud_type"], // mud_type + mudinfo[mudname]["open_status"], // open_status + mudinfo[mudname]["admin_email"], // admin_email + mudinfo[mudname]["services"], // services + mudinfo[mudname]["other_data"], // other_data + }); + break; + } // switch + } // else not deleted + #ifndef SEND_WHOLE_MUDLIST + } // if needs updating + #endif + } // foreach + // out now has the mapping of what to tell the mud about... + // this might be big, so later I'll make it so it sends only 10 muds at a time... + // take an idea from /cmds/std/_semote.c + kys=keys(out); + for(i=0;i + #include + #include + #define DEB_IN 1 // trr-Incoming + #define DEB_OUT 2 // trr-Outgoing + #define DEB_INVALID 3 // trr-Invalid + #define DEB_OTHER 0 // trr-Other + #define MYSERVER 9000 // Port to accept connections on. + #define DEBUGGER_GUY "cratylus" // Name of who to display trrging info to. + #undef DEBUGGER_GUY + #define DEBUGGER_GUY "guest" + #define MAXIMUM_RETRIES 5 + // SEND_WHOLE_MUDLIST makes it act like the official I3 server instead of like the I3 specs + #define SEND_WHOLE_MUDLIST + // SEND_WHOLE_CHANLIST makes it act like the official I3 server instead of like the I3 specs + #define SEND_WHOLE_CHANLIST + inherit LIB_CLEAN; + + // Unsaved variables... + static private int router_socket; + // socket that the router is using + static private mapping sockets; + // physically connected sockets and their info + static private mapping connected_muds; + // muds that have successfully done a startup + // (key=mudname, value=fd) + //static private + mapping listening; + // list of muds listening to each channel + // (key=chan name, value=mud array) + + // Saved variables... + string router_name; // Name of the router. + string *router_list; // Ordered list of routers to use. + mapping mudinfo; // Info about all the muds which the router knows about. + mapping channels; // Info about all the channels the router handles. + mapping channel_updates; // Tells when a channel was last changed. + int channel_update_counter; // Counter for the most recent change. + // Why is this not a part of the channels mapping? + // Because I need to remember that some channels got deleted. + mapping mudinfo_updates; // Like channel_updates except for muds. + int mudinfo_update_counter; // Similar to channel_update_counter + + // Prototypes + void write_data(int fd, mixed data); + void close_connection(int fd); + static mapping muds_on_this_fd(int fd); + static mapping muds_not_on_this_fd(int fd); + static void broadcast_data(mapping targets, mixed data); + // Ones with their own files... + static void broadcast_chanlist(string channame); + static void broadcast_mudlist(string mudname); + static varargs void Debug(string str, int level); + static void process_channel(int fd, mixed *info); + static void process_startup_req(int protocol, mixed info, int fd); + static void read_callback(int fd, mixed info); + static void remove_mud(string mudname); + static void send_chanlist_reply(string mudname, int old_chanid); + static void send_mudlist(string mudname); + static void send_mudlist_updates(string updating_mudname, int old_mudlist_id); + static void send_startup_reply(string mudname); + static void send_error(string mud, string user, string errcode, string errmsg, mixed *info); + // core_stuff.h... + static void create(); + static void setup(); + void remove(); + // funcs.h... + static mapping muds_on_this_fd(int fd); + int value_equals(string a,int b, int c); + static mapping muds_not_on_this_fd(int fd); + int value_not_equals(string a,int b, int c); + // socket_stuff.h + static void close_callback(int fd); + static void listen_callback(int fd); + static void write_data_retry(int fd, mixed data, int counter); + static void close_connection(int fd); + static void write_data(int fd, mixed data); + static void broadcast_data(mapping targets, mixed data); + + // Code for all the stuff in the prototypes... + #include "./broadcast_chanlist.h" + #include "./broadcast_mudlist.h" + #include "./debug.h" + #include "./process_channel.h" + #include "./process_startup_req.h" + #include "./read_callback.h" + #include "./remove_mud.h" + #include "./send_chanlist_reply.h" + #include "./send_mudlist_updates.h" + #include "./send_startup_reply.h" + #include "./send_error.h" + + #include "./core_stuff.h" + #include "./funcs.h" + #include "./socket_stuff.h" + #include "./hosted_channels.h" + + // trrging stuff... + mapping query_mudinfo(){ return copy(mudinfo); } + mapping query_mud(string str){ return copy(mudinfo[str]); } + void get_info() { + write_file ("/tmp/info.txt", + "router_name: "+router_name+ + "\nrouter_list"+identify(router_list)+ + "\nchannel_update_counter: "+ channel_update_counter+ + "\nchannels:"+identify(channels)+ + "\nchannel_updates:"+identify(channel_updates)+ + "\nlistening:"+identify(listening)+ + "\nmudinfo:"+identify(mudinfo)+ + "\nmudinfo_update_counter: "+ mudinfo_update_counter+ + "\nmudinfo_updates:"+identify(mudinfo_updates)+ + "\nconnected:"+identify(connected_muds)+"\n"); + } + void clear(){ string mudname; foreach(mudname in keys(mudinfo)) remove_mud(mudname); + } + + mapping GetConnectedMuds(){ + return copy(connected_muds); + } + + string *AddBannedMud(string str){ + if( !((int)master()->valid_apply(({ "SECURE" }))) ) + error("Illegal attempt to access admintool: "+get_stack()+" "+identify(previous_object(-1))); + + banned_muds += ({ str }); + return banned_muds; + } + + string *RemoveBannedMud(string str){ + if( !((int)master()->valid_apply(({ "SECURE" }))) ) + error("Illegal attempt to access admintool: "+get_stack()+" "+identify(previous_object(-1))); + + banned_muds -= ({ str }); + return banned_muds; + } + + void clear_discs(){ + string mudname; + foreach(mudname in keys(mudinfo)) { + if(query_mud(mudname)["disconnect_time"] && + time() - query_mud(mudname)["disconnect_time"] > 60 && + time() - query_mud(mudname)["disconnect_time"] < 80){ + //trr("Removing mud: "+identify(mudname),"red"); + //remove_mud(mudname); + trr("Broadcasting updated mudlist.","white"); + broadcast_mudlist(mudname); + + } + } + } + diff -c -r --new-file ds2.0r18/lib/secure/daemon/i3router/socket_stuff.h ds2.0r28/lib/secure/daemon/i3router/socket_stuff.h *** ds2.0r18/lib/secure/daemon/i3router/socket_stuff.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/i3router/socket_stuff.h Wed Jul 5 00:01:12 2006 *************** *** 0 **** --- 1,77 ---- + // This file written in great part by Tim Johnson (Tim@TimMUD) + + static void close_callback(int fd){ + string mudname; + trr("close_callback: fd="+fd+"\n"); + foreach(mudname in keys(muds_on_this_fd(fd))){ + trr("Removing mud from connected_muds list: "+mudname); + mudinfo[mudname]["disconnect_time"] = time(); + map_delete(connected_muds, mudname); + broadcast_mudlist(mudname); + } + close_connection(fd); + } + + static void listen_callback(int fd){ + int fdstat; + if ((fdstat = socket_accept(fd, "read_callback", "write_callback")) < 0) { + return; + } + } + + void write_callback(int fd){ + if (sockets[fd]["write_status"] == EEALREADY) { + write_data(fd, sockets[fd]["pending"]); + map_delete(sockets[fd], "pending"); + } + else { + sockets[fd]["write_status"] = EESUCCESS; + } + } + + static void write_data_retry(int fd, mixed data, int counter){ + int rc; + if (counter == MAXIMUM_RETRIES) { + close_connection(fd); + return; + } + rc = socket_write(fd, data); + if(!sockets[fd]) sockets[fd]=([]); // Tim + sockets[fd]["write_status"] = rc; + switch (rc) { + case EESUCCESS: + break; + case EEALREADY: + sockets[fd]["pending"] = data; + break; + case EECALLBACK: + break; + case EESEND: + if (counter < MAXIMUM_RETRIES) { + trr("retry hit"); + call_out("retry_write", 2, ({fd, data, counter + 1})); + return; + } + default: + trr("write_data_retry: " + socket_error(rc)); + close_connection(fd); + break; + } + } + + static void close_connection(int fd){ + int sockerr; + map_delete(sockets, fd); + sockerr = socket_close(fd); + trr("closing sockerr:"+sockerr); + } + + static void write_data(int fd, mixed data){ + write_data_retry(fd, data, 0); + } + + static void broadcast_data(mapping targets, mixed data){ + foreach(int *arr in unique_array(values(targets), (: $1 :))){ + write_data(arr[0], data); + } + } diff -c -r --new-file ds2.0r18/lib/secure/daemon/imc2.c ds2.0r28/lib/secure/daemon/imc2.c *** ds2.0r18/lib/secure/daemon/imc2.c Tue Mar 28 23:23:41 2006 --- ds2.0r28/lib/secure/daemon/imc2.c Wed Jul 5 00:01:05 2006 *************** *** 1,23 **** // Tim Johnson // Started on May 1, 2004. // Use this however you want. // Connection data... ! //#define HOSTNAME "hub01.muddomain.com" ! //#define HOSTPORT 3333 ! //#define HOSTPORT 5000 ! #define HOSTPORT 3333 // HostIP overrides HOSTNAME, in case the mud doesn't want to resolve addresses. #define HOSTIP "70.85.248.74" - //#define HOSTIP "70.85.244.100" - //#define HOSTIP "66.218.49.113" // What name the network knows your mud as... ! #define MUDNAME "DeadSouls" // Passwords... ! #define CLIENT_PW "ClientPass321" ! #define SERVER_PW "ServPass321" // File to save data to, .o will be added automatically to the end. // This will have private stuff in it, don't put this in a directory where your wizards can read it. --- 1,22 ---- // Tim Johnson // Started on May 1, 2004. // Use this however you want. + // + // Dead Souls tweaks and fixes courtesy of Shadyman + // // Connection data... ! #define HOSTNAME "server01.intermud.us" ! #define HOSTPORT 5000 // HostIP overrides HOSTNAME, in case the mud doesn't want to resolve addresses. #define HOSTIP "70.85.248.74" // What name the network knows your mud as... ! #define MUDNAME "YADSM" // Passwords... ! #define CLIENT_PW "ClientPass" ! #define SERVER_PW "ServPass" // File to save data to, .o will be added automatically to the end. // This will have private stuff in it, don't put this in a directory where your wizards can read it. *************** *** 45,51 **** // Your MUD's URL is shared with other muds when building the mud list. // This you could also put this in your who reply. ! #define URL "http://dead-souls.sourceforge.net/" // ANNOUNCE_LOG is where network announcements get logged to. // I suggest you keep this turned on. --- 44,50 ---- // Your MUD's URL is shared with other muds when building the mud list. // This you could also put this in your who reply. ! #define URL "http://qs.bounceme.net" // ANNOUNCE_LOG is where network announcements get logged to. // I suggest you keep this turned on. *************** *** 66,80 **** // WHO_STR is the code that you want a who request to display. ! #define WHO_STR "/cmds/std/_who.c"->do_who()+URL+ \ ! "\ntelnet://www.darkwoodinc.com:3333\n" \ ! "______________________________________________________________________________" #include #include #include #include #ifndef VERSION --- 65,78 ---- // WHO_STR is the code that you want a who request to display. ! #define WHO_STR "/cmds/std/_who.c"->do_who()+URL+"\ntelnet://qs.bounceme.net 5500\n"+"______________________________________________________________________________" #include #include #include #include + #include #ifndef VERSION *************** *** 90,95 **** --- 88,101 ---- #define MODE_CONNECT_ERROR 3 // Not used yet, I need to see what the hub sends. #define MODE_HUB_DOWN 4 // Not used yet either. + + // What's the file for the channel daemon? + #ifndef CHANNEL_BOT + #define CHANNEL_BOT CHAT_D + #endif + //#ifndef CHANNEL_BOTS + //#define CHANNEL_BOTS ([ "local" : CHAT_D ]) + //#endif #ifndef STREAM #define STREAM 1 #endif *************** *** 118,124 **** #define ADMIN(x) archp(x) #endif ! #define HTML_LOCATION "http://dead-souls.sourceforge.net/" // Other things that could be #define'd... // INVIS(x) !visible(x) --- 124,130 ---- #define ADMIN(x) archp(x) #endif ! #define HTML_LOCATION "http://dead-souls.net/" // Other things that could be #define'd... // INVIS(x) !visible(x) *************** *** 228,242 **** // Shouldn't have to change anything beyond this point. ! private int read_callback(object socket, string info){ ! // string str, *strs; ! string a,b; int done=0; ! if(!sizeof(info)) return 0; ! //debug(save_variable(info),DEB_IN); #ifdef DATA_LOG ! log_file(DATA_LOG,"SERVER: "+save_variable(info)+"\n"); #endif buf += info; // The hub groups packets, unfortunately. switch(mode){ case MODE_WAITING_ACCEPT: // waiting for Hub to send autosetup --- 234,259 ---- // Shouldn't have to change anything beyond this point. ! void write_callback(int fd){ ! #ifdef DATA_LOG ! log_file(DATA_LOG,"Write_Callback on socket " + fd + "\n"); ! #endif ! start_logon(); ! } ! ! ! void read_callback(int socket, mixed info){ ! string a,b; ! int done=0; ! #ifdef DATA_LOG ! log_file(DATA_LOG,"SERVER: "+info+"\n"); #endif + + if(!sizeof(info)) return 0; + //debug(save_variable(info),DEB_IN); buf += info; + // The hub groups packets, unfortunately. switch(mode){ case MODE_WAITING_ACCEPT: // waiting for Hub to send autosetup *************** *** 247,285 **** send_is_alive("*"); send_keepalive_request(); send_ice_refresh(); ! } ! else if(sscanf(info, "PW %s %s version=%d %s\n", hub_name, server_pass, server_version, network_name)==4){ mode = MODE_CONNECTED; send_is_alive("*"); send_keepalive_request(); send_ice_refresh(); ! } ! else{ // Failed login sends plaintext error message. //debug("Failed to connect... "+info); } buf=""; // clear buffer break; ! case MODE_CONNECTED: while(!done){ if(sscanf(buf,"%s\n\r%s",a,b)==2){ // found a break... got_packet(a); buf=b; ! } ! else{ // no break... done = 1; } } - /* - strs = explode(info,"\n\r"); - foreach(str in strs){ - got_packet(str); - } - buf=""; - */ break; } ! return 1; } private void got_packet(string info){ --- 264,292 ---- send_is_alive("*"); send_keepalive_request(); send_ice_refresh(); ! } else if(sscanf(info, "PW %s %s version=%d %s\n", hub_name, server_pass, server_version, network_name)==4){ mode = MODE_CONNECTED; send_is_alive("*"); send_keepalive_request(); send_ice_refresh(); ! } else{ // Failed login sends plaintext error message. //debug("Failed to connect... "+info); } buf=""; // clear buffer break; ! case MODE_CONNECTED: while(!done){ if(sscanf(buf,"%s\n\r%s",a,b)==2){ // found a break... got_packet(a); buf=b; ! } else { // no break... done = 1; } } break; } ! return; } private void got_packet(string info){ *************** *** 291,297 **** mapping data; object who; if(!sizeof(info)) return; ! //debug(save_variable(info),DEB_PAK); str = info; // messages end with " \n\r" or "\n" or sometimes just a space --- 298,307 ---- mapping data; object who; if(!sizeof(info)) return; ! //debug(save_variable(info),DEB_PAK);; ! #ifdef DATA_LOG ! log_file(DATA_LOG,"GOT PACKET: "+info+"\n"); ! #endif str = info; // messages end with " \n\r" or "\n" or sometimes just a space *************** *** 465,471 **** return; } ! void create(){ #ifndef NO_UIDS seteuid(getuid()); #endif --- 475,483 ---- return; } ! void create(){ ! int temp; ! #ifndef NO_UIDS seteuid(getuid()); #endif *************** *** 482,499 **** mode = MODE_WAITING_ACCEPT; #ifdef HOSTIP // We already know the IP, go straight to the connecting, just do callback as if it found the IP. ! resolve_callback(HOSTIP,HOSTIP,1); #else ! if(!resolve(HOSTNAME, "resolve_callback")){ //debug("Addr_server is not running, resolve failed."); ! #ifdef DATA_LOG log_file(DATA_LOG,"Addr_server is not running, resolve failed.\n"); ! #endif remove(); return; } #endif - //debug("creating IMC2 object"); } void remove(){ --- 494,511 ---- mode = MODE_WAITING_ACCEPT; #ifdef HOSTIP // We already know the IP, go straight to the connecting, just do callback as if it found the IP. ! //resolve_callback(HOSTIP,HOSTIP,1); #else ! temp = resolve(HOSTNAME, "resolve_callback"); ! if(temp == 0){ //debug("Addr_server is not running, resolve failed."); ! #ifdef DATA_LOG log_file(DATA_LOG,"Addr_server is not running, resolve failed.\n"); ! #endif remove(); return; } #endif } void remove(){ *************** *** 507,520 **** destruct(this_object()); } ! private void resolve_callback( string address, string resolved, int key ) { // Figured out what the IP is for the address. int error; //debug("Resolved to: "+resolved); ! start_logon(); ! write_file("/tmp/imc2.log","address: "+address); ! write_file("/tmp/imc2.log","resolved: "+resolved); ! write_file("/tmp/imc2.log","key: "+key); //socket_num = socket_create(STREAM, "close_callback"); socket_num = socket_create(STREAM, "read_callback", "close_callback"); --- 519,531 ---- destruct(this_object()); } ! void resolve_callback( string address, string resolved, int key ) { // Figured out what the IP is for the address. int error; //debug("Resolved to: "+resolved); ! write_file("/tmp/imc2.log","address: "+address+"\n"); ! write_file("/tmp/imc2.log","resolved: "+resolved+"\n"); ! write_file("/tmp/imc2.log","key: "+key+"\n"); //socket_num = socket_create(STREAM, "close_callback"); socket_num = socket_create(STREAM, "read_callback", "close_callback"); *************** *** 522,531 **** #ifdef DATA_LOG log_file(DATA_LOG,"socket_create: " + socket_error(socket_num) + "\n"); #endif ! tc("socket_create: " + socket_error(socket_num) + "\n"); return; } ! //debug("Created socket descriptor " + socket_num); error = socket_connect(socket_num, resolved+" "+HOSTPORT, "read_callback", "write_callback"); if (error != EESUCCESS) { --- 533,544 ---- #ifdef DATA_LOG log_file(DATA_LOG,"socket_create: " + socket_error(socket_num) + "\n"); #endif ! //debug("socket_create: " + socket_error(socket_num) + "\n"); return; } ! #ifdef DATA_LOG ! log_file(DATA_LOG,"socket_create: Created Socket " + socket_num + "\n"); ! #endif error = socket_connect(socket_num, resolved+" "+HOSTPORT, "read_callback", "write_callback"); if (error != EESUCCESS) { *************** *** 536,548 **** socket_close(socket_num); return; } ! } ! private void write_callback(){ ! // start_logon(); } ! private void start_logon(){ //debug("Gonna try logging in, sending the PW thing..."); #if NOT_AUTO send_text(sprintf("PW %s %s version=%d\n", --- 549,562 ---- socket_close(socket_num); return; } ! #ifdef DATA_LOG ! log_file(DATA_LOG,"socket_connect: connected socket " + socket_num + " to " + resolved+" "+HOSTPORT + "\n"); ! #endif ! //write_callback(socket_num); } ! void start_logon(){ //debug("Gonna try logging in, sending the PW thing..."); #if NOT_AUTO send_text(sprintf("PW %s %s version=%d\n", *************** *** 642,648 **** return out; } ! private void send_packet(string sender, string packet_type, string target, string destination, string data){ // Sends a packet in the format that IMC2 uses. sequence++; send_text(sprintf("%s@%s %d %s %s %s@%s %s\n", --- 656,662 ---- return out; } ! void send_packet(string sender, string packet_type, string target, string destination, string data){ // Sends a packet in the format that IMC2 uses. sequence++; send_text(sprintf("%s@%s %d %s %s %s@%s %s\n", *************** *** 668,674 **** VERSION, network_name, URL)); } ! private int chan_listening(object user, string chan){ // Tells if a user is listening to a channel or not. if(!localchaninfo[chan]) return 0; if(member_array(GET_NAME(user),localchaninfo[chan]["users"])==-1) return 0; --- 682,688 ---- VERSION, network_name, URL)); } ! int chan_listening(object user, string chan){ // Tells if a user is listening to a channel or not. if(!localchaninfo[chan]) return 0; if(member_array(GET_NAME(user),localchaninfo[chan]["users"])==-1) return 0; *************** *** 684,693 **** int emote=0; int sz; - /* - tell_object(find_player("tim"),("data="+identify(data)+"\n")); - */ - sender=fromname+"@"+frommud; if(data["sender"]) sender=data["sender"]; if(data["realfrom"]) sender=data["realfrom"]; --- 698,703 ---- *************** *** 699,709 **** #ifdef CHANNEL_BOT // Can define CHANNEL_BOT to something with got_chan(channel,from,text,emote) // It will be given all channel messages. Be aware of this. ! call_other(CHANNEL_BOT,"got_chan",data["channel"],sender,data["text"],emote); #endif #ifdef CHANNEL_BOTS if(CHANNEL_BOTS[local]){ ! call_other(CHANNEL_BOTS[local],"got_chan",local,sender,data["text"],emote); } else if(CHANNEL_BOTS[data["channel"]]){ call_other(CHANNEL_BOTS[data["channel"]],"got_chan",data["channel"],sender,data["text"],emote); --- 709,719 ---- #ifdef CHANNEL_BOT // Can define CHANNEL_BOT to something with got_chan(channel,from,text,emote) // It will be given all channel messages. Be aware of this. ! CHANNEL_BOT->eventSendChannel(sender, data["channel"], data["text"], emote); #endif #ifdef CHANNEL_BOTS if(CHANNEL_BOTS[local]){ ! call_other(CHANNEL_BOTS[local],"got_chan",local,sender,data["text"],emote); } else if(CHANNEL_BOTS[data["channel"]]){ call_other(CHANNEL_BOTS[data["channel"]],"got_chan",data["channel"],sender,data["text"],emote); *************** *** 976,982 **** } private void whois_in(string fromname, string frommud, string targ, mapping data){ ! if(FIND_PLAYER(lower_case(targ)) #ifdef INVIS && !INVIS(FIND_PLAYER(lower_case(targ))) #endif --- 986,992 ---- } private void whois_in(string fromname, string frommud, string targ, mapping data){ ! if(FIND_PLAYER(lower_case(targ)) #ifdef INVIS && !INVIS(FIND_PLAYER(lower_case(targ))) #endif *************** *** 1134,1140 **** x=0; y=0; output=sprintf("[%s] %-20s %-20s %-20s\n","U/D?","Name","Network","IMC2 Version"); foreach (mud in muds){ ! if(!mudinfo[mud]) output += "Error on mud: "+mud+"\n"; else{ if(mudinfo[mud]["online"]) x++; else y++; --- 1144,1150 ---- x=0; y=0; output=sprintf("[%s] %-20s %-20s %-20s\n","U/D?","Name","Network","IMC2 Version"); foreach (mud in muds){ ! if(!mudinfo[mud]) output += "Error on mud: "+mud+"\n"; else{ if(mudinfo[mud]["online"]) x++; else y++; *************** *** 1270,1276 **** case "chans": output="Local setup for "+NETWORK_ID+" channels:\n"; output += sprintf("%-15s %-15s %-15s %-15s\n", ! "Local Name","Allowed (you?)","Listening","Network Name"); foreach(a in sort_array(keys(localchaninfo),1)){ output += sprintf("%-15s %s%-15s%%^RESET%%^ %s%-15s%%^RESET%%^ %-15s\n", a, --- 1280,1286 ---- case "chans": output="Local setup for "+NETWORK_ID+" channels:\n"; output += sprintf("%-15s %-15s %-15s %-15s\n", ! "Local Name","Allowed (you?)","Listening","Network Name"); foreach(a in sort_array(keys(localchaninfo),1)){ output += sprintf("%-15s %s%-15s%%^RESET%%^ %s%-15s%%^RESET%%^ %-15s\n", a, *************** *** 1287,1293 **** case "allchans": output=NETWORK_ID+" channels:\n"; output += sprintf("%-23s %-17s %-7s %-6s %-10s %-10s\n", ! "Name","Owner","Policy","Level","Suggested","Local Name"); foreach(a in sort_array(keys(chaninfo),1)){ output += sprintf("%-23s %-17s %-7s %-6s %-10s %-10s\n", a,chaninfo[a]["owner"], --- 1297,1303 ---- case "allchans": output=NETWORK_ID+" channels:\n"; output += sprintf("%-23s %-17s %-7s %-6s %-10s %-10s\n", ! "Name","Owner","Policy","Level","Suggested","Local Name"); foreach(a in sort_array(keys(chaninfo),1)){ output += sprintf("%-23s %-17s %-7s %-6s %-10s %-10s\n", a,chaninfo[a]["owner"], *************** *** 1343,1349 **** sprintf("channel=%s text=%s emote=%d echo=1", localchaninfo[a]["name"],escape(pinkfish_to_imc2(b)),emote)); return 1; ! break; case "reply": // Drop-through case "replyemote": // Drop-through case "tellemote": // Drop-through --- 1353,1359 ---- sprintf("channel=%s text=%s emote=%d echo=1", localchaninfo[a]["name"],escape(pinkfish_to_imc2(b)),emote)); return 1; ! break; case "reply": // Drop-through case "replyemote": // Drop-through case "tellemote": // Drop-through diff -c -r --new-file ds2.0r18/lib/secure/daemon/include/chat.h ds2.0r28/lib/secure/daemon/include/chat.h *** ds2.0r18/lib/secure/daemon/include/chat.h Sat Oct 22 18:08:55 2005 --- ds2.0r28/lib/secure/daemon/include/chat.h Wed Jul 5 00:01:12 2006 *************** *** 6,12 **** string *eventRemoveMember(string *chans); int cmdChannel(string verb, string str); varargs void eventSendChannel(string who, string ch, string msg, int emote, ! string target, string targmsg); string *GetChannelList(string ch); string GetLocalChannel(string ch); string GetRemoteChannel(string ch); --- 6,12 ---- string *eventRemoveMember(string *chans); int cmdChannel(string verb, string str); varargs void eventSendChannel(string who, string ch, string msg, int emote, ! string target, string targmsg); string *GetChannelList(string ch); string GetLocalChannel(string ch); string GetRemoteChannel(string ch); diff -c -r --new-file ds2.0r18/lib/secure/daemon/include/imc2_code.h ds2.0r28/lib/secure/daemon/include/imc2_code.h *** ds2.0r18/lib/secure/daemon/include/imc2_code.h Wed Jan 11 23:18:00 2006 --- ds2.0r28/lib/secure/daemon/include/imc2_code.h Wed Jul 5 00:01:12 2006 *************** *** 43,49 **** #define ADMIN(x) archp(x) #endif ! #define HTML_LOCATION "http://dead-souls.sourceforge.net/" // Other things that could be #define'd... // INVIS(x) !visible(x) --- 43,49 ---- #define ADMIN(x) archp(x) #endif ! #define HTML_LOCATION "http://dead-souls.net/" // Other things that could be #define'd... // INVIS(x) !visible(x) *************** *** 106,113 **** private void send_ice_refresh(); private void resolve_callback(string address, string resolved, int key); ! //private varargs void debug(mixed msg, int x){ ! // Add stuff in here if you want to see messages. //} // Functions for users to change. --- 106,113 ---- private void send_ice_refresh(); private void resolve_callback(string address, string resolved, int key); ! //private varargs void Debug(mixed msg, int x){ ! // Add stuff in here if you want to see messages. //} // Functions for users to change. *************** *** 132,153 **** // so you can do groups without having to always do subgroups of higher // ones or anything like 'levels'. BACKLOG_WEB_LEVEL is the only one of // significance, as it's the only one that the web backlog thing works on. ! switch(i){ ! case 2: return "arch"; ! case 1: return "creator"; ! case 0: return "public"; ! } ! return "invalid"; } int chan_perm_allowed(object user, string chan){ // Using the permission level assigned locally to a channel, // return 1 if user is allowed to use the channel, 0 if not. ! switch(localchaninfo[chan]["perm"]){ ! case 2: if(archp(user)) return 1; return 0; ! case 1: if(creatorp(user)) return 1; return 0; ! case 0: return 1; ! } } --- 132,153 ---- // so you can do groups without having to always do subgroups of higher // ones or anything like 'levels'. BACKLOG_WEB_LEVEL is the only one of // significance, as it's the only one that the web backlog thing works on. ! switch(i){ ! case 2: return "arch"; ! case 1: return "creator"; ! case 0: return "public"; ! } ! return "invalid"; } int chan_perm_allowed(object user, string chan){ // Using the permission level assigned locally to a channel, // return 1 if user is allowed to use the channel, 0 if not. ! switch(localchaninfo[chan]["perm"]){ ! case 2: if(archp(user)) return 1; return 0; ! case 1: if(creatorp(user)) return 1; return 0; ! case 0: return 1; ! } } *************** *** 157,163 **** // string str, *strs; string a,b; int done=0; if(!sizeof(info)) return 0; ! //debug(save_variable(info),DEB_IN); #ifdef DATA_LOG log_file(DATA_LOG,"SERVER: "+save_variable(info)+"\n"); #endif --- 157,163 ---- // string str, *strs; string a,b; int done=0; if(!sizeof(info)) return 0; ! //Debug(save_variable(info),DEB_IN); #ifdef DATA_LOG log_file(DATA_LOG,"SERVER: "+save_variable(info)+"\n"); #endif *************** *** 167,173 **** case MODE_WAITING_ACCEPT: // waiting for Hub to send autosetup if(sscanf(info, "autosetup %s accept %s\n\r", hub_name, network_name)==2){ ! //debug("Connected, hub is "+hub_name+", network is "+network_name); mode = MODE_CONNECTED; send_is_alive("*"); send_keepalive_request(); --- 167,173 ---- case MODE_WAITING_ACCEPT: // waiting for Hub to send autosetup if(sscanf(info, "autosetup %s accept %s\n\r", hub_name, network_name)==2){ ! //Debug("Connected, hub is "+hub_name+", network is "+network_name); mode = MODE_CONNECTED; send_is_alive("*"); send_keepalive_request(); *************** *** 181,187 **** send_ice_refresh(); } else{ // Failed login sends plaintext error message. ! //debug("Failed to connect... "+info); } buf=""; // clear buffer break; --- 181,187 ---- send_ice_refresh(); } else{ // Failed login sends plaintext error message. ! //Debug("Failed to connect... "+info); } buf=""; // clear buffer break; *************** *** 216,222 **** mapping data; object who; if(!sizeof(info)) return; ! //debug(save_variable(info),DEB_PAK); str = info; // messages end with " \n\r" or "\n" or sometimes just a space --- 216,222 ---- mapping data; object who; if(!sizeof(info)) return; ! //Debug(save_variable(info),DEB_PAK); str = info; // messages end with " \n\r" or "\n" or sometimes just a space *************** *** 235,246 **** sender="*"; origin=a; } data = string_to_mapping(strdata); ! // debug("sender="+sender); ! // debug("origin="+origin); ! // debug("sequence="+sequence); ! // debug("route="+route); ! // debug("packet_type="+packet_type); ! // debug("data="+save_variable(data)); if(!mudinfo[origin]) mudinfo[origin] = ([ ]); switch(packet_type){ --- 235,246 ---- sender="*"; origin=a; } data = string_to_mapping(strdata); ! // Debug("sender="+sender); ! // Debug("origin="+origin); ! // Debug("sequence="+sequence); ! // Debug("route="+route); ! // Debug("packet_type="+packet_type); ! // Debug("data="+save_variable(data)); if(!mudinfo[origin]) mudinfo[origin] = ([ ]); switch(packet_type){ *************** *** 251,257 **** //mudinfo[origin]["version"]="blah"; mudinfo[origin]+=data; mudinfo[origin]["online"]=1; ! //debug("handled is-alive for mud "+origin); break; case "close-notify": // Someone disconnected. if(!mudinfo[data["host"]]) mudinfo[data["host"]] = ([]); --- 251,257 ---- //mudinfo[origin]["version"]="blah"; mudinfo[origin]+=data; mudinfo[origin]["online"]=1; ! //Debug("handled is-alive for mud "+origin); break; case "close-notify": // Someone disconnected. if(!mudinfo[data["host"]]) mudinfo[data["host"]] = ([]); *************** *** 347,365 **** case "remote-admin": // For controlling the hub case "ice-refresh": // Request data about channels case "ice-msg-p": // Private channel message ! //debug("This packet isn't supposed to be incoming: "+packet_type); break; default: #ifdef UNKNOWN_DATA_LOG log_file(UNKNOWN_DATA_LOG,"Unknown packet: "+escape(info)+"\n\n"); #endif ! //debug("Unlisted packet type: "+packet_type); break; } } else{ buf += info; ! //debug("Doesn't match incoming pattern, so putting on buffer: "+str); #ifdef BAD_PACKET log_file(BAD_PACKET,"Doesn't match incoming pattern: "+str+"\n"); #endif --- 347,365 ---- case "remote-admin": // For controlling the hub case "ice-refresh": // Request data about channels case "ice-msg-p": // Private channel message ! //Debug("This packet isn't supposed to be incoming: "+packet_type); break; default: #ifdef UNKNOWN_DATA_LOG log_file(UNKNOWN_DATA_LOG,"Unknown packet: "+escape(info)+"\n\n"); #endif ! //Debug("Unlisted packet type: "+packet_type); break; } } else{ buf += info; ! //Debug("Doesn't match incoming pattern, so putting on buffer: "+str); #ifdef BAD_PACKET log_file(BAD_PACKET,"Doesn't match incoming pattern: "+str+"\n"); #endif *************** *** 383,390 **** #ifdef DATA_LOG log_file(DATA_LOG,"CLIENT: "+save_variable(text)+"\n"); #endif ! //debug(save_variable(text), DEB_OUT); ! // debug("writing to socket: "+socket_num); socket_write(socket_num,text); // imc2_socket->send(text); return; --- 383,390 ---- #ifdef DATA_LOG log_file(DATA_LOG,"CLIENT: "+save_variable(text)+"\n"); #endif ! //Debug(save_variable(text), DEB_OUT); ! // Debug("writing to socket: "+socket_num); socket_write(socket_num,text); // imc2_socket->send(text); return; *************** *** 410,416 **** resolve_callback(HOSTIP,HOSTIP,1); #else if(!resolve(HOSTNAME, "resolve_callback")){ ! //debug("Addr_server is not running, resolve failed."); #ifdef DATA_LOG log_file(DATA_LOG,"Addr_server is not running, resolve failed.\n"); #endif --- 410,416 ---- resolve_callback(HOSTIP,HOSTIP,1); #else if(!resolve(HOSTNAME, "resolve_callback")){ ! //Debug("Addr_server is not running, resolve failed."); #ifdef DATA_LOG log_file(DATA_LOG,"Addr_server is not running, resolve failed.\n"); #endif *************** *** 418,424 **** return; } #endif ! //debug("creating IMC2 object"); } void remove(){ --- 418,424 ---- return; } #endif ! //Debug("creating IMC2 object"); } void remove(){ *************** *** 435,441 **** private void resolve_callback( string address, string resolved, int key ) { // Figured out what the IP is for the address. int error; ! //debug("Resolved to: "+resolved); write_file("/tmp/imc2.log","address: "+address); write_file("/tmp/imc2.log","resolved: "+resolved); write_file("/tmp/imc2.log","key: "+key); --- 435,441 ---- private void resolve_callback( string address, string resolved, int key ) { // Figured out what the IP is for the address. int error; ! //Debug("Resolved to: "+resolved); write_file("/tmp/imc2.log","address: "+address); write_file("/tmp/imc2.log","resolved: "+resolved); write_file("/tmp/imc2.log","key: "+key); *************** *** 449,462 **** tc("socket_create: " + socket_error(socket_num) + "\n"); return; } ! //debug("Created socket descriptor " + socket_num); error = socket_connect(socket_num, resolved+" "+HOSTPORT, "read_callback", "write_callback"); if (error != EESUCCESS) { #ifdef DATA_LOG log_file(DATA_LOG,"socket_connect: " + socket_error(error) + "\n"); #endif ! //debug("socket_connect, error="+error+": " + socket_error(error) + "\n"); socket_close(socket_num); return; } --- 449,462 ---- tc("socket_create: " + socket_error(socket_num) + "\n"); return; } ! //Debug("Created socket descriptor " + socket_num); error = socket_connect(socket_num, resolved+" "+HOSTPORT, "read_callback", "write_callback"); if (error != EESUCCESS) { #ifdef DATA_LOG log_file(DATA_LOG,"socket_connect: " + socket_error(error) + "\n"); #endif ! //Debug("socket_connect, error="+error+": " + socket_error(error) + "\n"); socket_close(socket_num); return; } *************** *** 467,473 **** } private void start_logon(){ ! //debug("Gonna try logging in, sending the PW thing..."); #if NOT_AUTO send_text(sprintf("PW %s %s version=%d\n", #else --- 467,473 ---- } private void start_logon(){ ! //Debug("Gonna try logging in, sending the PW thing..."); #if NOT_AUTO send_text(sprintf("PW %s %s version=%d\n", #else diff -c -r --new-file ds2.0r18/lib/secure/daemon/letters.c ds2.0r28/lib/secure/daemon/letters.c *** ds2.0r18/lib/secure/daemon/letters.c Mon Jan 16 23:03:54 2006 --- ds2.0r28/lib/secure/daemon/letters.c Wed Jul 5 00:01:05 2006 *************** *** 38,44 **** __LettersDir[i] = unguarded((: get_dir, DIR_LETTERS+"/"+i+"/", 0 :)); } i = sizeof(tmp = unguarded((: get_dir, DIR_POSTAL+"/", 0 :))); ! __PostalPtr = ({ tmp[0], 0 }); while(i--) { if(unguarded((: file_size, DIR_POSTAL+"/"+tmp[i] :)) == -2) __PostalDir[tmp[i]] = unguarded((: get_dir, DIR_POSTAL+"/"+tmp[i]+"/", 0 :)); --- 38,44 ---- __LettersDir[i] = unguarded((: get_dir, DIR_LETTERS+"/"+i+"/", 0 :)); } i = sizeof(tmp = unguarded((: get_dir, DIR_POSTAL+"/", 0 :))); ! if(i) __PostalPtr = ({ tmp[0], 0 }); while(i--) { if(unguarded((: file_size, DIR_POSTAL+"/"+tmp[i] :)) == -2) __PostalDir[tmp[i]] = unguarded((: get_dir, DIR_POSTAL+"/"+tmp[i]+"/", 0 :)); diff -c -r --new-file ds2.0r18/lib/secure/daemon/log.c ds2.0r28/lib/secure/daemon/log.c *** ds2.0r18/lib/secure/daemon/log.c Fri Mar 24 14:39:55 2006 --- ds2.0r28/lib/secure/daemon/log.c Wed Jul 5 00:01:05 2006 *************** *** 9,20 **** int RotateLogs(){ string *contents,*paths; string fooname,foopath,temppath; ! paths = ({"/log/","/log/errors/","/secure/log","/secure/log/bak"}); foreach(string path in paths){ contents = get_dir(path); foreach(string substr in contents){ temppath = path+substr; ! if( file_size(temppath) > 150000) { fooname=substr+"-"+timestamp(); foopath=path+fooname; rename(temppath,foopath ); --- 9,20 ---- int RotateLogs(){ string *contents,*paths; string fooname,foopath,temppath; ! paths = ({"/log/chan/", "/log/","/log/errors/","/secure/log/adm/","/secure/log/"}); foreach(string path in paths){ contents = get_dir(path); foreach(string substr in contents){ temppath = path+substr; ! if( file_size(temppath) > 50000) { fooname=substr+"-"+timestamp(); foopath=path+fooname; rename(temppath,foopath ); diff -c -r --new-file ds2.0r18/lib/secure/daemon/master.c ds2.0r28/lib/secure/daemon/master.c *** ds2.0r18/lib/secure/daemon/master.c Sat Mar 11 11:17:32 2006 --- ds2.0r28/lib/secure/daemon/master.c Wed Jul 5 00:01:05 2006 *************** *** 193,199 **** object *stack; string *privs; string priv; ! int i; if( objectp(file) ) file = base_name(file); if( ok && sizeof(ok) && ok[0] == "all" ) return 1; --- 193,199 ---- object *stack; string *privs; string priv; ! int i, privcheck; if( objectp(file) ) file = base_name(file); if( ok && sizeof(ok) && ok[0] == "all" ) return 1; *************** *** 219,238 **** else stack = ({ ob }) + previous_object(-1); } else i = sizeof(stack = previous_object(-1) + ({ ob })); while(i--) { ! if(!stack[i] || stack[i] == this_object()) continue; ! if(file_name(stack[i]) == SEFUN) continue; ! if(!(priv = query_privs(stack[i]))) return 0; ! if(!ok && oper == "read") continue; privs = explode(priv, ":"); ! if(member_array(PRIV_SECURE, privs) != -1) continue; ! if(member_array(file_privs(file), privs) != -1) continue; if(!ok && oper == "write") { if(userp(stack[i]) && check_user(stack[i], fun, file, oper)) continue; else return 0; } ! if(sizeof(privs & ok)) continue; if(userp(stack[i]) && check_user(stack[i], fun, file, oper)) continue; if(userp(stack[i]) && check_domain(stack[i], fun, file,oper)) continue; return 0; --- 219,275 ---- else stack = ({ ob }) + previous_object(-1); } else i = sizeof(stack = previous_object(-1) + ({ ob })); + //tc("me: "+identify(this_object()), "red"); + //tc("prevs: "+identify((previous_object(-1)+({ob}))), "red"); + //tc("get_stack: "+get_stack(), "white"); + //tc("oper: "+oper, "red"); while(i--) { ! if(!stack[i] || stack[i] == this_object()) { ! //tc("stack check true"); ! continue; ! } ! if(file_name(stack[i]) == SEFUN) { ! //tc("sefun check true"); ! continue; ! } ! if(!(priv = query_privs(stack[i]))) { ! //tc("priv check FALSE"); ! return 0; ! } ! //tc("priv: "+priv,"yellow"); ! //tc("prevs: "+identify(previous_object(-1))); ! if(!ok && oper == "read") { ! //tc("trivial read check passed"); ! continue; ! } privs = explode(priv, ":"); ! if(member_array(PRIV_SECURE, privs) != -1) { ! //tc("priv secure check true"); ! //tc("prevs: "+identify(previous_object(-1)),"white"); ! //tc("stack: "+get_stack(),"white"); ! continue; ! } ! if(stringp(file) && member_array(file_privs(file), privs) != -1) { ! //tc("file: "+file+", checks true"); ! continue; ! } ! //foreach(string sub_priv in privs){ ! // if(sizeof(ok) && member_array(sub_priv, ok) != -1) privcheck = 1; ! //} ! //if(ok) tc("ok: "+identify(ok)); ! //tc("current ob: "+identify(stack[i])); ! //tc("privcheck: "+privcheck+"\n\n"); ! //if(privcheck) continue; if(!ok && oper == "write") { + //tc("verde","green"); if(userp(stack[i]) && check_user(stack[i], fun, file, oper)) continue; else return 0; } ! if(sizeof(privs & ok)) { ! //tc("azul","blue"); ! continue; ! } if(userp(stack[i]) && check_user(stack[i], fun, file, oper)) continue; if(userp(stack[i]) && check_domain(stack[i], fun, file,oper)) continue; return 0; *************** *** 363,368 **** --- 400,406 ---- if( !strsrch(file, DIR_TMP) ) return 0; else if( !strsrch(file, DIR_FTP) ) return 0; else if( !strsrch(file, DIR_LOGS) ) return 0; + else if( !strsrch(file, DIR_SECURE_SAVE) ) return 0; else return 1; } *************** *** 572,579 **** string *parse_command_prepos_list() { return ({ "in", "with", "without", "into", "for", "on", "under", "against", "out", "within", "of", "from", "between", "at", "to", "over", "near", ! "inside", "onto", "off", "through", "across", "up", "down", ! "around", "about", "only", "here", "room", "exit", "enter", "-r"}); } string parse_command_all_word() { return "all"; } --- 610,617 ---- string *parse_command_prepos_list() { return ({ "in", "with", "without", "into", "for", "on", "under", "against", "out", "within", "of", "from", "between", "at", "to", "over", "near", ! "inside", "onto", "off", "through", "across", "up", "down", "every", ! "around", "about", "only", "here", "room", "exit", "enter", "-r", "-a"}); } string parse_command_all_word() { return "all"; } diff -c -r --new-file ds2.0r18/lib/secure/daemon/options.c ds2.0r28/lib/secure/daemon/options.c *** ds2.0r18/lib/secure/daemon/options.c Mon Jan 16 23:04:14 2006 --- ds2.0r28/lib/secure/daemon/options.c Wed Jul 5 00:48:29 2006 *************** *** 20,26 **** daemon::create(); SetNoClean(1); __MyGroups = ([]); ! __Options = ([]); __Owner = 0; } --- 20,26 ---- daemon::create(); SetNoClean(1); __MyGroups = ([]); ! __Options = (["notify" : 1]); __Owner = 0; } *************** *** 45,58 **** file = DIR_POSTAL+"/"+who[0..0]+"/"+who; if(unguarded((: file_size, file :)) != -2) unguarded((: mkdir, file :)); __MyGroups = ([]); ! __Options = ([]); __Owner = who; unguarded((: save_object, file+"/postalrc" :)); } static private void load_options(string who) { string file; - if(who == __Owner) return; this_object()->assure_box_exists(who); if(__Owner == who) { --- 45,57 ---- file = DIR_POSTAL+"/"+who[0..0]+"/"+who; if(unguarded((: file_size, file :)) != -2) unguarded((: mkdir, file :)); __MyGroups = ([]); ! __Options = (["notify":1]); __Owner = who; unguarded((: save_object, file+"/postalrc" :)); } static private void load_options(string who) { string file; if(who == __Owner) return; this_object()->assure_box_exists(who); if(__Owner == who) { *************** *** 65,71 **** static private void save_options() { string file; - file = DIR_POSTAL+"/"+__Owner[0..0]+"/"+__Owner+"/postalrc"; unguarded((: save_object, file :)); } --- 64,69 ---- diff -c -r --new-file ds2.0r18/lib/secure/daemon/ping.c ds2.0r28/lib/secure/daemon/ping.c *** ds2.0r18/lib/secure/daemon/ping.c Fri Mar 24 14:39:55 2006 --- ds2.0r28/lib/secure/daemon/ping.c Wed Jul 5 00:01:05 2006 *************** *** 1,4 **** --- 1,5 ---- #include + #include #include #include *************** *** 8,14 **** int OK = 0; int Retries = 0; ! string *muds = ({ "Frontiers", "Carnivore" }); int CheckOK(){ Pinging = 0; --- 9,15 ---- int OK = 0; int Retries = 0; ! string *muds = PINGING_MUDS; int CheckOK(){ Pinging = 0; *************** *** 39,44 **** --- 40,51 ---- int eventPing(){ Pinging = 1; OK = 0; + + if(!sizeof(muds)) { + Pinging = 0; + return 0; + } + foreach(string mud in muds){ INTERMUD_D->eventWrite(({ "auth-mud-req", 5, mud_name(), 0, mud, 0 })); } diff -c -r --new-file ds2.0r18/lib/secure/daemon/player.c ds2.0r28/lib/secure/daemon/player.c *** ds2.0r18/lib/secure/daemon/player.c Mon Jan 16 23:04:14 2006 --- ds2.0r28/lib/secure/daemon/player.c Wed Dec 31 19:00:00 1969 *************** *** 1,74 **** - // /adm/daemon/player_d.c - // from the Dead Souls Mudlib - // a daemon to keep track of player progress - // created by Descartes of Borg 10 july 1993 - - #include - #include - - string *monsters; - mapping *player_list; - - void create() { - monsters = ({}); - player_list = ({}); - if(unguarded((: file_exists, SAVE_PLAYER_LIST+__SAVE_EXTENSION__ :))) - unguarded((: restore_object, SAVE_PLAYER_LIST :)); - } - - mapping *query_player_list() { return player_list; } - - void add_player_info() { - int x; - object ob; - int i; - - if(!(ob = previous_object()) || !userp(ob)) return; - if(creatorp(ob)) { - i = sizeof(player_list); - while(i--) - if(player_list[i]["name"] == (string)ob->GetKeyName() && creatorp(ob)) - player_list -= ({ player_list[i] }); - return; - } - x = -1; - i = sizeof(player_list); - while(i--) if(player_list[i]["name"] == (string)ob->GetKeyName()) x = i; - if((sizeof(player_list) == 20) && (x == -1) && - (((int)ob->query_exp()) < player_list[19]["experience"])) - return; - if(x > -1) player_list -= ({ player_list[x] }); - player_list += ({ ([ "name":(string)ob->GetKeyName(), "experience":(int)ob->query_exp(), - "kills":sizeof((string *)ob->query_kills()), - "deaths": sizeof((mixed *)ob->query_deaths()), - "quests": sizeof((string *)ob->query_quests()), - "major accomplishments": sizeof((mixed *)ob->query_mini_quests()), - "level": (int)ob->query_level(), - "class": (string)ob->query_class(), - "guild": (string)ob->query_guild() - ]) }); - player_list = sort_array(player_list, "sort_list", this_object()); - if(sizeof(player_list) > 20) player_list = player_list[0..19]; - unguarded((: save_object, SAVE_PLAYER_LIST :)); - } - - int sort_list(mapping alpha, mapping beta) { - if(alpha["experience"] > beta["experience"]) return -1; - else if(alpha["experience"] < beta["experience"]) return 1; - else return strcmp(alpha["name"], beta["name"]); - } - - int add_kill(string str) { - int x; - - if(!userp(previous_object(0)) || !stringp(str)) return -1; - if(!monsters) monsters = ({}); - if((x=member_array(str, monsters)) == -1) { - monsters += ({ str }); - x = member_array(str, monsters); - unguarded((: save_object, SAVE_PLAYER_LIST :)); - } - return x; - } - - string query_monster(int x) { return monsters[x]; } --- 0 ---- diff -c -r --new-file ds2.0r18/lib/secure/daemon/players.c ds2.0r28/lib/secure/daemon/players.c *** ds2.0r18/lib/secure/daemon/players.c Mon Nov 7 13:32:07 2005 --- ds2.0r28/lib/secure/daemon/players.c Wed Jul 5 00:01:05 2006 *************** *** 1,43 **** ! /* /secure/daemon/players.c ! * from the Dead Soulsr1 Object Library ! * a player management system ! * created by Descartes of Borg 950926 ! * Version: @(#) players.c 1.2@(#) ! * Last modified: 96/10/12 ! */ ! ! #include ! #include ! #include "players.h" ! ! inherit LIB_DAEMON; ! ! static void create() { } ! ! varargs int RemovePlayer(string str) { ! object who; ! ! if( !str ) { /* this is for suicide and undead death */ ! string file, backup; ! ! if( !(who = previous_object()) || creatorp(who) ) return 0; ! file = save_file((string)who->GetKeyName()) + __SAVE_EXTENSION__; ! backup = DIR_SECURE_SAVE "/backup/" + who->GetKeyName() + "." + time(); ! return unguarded( (: rename($(file), $(backup)) :) ); } - else { - string file; ! if( !user_exists(str) ) return 0; ! if( member_group(str, PRIV_SECURE) || member_group(str, PRIV_ASSIST) ) ! return 0; ! who = find_player(str); ! file = save_file(str) + __SAVE_EXTENSION__; ! if( who ) { ! message("system", "You have been removed from " + mud_name() + ".", ! who); ! who->eventDestruct(); } ! return rm(file); } } --- 1,157 ---- ! #include ! #include ! #include ! ! mapping PlayerDataMap = ([]); ! string *PendingEncres = ({}); ! string *PendingDecres = ({}); ! string *players = ({}); ! string *creators = ({}); ! string *user_list = ({}); ! ! string player_save_file; ! ! void create() { ! if(unguarded((: file_exists, SAVE_PLAYER_LIST+__SAVE_EXTENSION__ :))) ! unguarded((: restore_object, SAVE_PLAYER_LIST :)); ! PendingEncres = singular_array(PendingEncres); ! PendingDecres = singular_array(PendingDecres); ! players = singular_array(players); ! creators = singular_array(creators); ! user_list = singular_array(user_list); ! unguarded((: save_object, SAVE_PLAYER_LIST :)); ! ! } ! ! string *eventCre(string str){ ! str = lower_case(str); ! if(member_array(str,creators) == -1) creators += ({ str }); ! if(member_array(str,players) != -1) players -= ({ str }); ! unguarded((: save_object, SAVE_PLAYER_LIST :)); ! return creators; ! } ! ! string *eventDecre(string str){ ! str = lower_case(str); ! if(member_array(str,creators) != -1) creators -= ({ str }); ! if(member_array(str,players) == -1) players += ({ str }); ! unguarded((: save_object, SAVE_PLAYER_LIST :)); ! return players; ! } ! ! void AddPlayerInfo(mixed arg) { ! ! if(!objectp(arg) && !stringp(arg)) return ; ! ! if(objectp(arg)){ ! if(!interactive(arg)) return; ! else player_save_file = base_name(arg)+".o"; } ! else { ! arg = lower_case(arg); ! if(last(arg,2) != ".o") arg += ".o"; ! if(!grepp(arg,"/")){ ! string initial = arg[0..0]; ! player_save_file = DIR_CRES +"/"+initial+"/"+arg; ! if(!file_exists(player_save_file)) ! player_save_file = DIR_PLAYERS +"/"+initial+"/"+arg; ! if(!file_exists(player_save_file)) return; } ! else player_save_file = arg; ! if(grepp(DIR_CRES, player_save_file)) creators += ({ replace_string(last_string_element(player_save_file,"/"),".o","") }) ; ! else players += ({ replace_string(last_string_element(player_save_file,"/"),".o","") }) ; ! if(!file_exists(player_save_file)) return; } + + //tc("player_save_file: "+player_save_file); + user_list += ({ replace_string(last_string_element(player_save_file,"/"),".o","") }) ; + unguarded((: save_object, SAVE_PLAYER_LIST :)); } + + string *GetPlayerList(){ + return players; + } + + string *GetCreatorList(){ + return creators; + } + + string *GetUserList(){ + return user_list; + } + + int RemoveUser(string str){ + if(!str || str == "") return 0; + str = lower_case(str); + if(!user_exists(str)) return 0; + if(member_array(str, players) != -1) players -= ({ str }); + if(member_array(str, creators) != -1) creators -= ({ str }); + if(member_array(str, user_list) != -1) user_list -= ({ str }); + return 1; + } + + string *AddPendingEncre(string str){ + if(catch((int)master()->valid_apply()) || + !(int)master()->valid_apply(({ "SECURE", "ASSIST", "LIB_CONNECT" })) ){ + string offender = identify(previous_object(-1)); + debug("SECURITY VIOLATION: "+offender+" ",get_stack(),"red"); + log_file("security", "\n"+timestamp()+" AddPendingEncre breach: "+offender+" "+get_stack()); + return ({}); + } + if(str && str != "") PendingEncres += ({ lower_case(str) }); + unguarded((: save_object, SAVE_PLAYER_LIST :)); + return PendingEncres; + } + + string *RemovePendingEncre(string str){ + if(catch((int)master()->valid_apply()) || + !(int)master()->valid_apply(({ "SECURE", "ASSIST", "LIB_CONNECT" })) ){ + string offender = identify(previous_object(-1)); + debug("SECURITY VIOLATION: "+offender+" ",get_stack(),"red"); + log_file("security","\n"+ timestamp()+" RemovePendingEncre breach: "+offender+" "+get_stack()); + return ({}); + } + if(!str || str == "") return PendingEncres; + str = lower_case(str); + if(member_array(str, PendingEncres) != -1) PendingEncres -= ({ lower_case(str) }); + unguarded((: save_object, SAVE_PLAYER_LIST :)); + return PendingEncres; + } + + string *GetPendingEncres(){ + return PendingEncres; + } + + string *AddPendingDecre(string str){ + if(catch((int)master()->valid_apply()) || + !(int)master()->valid_apply(({ "SECURE", "ASSIST", "LIB_CONNECT" })) ){ + string offender = identify(previous_object(-1)); + debug("SECURITY VIOLATION: "+offender+" ",get_stack(),"red"); + log_file("security", "\n"+timestamp()+" AddPendingDecre breach: "+offender+" "+get_stack()); + return ({}); + } + if(str && str != "") PendingDecres += ({ lower_case(str) }); + unguarded((: save_object, SAVE_PLAYER_LIST :)); + return PendingDecres; + } + + string *RemovePendingDecre(string str){ + if(catch((int)master()->valid_apply()) || + !(int)master()->valid_apply(({ "SECURE", "ASSIST", "LIB_CONNECT" })) ){ + string offender = identify(previous_object(-1)); + debug("SECURITY VIOLATION: "+offender+" ",get_stack(),"red"); + log_file("security", "\n"+timestamp()+" RemovePendingDecre breach: "+offender+" "+get_stack()); + return ({}); + } + if(!str || str == "") return PendingDecres; + str = lower_case(str); + if(member_array(str, PendingDecres) != -1) PendingDecres -= ({ lower_case(str) }); + unguarded((: save_object, SAVE_PLAYER_LIST :)); + return PendingDecres; + } + + string *GetPendingDecres(){ + return PendingDecres; + } + diff -c -r --new-file ds2.0r18/lib/secure/daemon/players.h ds2.0r28/lib/secure/daemon/players.h *** ds2.0r18/lib/secure/daemon/players.h Wed Sep 28 19:34:12 2005 --- ds2.0r28/lib/secure/daemon/players.h Wed Dec 31 19:00:00 1969 *************** *** 1,7 **** - #ifndef l_players_h - #define l_players_h - - static void create(); - varargs int RemovePlayer(string str); - - #endif /* l_players_h */ --- 0 ---- diff -c -r --new-file ds2.0r18/lib/secure/daemon/snoop.c ds2.0r28/lib/secure/daemon/snoop.c *** ds2.0r18/lib/secure/daemon/snoop.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/daemon/snoop.c Wed Jul 5 19:58:20 2006 *************** *** 0 **** --- 1,269 ---- + #include + #include + #include + #include + #include + + inherit LIB_DAEMON; + + int SnoopClean(); + + string *snooped = ({}); + object *snoopers = ({}); + string *monitored = ({}); + mapping Watchers = ([]); + int count = 0; + int just_loaded = 1; + object *prevusers; + + void eventLoadRogues(); + + static void create() { + daemon::create(); + debug("SNOOP_D restarted.","red"); + if( file_size( SAVE_SNOOP __SAVE_EXTENSION__ ) > 0 ) + unguarded( (: restore_object, SAVE_SNOOP, 1 :) ); + SetNoClean(1); + SnoopClean(); + set_heart_beat(1); + if(GLOBAL_MONITOR == 0 && sizeof(monitored)){ + call_out( (: eventLoadRogues :), 1); + } + snoopers = filter(objects(), (: base_name($1) == "/secure/obj/snooper" :) ); + prevusers = users(); + } + + void RegisterSnooper(){ + object registrant = previous_object(); + if(base_name(registrant) == "/secure/obj/snooper" && + member_array(registrant,snoopers) == -1) snoopers += ({ registrant }); + unguarded( (: save_object, SAVE_SNOOP, 1 :) ); + } + + void UnregisterSnooper(){ + object registrant = previous_object(); + if(base_name(registrant) == "/secure/obj/snooper" && + member_array(registrant,snoopers) != -1) snoopers -= ({ registrant }); + unguarded( (: save_object, SAVE_SNOOP, 1 :) ); + } + + void eventLoadRogues(){ + if( !((int)master()->valid_apply(({ PRIV_SECURE }))) ) return; + foreach(string rogue in monitored) this_object()->CheckBot(rogue); + snoopers = filter(objects(), (: base_name($1) == "/secure/obj/snooper" :) ); + } + + int CheckBot(string str){ + object cloan, foo; + int allset, already_watched = 0; + string *immune; + string name; + + //tc("hello."); + if(!str) str = "foo"; + str = lower_case(str); + foo = find_player(str); + if(sizeof(snoopers)){ + foreach(object snoopbox in snoopers){ + //tc("snooper: "+identify(snoopbox)); + //if(snoopbox && grepp("#",file_name(snoopbox)) ) { + if(clonep(snoopbox) ) { + //tc("snooped: "+ file_name(snoopbox)+": "+snoopbox->GetSnooped()+"\n","yellow"); + } + else snoopers -= ({snoopbox}); + if(snoopbox && snoopbox->GetSnooped() && snoopbox->GetSnooped() == str) { + already_watched = 1; + } + if(snoopbox->GetSnooped() && (!find_player(snoopbox->GetSnooped()) ||!(snoopbox->GetSnooped()))) { + } + } + } + if(!already_watched && foo && (GLOBAL_MONITOR > 0 || member_array(str, monitored) != -1 || member_array(str, snooped) != -1 )){ + if(archp(find_player(str)) && GLOBAL_MONITOR == 2) return 0; + //tc("already watched: "+already_watched); + cloan=new("/secure/obj/snooper"); + //tc("cloning : "+identify(cloan)); + cloan->eventStartSnoop(str); + } + //tc("query_snooping: "+identify(query_snooping(cloan))); + unguarded( (: save_object, SAVE_SNOOP, 1 :) ); + return 1; + } + + void CheckSnooped(){ + object *lusers = users(); + //if(!compare_array(lusers, prevusers) || just_loaded){ + just_loaded = 0; + foreach(object user in lusers){ + CheckBot(user->GetKeyName()); + } + //} + //else CheckBot("tanstaafl"); + prevusers = lusers; + } + + int SnoopClean(){ + snoopers = filter(objects(), (: base_name($1) == "/secure/obj/snooper" :) ); + if(sizeof(snoopers)){ + foreach(object snoopbox in snoopers){ + if(snoopbox && !clonep(snoopbox) ) { + snoopers -= ({snoopbox}); + } + else { + object subject; + string dude = snoopbox->GetSnooped(); + if(dude) subject = find_player(dude); + if(!dude || !subject || !query_snooping(snoopbox) || + (member_array(dude,snooped) == -1 && member_array(dude,monitored) == -1 && GLOBAL_MONITOR < 1 )){ + snoopbox->eventDestruct(); + snoopers -= ({snoopbox}); + } + } + } + } + return 1; + } + + int eventDestruct(){ + if( !((int)master()->valid_apply(({ "SECURE" }))) ) + error("Illegal attempt to destruct snoop: "+get_stack()+" "+identify(previous_object(-1))); + return ::eventDestruct(); + } + + + void heart_beat(){ + count++; + + //tc("snoop daemon heart_beat","green"); + if( !(count % 5) ) CheckSnooped(); + + if( !(count % 10)) { + foreach(object snoopbox in snoopers){ + if(!snoopbox) snoopers -= ({ snoopbox }); + } + SnoopClean(); + } + if(count > 100) count = 0; + } + + void reset(){ + //tc("Snoop daemon reset"); + if(query_heart_beat(this_object()) < 1) set_heart_beat(60); + CheckSnooped(); + } + + int GetSnoop(string target, string msg){ + if(target != "cratylus") { + } + if(base_name(previous_object()) != "/secure/obj/snooper") return 0; + else if(sizeof(Watchers[target])) { + foreach(string watcher in Watchers[target]){ + tell_player(watcher, target+"% "+msg); + } + } + else Watchers[target] = ({}); + return 1; + } + + int AddWatcher(string watcher, string target){ + if(!valid_snoop(find_player(watcher), find_player(target))) { + return 0; + } + if(Watchers[target] && member_array(watcher,Watchers[target]) != -1){ + return 0; + } + if(!Watchers[target] || !sizeof(Watchers[target])) { + Watchers[target] = ({ watcher }); + } + else { + Watchers[target] += ({ watcher }); + } + if(member_array(target,snooped) == -1) snooped += ({target}); + CheckBot(target); + unguarded( (: save_object, SAVE_SNOOP, 1 :) ); + return 1; + } + + int RemoveWatcher(string watcher, string target){ + if(!valid_snoop(find_player(watcher), find_player(target))) return 0; + if(this_player() && interactive(this_player())){ + if(this_player()->GetKeyName() != watcher && !archp(this_player())) return 0; + } + else return 0; + + if(!Watchers[target] || !sizeof(Watchers[target])) return 0; + else if(member_array(watcher, Watchers[target]) != -1) + Watchers[target] -= ({ watcher }); + if((!Watchers[target] || !sizeof(Watchers[target])) && + member_array(target, monitored) == -1) { + foreach(object snoopbox in snoopers){ + if(snoopbox->GetSnooped() == target) snoopbox->eventDestruct(); + } + } + if(!Watchers[target] || !sizeof(Watchers[target])) { + snooped -= ({target}); + if(Watchers[target]) map_delete(Watchers, target); + } + CheckBot("adsfgrertgrsgnfxmy"); + unguarded( (: save_object, SAVE_SNOOP, 1 :) ); + return 1; + } + + int AddMonitor(string requestor, string target){ + if(member_array(target, monitored) == -1) monitored += ({ target }); + unguarded( (: save_object, SAVE_SNOOP, 1 :) ); + CheckBot(target); + return 1; + } + + int RemoveMonitor(object requestor, string target){ + if(!archp(requestor)) return 0; + monitored -= ({ target }); + unguarded( (: save_object, SAVE_SNOOP, 1 :) ); + if(Watchers[target] && sizeof(Watchers[target])) return 1; + foreach(object snoopbox in snoopers){ + if(snoopbox->GetSnooped() == target) snoopbox->eventDestruct(); + } + if(Watchers[target] && !sizeof(Watchers[target])) map_delete(Watchers, target); + CheckBot("asreg54eqwhtrbsf"); + unguarded( (: save_object, SAVE_SNOOP, 1 :) ); + return 1; + } + + int ReportLinkDeath(string str){ + if(!find_player(str)){ + foreach(object snoopbox in snoopers){ + if(snoopbox->GetSnooped() == str) snoopbox->eventDestruct(); + } + map_delete(Watchers, str); + unguarded( (: save_object, SAVE_SNOOP, 1 :) ); + return 1; + } + return 0; + } + + int ReportReconnect(string str){ + if(base_name(previous_object()) == LIB_CONNECT){ + foreach(object snoopbox in snoopers){ + if(snoopbox->GetSnooped() == str) snoopbox->eventDestruct(); + } + map_delete(Watchers, str); + CheckBot(str); + unguarded( (: save_object, SAVE_SNOOP, 1 :) ); + return 1; + } + return 0; + } + + int Report(){ + if( !((int)master()->valid_apply(({ PRIV_SECURE }))) ){ + return 0; + } + write("Watchers: "+identify(Watchers)+"\n"); + write("snoopers: "+identify(snoopers)+"\n"); + //write("prevusers: "+identify(prevusers)+"\n"); + write("snooped: "+identify(snooped)+"\n"); + write("monitored: "+identify(monitored)+"\n"); + return 1; + } + diff -c -r --new-file ds2.0r18/lib/secure/daemon/update.blank ds2.0r28/lib/secure/daemon/update.blank *** ds2.0r18/lib/secure/daemon/update.blank Sat Mar 11 11:19:19 2006 --- ds2.0r28/lib/secure/daemon/update.blank Wed Jul 5 00:01:05 2006 *************** *** 2,9 **** inherit LIB_DAEMON; - string *deleta; - static void eventUpdate() { } --- 2,7 ---- diff -c -r --new-file ds2.0r18/lib/secure/daemon/update.c ds2.0r28/lib/secure/daemon/update.c *** ds2.0r18/lib/secure/daemon/update.c Mon Jan 23 20:50:41 2006 --- ds2.0r28/lib/secure/daemon/update.c Wed Jul 5 00:01:05 2006 *************** *** 2,9 **** inherit LIB_DAEMON; - string *deleta; - static void eventUpdate() { } --- 2,7 ---- diff -c -r --new-file ds2.0r18/lib/secure/daemon/voting.c ds2.0r28/lib/secure/daemon/voting.c *** ds2.0r18/lib/secure/daemon/voting.c Mon Jan 16 23:04:14 2006 --- ds2.0r28/lib/secure/daemon/voting.c Wed Jul 5 00:01:05 2006 *************** *** 157,163 **** mixed eventNextDay() { mapVoting["daycount"]--; ! if( ! mapVoting["daycount"] ) { if( mapVoting["mode"] == VOTE_MODE_CANDIDATES ) { mapVoting["mode"] = VOTE_MODE_VOTING; mapVoting["daycount"] = VOTE_DAY_COUNT; --- 157,163 ---- mixed eventNextDay() { mapVoting["daycount"]--; ! if( !mapVoting["daycount"] ) { if( mapVoting["mode"] == VOTE_MODE_CANDIDATES ) { mapVoting["mode"] = VOTE_MODE_VOTING; mapVoting["daycount"] = VOTE_DAY_COUNT; *************** *** 167,173 **** eventSave(); return VOTE_SUCCESS; } ! eventEndVoting(); return VOTE_SUCCESS; } --- 167,173 ---- eventSave(); return VOTE_SUCCESS; } ! //tc("mapVoting[\"daycount\"]: "+mapVoting["daycount"]); eventEndVoting(); return VOTE_SUCCESS; } *************** *** 189,197 **** mapCouncil = ([]); foreach( string sClass in CLASSES_D->GetClasses() ) { mapWho = mapVoting["votes"][lower_case(sClass)]; ! if( ! ( sizeof( asWho = keys( mapWho ) ) ) ) ! return VOTE_SUCCESS; while( sizeof( asWho ) >= 2 ) { string player1, player2; --- 189,203 ---- mapCouncil = ([]); foreach( string sClass in CLASSES_D->GetClasses() ) { + //tc("sClass: "+sClass); mapWho = mapVoting["votes"][lower_case(sClass)]; ! //tc("mapVoting: "+identify(mapVoting),"red"); ! //tc("mapWho: "+identify(mapWho)); ! if( ! ( sizeof( asWho = keys( mapWho ) ) ) ){ ! //tc("?"); ! //return VOTE_SUCCESS; ! } ! //tc("asWho: "+identify(asWho)); while( sizeof( asWho ) >= 2 ) { string player1, player2; *************** *** 204,211 **** else asWho -= ({ player1 }); } ! mapCouncil[lower_case(sClass)] = asWho[0]; } eventSave(); --- 210,219 ---- else asWho -= ({ player1 }); } + //tc("asWho: "+identify(asWho)); ! if(asWho && sizeof(asWho)) mapCouncil[lower_case(sClass)] = asWho[0]; ! //tc("mapCouncil["+lower_case(sClass)+"]: "+identify(mapCouncil[lower_case(sClass)])); } eventSave(); *************** *** 230,236 **** return asWho; } ! string GetCouncilMember( string sClass ) { return mapCouncil[sClass]; } int GetVoteStatus( object ob ) { string sVoter; --- 238,258 ---- return asWho; } ! string GetCouncilMember( string sClass ) { ! if(mapCouncil[sClass]) return mapCouncil[sClass]; ! else return ""; ! } ! ! string GetCurrentCouncil(){ ! string ret = "Current council:\n"; ! foreach( string sClass in CLASSES_D->GetClasses() ){ ! string councillor; ! if(mapCouncil[sClass]) councillor = mapCouncil[sClass]; ! else councillor = "NONE"; ! ret += capitalize(sClass)+": "+capitalize(councillor)+"\n"; ! } ! return ret; ! } int GetVoteStatus( object ob ) { string sVoter; diff -c -r --new-file ds2.0r18/lib/secure/include/bboard.h ds2.0r28/lib/secure/include/bboard.h *** ds2.0r18/lib/secure/include/bboard.h Wed Sep 28 19:34:12 2005 --- ds2.0r28/lib/secure/include/bboard.h Wed Jul 5 00:48:29 2006 *************** *** 1,5 **** ! #define BBOARD_DIR "/adm/save/boards/" ! #define BBOARD_EDIT "/tmp/bb/" #define BBOARD_OK 0 #define BAD_DATA 1 --- 1,5 ---- ! #define BBOARD_DIR "/save/boards/" ! #define BBOARD_EDIT "/tmp/" #define BBOARD_OK 0 #define BAD_DATA 1 diff -c -r --new-file ds2.0r18/lib/secure/include/compat.h ds2.0r28/lib/secure/include/compat.h *** ds2.0r18/lib/secure/include/compat.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/include/compat.h Wed Jul 5 00:01:05 2006 *************** *** 0 **** --- 1,62 ---- + #ifndef s_lpu_h + #define s_lpu_h + + #define ROOM "/lib/std/room" + #define OBJECT "/lib/std/item" + #define OB_SIMUL_EFUN "/secure/sefun/sefun" + #define __DIR__ "/domains/lpuni/" + + #define set_light SetAmbientLight + #define set_short SetShort + #define set_long SetLong + #define set_items SetItems + #define set_exits SetExits + #define query_exit GetExit + #define set_property SetProperty + #define set_name SetKeyName + #define set_id SetId + #define set_no_clean SetNoClean + #define set_smell_string SetSmell + #define set_smell SetSmell + #define set_properties SetProperties + #define set_door SetDoor + #define set_race SetRace + #define set_gender SetGender + #define set_level SetLevel + #define set_body_type SetProperty + #define set_hp SetHealthPoints + #define set_class SetClass + #define set_spell_chance SetSpellChance + #define set_spell SetSpell + #define set_skills SetSkills + #define set_skill SetSkill + #define set_spell_chance SetSpellChance + #define set_emotes SetActions + #define set_wielding_limbs SetWieldingLimbs + #define set_wc SetClass + #define set_type SetWeaponType + #define set_mass SetMass + #define set_value SetValue + #define set_listen_string SetListen + #define set_listen SetListen + #define set_edit_ok valid_edit + #define POLITICS_D "/secure/daemon/politics" + #define set_search SetSearch + #define set_paralyzed SetParalyzed + #define set_pre_exit_functions SetProperty + #define MONSTER LIB_SENTIENT + #define monster sentient + #define set_money SetCurrency + #define add_exit AddExit + #define set_read SetRead + #define set_prevent_get SetPreventGet + #define VAULT LIB_ROOM + #define set_day_long SetDayLong + #define set_night_long SetNightLong + #define set_open SetOpen + #define query_open GetOpen + #define remove_item_description RemoveItem + #define remove_exit RemoveExit + #define add_item_description AddItem + + #endif /* s_lpu_h */ diff -c -r --new-file ds2.0r18/lib/secure/include/config.h ds2.0r28/lib/secure/include/config.h *** ds2.0r18/lib/secure/include/config.h Sat Mar 11 11:18:20 2006 --- ds2.0r28/lib/secure/include/config.h Wed Jul 5 00:01:05 2006 *************** *** 4,9 **** --- 4,10 ---- #define DEFAULT_PROMPT "> " #define MUD_STATUS "mudlib development" #define ADMIN_EMAIL "admin@here" + #define DEBUGGER "DEBUG_NAME" #define LOCAL_NEWS_PREFIX "nm" #define MUD_IS_LOCKED 0 *************** *** 40,44 **** --- 41,52 ---- #define DEFAULT_ITEM_MESSAGE "You do not see that here." #define EXTRA_TIME_OFFSET 0 + #define RESET_INTERMUD 0 + #define ENGLISH_ONLY 0 + #define HUMANS_ONLY 0 + #define PINGING_MUDS ({"Frontiers","Dead Souls"}) + #define ENABLE_ENCUMBRANCE 1 + #define GLOBAL_MONITOR 0 + #define PLAYER_KILL 0 #endif /* s_config_h */ diff -c -r --new-file ds2.0r18/lib/secure/include/council.h ds2.0r28/lib/secure/include/council.h *** ds2.0r18/lib/secure/include/council.h Wed Sep 28 19:34:12 2005 --- ds2.0r28/lib/secure/include/council.h Wed Jul 5 00:01:05 2006 *************** *** 7,25 **** #define POLICECOM ({ "sluggo" }) #define SECRETARY ({ "brunoer" }) ! #define COUNCIL ({ "bess", "moonstar", "sluggo", "turk", "katana", "mina",\ "yildor", "pianoman", "topknot", "niteraven", "brunoer",\ "hades", "annie" }) ! #define MAGE_COUNCIL ({ "moonstar" }) ! #define MONK_COUNCIL ({ "bess" }) ! #define ROGUE_COUNCIL ({ "turk" }) ! #define CLERIC_COUNCIL ({ "katana" }) ! #define FIGHTER_COUNCIL ({ "sluggo" }) ! #define KATAAN_COUNCIL ({ "mina" }) --- 7,25 ---- #define POLICECOM ({ "sluggo" }) #define SECRETARY ({ "brunoer" }) ! #define COUNCIL ({ "bess", "moonstar", "sluggo", "turk", "katana", "mina",\ "yildor", "pianoman", "topknot", "niteraven", "brunoer",\ "hades", "annie" }) ! #define MAGE_COUNCIL ({ "moonstar" }) ! #define MONK_COUNCIL ({ "bess" }) ! #define ROGUE_COUNCIL ({ "turk" }) ! #define CLERIC_COUNCIL ({ "katana" }) ! #define FIGHTER_COUNCIL ({ "sluggo" }) ! #define KATAAN_COUNCIL ({ "mina" }) diff -c -r --new-file ds2.0r18/lib/secure/include/daemons.h ds2.0r28/lib/secure/include/daemons.h *** ds2.0r18/lib/secure/include/daemons.h Sat Mar 11 11:19:19 2006 --- ds2.0r28/lib/secure/include/daemons.h Wed Jul 5 00:01:05 2006 *************** *** 4,10 **** --- 4,12 ---- #include #define ADMIN_D DIR_SECURE_DAEMONS "/admin" + #define ADVANCE_D DIR_SECURE_DAEMONS "/advance" #define ADVERBS_D DIR_DAEMONS "/adverbs" + #define AUTOEXEC_D DIR_SECURE_DAEMONS "/autoexec" #define BANISH_D DIR_DAEMONS "/banish" #define BBOARD_D DIR_SECURE_DAEMONS "/bboard" #define BUGS_D DIR_DAEMONS "/bugs" *************** *** 28,49 **** #define NOTIFY_D DIR_DAEMONS "/notify" #define OPTIONS_D DIR_SECURE_DAEMONS "/options" #define PARTY_D DIR_DAEMONS "/party" - #define PLAYERS_D DIR_SECURE_DAEMONS "/players" #define PING_D DIR_SECURE_DAEMONS "/ping" #define RACES_D DIR_DAEMONS "/races" #define REAPER_D DIR_DAEMONS "/reaper" #define REMOTE_D DIR_SECURE_DAEMONS "/remote" #define REMOTEPOST_D DIR_SECURE_DAEMONS "/remotepost" #define SEASONS_D DIR_DAEMONS "/seasons" #define SERVICES_D DIR_DAEMONS "/services" #define SOUL_D DIR_DAEMONS "/soul" ! #define SPELLS_D DIR_DAEMONS "/spells" #define STATISTICS_D DIR_DAEMONS "/statistics" #define TERMINAL_D DIR_DAEMONS "/terminal" #define TIME_D DIR_DAEMONS "/time" - #ifdef Dead SoulsLPMud #define UNDERWORLD_D DIR_DAEMONS "/underworld" - #endif #define UNIQUE_D DIR_DAEMONS "/unique" #define USERS_D DIR_SECURE_DAEMONS "/users" #define VERBS_D DIR_DAEMONS "/verbs" --- 30,53 ---- #define NOTIFY_D DIR_DAEMONS "/notify" #define OPTIONS_D DIR_SECURE_DAEMONS "/options" #define PARTY_D DIR_DAEMONS "/party" #define PING_D DIR_SECURE_DAEMONS "/ping" + #define PLAYERS_D DIR_SECURE_DAEMONS "/players" + #define POLITICS_D DIR_SECURE_DAEMONS "/politics" #define RACES_D DIR_DAEMONS "/races" #define REAPER_D DIR_DAEMONS "/reaper" #define REMOTE_D DIR_SECURE_DAEMONS "/remote" #define REMOTEPOST_D DIR_SECURE_DAEMONS "/remotepost" + #define ROUTER_D DIR_SECURE_DAEMONS "/i3router/server" #define SEASONS_D DIR_DAEMONS "/seasons" #define SERVICES_D DIR_DAEMONS "/services" + #define SNOOP_D DIR_SECURE_DAEMONS "/snoop" #define SOUL_D DIR_DAEMONS "/soul" ! #define SPELLS_D DIR_DAEMONS "/spells" #define STATISTICS_D DIR_DAEMONS "/statistics" + #define STARGATE_D DIR_DAEMONS "/stargate" #define TERMINAL_D DIR_DAEMONS "/terminal" #define TIME_D DIR_DAEMONS "/time" #define UNDERWORLD_D DIR_DAEMONS "/underworld" #define UNIQUE_D DIR_DAEMONS "/unique" #define USERS_D DIR_SECURE_DAEMONS "/users" #define VERBS_D DIR_DAEMONS "/verbs" diff -c -r --new-file ds2.0r18/lib/secure/include/dirs.h ds2.0r28/lib/secure/include/dirs.h *** ds2.0r18/lib/secure/include/dirs.h Wed Sep 28 19:34:12 2005 --- ds2.0r28/lib/secure/include/dirs.h Wed Jul 5 00:01:05 2006 *************** *** 80,86 **** #define DIR_SECURE_COMMON_CMDS DIR_SECURE_CMDS "/common" #define DIR_CREATOR_CMDS DIR_CMDS "/creators" #define DIR_SECURE_CREATOR_CMDS DIR_SECURE_CMDS "/creators" ! #define DIR_GUILD_CMDS DIR_CMDS "/guild" #define DIR_HM_CMDS DIR_CMDS "/hm" #define DIR_PLAYER_CMDS DIR_CMDS "/players" #define DIR_SECURE_PLAYER_CMDS DIR_SECURE_CMDS "/players" --- 80,86 ---- #define DIR_SECURE_COMMON_CMDS DIR_SECURE_CMDS "/common" #define DIR_CREATOR_CMDS DIR_CMDS "/creators" #define DIR_SECURE_CREATOR_CMDS DIR_SECURE_CMDS "/creators" ! #define DIR_CLAN_CMDS DIR_CMDS "/clan" #define DIR_HM_CMDS DIR_CMDS "/hm" #define DIR_PLAYER_CMDS DIR_CMDS "/players" #define DIR_SECURE_PLAYER_CMDS DIR_SECURE_CMDS "/players" diff -c -r --new-file ds2.0r18/lib/secure/include/events.h ds2.0r28/lib/secure/include/events.h *** ds2.0r18/lib/secure/include/events.h Mon Jan 23 08:57:36 2006 --- ds2.0r28/lib/secure/include/events.h Wed Jul 5 00:01:05 2006 *************** *** 23,28 **** --- 23,29 ---- #define LIB_LOOK_IN DIR_EVENTS "/look_in" #define LIB_POISON DIR_EVENTS "/poison" #define LIB_PRESS DIR_EVENTS "/press" + #define LIB_PULL DIR_EVENTS "/pull" #define LIB_PUT DIR_EVENTS "/put" #define LIB_READ DIR_EVENTS "/read" #define LIB_SEARCH DIR_EVENTS "/search" diff -c -r --new-file ds2.0r18/lib/secure/include/global.h ds2.0r28/lib/secure/include/global.h *** ds2.0r18/lib/secure/include/global.h Wed Sep 28 19:34:12 2005 --- ds2.0r28/lib/secure/include/global.h Wed Jul 5 00:01:05 2006 *************** *** 1,9 **** #ifndef __GLOBAL_H #define __GLOBAL_H ! #define __nightmare__ 4.5 ! #define __nightmare5__ ! #define Dead SoulsLPMud #define DAY_ONE 720550800 --- 1,11 ---- #ifndef __GLOBAL_H #define __GLOBAL_H ! #include ! ! #if COMPAT_MODE ! #include ! #endif #define DAY_ONE 720550800 *************** *** 15,22 **** #undef debug #endif /* debug */ ! #ifdef DEBUG ! #define debug(x, y) (find_player(x) || master())->eventPrint(x) ! #endif /* DEBUG */ #endif /* GLOBAL_H */ --- 17,24 ---- #undef debug #endif /* debug */ ! //#ifdef DEBUG ! //#define debug(x, y) (find_player(x) || master())->eventPrint(x) ! //#endif /* DEBUG */ #endif /* GLOBAL_H */ diff -c -r --new-file ds2.0r18/lib/secure/include/iips.h ds2.0r28/lib/secure/include/iips.h *** ds2.0r18/lib/secure/include/iips.h Wed Sep 28 19:34:12 2005 --- ds2.0r28/lib/secure/include/iips.h Wed Jul 5 00:01:05 2006 *************** *** 1,8 **** #ifndef __IIPS_H #define __IIPS_H ! #include ! #define POSTAL_ID "imaginary mailer" ! #endif /* __IIPS_H */ --- 1,8 ---- #ifndef __IIPS_H #define __IIPS_H ! #include ! #define POSTAL_ID "imaginary mailer" ! #endif /* __IIPS_H */ diff -c -r --new-file ds2.0r18/lib/secure/include/lib.h ds2.0r28/lib/secure/include/lib.h *** ds2.0r18/lib/secure/include/lib.h Sun Jan 29 11:24:32 2006 --- ds2.0r28/lib/secure/include/lib.h Wed Jul 5 00:48:30 2006 *************** *** 1,6 **** --- 1,7 ---- #ifndef s_lib_h #define s_lib_h + //#include #include #include *************** *** 10,23 **** --- 11,32 ---- #include #include + #define LIB_AUTH DIR_SECURE_LIB "/auth" + #define LIB_BATTERY DIR_LIB "/battery" + #define LIB_BLANK_PILE DIR_LIB "/blank_pile" + #define LIB_BOARD DIR_LIB "/bboard" #define LIB_BODY DIR_LIB "/body" + #define LIB_BOT DIR_LIB "/bot" #define LIB_BURN DIR_LIB "/burn" #define LIB_CAPTURE DIR_LIB "/capture" #define LIB_CHAPEL DIR_LIB "/chapel" #define LIB_CHAT DIR_LIB "/chat" #define LIB_CLASSES DIR_LIB "/classes" + #define LIB_CLAY DIR_LIB "/clay" + #define LIB_CLERK DIR_LIB "/clerk" #define LIB_CLIENT DIR_SECURE_LIB "/net/client" + #define LIB_CLIP DIR_LIB "/clip" #define LIB_COMBAT DIR_LIB "/combat" #define LIB_COMBATMSG DIR_LIB "/combatmsg" #define LIB_COMMAND DIR_LIB "/command" *************** *** 36,59 **** #define LIB_FILES DIR_LIB "/files" #define LIB_FISH DIR_LIB "/fish" #define LIB_FISHING DIR_LIB "/fishing" #define LIB_FOLLOW DIR_LIB "/follow" #define LIB_FUEL DIR_LIB "/fuel" #define LIB_GENETICS DIR_LIB "/genetics" ! #define LIB_GUILD DIR_LIB "/guild" #define LIB_HELP DIR_LIB "/help" #define LIB_HISTORY DIR_LIB "/history" ! #define LIB_INTERACTIVE DIR_LIB "/interactive" ! #define LIB_INTERFACE DIR_LIB "/interface" ! #define LIB_LAMP DIR_LIB "/lamp" ! #define LIB_LANGUAGE DIR_LIB "/language" ! #define LIB_LEAD DIR_LIB "/lead" ! #define LIB_LEADER DIR_LIB "/leader" ! #define LIB_LIGHT DIR_LIB "/light" ! #define LIB_LIVING DIR_LIB "/living" #define LIB_LOGIN DIR_SECURE_LIB "/login" #define LIB_MAGIC DIR_LIB "/magic" #define LIB_MATCH DIR_LIB "/match" #define LIB_MEAL DIR_LIB "/meal" #define LIB_MESSAGES DIR_LIB "/messages" #define LIB_MONEY DIR_LIB "/money" #define LIB_NMSH DIR_LIB "/nmsh" --- 45,74 ---- #define LIB_FILES DIR_LIB "/files" #define LIB_FISH DIR_LIB "/fish" #define LIB_FISHING DIR_LIB "/fishing" + #define LIB_FLASHLIGHT DIR_LIB "/flashlight" #define LIB_FOLLOW DIR_LIB "/follow" + #define LIB_FTP_DATA_CONN DIR_SECURE_LIB "/net/ftp_data_connection" #define LIB_FUEL DIR_LIB "/fuel" #define LIB_GENETICS DIR_LIB "/genetics" ! #define LIB_GUN DIR_LIB "/gun" ! #define LIB_CLAN DIR_LIB "/clan" #define LIB_HELP DIR_LIB "/help" #define LIB_HISTORY DIR_LIB "/history" ! #define LIB_INTERACTIVE DIR_LIB "/interactive" ! #define LIB_INTERFACE DIR_LIB "/interface" ! #define LIB_LAMP DIR_LIB "/lamp" ! #define LIB_LANGUAGE DIR_LIB "/language" ! #define LIB_LEAD DIR_LIB "/lead" ! #define LIB_LEADER DIR_LIB "/leader" ! #define LIB_LIGHT DIR_LIB "/light" ! #define LIB_LIVING DIR_LIB "/living" #define LIB_LOGIN DIR_SECURE_LIB "/login" #define LIB_MAGIC DIR_LIB "/magic" + #define LIB_MANYCOINS DIR_LIB "/manycoins" #define LIB_MATCH DIR_LIB "/match" + #define LIB_MAYOR DIR_LIB "/mayor" #define LIB_MEAL DIR_LIB "/meal" + #define LIB_MEAL_POISON DIR_LIB "/poison" #define LIB_MESSAGES DIR_LIB "/messages" #define LIB_MONEY DIR_LIB "/money" #define LIB_NMSH DIR_LIB "/nmsh" *************** *** 61,104 **** #define LIB_PAGER DIR_LIB "/pager" #define LIB_PERSIST DIR_LIB "/persist" #define LIB_PILE DIR_LIB "/pile" #define LIB_PLAYER DIR_LIB "/player" #define LIB_POLE DIR_LIB "/pole" #define LIB_POST_OFFICE DIR_LIB "/post_office" #define LIB_RACE DIR_LIB "/race" #define LIB_REMOTE DIR_LIB "/remote" #define LIB_SCROLL DIR_LIB "/scroll" #define LIB_SENTIENT DIR_LIB "/sentient" #define LIB_SERVER DIR_SECURE_LIB "/net/server" #define LIB_SOCKET DIR_SECURE_LIB "/net/socket" #define LIB_SPELL DIR_LIB "/spell" #define LIB_STEAL DIR_LIB "/steal" #define LIB_TALK DIR_LIB "/talk" #define LIB_TELLER DIR_LIB "/teller" #define LIB_TORCH DIR_LIB "/torch" #define LIB_TRAINER DIR_LIB "/trainer" - #ifdef Dead SoulsLPMud #define LIB_UNDEAD DIR_LIB "/undead" - #endif #define LIB_VEHICLE DIR_LIB "/vehicle" #define LIB_VERB DIR_LIB "/verb" #define LIB_VIRTUAL DIR_LIB "/virtual" - #define LIB_BATTERY DIR_LIB "/battery" - #define LIB_SHADOW DIR_LIB "/shadow" - #define LIB_SHOP DIR_LIB "/shop" - #define LIB_FLASHLIGHT DIR_LIB "/flashlight" - #define LIB_GUN DIR_LIB "/gun" - #define LIB_PISTOL DIR_LIB "/pistol" - #define LIB_RIFLE DIR_LIB "/rifle" - #define LIB_ROUND DIR_LIB "/round" - #define LIB_SHELL DIR_LIB "/shell" - #define LIB_CLIP DIR_LIB "/clip" - #define LIB_MANYCOINS DIR_LIB "/manycoins" - #define LIB_BLANK_PILE DIR_LIB "/blank_pile" - #define LIB_MONEY DIR_LIB "/money" - #define LIB_MAYOR DIR_LIB "/mayor" - #define LIB_CLERK DIR_LIB "/clerk" - #define LIB_CLAY DIR_LIB "/clay" - #define LIB_FTP_DATA_CONNECTION "/secure/lib/net/ftp_data_connection" - #endif /* s_lib_h */ --- 76,109 ---- #define LIB_PAGER DIR_LIB "/pager" #define LIB_PERSIST DIR_LIB "/persist" #define LIB_PILE DIR_LIB "/pile" + #define LIB_PISTOL DIR_LIB "/pistol" #define LIB_PLAYER DIR_LIB "/player" + #define LIB_PLAYERS DIR_LIB "/player" #define LIB_POLE DIR_LIB "/pole" #define LIB_POST_OFFICE DIR_LIB "/post_office" #define LIB_RACE DIR_LIB "/race" #define LIB_REMOTE DIR_LIB "/remote" + #define LIB_RIFLE DIR_LIB "/rifle" + #define LIB_ROUND DIR_LIB "/round" #define LIB_SCROLL DIR_LIB "/scroll" + #define LIB_SECURE_BOARD DIR_SECURE_LIB "/bboard" #define LIB_SENTIENT DIR_LIB "/sentient" #define LIB_SERVER DIR_SECURE_LIB "/net/server" + #define LIB_SHADOW DIR_LIB "/shadow" + #define LIB_SHELL DIR_LIB "/shell" + #define LIB_SHOP DIR_LIB "/shop" #define LIB_SOCKET DIR_SECURE_LIB "/net/socket" #define LIB_SPELL DIR_LIB "/spell" + #define LIB_STARGATE DIR_LIB "/stargate" #define LIB_STEAL DIR_LIB "/steal" #define LIB_TALK DIR_LIB "/talk" + #define LIB_TEACHER DIR_LIB "/teacher" #define LIB_TELLER DIR_LIB "/teller" #define LIB_TORCH DIR_LIB "/torch" #define LIB_TRAINER DIR_LIB "/trainer" #define LIB_UNDEAD DIR_LIB "/undead" #define LIB_VEHICLE DIR_LIB "/vehicle" #define LIB_VERB DIR_LIB "/verb" #define LIB_VIRTUAL DIR_LIB "/virtual" #endif /* s_lib_h */ diff -c -r --new-file ds2.0r18/lib/secure/include/network.h ds2.0r28/lib/secure/include/network.h *** ds2.0r18/lib/secure/include/network.h Wed Sep 28 19:34:12 2005 --- ds2.0r28/lib/secure/include/network.h Wed Jul 5 00:01:05 2006 *************** *** 1,20 **** #ifndef __NETWORK_H #define __NETWORK_H ! #include ! #include ! #define MUD 0 #define STREAM 1 #define DATAGRAM 2 #define STREAM_BINARY 3 #define DATAGRAM_BINARY 4 ! #define PORT_ADMIN 17010 #define PORT_FTP (query_host_port() - 1) #define PORT_HTTP (query_host_port() - 5) #define PORT_OOB (query_host_port() + 5) #define PORT_RCP (query_host_port() - 10) #define PORT_UDP (query_host_port() + 8) ! #endif /* __NETWORK_H */ --- 1,20 ---- #ifndef __NETWORK_H #define __NETWORK_H ! #include ! //#include ! #define MUD 0 #define STREAM 1 #define DATAGRAM 2 #define STREAM_BINARY 3 #define DATAGRAM_BINARY 4 ! #define PORT_ADMIN 17010 #define PORT_FTP (query_host_port() - 1) #define PORT_HTTP (query_host_port() - 5) #define PORT_OOB (query_host_port() + 5) #define PORT_RCP (query_host_port() - 10) #define PORT_UDP (query_host_port() + 8) ! #endif /* __NETWORK_H */ diff -c -r --new-file ds2.0r18/lib/secure/include/post.h ds2.0r28/lib/secure/include/post.h *** ds2.0r18/lib/secure/include/post.h Wed Sep 28 19:34:12 2005 --- ds2.0r28/lib/secure/include/post.h Wed Jul 5 00:01:05 2006 *************** *** 1,11 **** #ifndef __POST_H #define __POST_H ! #include ! #define POSTAL_ID "imaginary mailer" #define POSTAL_PROMPT "% " #define POSTAL_USER_HELP DIR_USER_HELP+"/postal" #define POSTAL_CREATOR_HELP DIR_CREATOR_HELP+"/postal" ! #endif /* __POST_H */ --- 1,11 ---- #ifndef __POST_H #define __POST_H ! #include ! #define POSTAL_ID "imaginary mailer" #define POSTAL_PROMPT "% " #define POSTAL_USER_HELP DIR_USER_HELP+"/postal" #define POSTAL_CREATOR_HELP DIR_CREATOR_HELP+"/postal" ! #endif /* __POST_H */ diff -c -r --new-file ds2.0r18/lib/secure/include/rooms.h ds2.0r28/lib/secure/include/rooms.h *** ds2.0r18/lib/secure/include/rooms.h Mon Jan 16 23:04:14 2006 --- ds2.0r28/lib/secure/include/rooms.h Wed Jul 5 00:01:05 2006 *************** *** 6,14 **** #define ROOM_DEATH DIR_STANDARD_DOMAIN "/room/death" #define ROOM_FREEZER DIR_STANDARD_DOMAIN "/room/freezer" #define ROOM_FURNACE DIR_STANDARD_DOMAIN "/room/furnace" ! #define ROOM_START DIR_STANDARD_DOMAIN "/room/start" #define ROOM_VOID DIR_STANDARD_DOMAIN "/room/void" #define ROOM_WIZ DIR_STANDARD_DOMAIN "/room/wiz_hall" #define ROOM_ARCH "/secure/room/arch" #endif /* s_rooms_h */ --- 6,16 ---- #define ROOM_DEATH DIR_STANDARD_DOMAIN "/room/death" #define ROOM_FREEZER DIR_STANDARD_DOMAIN "/room/freezer" #define ROOM_FURNACE DIR_STANDARD_DOMAIN "/room/furnace" ! #define ROOM_START "/domains/campus/room/start" #define ROOM_VOID DIR_STANDARD_DOMAIN "/room/void" #define ROOM_WIZ DIR_STANDARD_DOMAIN "/room/wiz_hall" #define ROOM_ARCH "/secure/room/arch" + #define ROOM_NETWORK "/secure/room/network" + #define ROOM_ROUTER "/secure/room/router" #endif /* s_rooms_h */ diff -c -r --new-file ds2.0r18/lib/secure/include/save.h ds2.0r28/lib/secure/include/save.h *** ds2.0r18/lib/secure/include/save.h Wed Jan 11 23:07:30 2006 --- ds2.0r28/lib/secure/include/save.h Wed Jul 5 00:01:05 2006 *************** *** 17,28 **** #define SAVE_NAMESERVER DIR_SAVE "/network" #define SAVE_NOTIFY DIR_SAVE "/notify" #define SAVE_QUESTS DIR_SECURE_SAVE "/quests" - #define SAVE_RACES DIR_SAVE "/races" #define SAVE_PLAYER_LIST DIR_SAVE "/player_list" #define SAVE_POLITICS DIR_SECURE_SAVE "/politics" #define SAVE_RACES DIR_SAVE "/races" #define SAVE_SERVICES DIR_SAVE "/services" #define SAVE_SOUL DIR_SAVE "/soul" #define SAVE_UNIQUE DIR_SAVE "/unique" #define SAVE_IMC2 DIR_SAVE "/imc2" --- 17,30 ---- #define SAVE_NAMESERVER DIR_SAVE "/network" #define SAVE_NOTIFY DIR_SAVE "/notify" #define SAVE_QUESTS DIR_SECURE_SAVE "/quests" #define SAVE_PLAYER_LIST DIR_SAVE "/player_list" #define SAVE_POLITICS DIR_SECURE_SAVE "/politics" #define SAVE_RACES DIR_SAVE "/races" + #define SAVE_ROUTER DIR_SECURE_SAVE "/router" #define SAVE_SERVICES DIR_SAVE "/services" + #define SAVE_SNOOP DIR_SECURE_SAVE "/snoop" #define SAVE_SOUL DIR_SAVE "/soul" + #define SAVE_STARGATE DIR_SAVE "/stargate" #define SAVE_UNIQUE DIR_SAVE "/unique" #define SAVE_IMC2 DIR_SAVE "/imc2" diff -c -r --new-file ds2.0r18/lib/secure/lib/bboard.c ds2.0r28/lib/secure/lib/bboard.c *** ds2.0r18/lib/secure/lib/bboard.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/lib/bboard.c Wed Jul 5 00:48:30 2006 *************** *** 0 **** --- 1,274 ---- + /* /lib/bboard.c + * /lib/bboard.c + * from Nightmare 3.3 + * the Dead Souls bulletin board system + * created by Descartes of Borg 940920 + */ + + + #include + #include + #include "include/bboard.h" + + inherit LIB_ITEM; + + static private string __BoardID; + static private string *__EditOK; + static string globalstr, globalfile; + + void create() { + item::create(); + SetNoClean(1); + SetPreventGet("You cannot get that!"); + SetPreventPut("You cannot put that in there!"); + SetPreventDrop("Drop a bulletin board?"); + __EditOK = ({}); + } + + void init() { + item::init(); + add_action("cmd_post", "post"); + add_action("cmd_read", "read"); + add_action("cmd_followup_and_respond", ({ "followup", "respond "})); + add_action("cmd_remove", "remove"); + add_action("cmd_edit", "edit"); + if(!creatorp(this_player())) return; + } + + static private int valid_edit(string author) { + string who; + + who = (string)this_player()->GetKeyName(); + if(who == author) return 1; + if(archp(this_player())) return 1; + if(member_array(who, __EditOK) != -1) return 1; + return (int)master()->valid_apply(({})); + } + + int cmd_post(string str) { + string file; + + if(!str) return notify_fail("You must specify a subject.\n"); + if(file_exists(file = DIR_TMP+"/"+(string)this_player()->GetKeyName())) { + message("system", "You have an abandoned post waiting.",this_player()); + message("system", " e)dit it, or start n)ew", this_player()); + message("prompt", "\nCommand (default 'n'): ", this_player()); + input_to("begin_post", str, file, (: continue_post :)); + } + else begin_post("n", str, file, (: continue_post :)); + return 1; + } + + static void begin_post(string cmd, string subj, string file, function f) { + if(cmd == "" || !cmd) cmd = "n"; + else cmd = cmd[0..0]; + if(cmd != "n" && cmd != "e") { + message("system", "Invalid bulletin board command.", this_player()); + return; + } + if(cmd == "n" && file_exists(file)) rm(file); + (*f)(subj, file); + } + + void continue_post(string subj, string file) { + this_player()->eventEdit(file, (: end_post, subj, 0 :)); + } + + void end_post(string subj, string mail) { + string file, msg; + + file = DIR_TMP "/" + (string)this_player()->GetKeyName(); + if(!(msg = read_file(file))) { + message("system", "No file read!", this_player()); + if(file_exists(file)) rm(file); + return; + } + else rm(file); + if( !mail ) + BBOARD_D->add_post(query_board_id(), + (string)this_player()->GetCapName(), subj, msg); + message("system", "Message posted!", this_player()); + } + + int cmd_read(string str) { + string junk; + mapping *posts; + int x, i, maxi; + + if(str){ + if(str == "board" || sscanf(str,"board %s",junk) ) { + write("To read the first post, type: read 1"); + write("To read the second one: read 2"); + write("And so on."); + return 1; + } + + maxi = sizeof(posts = (mapping *)BBOARD_D->query_posts(query_board_id())); + if(!str) { + for(i=0, x = -1; iGetKeyName(), + posts[i]["read"]) == -1) { + x = i; + break; + } + if(x == -1) return notify_fail("No unread posts.\n"); + } + else if(!(x = to_int(str))) return notify_fail("Read what?\n"); + else x--; + if(x < 0 || x >= sizeof(posts)) + return notify_fail("Invalid post number.\n"); + str = "Post #%^YELLOW%^" + (x+1) + "%^RESET%^ by %^YELLOW%^" + + posts[x]["author"] + "%^RESET%^\nSubject: %^CYAN%^" + + posts[x]["subject"] + "%^RESET%^\n\n"; + str += posts[x]["post"]; + + BBOARD_D->mark_read(query_board_id(),x,(string)this_player()->GetKeyName()); + this_player()->eventPage(explode(str, "\n"), "system"); + return 1; + } + } + + int cmd_followup_and_respond(string str) { + mapping post; + function f; + string file, verb; + int x; + + if(!str) return notify_fail(capitalize(verb=query_verb())+" which + post?\n"); + if((x=to_int(str)) < 1 || + x>(int)BBOARD_D->query_number_posts(query_board_id())) + + return notify_fail("Invalid post number.\n"); + x--; + post = (mapping)BBOARD_D->query_post(query_board_id(), x); + if((verb = query_verb()) == "respond") f = (: continue_mail, post :); + else f = (: continue_followup, post :); + str = post["subject"]; + if(!str) str = "Re: "+possessive_noun(post["author"])+" post"; + else if(strlen(str) <= 4 || str[0..3] != "Re: ") str = "Re: "+str; + if(file_exists(file = DIR_TMP+"/"+(string)this_player()->GetKeyName())) { + message("system", "You have an abandoned post waiting.",this_player()); + message("system", " e)dit it, or start n)ew", this_player()); + message("prompt", "\nCommand (default 'n'): ", this_player()); + input_to("begin_post", str, file, f); + } + else begin_post("n", str, file, f); + return 1; + } + + void continue_followup(mapping post, string subj, string file) { + message("prompt", "\nInclude original text (default 'n'): ",this_player()); + input_to("check_include_text", subj, file, post, 0); + } + + void continue_mail(mapping post, string subj, string file) { + message("prompt", "\nInclude original text (default 'n'): ",this_player()); + input_to("check_include_text", subj, file, post, 1); + } + + static void check_include_text(string ans, string subj, string file, mapping + post, int mail) { + + string msg; + + if(ans == "" || !ans) ans = "n"; + else ans = ans[0..0]; + if(ans == "y") { + msg = post["author"] + " once wrote...\n>"; + msg += implode(explode(post["post"], "\n"), "\n> ")+"\n"; + globalstr = msg; + globalfile = file; + unguarded( (: write_file(globalfile, globalstr) :) ); + } + this_player()->eventEdit(file, (: end_post, subj, (mail ? post : 0) :)); + } + + int cmd_remove(string str) { + mapping post; + int x; + + if((x = to_int(str)) < 1 || + x > (int)BBOARD_D->query_number_posts(query_board_id())) + return notify_fail("Invalid post number.\n"); + post = (mapping)BBOARD_D->query_post(query_board_id(), x-1); + if(!valid_edit(convert_name(post["author"]))) + return notify_fail("You do not have permission to remove that!\n"); + BBOARD_D->remove_post(query_board_id(), x-1); + message("system", "Post "+x+" removed.", this_player()); + return 1; + } + + int cmd_edit(string str) { + mapping post; + string file; + int x; + + if((x = to_int(str)) < 1 || + x > (int)BBOARD_D->query_number_posts(query_board_id())) + return notify_fail("Invalid post number.\n"); + post = (mapping)BBOARD_D->query_post(query_board_id(), x-1); + if(!valid_edit(convert_name(post["author"]))) + return notify_fail("You do not have permission to edit that post!\n"); + file = DIR_TMP+"/"+(string)this_player()->GetKeyName()+".bb"; + if(file_exists(file)) rm(file); + globalstr = post["post"]; + globalfile = file; + unguarded( (: write_file(globalfile, globalstr) :) ); + this_player()->edit(file, (: end_edit, post["subject"], x-1 :) ); + return 1; + } + + void end_edit(string subj, int num) { + string file, msg; + + file = DIR_TMP "/" + (string)this_player()->GetKeyName(); + if(!(msg = read_file(file))) { + message("system", "No file read!", this_player()); + return; + } + else rm(file); + BBOARD_D->remove_post(query_board_id(), num); + BBOARD_D->add_post(query_board_id(), + (string)this_player()->GetCapName(), subj, msg); + message("system", "Message posted!", this_player()); + } + + string GetExternalDesc() { + mapping *posts; + string msg; + int i, maxi; + + msg = item::GetExternalDesc(); + maxi = sizeof(posts = (mapping *)BBOARD_D->query_posts(query_board_id())); + msg += "\n"; + if(!maxi) msg += "There are currently no posts.\n"; + else for(i=0; i < maxi; i++) { + int lu; + + if(!this_player()) lu = 1; + else if(member_array((string)this_player()->GetKeyName(), + posts[i]["read"]) == -1) lu = 0; + else lu = 1; + msg += sprintf("[%:-3d] %s %:-17s \"%:-27s %s\n", + (i+1), (lu ? " " : "(new)"), posts[i]["author"]+":", + posts[i]["subject"]+"\"", query_board_time(posts[i]["time"])); + } + return msg; + } + + void set_board_id(string str) { __BoardID = str; } + + string query_board_id() { return __BoardID; } + + string query_board_time(int x) { + string date, day, mon, year, hour, ret; + + if(sscanf(ctime(x), "%s %s %s %s %s", day, mon, date, hour, year) !=5) + sscanf(ctime(x), "%s %s %s %s %s", day, mon, date, hour, year); + + sscanf(hour, "%s:%s:%*s", hour, ret); + return(hour+ret+" "+day+" "+date+" "+mon); + } + + diff -c -r --new-file ds2.0r18/lib/secure/lib/connect.c ds2.0r28/lib/secure/lib/connect.c *** ds2.0r18/lib/secure/lib/connect.c Tue Mar 28 23:23:41 2006 --- ds2.0r28/lib/secure/lib/connect.c Wed Jul 5 00:01:05 2006 *************** *** 122,134 **** Admin->SetTerminal("ansi"); Admin->save_player(Name); make_workroom(Name); tmp = read_file(CFG_GROUPS); rm(CFG_GROUPS); tmp = replace_string(tmp, "ADMIN", Name); write_file(CFG_GROUPS, tmp); if( ob = find_object(LIB_CONNECT) ) destruct(ob); cp(DIR_SECURE_LIB "/connect.c", DIR_SECURE_LIB "/connect.first"); ! rename(DIR_SECURE_LIB "/connect.real", DIR_SECURE_LIB "/connect.c"); destruct(Admin); mkdir(DIR_CRES "/" + Name[0..0]); rename(DIR_PLAYERS "/" + Name[0..0] + "/" + Name + __SAVE_EXTENSION__, --- 122,149 ---- Admin->SetTerminal("ansi"); Admin->save_player(Name); make_workroom(Name); + PLAYERS_D->AddPlayerInfo(Name); + tmp = read_file(CFG_GROUPS); rm(CFG_GROUPS); tmp = replace_string(tmp, "ADMIN", Name); write_file(CFG_GROUPS, tmp); + + tmp = ""; + + tmp = read_file("/secure/include/config.h"); + + if(sizeof(tmp)){ + rm("/secure/include/config.h"); + tmp = replace_string(tmp, "DEBUG_NAME", Name); + write_file("/secure/include/config.h", tmp); + } + if( ob = find_object(LIB_CONNECT) ) destruct(ob); cp(DIR_SECURE_LIB "/connect.c", DIR_SECURE_LIB "/connect.first"); ! //rename(DIR_SECURE_LIB "/connect.real", DIR_SECURE_LIB "/connect.c"); ! rm(DIR_SECURE_LIB "/connect.c"); ! cp(DIR_SECURE_LIB "/connect.real", DIR_SECURE_LIB "/connect.c"); destruct(Admin); mkdir(DIR_CRES "/" + Name[0..0]); rename(DIR_PLAYERS "/" + Name[0..0] + "/" + Name + __SAVE_EXTENSION__, *************** *** 145,150 **** --- 160,166 ---- else { receive("Mud name unchanged.\n"); } + PLAYERS_D->AddPlayerInfo(Name); shutdown(); destruct(this_object()); diff -c -r --new-file ds2.0r18/lib/secure/lib/connect.first ds2.0r28/lib/secure/lib/connect.first *** ds2.0r18/lib/secure/lib/connect.first Sat Mar 11 21:10:23 2006 --- ds2.0r28/lib/secure/lib/connect.first Wed Jul 5 00:01:05 2006 *************** *** 122,134 **** Admin->SetTerminal("ansi"); Admin->save_player(Name); make_workroom(Name); tmp = read_file(CFG_GROUPS); rm(CFG_GROUPS); tmp = replace_string(tmp, "ADMIN", Name); write_file(CFG_GROUPS, tmp); if( ob = find_object(LIB_CONNECT) ) destruct(ob); cp(DIR_SECURE_LIB "/connect.c", DIR_SECURE_LIB "/connect.first"); ! rename(DIR_SECURE_LIB "/connect.real", DIR_SECURE_LIB "/connect.c"); destruct(Admin); mkdir(DIR_CRES "/" + Name[0..0]); rename(DIR_PLAYERS "/" + Name[0..0] + "/" + Name + __SAVE_EXTENSION__, --- 122,149 ---- Admin->SetTerminal("ansi"); Admin->save_player(Name); make_workroom(Name); + PLAYERS_D->AddPlayerInfo(Name); + tmp = read_file(CFG_GROUPS); rm(CFG_GROUPS); tmp = replace_string(tmp, "ADMIN", Name); write_file(CFG_GROUPS, tmp); + + tmp = ""; + + tmp = read_file("/secure/include/config.h"); + + if(sizeof(tmp)){ + rm("/secure/include/config.h"); + tmp = replace_string(tmp, "DEBUG_NAME", Name); + write_file("/secure/include/config.h", tmp); + } + if( ob = find_object(LIB_CONNECT) ) destruct(ob); cp(DIR_SECURE_LIB "/connect.c", DIR_SECURE_LIB "/connect.first"); ! //rename(DIR_SECURE_LIB "/connect.real", DIR_SECURE_LIB "/connect.c"); ! rm(DIR_SECURE_LIB "/connect.c"); ! cp(DIR_SECURE_LIB "/connect.real", DIR_SECURE_LIB "/connect.c"); destruct(Admin); mkdir(DIR_CRES "/" + Name[0..0]); rename(DIR_PLAYERS "/" + Name[0..0] + "/" + Name + __SAVE_EXTENSION__, *************** *** 139,150 **** tool = load_object("/secure/cmds/admins/admintool"); if(tool) foo = tool->eventChangeName("Dead_Souls_"+Name, 1); if(foo){ ! receive("\n\nMud name changed. Use admintool to customize it."); ! receive("\nFor more info, log in and type: help admintool\n"); } else { ! receive("Mud name unchanged.\n"); } shutdown(); destruct(this_object()); --- 154,166 ---- tool = load_object("/secure/cmds/admins/admintool"); if(tool) foo = tool->eventChangeName("Dead_Souls_"+Name, 1); if(foo){ ! receive("\n\nMud name changed. Use admintool to customize it."); ! receive("\nFor more info, log in and type: help admintool\n"); } else { ! receive("Mud name unchanged.\n"); } + PLAYERS_D->AddPlayerInfo(Name); shutdown(); destruct(this_object()); diff -c -r --new-file ds2.0r18/lib/secure/lib/connect.first.c ds2.0r28/lib/secure/lib/connect.first.c *** ds2.0r18/lib/secure/lib/connect.first.c Tue Mar 28 23:23:41 2006 --- ds2.0r28/lib/secure/lib/connect.first.c Wed Jul 5 00:01:05 2006 *************** *** 122,134 **** Admin->SetTerminal("ansi"); Admin->save_player(Name); make_workroom(Name); tmp = read_file(CFG_GROUPS); rm(CFG_GROUPS); tmp = replace_string(tmp, "ADMIN", Name); write_file(CFG_GROUPS, tmp); if( ob = find_object(LIB_CONNECT) ) destruct(ob); cp(DIR_SECURE_LIB "/connect.c", DIR_SECURE_LIB "/connect.first"); ! rename(DIR_SECURE_LIB "/connect.real", DIR_SECURE_LIB "/connect.c"); destruct(Admin); mkdir(DIR_CRES "/" + Name[0..0]); rename(DIR_PLAYERS "/" + Name[0..0] + "/" + Name + __SAVE_EXTENSION__, --- 122,149 ---- Admin->SetTerminal("ansi"); Admin->save_player(Name); make_workroom(Name); + PLAYERS_D->AddPlayerInfo(Name); + tmp = read_file(CFG_GROUPS); rm(CFG_GROUPS); tmp = replace_string(tmp, "ADMIN", Name); write_file(CFG_GROUPS, tmp); + + tmp = ""; + + tmp = read_file("/secure/include/config.h"); + + if(sizeof(tmp)){ + rm("/secure/include/config.h"); + tmp = replace_string(tmp, "DEBUG_NAME", Name); + write_file("/secure/include/config.h", tmp); + } + if( ob = find_object(LIB_CONNECT) ) destruct(ob); cp(DIR_SECURE_LIB "/connect.c", DIR_SECURE_LIB "/connect.first"); ! //rename(DIR_SECURE_LIB "/connect.real", DIR_SECURE_LIB "/connect.c"); ! rm(DIR_SECURE_LIB "/connect.c"); ! cp(DIR_SECURE_LIB "/connect.real", DIR_SECURE_LIB "/connect.c"); destruct(Admin); mkdir(DIR_CRES "/" + Name[0..0]); rename(DIR_PLAYERS "/" + Name[0..0] + "/" + Name + __SAVE_EXTENSION__, *************** *** 145,150 **** --- 160,166 ---- else { receive("Mud name unchanged.\n"); } + PLAYERS_D->AddPlayerInfo(Name); shutdown(); destruct(this_object()); diff -c -r --new-file ds2.0r18/lib/secure/lib/connect.real ds2.0r28/lib/secure/lib/connect.real *** ds2.0r18/lib/secure/lib/connect.real Fri Mar 24 14:39:55 2006 --- ds2.0r28/lib/secure/lib/connect.real Wed Jul 5 00:01:05 2006 *************** *** 24,29 **** --- 24,31 ---- static private int *Screen; static private int rescue; + int eventCheckPending(string str); + static void create(int binary) { CrackCount = 0; Name = ""; *************** *** 117,123 **** } receive("Password: \n"); input_to((: InputPassword :), I_NOECHO | I_NOESC, name); ! name = ""; } static void InputPassword(string pass, string cap) { --- 119,125 ---- } receive("Password: \n"); input_to((: InputPassword :), I_NOECHO | I_NOESC, name); ! //name = ""; } static void InputPassword(string pass, string cap) { *************** *** 128,133 **** --- 130,141 ---- Destruct(); return; } + if(!cap || cap == "") { + receive("\nAn unusual error has occurred. Please try again.\n"); + Destruct(); + return; + } + control = (string)Player->GetPassword(); if( control != crypt(pass, control) ) { receive("\nInvalid password.\n"); *************** *** 147,152 **** --- 155,163 ---- input_to( (: InputPassword :), I_NOECHO | I_NOESC, cap); return; } + + call_out( (: eventCheckPending, lower_case(Name) :), 3); + if( !NetDead ) eventEnterGame(); else eventReEnterGame(cap); } *************** *** 200,205 **** --- 211,217 ---- if(sizeof(deep_inventory(Player))) deep_inventory(Player)->eventMove(ROOM_FURNACE); log_file("enter", cap + " (exec): " + ctime(time()) + "\n"); Player->eventReconnect(); + SNOOP_D->ReportReconnect(Player->GetKeyName()); } receive("\nProblem reconnecting.\n"); Destruct(); *************** *** 233,239 **** static private void eventEnterGame() { if(!exec(Player, this_object())) { ! //tc("problem connecting"); receive("\nProblem connecting.\n"); Player->eventDestruct(); destruct(this_object()); --- 245,251 ---- static private void eventEnterGame() { if(!exec(Player, this_object())) { ! debug("problem connecting"); receive("\nProblem connecting.\n"); Player->eventDestruct(); destruct(this_object()); *************** *** 246,251 **** --- 258,264 ---- file_size(user_path(Player->GetKeyName())+".profile") > 0){ Player->eventForce("source "+user_path(Player->GetKeyName())+".profile"); } + SNOOP_D->CheckBot(Player->GetKeyName()); //if(!(Player->GetProperty("brand_spanking_new"))) destruct(this_object()); call_out( (: destruct(this_object()) :), 10); *************** *** 320,337 **** static void InputRealName(string rname) { if( !rname || rname == "" ) rname = "Unknown"; Player->SetRealName(rname); ! receive("\n\nYou must now pick a race.\n"); ! receive("Picking a race influences what physical traits your character " ! "will have.\n"); ! receive("\nYou may issue the following commands:\n"); ! receive("\tlist - lists all races from which you can choose\n"); ! receive("\thelp - get help on what races mean\n"); ! receive("\thelp RACE - (e.g. \"help human\") gives you information on " ! "a race\n"); ! receive("\tpick RACE - pick a particular race for yourself\n"); ! receive("\nRace: \n"); ! input_to((: InputRace :), I_NOESC); ! } static void InputRace(string str) { --- 333,352 ---- static void InputRealName(string rname) { if( !rname || rname == "" ) rname = "Unknown"; Player->SetRealName(rname); ! if(!HUMANS_ONLY){ ! receive("\n\nYou must now pick a race.\n"); ! receive("Picking a race influences what physical traits your character " ! "will have.\n"); ! receive("\nYou may issue the following commands:\n"); ! receive("\tlist - lists all races from which you can choose\n"); ! receive("\thelp - get help on what races mean\n"); ! receive("\thelp RACE - (e.g. \"help human\") gives you information on " ! "a race\n"); ! receive("\tpick RACE - pick a particular race for yourself\n"); ! receive("\nRace: \n"); ! input_to((: InputRace :), I_NOESC); ! } ! else InputRace("pick human"); } static void InputRace(string str) { *************** *** 401,416 **** int eventCre(string str){ mixed mixt; - //tc("made it in"); if(AUTO_WIZ == 1){ mixt = load_object("/secure/cmds/admins/encre")->cmd(str); - //tc("mixt: "+identify(mixt)); } destruct(this_object()); - //Destruct(); return 1; } static void cmdPick(string args) { if( !args || args == "" ) { receive("You must specify a race to pick.\n\nRace: \n"); --- 416,443 ---- int eventCre(string str){ mixed mixt; if(AUTO_WIZ == 1){ mixt = load_object("/secure/cmds/admins/encre")->cmd(str); } destruct(this_object()); return 1; } + int eventCheckPending(string str){ + mixed mixt; + if(member_array(lower_case(str),PLAYERS_D->GetPendingEncres()) != -1){ + PLAYERS_D->RemovePendingEncre(lower_case(str)); + mixt = load_object("/secure/cmds/admins/encre")->cmd(str); + } + else if(member_array(lower_case(str),PLAYERS_D->GetPendingDecres()) != -1){ + PLAYERS_D->RemovePendingDecre(lower_case(str)); + mixt = load_object("/secure/cmds/admins/decre")->cmd(str); + } + destruct(this_object()); + return 1; + } + + static void cmdPick(string args) { if( !args || args == "" ) { receive("You must specify a race to pick.\n\nRace: \n"); *************** *** 428,434 **** Player->AddCurrency("silver",random(100)+57); this_player()->SetWimpy(20); this_player()->SetTerminal("ansi"); ! //tc("about to encre: "+Name); call_out( (: eventCre, Name :), 3); eventEnterGame(); } --- 455,461 ---- Player->AddCurrency("silver",random(100)+57); this_player()->SetWimpy(20); this_player()->SetTerminal("ansi"); ! PLAYERS_D->AddPlayerInfo(Name); call_out( (: eventCre, Name :), 3); eventEnterGame(); } *************** *** 504,510 **** int *GetScreen() { if( Screen ) return Screen; ! else return ({ 79, 24 }); } void SetLastError(mapping m) { --- 531,537 ---- int *GetScreen() { if( Screen ) return Screen; ! else return ({ 79, 25 }); } void SetLastError(mapping m) { diff -c -r --new-file ds2.0r18/lib/secure/lib/include/bboard.h ds2.0r28/lib/secure/lib/include/bboard.h *** ds2.0r18/lib/secure/lib/include/bboard.h Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/lib/include/bboard.h Wed Jul 5 00:48:30 2006 *************** *** 0 **** --- 1,25 ---- + #ifndef __BBOARD_H + #define __BBOARD_H + + void create(); + void init(); + static private int valid_edit(string author); + int cmd_post(string str); + static void begin_post(string cmd, string subj, string file, function f); + void continue_post(string subj, string file); + void abort_edit(); + void end_post(string subj, string mail); + int cmd_read(string str); + int cmd_followup_and_respond(string str); + void continue_followup(mapping post, string subj, string file); + void continue_mail(mapping post, string subj, string file); + static void check_include_text(string ans, string subj, string file, mapping post, int mail); + int cmd_eventDestruct(string str); + int cmd_edit(string str); + void end_edit(string subj, int num); + varargs string GetLong(string str); + void set_board_id(string str); + string query_board_id(); + string query_board_time(int x); + + #endif /* __BBOARD_H */ diff -c -r --new-file ds2.0r18/lib/secure/lib/net/include/ftp.h ds2.0r28/lib/secure/lib/net/include/ftp.h *** ds2.0r18/lib/secure/lib/net/include/ftp.h Wed Sep 28 19:34:00 2005 --- ds2.0r28/lib/secure/lib/net/include/ftp.h Wed Jul 5 00:01:15 2006 *************** *** 24,41 **** private void eventCmdRmd(string arg); class ftp_session { ! int connected; ! string user; ! mixed priv; ! string pwd; ! object dataPipe; ! object cmdPipe; ! int idleTime; ! int binary; ! string targetFile; ! string command; ! int filepos; ! string renamefrom; } #define LTYPE_LIST 0 --- 24,41 ---- private void eventCmdRmd(string arg); class ftp_session { ! int connected; ! string user; ! mixed priv; ! string pwd; ! object dataPipe; ! object cmdPipe; ! int idleTime; ! int binary; ! string targetFile; ! string command; ! int filepos; ! string renamefrom; } #define LTYPE_LIST 0 diff -c -r --new-file ds2.0r18/lib/secure/lib/net/server.c ds2.0r28/lib/secure/lib/net/server.c *** ds2.0r18/lib/secure/lib/net/server.c Mon Nov 7 13:33:41 2005 --- ds2.0r28/lib/secure/lib/net/server.c Wed Jul 5 00:01:12 2006 *************** *** 109,114 **** --- 109,115 ---- static int Destruct() { if( daemon::Destruct() ) { foreach(int fd, class server socket in Sockets) { + trr("server:Destruct: fd: "+fd+", "+socket_address(fd),"green"); socket->Owner->evenShutdown(); } eventClose(Listen); *************** *** 136,141 **** --- 137,143 ---- } static void eventServerAbortCallback(int fd) { + trr("server:eventServerAbortCallback: fd: "+fd+", "+socket_address(fd),"green"); eventClose(fd); } *************** *** 150,155 **** --- 152,158 ---- static void eventServerListenCallback(int fd) { int x; + trr("server:eventServerListenCallback: fd: "+fd+", "+socket_address(fd),"green"); x = socket_accept(fd, "eventServerReadCallback", "eventServerWriteCallback"); *************** *** 166,171 **** --- 169,175 ---- static void eventServerReadCallback(int fd, mixed val) { class server s = Sockets[fd]; + trr("server:eventServerReadCallback: fd: "+fd+", "+socket_address(fd),"green"); if( !s || !s->Owner ) { eventClose(fd); return; *************** *** 179,184 **** --- 183,189 ---- class server sock; int x; + trr("server:eventServerWriteCallback: fd: "+fd+", "+socket_address(fd),"green"); if( Listen && Listen->Descriptor == fd ) { sock = Listen; } *************** *** 232,237 **** --- 237,244 ---- class server sock; int fd = owner->GetDescriptor(); + trr("server:eventWrite: fd: "+fd+", "+socket_address(fd),"green"); + if( Listen && Listen->Descriptor == fd ) { sock = Listen; } diff -c -r --new-file ds2.0r18/lib/secure/modules/create.c ds2.0r28/lib/secure/modules/create.c *** ds2.0r18/lib/secure/modules/create.c Fri Mar 24 14:41:23 2006 --- ds2.0r28/lib/secure/modules/create.c Wed Jul 5 00:01:06 2006 *************** *** 14,39 **** int eventDelete(object ob, string value); string global1, global2, globaltmp, globalvalue; ! string *base_arr = ({"SetUnique", "SetNoClean","SetNoModify","SetProperties","SetLong","SetShort","SetItems","SetListen","SetSmell"}); string *item_arr = base_arr + ({"SetLanguage","SetRead","SetDefaultRead","SetDisableChance", "SetDamagePoints", "SetVendorType","SetNoCondition","SetMoney","SetKeyName", "SetId", "SetMass","SetCost","SetValue","SetAdjectives","SetDamagePoints","SetBaseCost" }); string *meal_arr = item_arr + ({ "SetMealType", "SetStrength"}) -({"SetDamagePoints"}); ! string *storage_arr = item_arr + ({"SetMaxCarry","SetInventory", "SetCanClose", "SetCanLock","SetMaxRecurse","SetLocked","SetClosed","SetKey"}); ! string *room_arr = base_arr - ({"SetUnique"}) + ({"SetNoObviousExits","SetDefaultExits","SetTown","SetNightLong","SetDayLong","SetClimate","SetAmbientLight","SetNightLight","SetDayLight","SetObviousExits", "SetInventory", "SetEnters"}); ! string *npc_arr = base_arr - ({"SetItems"}) + ({"SetCustomXP", "SetSpellBook", "SetCanBite", "SetWimpy","SetWimpyCommand","SetPacifist", "SetBodyComposition", "SetSleeping","SetPermitLoad", "SetAutoStand","SetCurrency","SetSkills","SetStats","SetKeyName", "SetId", "SetLevel", "SetRace", "SetClass","SetGender", "SetInventory", "SetHealthPoints","SetMaxHealthPoints", "SetAdjectives", "SetMelee", "SetPosition", "SetWanderSpeed", "SetEncounter", "SetMorality", "SetHeartBeat"}); string *barkeep_arr = npc_arr + ({"SetLocalCurrency","SetMenuItems"}); ! string *trainer_arr = npc_arr + ({"AddTrainingSkills"}); string *vendor_arr = npc_arr + ({"SetLocalCurrency","SetStorageRoom","SetMaxItems","SetVendorType"}); string *armor_arr = item_arr +({"SetRestrictLimbs","SetProtection","SetArmorType"}); string *weapon_arr = item_arr + ({"SetClass","SetWeaponType","SetDamageType","SetHands"}); string *chair_arr = item_arr + ({"SetMaxSitters","SetMaxCarry","SetInventory"}); string *bed_arr = chair_arr + ({"SetMaxLiers"}); string *table_arr = storage_arr + bed_arr; ! string *door_arr = ({"SetLong","SetShort","SetLocked","SetClosed","SetCanLock","SetKey","SetId"}); string *book_arr = item_arr + ({"SetTitle","SetSource"}); string *worn_storage_arr = armor_arr + storage_arr; string *all_arr = storage_arr + door_arr + room_arr + barkeep_arr + armor_arr + weapon_arr + bed_arr +meal_arr + vendor_arr +trainer_arr; string GetSettings(string str){ string ret; string *name = ({}); --- 14,40 ---- int eventDelete(object ob, string value); string global1, global2, globaltmp, globalvalue; ! string *base_arr = ({"set_heart_beat", "SetUnique", "SetNoClean","SetNoModify","SetProperties","SetLong","SetShort","SetItems","SetListen","SetSmell"}); string *item_arr = base_arr + ({"SetLanguage","SetRead","SetDefaultRead","SetDisableChance", "SetDamagePoints", "SetVendorType","SetNoCondition","SetMoney","SetKeyName", "SetId", "SetMass","SetCost","SetValue","SetAdjectives","SetDamagePoints","SetBaseCost" }); string *meal_arr = item_arr + ({ "SetMealType", "SetStrength"}) -({"SetDamagePoints"}); ! string *storage_arr = item_arr + ({"SetOpacity", "SetMaxCarry","SetInventory", "SetCanClose", "SetCanLock","SetMaxRecurse","SetLocked","SetClosed","SetKey"}); ! string *room_arr = base_arr - ({"SetUnique"}) + ({"SetLanguage", "SetRead", "SetDefaultRead", "SetNoObviousExits","SetDefaultExits","SetTown","SetNightLong","SetDayLong","SetClimate","SetAmbientLight","SetNightLight","SetDayLight","SetObviousExits", "SetInventory", "SetEnters"}); ! string *npc_arr = base_arr - ({"SetItems"}) + ({"SetNativeLanguage","SetCustomXP", "SetSpellBook", "SetCanBite", "SetWimpy","SetWimpyCommand","SetPacifist", "SetBodyComposition", "SetSleeping","SetPermitLoad", "SetAutoStand","SetCurrency","SetSkills","SetStats","SetKeyName", "SetId", "SetLevel", "SetRace", "SetClass","SetGender", "SetInventory", "SetHealthPoints","SetMaxHealthPoints", "SetAdjectives", "SetMelee", "SetPosition", "SetWanderSpeed", "SetEncounter", "SetMorality", "SetHeartBeat"}); string *barkeep_arr = npc_arr + ({"SetLocalCurrency","SetMenuItems"}); ! string *trainer_arr = npc_arr + ({"SetNoSpells", "AddTrainingSkills"}); string *vendor_arr = npc_arr + ({"SetLocalCurrency","SetStorageRoom","SetMaxItems","SetVendorType"}); string *armor_arr = item_arr +({"SetRestrictLimbs","SetProtection","SetArmorType"}); string *weapon_arr = item_arr + ({"SetClass","SetWeaponType","SetDamageType","SetHands"}); string *chair_arr = item_arr + ({"SetMaxSitters","SetMaxCarry","SetInventory"}); string *bed_arr = chair_arr + ({"SetMaxLiers"}); string *table_arr = storage_arr + bed_arr; ! string *door_arr = ({"SetHiddenDoor", "SetLong","SetShort","SetLocked","SetClosed","SetCanLock","SetKey","SetId"}); string *book_arr = item_arr + ({"SetTitle","SetSource"}); string *worn_storage_arr = armor_arr + storage_arr; string *all_arr = storage_arr + door_arr + room_arr + barkeep_arr + armor_arr + weapon_arr + bed_arr +meal_arr + vendor_arr +trainer_arr; + string GetSettings(string str){ string ret; string *name = ({}); *************** *** 93,99 **** inheritance = ""; ! if(ob->GetDoor()) { inheritance = "door"; ob = load_object(ob->GetDoor()); } --- 94,100 ---- inheritance = ""; ! if(ob->GetDoor() && sizeof(ob->GetDoor())) { inheritance = "door"; ob = load_object(ob->GetDoor()); } *************** *** 413,418 **** --- 414,421 ---- case "settrainingskills" : out = "AddTrainingSkills";break; case "trainingskills" : out = "AddTrainingSkills";break; case "training" : out = "AddTrainingSkills";break; + case "nospells" : out = "SetNoSpells";break; + case "setnospells" : out = "SetNoSpells";break; case "defaultexits" : out = "SetDefaultExits";break; case "setdefaultexits" : out = "SetDefaultExits";break; case "setnoobviousexits" : out = "SetNoObviousExits";break; *************** *** 421,426 **** --- 424,439 ---- case "setxp" : out = "SetCustomXP";break; case "setcustomxp" : out = "SetCustomXP";break; case "customxp" : out = "SetCustomXP";break; + case "nativelanguage" : out = "SetNativeLanguage";break; + case "setnativelanguage" : out = "SetNativeLanguage";break; + case "heartbeat" : out = "set_heart_beat";break; + case "setheartbeat" : out = "set_heart_beat";break; + case "set_heart_beat" : out = "set_heart_beat";break; + case "heart_beat" : out = "set_heart_beat";break; + case "hiddendoor" : out = "SetHiddenDoor";break; + case "sethiddendoor" : out = "SetHiddenDoor";break; + case "opacity" : out = "SetOpacity";break; + case "setopacity" : out = "SetOpacity";break; default : out = mode; } } *************** *** 533,539 **** return 1; } ! if(grepp(inheritance,"door")){ string cote = this_object()->eventEvaluateDoorSide(ob); if(cote) this_object()->eventProcessDoor(ob, out, value, cote); else this_object()->eventProcessDoor(ob, out, value); --- 546,552 ---- return 1; } ! if(grepp(inheritance,"door") && out != "SetHiddenDoor" ){ string cote = this_object()->eventEvaluateDoorSide(ob); if(cote) this_object()->eventProcessDoor(ob, out, value, cote); else this_object()->eventProcessDoor(ob, out, value); *************** *** 552,563 **** --- 565,578 ---- case "SetShort" : p_array = ({"SetAmbientLight","SetDayLight","SetNightLight","create()","create ()","create"}); break; case "SetHealthPoints" : p_array = ({"SetInventory","SetMaxHealhPoints","SetClass","SetRace","SetLong"});break; case "SetMaxHealthPoints" : p_array = ({"SetInventory","SetHealhPoints","SetClass","SetRace","SetLong"});break; + case "SetNativeLanguage" : p_array = ({"SetRace"});break; case "SetSmell" : p_array = ({"SetItems","SetInventory","SetListen","SetLong","SetDayLong","SetNightLong","SetShort"});break; case "SetListen" : p_array = ({"SetItems","SetInventory","SetSmell","SetLong","SetDayLong","SetNightLong","SetShort"});break; case "SetItems" : p_array = ({"SetAmbientLight","SetDayLight","SetNightLight","create()","create ()","SetShort","SetLong","SetDayLong","SetNightLong"});break; case "SetAmbientLight" : p_array = ({"SetDayLight","SetNightLight","create()","create ()","SetShort","SetLong","SetDayLong","SetNightLong"});break; case "SetDayLight" : p_array = ({"SetAmbientLight","SetNightLight","create()","create ()","SetShort","SetLong","SetDayLong","SetNightLong"});break; case "SetNightLight" : p_array = ({"SetAmbientLight","SetDayLight","create()","create ()","SetShort","SetLong","SetDayLong","SetNightLong"});break; + case "SetHiddenDoor" : p_array = ({ "SetClosed", "SetLocked" }); break; default : p_array = ({"SetItems","SetLong","SetDayLong","SetNightLong","SetShort"}); } *************** *** 585,591 **** --- 600,609 ---- filename = base_name(ob)+".c"; tmpfile = generate_tmp(ob); + + //tc("stack: "+get_stack()); if(!check_privs(this_player(),filename)){ + write("You do not appear to have access to this file. Modification aborted."); return 1; } *************** *** 623,628 **** --- 641,648 ---- string *p_array; mixed mx; filename = base_name(target)+".c"; + + //tc("stack: "+get_stack()); if(!check_privs(this_player(),filename)){ write("You do not appear to have access to this file. Modification aborted."); return 1; *************** *** 643,649 **** --- 663,671 ---- default : p_array = ({"SetLong","SetShort","SetDayLong","SetNightLong"}); } ret = remove_matching_line(read_file(tmpfile),func); + //tc("ret: "+ret,"red"); ret = this_object()->eventAppend(ret,p_array,"\n"+array_string+"\n"); + //tc("ret: "+ret,"green"); globaltmp = ret; unguarded( (: write_file(global2,globaltmp,1) :) ); this_object()->eventGeneralStuff(tmpfile); *************** *** 669,674 **** --- 691,698 ---- map_string = func+"("+map_string+");"; filename = base_name(target)+".c"; + //tc("stack: "+get_stack()); + if(!check_privs(this_player(),filename)){ write("You do not appear to have access to this file. Modification aborted."); return 1; *************** *** 681,687 **** ret = remove_matching_line(read_file(tmpfile),func); switch(func){ case "SetHealthPoints" : p_array = ({"SetInventory","SetMaxHealhPoints","SetClass","SetRace","SetLong"});break; ! case "SetMaxHealthPoints" : p_array = ({"SetInventory","SetHealhPoints","SetClass","SetRace","SetLong"});break; case "SetSmell" : p_array = ({"SetItems","SetInventory","SetListen","SetLong","SetDayLong","SetNightLong","SetShort"});break; case "SetListen" : p_array = ({"SetItems","SetInventory","SetSmell","SetLong","SetDayLong","SetNightLong","SetShort"});break; default : p_array = ({"SetItems","SetLong","SetDayLong","SetNightLong","SetShort"}); --- 705,711 ---- ret = remove_matching_line(read_file(tmpfile),func); switch(func){ case "SetHealthPoints" : p_array = ({"SetInventory","SetMaxHealhPoints","SetClass","SetRace","SetLong"});break; ! case "SetMaxHealthPoints" : p_array = ({"SetClass","SetRace","SetHealthPoints","SetLong"});break; case "SetSmell" : p_array = ({"SetItems","SetInventory","SetListen","SetLong","SetDayLong","SetNightLong","SetShort"});break; case "SetListen" : p_array = ({"SetItems","SetInventory","SetSmell","SetLong","SetDayLong","SetNightLong","SetShort"});break; default : p_array = ({"SetItems","SetLong","SetDayLong","SetNightLong","SetShort"}); *************** *** 707,713 **** int eventAddSettings(object ob, string tmp, mapping NewMap, string func){ string filename, new_lines; ! filename = base_name(ob)+".c"; if(!check_privs(this_player(),filename)){ --- 731,737 ---- int eventAddSettings(object ob, string tmp, mapping NewMap, string func){ string filename, new_lines; ! //tc("stack: "+get_stack()); filename = base_name(ob)+".c"; if(!check_privs(this_player(),filename)){ *************** *** 730,736 **** //else new_lines += func+"(\""+key+"\", 0, \""+val+"\");\n"; //} } ! global1 = this_object()->eventAppend(global1,({func,"SetClass","SetRace","SetLevel","SetItems","SetInventory","SetLong"}),new_lines); unguarded( (: write_file(global2, global1,1) :) ); this_object()->eventGeneralStuff(global2); global1 = filename; --- 754,760 ---- //else new_lines += func+"(\""+key+"\", 0, \""+val+"\");\n"; //} } ! global1 = this_object()->eventAppend(global1,({func,"SetClass","SetRace","SetLevel","SetItems","SetInventory","SetLong", "SetClosed"}),new_lines); unguarded( (: write_file(global2, global1,1) :) ); this_object()->eventGeneralStuff(global2); global1 = filename; diff -c -r --new-file ds2.0r18/lib/secure/modules/file.c ds2.0r28/lib/secure/modules/file.c *** ds2.0r18/lib/secure/modules/file.c Mon Jan 23 08:57:55 2006 --- ds2.0r28/lib/secure/modules/file.c Wed Jul 5 00:01:06 2006 *************** *** 284,289 **** --- 284,292 ---- globalstr = tmpfile; globalstr2 = file; + //if(file == "/lib/std/dummy.c" || file == LIB_DUMMY || (load_object(file) && inherits(LIB_DUMMY, load_object(file))) ) return 0; + //if(file == "/lib/std/dummy.c" ) return 0; + if(file_exists(file) && !check_privs(this_player(),file)){ write("You do not appear to have access to this file. Modification aborted."); return 1; diff -c -r --new-file ds2.0r18/lib/secure/modules/generic.c ds2.0r28/lib/secure/modules/generic.c *** ds2.0r18/lib/secure/modules/generic.c Sat Mar 11 11:19:33 2006 --- ds2.0r28/lib/secure/modules/generic.c Wed Jul 5 00:01:06 2006 *************** *** 66,71 **** --- 66,74 ---- } if(last(filename,2) != ".c") filename += ".c"; + //tc("thing: "+last_string_element(this_player()->query_cwd(),"/"), "red"); + //tc("filename: "+filename); + //tc("check_privs: "+check_privs(this_player(), filename)); if(!this_player()->query_cwd()){ write("You have no current working directory. Please type: cd\nthen try again."); diff -c -r --new-file ds2.0r18/lib/secure/modules/money.c ds2.0r28/lib/secure/modules/money.c *** ds2.0r18/lib/secure/modules/money.c Mon Jan 16 23:00:14 2006 --- ds2.0r28/lib/secure/modules/money.c Wed Jul 5 00:01:06 2006 *************** *** 24,29 **** --- 24,30 ---- globalstr2 = ""; globalstr3 = ""; + if(inherits(LIB_NPC,ob)) npc = 1; if(!intp(val) ) sscanf(val,"%s %d",junk1,amount); *************** *** 66,78 **** this_object()->eventGeneralStuff(globalstr); unguarded( (: cp(globalstr,globalstr3) :) ); unguarded( (: rm(globalstr) :) ); return 1; } int eventModCost(object ob, string type, mixed val){ string new_line, junk; int amount; ! sscanf(val,"%s %d",junk,amount); globalstr = base_name(ob)+".c"; if(!check_privs(this_player(),globalstr)){ write("You do not appear to have access to this file. Modification aborted."); --- 67,82 ---- this_object()->eventGeneralStuff(globalstr); unguarded( (: cp(globalstr,globalstr3) :) ); unguarded( (: rm(globalstr) :) ); + reload(ob); return 1; } int eventModCost(object ob, string type, mixed val){ string new_line, junk; int amount; ! ! if(stringp(val)) sscanf(val,"%s %d",junk,amount); ! else amount = val; globalstr = base_name(ob)+".c"; if(!check_privs(this_player(),globalstr)){ write("You do not appear to have access to this file. Modification aborted."); *************** *** 94,99 **** --- 98,105 ---- unguarded( (: write_file(globalstr, globalstr2, 1) :) ); this_object()->eventGeneralStuff(globalstr); + reload(ob); + return 1; } diff -c -r --new-file ds2.0r18/lib/secure/modules/room.c ds2.0r28/lib/secure/modules/room.c *** ds2.0r18/lib/secure/modules/room.c Fri Mar 24 14:41:23 2006 --- ds2.0r28/lib/secure/modules/room.c Wed Jul 5 00:01:06 2006 *************** *** 15,21 **** mixed make(string str) { int enter; - string *dir_array; string *exits; string *enters; string foo, current_dir, current_room, this_room, new_room, room_dir; --- 15,20 ---- *************** *** 37,45 **** room = environment(this_player()); current_dir = this_player()->query_cwd(); current_room = base_name(room); ! dir_array = explode(current_room, "/"); ! dir_array -= ({ dir_array[sizeof(dir_array) - 1] }); ! room_dir = "/"+implode(dir_array,"/"); if(file_exists(current_room+".c") && !check_privs(this_player(),current_room+".c")){ --- 36,42 ---- room = environment(this_player()); current_dir = this_player()->query_cwd(); current_room = base_name(room); ! room_dir = path_prefix(current_room); if(file_exists(current_room+".c") && !check_privs(this_player(),current_room+".c")){ *************** *** 83,89 **** } if(strsrch(arg2,".c") == -1) arg2 += ".c"; ! if(strsrch(arg2," ") != -1) arg2 = replace_string(arg2," ",""); if(file_exists(arg2)) new_file = arg2; else if(strsrch(arg2,"./") != -1) { --- 80,86 ---- } if(strsrch(arg2,".c") == -1) arg2 += ".c"; ! if(strsrch(arg2," ") != -1) arg2 = replace_string(arg2," ","_"); if(file_exists(arg2)) new_file = arg2; else if(strsrch(arg2,"./") != -1) { *************** *** 111,117 **** return 1; } ! if(new_file[0..7] == "/realms/" && strsrch(new_file,"/area/") != -1){ if(!file_exists(new_file)) cp("/obj/area_room.c",new_file); } else { --- 108,114 ---- return 1; } ! if(new_file[0..7] == "/realms/" && strsrch(new_file,"/area/room/") != -1){ if(!file_exists(new_file)) cp("/obj/area_room.c",new_file); } else { *************** *** 386,394 **** if(remote && member_array("out",load_object(room)->GetExits()) != -1) return 0; ! globaltmp = remove_matching_line(globaltmp,"SetObviousExits",1); ! globaltmp = remove_matching_line(globaltmp,"SetExits",1); ! globaltmp = remove_matching_line(globaltmp,"SetDoor",1); globaltmp = remove_matching_line(globaltmp,"SetEnters",1); globaltmp = remove_matching_line(globaltmp,"//extras",1); //tc("remote: "+remote,"yellow"); --- 383,391 ---- if(remote && member_array("out",load_object(room)->GetExits()) != -1) return 0; ! //globaltmp = remove_matching_line(globaltmp,"SetObviousExits",1); ! //globaltmp = remove_matching_line(globaltmp,"SetExits",1); ! //globaltmp = remove_matching_line(globaltmp,"SetDoor",1); globaltmp = remove_matching_line(globaltmp,"SetEnters",1); globaltmp = remove_matching_line(globaltmp,"//extras",1); //tc("remote: "+remote,"yellow"); diff -c -r --new-file ds2.0r18/lib/secure/npc/drone.c ds2.0r28/lib/secure/npc/drone.c *** ds2.0r18/lib/secure/npc/drone.c Mon Nov 7 13:32:08 2005 --- ds2.0r28/lib/secure/npc/drone.c Wed Jul 5 00:01:06 2006 *************** *** 3,19 **** #include #include "/daemon/include/races.h" ! int eventReceiveCommand(string butt); int SetOwner(string hole); string GetOwner(); int ListenUp(int foo); int itemcheck,listening; mixed arguments; string owner, mm, vv, printvar,owner; ! string mensaje, clase_mensaje,desc; object dude,ww, ownerob; void doPrint(string str1, string str2); int doCheckLiving(object ob){ if(living(ob) && ob->GetInvis() !=1){ if(file_name(ob) != file_name(this_object()) ) --- 3,35 ---- #include #include "/daemon/include/races.h" ! int eventReceiveCommand(string butt, string munch); int SetOwner(string hole); string GetOwner(); int ListenUp(int foo); int itemcheck,listening; mixed arguments; string owner, mm, vv, printvar,owner; ! string mensaje, clase_mensaje,desc,control_code; object dude,ww, ownerob; void doPrint(string str1, string str2); + void validate(){ + //tc("control code: "+control_code,"green"); + //tc(" previous_object()->GetControlCode(): "+ previous_object()->GetControlCode(),"red"); + //tc("hmm. previous_object: "+identify(previous_object(-1))); + if(base_name(previous_object()) != "/secure/obj/control" || + previous_object()->GetControlCode() != control_code){ + if(ownerob){ + tell_object(ownerob,"%^RED%^Security violation. Someone is attempting to "+ + "hijack your drone. Guilty object stack: %^YELLOW%^"+ + identify(previous_object(-1))+"%^RESET%^"); + } + error("Illegal control attempt by: "+identify(previous_object(-1))+", "+get_stack()); + } + return; + } + int doCheckLiving(object ob){ if(living(ob) && ob->GetInvis() !=1){ if(file_name(ob) != file_name(this_object()) ) *************** *** 45,53 **** --- 61,71 ---- this_object()->set_heart_beat(1); this_object()->SetNoClean(1); } + void receive_message(string s1, string s2){ if(ownerob && listening) tell_object(ownerob,"Remote: "+s2); } + varargs mixed eventHearTalk(object who, object target, int cls, string verb, string msg, string lang) { ww=who; *************** *** 57,62 **** --- 75,81 ---- this_object()->receive_message("me",ww->GetName()+" "+vv+"s: "+mm) ; return; } + varargs int doPrint(string msg, string msg_class){ printvar=msg; this_object()->receive_message("me again",printvar) ; *************** *** 74,89 **** dude=this_object()->GetShadowedObject(); arguments = args; //dude->eDE(arguments) ; ! unguarded((: tell_object(ownerob,this_object()->eDE()) :)); return 1; } int eventReceiveCommand(string str){ string thing; if(!query_heart_beat(this_object())) this_object()->set_heart_beat(1); if(ownerob && str != "look" && str != "l") this_object()->eventForce(str); else if(ownerob){ ! tell_object(ownerob,"This is where the env dsc comes in."); unguarded((: this_object()->eventDescribeEnvironment() :)) ; //ownerob->eventPrint(this_object()->eventDescribeEnvironment(this_object())) ; } --- 93,111 ---- dude=this_object()->GetShadowedObject(); arguments = args; //dude->eDE(arguments) ; ! unguarded((: tell_object(ownerob,this_object()->eDE()+"\n") :)); return 1; } int eventReceiveCommand(string str){ string thing; + + validate(); + if(!query_heart_beat(this_object())) this_object()->set_heart_beat(1); if(ownerob && str != "look" && str != "l") this_object()->eventForce(str); else if(ownerob){ ! //tell_object(ownerob,"This is where the env dsc comes in."); unguarded((: this_object()->eventDescribeEnvironment() :)) ; //ownerob->eventPrint(this_object()->eventDescribeEnvironment(this_object())) ; } *************** *** 92,97 **** --- 114,130 ---- } int SetOwner(string str){ + //tc("control code: "+control_code,"blue"); + if(sizeof(owner) && this_object()->GetOwner() != "NONE") { + validate(); + } + if(str == "NONE") { + control_code = ""; + owner = "NONE"; + ownerob = 0; + listening = 0; + return 1; + } owner=str; ownerob=find_player(owner); listening=1; *************** *** 105,110 **** --- 138,156 ---- } + int SetControlCode(string str){ + if(sizeof(control_code) && GetOwner() != "NONE" ){ + if(ownerob){ + tell_object(ownerob,"%^RED%^Security violation. Someone is attempting to " + "hijack your drone. Guilty object stack: %^YELLOW%^"+ + identify(previous_object(-1))+"%^RESET%^"); + } + error("Illegal control attempt by: "+identify(previous_object(-1))+", "+get_stack()); + } + else control_code = str; + return 1; + } + string eDE(int brief) { object env; object *invarr; diff -c -r --new-file ds2.0r18/lib/secure/obj/arch_board.c ds2.0r28/lib/secure/obj/arch_board.c *** ds2.0r18/lib/secure/obj/arch_board.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/obj/arch_board.c Wed Jul 5 00:48:30 2006 *************** *** 0 **** --- 1,83 ---- + #include + #include + + inherit LIB_SECURE_BOARD; + + void create(){ + ::create(); + + SetKeyName("chalkboard"); + SetId(({ "board", "chalkboard" })); + set_board_id("admin_board"); + SetShort("The Arch Board"); + SetLong("This is the Arch board. You know how to use it."); + } + + void init(){ + ::init(); + } + + void validate(){ + if( !this_player() || !archp(this_player()) ) + error("Illegal attempt to access arch board: "+get_stack()+" "+identify(previous_object(-1))); + } + + int cmd_read(string str) { + validate(); + return ::cmd_read(str); + } + + int cmd_post(string str) { + validate(); + return ::cmd_post(str); + } + + void continue_post(string subj, string file) { + validate(); + return ::continue_post(subj, file); + } + + void end_post(string subj, string mail) { + validate(); + return ::end_post(subj, mail); + } + + int cmd_followup_and_respond(string str) { + validate(); + return ::cmd_followup_and_respond(str); + } + + + void continue_followup(mapping post, string subj, string file) { + validate(); + return ::continue_followup(post, subj, file); + } + + void continue_mail(mapping post, string subj, string file) { + validate(); + return ::continue_mail(post, subj, file); + } + + int cmd_remove(string str){ + validate(); + return ::cmd_remove(str); + } + + int cmd_edit(string str){ + validate(); + return ::cmd_edit(str); + } + + void end_edit(string subj, int num) { + validate(); + return ::end_edit(subj, num); + } + + string GetExternalDesc() { + validate(); + return ::GetExternalDesc(); + } + + + + diff -c -r --new-file ds2.0r18/lib/secure/obj/control.c ds2.0r28/lib/secure/obj/control.c *** ds2.0r18/lib/secure/obj/control.c Mon Jan 23 08:57:55 2006 --- ds2.0r28/lib/secure/obj/control.c Wed Jul 5 00:01:06 2006 *************** *** 6,12 **** #include inherit LIB_ITEM; int controlling; ! string remote; void create(){ ::create(); SetKeyName("remote control"); --- 6,14 ---- #include inherit LIB_ITEM; int controlling; ! string remote, control_code; ! object owner; ! void create(){ ::create(); SetKeyName("remote control"); *************** *** 25,37 **** --- 27,45 ---- SetMass(20); SetValue(10); SetVendorType(VT_TREASURE); + control_code = alpha_crypt(16); } + void init(){ ::init(); + if(living(environment())) owner = environment(); + else owner = 0; + //tc("control code: "+control_code); add_action("control","control"); add_action("release","release"); add_action("do_control","]"); } + int control(string str){ object ob; string *eyedees; *************** *** 43,53 **** write("There is no such thing to be controlled here."); return 1; } if(!living(ob)){ write(capitalize(ob->GetKeyName())+" is not a living thing."); return 1; } ! if(strsrch(base_name(ob),"secure") > -1 ){ write(ob->GetName()+" is not controllable with this device."); say(this_player()->GetName()+" tries to establish control over "+ob->GetName()+" and fails.\n"); return 1; --- 51,72 ---- write("There is no such thing to be controlled here."); return 1; } + + if(!creatorp(this_player()) && !present("visitor pass",this_player())){ + write("Your puny mortal mind can't wrap itself around the use " + "of this powerful instrument."); + log_file("adm/control",capitalize(this_player()->GetKeyName())+ + " attempted to use the remote control on "+str+": "+timestamp()+"\n"); + tell_creators("SECURITY: "+capitalize(this_player()->GetKeyName())+ + " attempted to use the remote control on "+str+"."); + return 1; + } + if(!living(ob)){ write(capitalize(ob->GetKeyName())+" is not a living thing."); return 1; } ! if(!strsrch(base_name(ob),"/secure") ){ write(ob->GetName()+" is not controllable with this device."); say(this_player()->GetName()+" tries to establish control over "+ob->GetName()+" and fails.\n"); return 1; *************** *** 56,107 **** write("Your remote control is busy controlling some other creature."); return 1; } ! if(ob->QueryDrone()) { ! string schmowner; ! schmowner = ob->GetOwner(); ! if(schmowner != "NOBODY" && schmowner != this_player()->GetKeyName()){ ! write("This drone is not yours to control."); ! return 1; ! } ! remote=file_name(ob); ! ob->SetOwner(this_player()->GetKeyName()); ! ob->SetListen(1); ! } ! else { ! ! new("/shadows/drone")->eventShadow(ob); ! remote=file_name(ob); ! ob->SetOwner(this_player()->GetKeyName()); ! ob->SetListen(1); ! eyedees = ob->GetId(); ! eyedees += ({"servant","drone","thrall"}); ! ob->SetId(eyedees); } write("You establish a remote control connection with "+capitalize(str)+"."); say(this_player()->GetName()+" establishes a control link with "+capitalize(str)+"."); controlling=1; return 1; } int do_control(string str){ object obj; if(!controlling){ write("You are not currently linked to any living thing."); return 1; } obj=find_object(remote); if(obj) obj->eventReceiveCommand(str); ! else write("There seems to be a problem."); return 1; } int release(){ object dingus; if(remote && dingus=find_object(remote) ){ ! dingus->SetOwner("NOBODY"); ! dingus->SetListen(0); } controlling=0; write("You release your remote link."); return 1; } --- 75,142 ---- write("Your remote control is busy controlling some other creature."); return 1; } ! ! if(ob->GetOwner() && ob->GetOwner() != "NONE"){ ! write("That creature is already in someone's thrall."); ! return 1; } + if(!(ob->GetOwner())) new("/shadows/drone")->eventShadow(ob); + remote=file_name(ob); + ob->SetOwner(this_player()->GetKeyName()); + ob->SetListen(1); + ob->SetControlCode(control_code); + eyedees = ob->GetId(); + eyedees += ({"servant","drone","thrall"}); + ob->SetId(eyedees); + write("You establish a remote control connection with "+capitalize(str)+"."); say(this_player()->GetName()+" establishes a control link with "+capitalize(str)+"."); controlling=1; return 1; } + int do_control(string str){ object obj; + if(!controlling){ write("You are not currently linked to any living thing."); return 1; } + + if(!str || str == ""){ + write("Nothing happens."); + return 1; + } + + if(environment() != owner){ + write("You don't seem to be in possession of the remote control."); + tell_object(environment(),"Possible security violation on remote control."); + error("Illegal access of remote control: "+get_stack()+" "+identify(previous_object(-1))); + return 1; + } + obj=find_object(remote); if(obj) obj->eventReceiveCommand(str); ! else { ! write("There seems to be a problem."); ! this_object()->release(); ! } return 1; } int release(){ object dingus; if(remote && dingus=find_object(remote) ){ ! dingus->SetOwner("NONE"); } controlling=0; write("You release your remote link."); return 1; } + + string GetControlCode(){ + //tc("previous object: "+identify(previous_object()),"white"); + if(base_name(previous_object()) != "/shadows/drone") return alpha_crypt(16); + else return control_code; + } diff -c -r --new-file ds2.0r18/lib/secure/obj/glasses.c ds2.0r28/lib/secure/obj/glasses.c *** ds2.0r18/lib/secure/obj/glasses.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/obj/glasses.c Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,34 ---- + #include + #include + #include + #include + + inherit LIB_ARMOR; + inherit MODULES_ARMOR; + inherit MODULES_CREATE; + inherit MODULES_MAPPING; + inherit MODULES_GENERIC; + inherit MODULES_ROOM; + inherit MODULES_FILE; + inherit MODULES_MONEY; + inherit MODULES_READ; + inherit MODULES_DOOR; + + static void create(){ + armor::create(); + SetKeyName("glasses"); + SetId(({"tanstaafl"})); + SetAdjectives(({"wire-rimmed", "wire rimmed"})); + SetShort("wire-rimmed glasses"); + SetLong("A pair of glasses with magic properties for Creators."); + SetMass(5); + SetBaseCost("silver",30); + SetDamagePoints(1); + SetProtection(BLUNT,1); + SetProtection(BLADE,1); + SetProtection(KNIFE,1); + SetArmorType(A_VISOR); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/secure/obj/meditate_mojo.c ds2.0r28/lib/secure/obj/meditate_mojo.c *** ds2.0r18/lib/secure/obj/meditate_mojo.c Mon Nov 7 13:32:08 2005 --- ds2.0r28/lib/secure/obj/meditate_mojo.c Wed Jul 5 00:01:06 2006 *************** *** 37,68 **** } int damage1(){ ! victim->AddStaminaPoints(random(5)+1); return 1; } int damage2(){ ! victim->AddHP(random(2)+1); ! victim->AddStaminaPoints(random(5)+1); return 1; } int damage3(){ ! victim->AddHP(random(3)+1); ! victim->AddStaminaPoints(random(5)+1); return 1; } int damage4(){ ! victim->AddHP(random(4)+1); ! victim->AddStaminaPoints(random(5)+1); return 1; } void heart_beat(){ ! if(!living(environment())) this_object()->eventDestruct(); if(counter == 50){ ! tell_object(environment(),"You feel the effects of your meditation wear off."); this_object()->eventMove("/domains/town/room/furnace"); } --- 37,68 ---- } int damage1(){ ! if(victim) victim->AddStaminaPoints(random(5)+1); return 1; } int damage2(){ ! if(victim) victim->AddHP(random(2)+1); ! if(victim) victim->AddStaminaPoints(random(5)+1); return 1; } int damage3(){ ! if(victim) victim->AddHP(random(3)+1); ! if(victim) victim->AddStaminaPoints(random(5)+1); return 1; } int damage4(){ ! if(victim) victim->AddHP(random(4)+1); ! if(victim) victim->AddStaminaPoints(random(5)+1); return 1; } void heart_beat(){ ! if(environment() && !living(environment())) this_object()->eventDestruct(); if(counter == 50){ ! if(environment()) tell_object(environment(),"You feel the effects of your meditation wear off."); this_object()->eventMove("/domains/town/room/furnace"); } diff -c -r --new-file ds2.0r18/lib/secure/obj/medtric.c ds2.0r28/lib/secure/obj/medtric.c *** ds2.0r18/lib/secure/obj/medtric.c Sun Jan 29 11:23:40 2006 --- ds2.0r28/lib/secure/obj/medtric.c Wed Jul 5 00:01:06 2006 *************** *** 93,107 **** write("You are not holding the tricorder."); return 2; } ! if(!creatorp(scanner) && !present("testchar badge",scanner)){ ! write("You are not authorized to use this device."); say(scanner->GetName()+" fumbles with a medical tricorder.",scanner); return 2; } say(scanner->GetName()+" operates a medical tricorder.",scanner); write("The tricorder makes a low, warbling sound."); return 1; } int posture(int i){ allowed=preAction(); if(allowed == 2) return 1; --- 93,114 ---- write("You are not holding the tricorder."); return 2; } ! if(!creatorp(scanner) && !present("visitor pass",scanner)){ ! write("Your puny mortal mind can't wrap itself around the use " ! "of this powerful instrument."); ! log_file("adm/tricorder",capitalize(this_player()->GetKeyName())+ ! " attempted to use the medical tricorder: "+timestamp()+"\n"); ! tell_creators("SECURITY: "+capitalize(this_player()->GetKeyName())+ ! " attempted to use the medical tricorder."); say(scanner->GetName()+" fumbles with a medical tricorder.",scanner); return 2; } + say(scanner->GetName()+" operates a medical tricorder.",scanner); write("The tricorder makes a low, warbling sound."); return 1; } + int posture(int i){ allowed=preAction(); if(allowed == 2) return 1; *************** *** 1104,1109 **** --- 1111,1117 ---- if(!str || str=="" || str=="here") { ob = environment(this_player()); name = ob->GetShort(); + str = base_name(ob); } if(str == "me") str = this_player()->GetKeyName(); if(present(str,this_player())) { diff -c -r --new-file ds2.0r18/lib/secure/obj/mojo.c ds2.0r28/lib/secure/obj/mojo.c *** ds2.0r18/lib/secure/obj/mojo.c Mon Nov 7 13:32:08 2005 --- ds2.0r28/lib/secure/obj/mojo.c Wed Jul 5 00:01:06 2006 *************** *** 37,65 **** } int damage1(){ ! if( victim->GetStaminaPoints() < 50) victim->AddStaminaPoints(random(5)+1); return 1; } int damage2(){ ! victim->AddHP(1); return 1; } int damage3(){ ! victim->AddHP(2); return 1; } int damage4(){ ! victim->AddHP(3); return 1; } void heart_beat(){ ! if(!living(environment())) this_object()->eventDestruct(); ! if(counter == 50){ ! tell_object(environment(),"You feel the effects of the healing salve wear off."); this_object()->eventMove("/domains/town/room/furnace"); } --- 37,65 ---- } int damage1(){ ! if( victim && victim->GetStaminaPoints() < 50) victim->AddStaminaPoints(random(5)+1); return 1; } int damage2(){ ! if(victim) victim->AddHP(1); return 1; } int damage3(){ ! if(victim) victim->AddHP(2); return 1; } int damage4(){ ! if(victim) victim->AddHP(3); return 1; } void heart_beat(){ ! if(environment() && !living(environment())) this_object()->eventDestruct(); ! if(counter == 100){ ! if(environment()) tell_object(environment(),"You feel the effects of the healing salve wear off."); this_object()->eventMove("/domains/town/room/furnace"); } diff -c -r --new-file ds2.0r18/lib/secure/obj/replacer.c ds2.0r28/lib/secure/obj/replacer.c *** ds2.0r18/lib/secure/obj/replacer.c Mon Nov 7 13:32:08 2005 --- ds2.0r28/lib/secure/obj/replacer.c Wed Jul 5 00:01:06 2006 *************** *** 8,13 **** --- 8,20 ---- string a1,a2,a3,line; int n, active; + + static private void validate() { + if(!this_player()) return 0; + if( !((int)master()->valid_apply(({ "SECURE" }))) || !securep(this_player())) + error("Illegal attempt to use replacer: "+get_stack()+" "+identify(previous_object(-1))); + } + void create(){ ::create(); SetKeyName("string replacer"); *************** *** 21,38 **** "To replace a word in EVERY FILE IN YOUR CURRENT WORKING DIRECTORY:\n autorep \n\n"+ "It does not handle spaces or special characters well. Using "+ "strings with parentheses, brackets, or anything other than "+ ! "the english alphabet may have unexpected results."); SetMass(20); SetValue(10); SetVendorType(VT_TREASURE); active = 0; } void init(){ add_action("rep_string","replace"); add_action("autorep","autorep"); } int eventActivate(){ write("With an unearthly roar, the string replacer comes "+ "to life. You sense great danger."); write("\n\nWARNING: Your current working directory is:\n\n"); --- 28,48 ---- "To replace a word in EVERY FILE IN YOUR CURRENT WORKING DIRECTORY:\n autorep \n\n"+ "It does not handle spaces or special characters well. Using "+ "strings with parentheses, brackets, or anything other than "+ ! "the english alphabet may have unexpected results."+ ! "\n%^RED%^%^BOLD%^ADMIN USE ONLY!%^RESET%^"); SetMass(20); SetValue(10); SetVendorType(VT_TREASURE); active = 0; } + void init(){ add_action("rep_string","replace"); add_action("autorep","autorep"); } int eventActivate(){ + validate(); write("With an unearthly roar, the string replacer comes "+ "to life. You sense great danger."); write("\n\nWARNING: Your current working directory is:\n\n"); *************** *** 45,50 **** --- 55,61 ---- } int eventDeactivate(){ + validate(); write("The string replacer powers off with a peculiar "+ "mechanical whine. You feel safer."); say(this_player()->GetName()+"'s string replacer "+ *************** *** 54,59 **** --- 65,71 ---- } varargs mixed eventTurn(string str){ + validate(); if( this_player() != environment() ) { write("You don't have that."); return 0; } write("You turn the replacer over in your hands."); say(this_player()->GetKeyName()+" turns over a string replacer in "+possessive(this_player())+" hands."); *************** *** 61,66 **** --- 73,79 ---- } int eventTurnOn(object ob){ + validate(); if( this_player() != environment() ) { write("You don't have that."); return 0; } *************** *** 79,84 **** --- 92,98 ---- } varargs mixed eventTurnOff(string str){ + validate(); if( this_player() != environment() ) { write("You don't have that."); return 0; } if(!active){ write("It's already off."); *************** *** 93,98 **** --- 107,113 ---- string dir, a1, a2; string *listing; + validate(); if(!active){ write("The string replacer is not turned on."); return 1; *************** *** 116,121 **** --- 131,137 ---- string dir,file,tempfile,backup; int valid_line; + validate(); if(!active){ write("The string replacer is not turned on."); return 1; *************** *** 147,153 **** line=read_file(file, n, 1); if(!line || line=="") valid_line=0; this_object()->replace(line); ! write_file(tempfile,line); n++; } cp(file, backup); --- 163,169 ---- line=read_file(file, n, 1); if(!line || line=="") valid_line=0; this_object()->replace(line); ! if(line) write_file(tempfile,line); n++; } cp(file, backup); *************** *** 162,173 **** eventDeactivate(); return 1; } int replace(string str){ string s1,s2; ! if(sscanf(str,"%s"+a2+"%s",s1,s2)>1){ line=s1+a3+s2; write("Found string in line "+n+". Replacing with: "+a3+".\n"); this_object()->replace(line); } return 1; } --- 178,192 ---- eventDeactivate(); return 1; } + int replace(string str){ string s1,s2; ! validate(); ! if(sizeof(str) && sscanf(str,"%s"+a2+"%s",s1,s2)>1){ line=s1+a3+s2; write("Found string in line "+n+". Replacing with: "+a3+".\n"); this_object()->replace(line); } + //tc("line: "+line); return 1; } diff -c -r --new-file ds2.0r18/lib/secure/obj/snooper.c ds2.0r28/lib/secure/obj/snooper.c *** ds2.0r18/lib/secure/obj/snooper.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/obj/snooper.c Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,91 ---- + #include + #include + #include + #include + inherit LIB_ITEM; + + string guy, stringy; + int seconds; + object ob; + + void create(){ + item::create(); + + SetKeyName("snooper object"); + SetId( ({"thing","item","thang","dingus","snooper","object"}) ); + SetAdjectives( ({"invisible","snooper","snoop"}) ); + SetShort("an invisible object"); + SetLong("This is an object of indeterminate nature and proportions. " + "It is intentionally invisible, and your attempts to " + "understand it may constitute a security breach. You'd " + "be well advised to leave it alone."); + SetInvis(1); + set_heart_beat(10); + SetNoClean(1); + SNOOP_D->RegisterSnooper(); + } + + void init(){ + ::init(); + } + + void stamp_time(){ + seconds = time(); + write_file("/secure/log/adm/"+guy+".log","\n"+timestamp()+"\n"); + } + + void heart_beat(){ + object dude; + if(!guy || !(dude = find_player(guy))) { + //tc("I can't find "+guy); + eventDestruct(); + } + if(dude && environment(dude) && base_name(environment(dude)) == ROOM_FREEZER) eventDestruct(); + if(time() - seconds > 600 ) stamp_time(); + } + + void receive_snoop(string str){ + stringy = str; + unguarded((: write_file("/secure/log/adm/"+guy+".log",guy+" "+timestamp()+": "+stringy) :)); + SNOOP_D->GetSnoop(guy, stringy); + if( file_size("/secure/log/adm/"+guy+".log") > 200000) { + rename("/secure/log/adm/"+guy+".log", "/secure/log/bak/"+guy+"."+time()); + } + } + + int eventStartSnoop(string str){ + string snoopee; + if(!str || str == "") return 0; + //tc("thingy: "+str); + snoopee = "nobody"; + str = lower_case(str); + guy = str; + + if(!ob=find_player(str)) { write("Target not found."); return; } + unguarded((: write_file("/secure/log/adm/snoop.err",snoop(this_object(), ob)?"":guy+": snoop failed.\n") :)); + if(query_snooping(this_object())) snoopee = identify(query_snooping(this_object())); + //tc("I am: "+identify(this_object())+", and I am snooping: "+snoopee); + SNOOP_D->RegisterSnooper(); + write_file("/secure/log/adm/"+str+".log","\nNEW SESSION: "+timestamp()+"\n"); + return 1; + } + + void receive_message(string s1, string s2){ + stringy = s2; + unguarded((: write_file("/secure/log/adm/"+guy+".log",guy+": "+stringy) :)); + SNOOP_D->GetSnoop(guy, stringy); + } + + int eventDestruct(){ + if(base_name(previous_object()) != SNOOP_D && !archp(previous_object(2)) && + previous_object() != this_object()) return 0; + SNOOP_D->UnregisterSnooper(); + return item::eventDestruct(); + } + + string GetSnooped(){ + //debug("I am snooping ",guy,"green"); + if( !((int)master()->valid_apply(({ "PRIV_ASSIST", "PRIV_SECURE", "SNOOP_D" }))) ) return ""; + else return guy; + //return guy; + } diff -c -r --new-file ds2.0r18/lib/secure/obj/staff.c ds2.0r28/lib/secure/obj/staff.c *** ds2.0r18/lib/secure/obj/staff.c Mon Jan 23 08:57:55 2006 --- ds2.0r28/lib/secure/obj/staff.c Wed Jul 5 00:01:06 2006 *************** *** 39,41 **** --- 39,43 ---- void init(){ ::init(); } + + int CanSell() { return 0; } diff -c -r --new-file ds2.0r18/lib/secure/room/arch.c ds2.0r28/lib/secure/room/arch.c *** ds2.0r18/lib/secure/room/arch.c Sat Mar 11 11:20:02 2006 --- ds2.0r28/lib/secure/room/arch.c Wed Jul 5 00:48:30 2006 *************** *** 100,110 **** } string LongDesc(){ ! string desc = "This is a polished, antiseptic room composed of some "+ ! "white, gleaming material. There is a viewscreen on a wall here, "+ "with a control panel alonside it. "+ ! "There is a shimmering portal "+ ! "on the north wall. A long printout hangs from the panel."; desc += "\nA sign on the wall reads: "+SignRead(); return desc; } --- 100,110 ---- } string LongDesc(){ ! string desc = "This is a polished antiseptic room composed of some "+ ! "white gleaming material. There is a viewscreen on a wall here, "+ "with a control panel alonside it. "+ ! "A long printout hangs from the panel." ! "\nThe network troubleshooting room is down from here."; desc += "\nA sign on the wall reads: "+SignRead(); return desc; } *************** *** 140,145 **** --- 140,151 ---- "appears to be an identification plate of some sort, designed " "to accomodate a human hand.", "portal" : "A portal to another place." ]) ); + SetExits( ([ + "north" : "/domains/default/room/wiz_hall", + "down" : "/secure/room/network.c", + ]) ); + SetEnters( ([ + ]) ); SetProperties(([ "no peer" : 1, ])); *************** *** 147,169 **** SetRead("printout", (: eventReadPrintout :) ); SetRead("sign", (: SignRead :) ); - SetExits( ([ - "north" : "/domains/default/room/wiz_hall.c", - ]) ); SetListen("default", "You can faintly hear a low hum coming from the walls."); SetListen( ({"wall","walls"}), "You hear a low throbbing sound, as if from machinery."); ! AddEnter("portal" , "/domains/default/room/wiz_hall"); ! ob = new("/lib/bboard"); ! ob->SetKeyName("chalkboard"); ! ob->SetId( ({ "board", "chalkboard" })); ! ob->set_board_id("admin_board"); ! ob->set_max_posts(30); ! ob->SetShort("The Arch Board"); ! ob->SetLong("This is the Arch board. You know how to use it."); ! ob->eventMove(this_object()); } int CanReceive(object ob) { ! if( living(ob) && !archp(ob) ){ message("info","The arch room is available only to "+ "admins, sorry.",ob); return 0; --- 153,166 ---- SetRead("printout", (: eventReadPrintout :) ); SetRead("sign", (: SignRead :) ); SetListen("default", "You can faintly hear a low hum coming from the walls."); SetListen( ({"wall","walls"}), "You hear a low throbbing sound, as if from machinery."); ! SetInventory( ([ ! "/secure/obj/arch_board" : 1, ! ]) ); } int CanReceive(object ob) { ! if( !archp(ob) && base_name(ob) != "/secure/obj/arch_board"){ message("info","The arch room is available only to "+ "admins, sorry.",ob); return 0; diff -c -r --new-file ds2.0r18/lib/secure/room/network.c ds2.0r28/lib/secure/room/network.c *** ds2.0r18/lib/secure/room/network.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/room/network.c Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,32 ---- + #include + #include + inherit LIB_ROOM; + + static void create() { + object ob; + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Network room"); + SetLong("This is where all network messages go. It is an extremely " + "noisy and uncomfortable location, just like network rooms all around " + "the world. It is here for debugging and troubleshooting purposes, so " + "if that's not what you're doing, you should probably leave. " + "The arch room is above. The router room is south."); + SetExits( ([ + "up" : "/secure/room/arch", + "south" : "/secure/room/router.c", + ]) ); + + } + int CanReceive(object ob) { + if( !archp(ob) ){ + message("info","The network room is available only to "+ + "admins, sorry.",ob); + return 0; + } + return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/secure/room/router.c ds2.0r28/lib/secure/room/router.c *** ds2.0r18/lib/secure/room/router.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/room/router.c Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,31 ---- + #include + #include + inherit LIB_ROOM; + + static void create() { + object ob; + room::create(); + SetClimate("indoors"); + SetAmbientLight(30); + SetShort("Router room"); + SetLong("This room is like the network room to its north, " + "but it receives messages from the I3 router, instead of " + "the intermud daemon. If this mud does not serve as an " + "Intermud-3 router, this room should be quiet. Otherwise " + "this may be the noisiest damn room on your mud."); + SetExits(([ + "north" : "/secure/room/network", + ])); + + } + int CanReceive(object ob) { + if( !archp(ob) ){ + message("info","The router room is available only to "+ + "admins, sorry.",ob); + return 0; + } + return 1; + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r18/lib/secure/save/boards/immortal_board.o ds2.0r28/lib/secure/save/boards/immortal_board.o *** ds2.0r18/lib/secure/save/boards/immortal_board.o Sun Dec 11 21:37:14 2005 --- ds2.0r28/lib/secure/save/boards/immortal_board.o Wed Jul 5 00:01:12 2006 *************** *** 1,3 **** #/secure/daemon/bboard.c __Owner "GENERAL" ! __Posts ({(["author":"Cratylus","post":"A couple of hints: - Look in your workroom's chest for useful wiz toys. - Read /doc/README for instructions on enabling intermud channels. - There's a creator's manual in your workroom's chest. It is your friend. - Information and documentation is available at: http://dead-souls.sourceforge.net/ - Almost everything you need is in /doc. Whatever isn't there, you wouldn't understand anyway. - Make an effort to find an answer of your own before asking for help. - If you ask for help, be polite. - Have fun. ","subject":"Welcome to Dead Souls","time":1132694785,"read":({"cratylus","jayren",}),]),(["author":"Cratylus","post":"- When your stuff won't update, the elog command will help you track down the problem. - When players generate runtime errors, detailed error messages get logged to /log/player_errors . ","subject":"player errors","time":1132694930,"read":({"cratylus","jayren",}),]),(["post":"Dead Souls now sports a groovy new creation system. We're still working out the kinks and still adding features, but it's stable enough to try out. The main commands for this new system are: create, modify, add, delete, and copy. For detailed info, type: help creation ","subject":"NEW creation system","author":"Cratylus","time":1134153426,"read":({"cratylus",}),]),}) --- 1,3 ---- #/secure/daemon/bboard.c __Owner "GENERAL" ! __Posts ({(["author":"Cratylus","post":"A couple of hints: - Look in your workroom's chest for useful wiz toys. - Read /doc/README for instructions on enabling intermud channels. - There's a creator's manual in your workroom's chest. It is your friend. - Information and documentation is available at: http://dead-souls.net/ - Almost everything you need is in /doc. Whatever isn't there, you wouldn't understand anyway. - Make an effort to find an answer of your own before asking for help. - If you ask for help, be polite. - Have fun. ","subject":"Welcome to Dead Souls","time":1132694785,"read":({"cratylus","jayren",}),]),(["author":"Cratylus","post":"- When your stuff won't update, the elog command will help you track down the problem. - When players generate runtime errors, detailed error messages get logged to /log/player_errors . ","subject":"player errors","time":1132694930,"read":({"cratylus","jayren",}),]),(["post":"Dead Souls now sports a groovy new creation system. We're still working out the kinks and still adding features, but it's stable enough to try out. The main commands for this new system are: create, modify, add, delete, and copy. For detailed info, type: help creation ","subject":"NEW creation system","author":"Cratylus","time":1134153426,"read":({"cratylus",}),]),}) diff -c -r --new-file ds2.0r18/lib/secure/sefun/base_name.c ds2.0r28/lib/secure/sefun/base_name.c *** ds2.0r18/lib/secure/sefun/base_name.c Wed Dec 7 14:28:42 2005 --- ds2.0r28/lib/secure/sefun/base_name.c Wed Jul 5 00:01:06 2006 *************** *** 7,14 **** string base_name(mixed val) { string name, base; int borg; ! ! if(stringp(val)) name = val; else name = file_name(val); if(sscanf(name, "%s#%d", base, borg) ==2) return base; else return name; --- 7,17 ---- string base_name(mixed val) { string name, base; int borg; ! //tc("val: "+identify(val)+", which is: "+typeof(val),"green"); ! if(!val) return ""; ! if(objectp(val)) name = file_name(val); ! else if(val == "") return ""; ! else if(stringp(val) && sizeof(val)) name = val; else name = file_name(val); if(sscanf(name, "%s#%d", base, borg) ==2) return base; else return name; diff -c -r --new-file ds2.0r18/lib/secure/sefun/communications.c ds2.0r28/lib/secure/sefun/communications.c *** ds2.0r18/lib/secure/sefun/communications.c Tue Mar 28 23:23:41 2006 --- ds2.0r28/lib/secure/sefun/communications.c Wed Jul 5 00:01:06 2006 *************** *** 4,9 **** --- 4,13 ---- */ #include + #include + #include + + object *global_tmp_ob_arr; varargs void say(mixed str, mixed ob) { object *obs; *************** *** 24,49 **** if(objectp(player)) str = player->GetKeyName(); else str = player; if(!msg || msg == "") return; if(!dude = find_player(str) ) return; else tell_object(dude, msg); } ! varargs void tc(string str, string col){ string prefix; if(!col) col = "magenta"; switch(col){ case "red" : prefix = "%^BOLD%^RED%^";break; case "cyan" : prefix = "%^BOLD%^CYAN%^";break; case "blue" : prefix = "%^BOLD%^BLUE%^";break; case "yellow" : prefix = "%^BOLD%^YELLOW%^";break; case "green" : prefix = "%^BOLD%^GREEN%^";break; default : prefix = "%^BOLD%^MAGENTA%^";break; } ! tell_player("cratylus",prefix+str+"%^RESET%^"); ! flush_messages(find_player("cratylus")); } varargs void tell_room(mixed ob, mixed str, mixed exclude) { --- 28,108 ---- if(objectp(player)) str = player->GetKeyName(); else str = player; if(!msg || msg == "") return; + //write_file("/tmp/debug.txt",msg+"\n"); if(!dude = find_player(str) ) return; else tell_object(dude, msg); } ! varargs void tc(string str, string col, object dude){ string prefix; if(!col) col = "magenta"; + switch(col){ + case "red" : prefix = "%^BOLD%^RED%^";break; + case "cyan" : prefix = "%^BOLD%^CYAN%^";break; + case "blue" : prefix = "%^BOLD%^BLUE%^";break; + case "yellow" : prefix = "%^BOLD%^YELLOW%^";break; + case "green" : prefix = "%^BOLD%^GREEN%^";break; + case "white" : prefix = "%^BOLD%^WHITE%^";break; + default : prefix = "%^BOLD%^MAGENTA%^";break; + } + if(!dude) dude = find_player(DEBUGGER); + if(!dude) return; + tell_player(dude ,prefix+str+"%^RESET%^"); + flush_messages(dude); + } + varargs int tn(string str, string col, object room){ + string prefix; + if(!col) col = "magenta"; switch(col){ case "red" : prefix = "%^BOLD%^RED%^";break; case "cyan" : prefix = "%^BOLD%^CYAN%^";break; case "blue" : prefix = "%^BOLD%^BLUE%^";break; case "yellow" : prefix = "%^BOLD%^YELLOW%^";break; case "green" : prefix = "%^BOLD%^GREEN%^";break; + case "white" : prefix = "%^BOLD%^WHITE%^";break; default : prefix = "%^BOLD%^MAGENTA%^";break; } + if(!room) tell_object(load_object(ROOM_NETWORK) ,prefix+str+"%^RESET%^"); + else tell_object(room, prefix+str+"%^RESET%^"); + return 1; + } ! varargs int trr(string str, string col){ ! tn(str, col, load_object(ROOM_ROUTER)); ! return 1; ! } + varargs int debug(mixed msg, mixed val, string color){ + object *players = filter(users(), (: $1->GetProperty("debug") :) ); + string ret = ""; + string prevob = ""; + if(!sizeof(players)) return 0; + prevob = file_name(previous_object()); + if(msg && stringp(msg) && val) ret += msg; + else if(msg && !val) val = msg; + ret += " "; + if(val) ret += identify(val); + if(!color || !sizeof(color)) color = "green"; + foreach(object guy in players){ + tc("%^BOLD%^WHITE%^DEBUG: %^RESET%^ "+prevob,color,guy); + tc(ret, color, guy); + } + return 1; + } + + varargs int tell_creators(string msg, string color){ + object *cres = filter(users(), (: creatorp($1) :) ); + global_tmp_ob_arr = ({}); + if(!sizeof(cres)) return 0; + global_tmp_ob_arr = sort_array(cres, (: member_array($1,global_tmp_ob_arr) == -1 :) ); + cres = global_tmp_ob_arr; + if(!msg) msg = ""; + if(!color) color = "red"; + foreach(object guy in cres){ + tc(msg, color, guy); + } + return 1; } varargs void tell_room(mixed ob, mixed str, mixed exclude) { diff -c -r --new-file ds2.0r18/lib/secure/sefun/compare_array.c ds2.0r28/lib/secure/sefun/compare_array.c *** ds2.0r18/lib/secure/sefun/compare_array.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/sefun/compare_array.c Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,26 ---- + #include + #include + + int compare_array(mixed *arr1, mixed *arr2){ + mixed *temparr1 = copy(arr1); + mixed *temparr2 = copy(arr2); + + if(typeof(arr1) != typeof(arr2)) return 0; + + if(sizeof(temparr1) != sizeof(temparr2)) return 0; + + foreach(mixed item in temparr1){ + if(member_array(item, temparr2) == -1) return 0; + } + + foreach(mixed item2 in temparr2){ + if(member_array(item2, temparr1) == -1) return 0; + } + + return 1; + } + + int arrcmp(mixed *arr1, mixed *arr2){ + return compare_array(arr1, arr2); + } + diff -c -r --new-file ds2.0r18/lib/secure/sefun/convert_name.c ds2.0r28/lib/secure/sefun/convert_name.c *** ds2.0r18/lib/secure/sefun/convert_name.c Wed Dec 7 14:28:42 2005 --- ds2.0r28/lib/secure/sefun/convert_name.c Wed Jul 5 00:01:06 2006 *************** *** 5,10 **** --- 5,11 ---- */ string convert_name(string str) { + if(!str || str == "") return ""; str = replace_string(str, " ", ""); str = replace_string(str, "'", ""); return lower_case(replace_string(str, "-", "")); diff -c -r --new-file ds2.0r18/lib/secure/sefun/groups.c ds2.0r28/lib/secure/sefun/groups.c *** ds2.0r18/lib/secure/sefun/groups.c Sat Mar 11 11:20:56 2006 --- ds2.0r28/lib/secure/sefun/groups.c Wed Dec 31 19:00:00 1969 *************** *** 1,13 **** - int imud_privp(mixed guy) { - if(objectp(guy)) guy = guy->GetKeyName(); - if(!stringp(guy)) return 0; - if(member_group(guy, "INTERMUD")) return 1; - else return 0; - } - - int securep(mixed guy) { - if(objectp(guy)) guy = guy->GetKeyName(); - if(!stringp(guy)) return 0; - if(member_group(guy, "SECURE")) return 1; - else return 0; - } --- 0 ---- diff -c -r --new-file ds2.0r18/lib/secure/sefun/legacy.c ds2.0r28/lib/secure/sefun/legacy.c *** ds2.0r18/lib/secure/sefun/legacy.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/sefun/legacy.c Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,25 ---- + #include + #include + + void set(mixed arg1, mixed arg2){ + arg1 = capitalize(arg1); + call_other( previous_object(), ({ "Set"+arg1, arg2 }) ); + return; + } + + void query(mixed arg1, mixed arg2){ + arg1 = capitalize(arg1); + call_other( previous_object(), ({ "Get"+arg1, arg2 }) ); + return; + } + + void personal_log(string str){ + tell_room(ROOM_ARCH,str); + return; + } + + void add_sky_event(function f){ + SEASONS_D->AddTimeEvent("night", f); + } + + diff -c -r --new-file ds2.0r18/lib/secure/sefun/local_time.c ds2.0r28/lib/secure/sefun/local_time.c *** ds2.0r18/lib/secure/sefun/local_time.c Fri Mar 24 14:41:23 2006 --- ds2.0r28/lib/secure/sefun/local_time.c Wed Jul 5 00:01:06 2006 *************** *** 3,8 **** --- 3,9 ---- */ #include + #include #include #include *************** *** 50,69 **** } ! string set_tz(string str){ string *zonearray; ! ! if(!str) return "Time zone unchanged."; ! ! tz = upper_case(str)[0..2]; zonearray = explode(read_file("/cfg/timezones.cfg"),"\n"); zonearray += ({""}); ! if(member_array(tz,zonearray) == -1) { ! return "Invalid time zone. Valid zones are: "+ implode(zonearray," "); } ! if(!archp(this_player())) return "You're not permitted to do this."; ! unguarded( (: write_file("/cfg/timezone.cfg",tz,1) :) ); return "Mud time zone is now "+read_file("/cfg/timezone.cfg"); } --- 51,76 ---- } ! int valid_timezone(string str){ string *zonearray; ! if(!str || str == "") return 0; ! str = upper_case(str)[0..2]; zonearray = explode(read_file("/cfg/timezones.cfg"),"\n"); zonearray += ({""}); ! if(member_array(str,zonearray) == -1) { ! return 0; } + else return 1; + } ! string set_tz(string str){ ! if(!str) str = ""; ! if( str != "" && !valid_timezone(str)) { ! return "Invalid time zone."; ! } ! tz = str; ! if( !((int)master()->valid_apply(({ "PRIV_ASSIST", "PRIV_SECURE" }))) ) ! error("Illegal attempt to modify timezone: "+get_stack()+" "+identify(previous_object(-1))); unguarded( (: write_file("/cfg/timezone.cfg",tz,1) :) ); return "Mud time zone is now "+read_file("/cfg/timezone.cfg"); } diff -c -r --new-file ds2.0r18/lib/secure/sefun/make_workroom.c ds2.0r28/lib/secure/sefun/make_workroom.c *** ds2.0r18/lib/secure/sefun/make_workroom.c Sun Dec 11 22:48:01 2005 --- ds2.0r28/lib/secure/sefun/make_workroom.c Wed Jul 5 00:01:06 2006 *************** *** 39,47 **** --- 39,50 ---- write_file(cdir+"/customdefs.h","\n"+dir_line+"\n"); write_file(cdir+"/customdefs.h",read_file(tdir+"customdefs.part2")); cp(tdir+"area/room/sample_room.c", cdir+"/area/room/sample_room.c"); + cp(tdir+"area/room/sample_two.c", cdir+"/area/room/sample_two.c"); cp(tdir+"area/weap/sword.c", cdir+"/area/weap/sword.c"); cp(tdir+"area/obj/table.c", cdir+"/area/obj/table.c"); cp(tdir+"area/obj/key.c", cdir+"/area/obj/key.c"); + cp(tdir+"area/obj/case.c", cdir+"/area/obj/case.c"); + cp(tdir+"area/obj/watch.c", cdir+"/area/obj/watch.c"); cp(tdir+"area/npc/fighter.c", cdir+"/area/npc/fighter.c"); cp(tdir+"area/armor/chainmail.c", cdir+"/area/armor/chainmail.c"); cp(tdir+"area/armor/leather_boot_r.c", cdir+"/area/armor/leather_boot_r.c"); diff -c -r --new-file ds2.0r18/lib/secure/sefun/messaging.c ds2.0r28/lib/secure/sefun/messaging.c *** ds2.0r18/lib/secure/sefun/messaging.c Sat Mar 11 11:20:56 2006 --- ds2.0r28/lib/secure/sefun/messaging.c Wed Jul 5 00:01:06 2006 *************** *** 343,349 **** } switch(words[i]) { case "$agent_verb": ! words[i] = pluralize(verb[verb_count++]); break; case "$agent_name": --- 343,352 ---- } switch(words[i]) { case "$agent_verb": ! //words[i] = pluralize(replace_string(identify(verb),"\"","")); ! //tc("verb: "+identify(verb)); ! //tc("verb: "+typeof(verb)); ! words[i] = ""+pluralize(verb[0]); break; case "$agent_name": diff -c -r --new-file ds2.0r18/lib/secure/sefun/mud_info.c ds2.0r28/lib/secure/sefun/mud_info.c *** ds2.0r18/lib/secure/sefun/mud_info.c Tue Mar 28 23:25:14 2006 --- ds2.0r28/lib/secure/sefun/mud_info.c Wed Jul 5 20:52:30 2006 *************** *** 27,33 **** string mudlib() { return "Dead Souls"; } ! string mudlib_version() { return "2.0r18"; } int query_host_port() { return __PORT__; } --- 27,33 ---- string mudlib() { return "Dead Souls"; } ! string mudlib_version() { return "2.0r28"; } int query_host_port() { return __PORT__; } diff -c -r --new-file ds2.0r18/lib/secure/sefun/pointers.c ds2.0r28/lib/secure/sefun/pointers.c *** ds2.0r18/lib/secure/sefun/pointers.c Wed Dec 7 14:28:42 2005 --- ds2.0r28/lib/secure/sefun/pointers.c Wed Jul 5 00:01:06 2006 *************** *** 15,26 **** --- 15,59 ---- return (userp(ob) && member_group(ob, "AMBASSADOR")); } + int elderp(object ob) { + if(!ob) ob = previous_object(); + return (userp(ob) && member_group(ob, "ELDER")); + } + + int testp(object ob) { + if(!ob) ob = previous_object(); + return (userp(ob) && member_group(ob, "TEST")); + } + int archp(object ob) { if(!ob) ob = previous_object(); if(!creatorp(ob)) return 0; return (member_group(ob, "ASSIST") || member_group(ob, "SECURE")); } + int imud_privp(mixed guy) { + if(member_group(guy, "INTERMUD")) return 1; + else return 0; + } + + int securep(mixed guy) { + mixed dude = guy; + if(!guy) guy = previous_object(); + if(!stringp(guy)) guy = guy->GetKeyName(); + if(!guy || guy == "") guy = base_name(dude); + if(member_group(guy, "SECURE")) return 1; + else return 0; + } + + int assistp(mixed guy) { + mixed dude = guy; + if(!guy) guy = previous_object(); + if(!stringp(guy)) guy = guy->GetKeyName(); + if(!guy || guy == "") guy = base_name(dude); + if(member_group(guy, "ASSIST")) return 1; + else return 0; + } + varargs int creatorp(object ob) { if(!ob) ob = previous_object(); if(!ob || !userp(ob)) return 0; diff -c -r --new-file ds2.0r18/lib/secure/sefun/reaper.c ds2.0r28/lib/secure/sefun/reaper.c *** ds2.0r18/lib/secure/sefun/reaper.c Fri Mar 24 14:41:23 2006 --- ds2.0r28/lib/secure/sefun/reaper.c Wed Jul 5 00:01:06 2006 *************** *** 41,47 **** } foreach(object thingy in others){ ! if(!userp(thingy) && !environment(thingy)) { thingy->eventDestruct(); } } --- 41,48 ---- } foreach(object thingy in others){ ! if(!userp(thingy) && !environment(thingy) && ! base_name(thingy) != "/secure/obj/snooper" ) { thingy->eventDestruct(); } } diff -c -r --new-file ds2.0r18/lib/secure/sefun/reload.c ds2.0r28/lib/secure/sefun/reload.c *** ds2.0r18/lib/secure/sefun/reload.c Mon Jan 23 08:58:12 2006 --- ds2.0r28/lib/secure/sefun/reload.c Wed Jul 5 00:01:06 2006 *************** *** 14,19 **** --- 14,21 ---- object env; mx = 0; + //tc("ob: "+identify(ob),"red"); + if(!ob) return 0; if(objectp(ob) && environment(ob)) env = environment(ob); *************** *** 30,36 **** return 0; } ! if(ob->GetDoor()) ob = load_object(ob->GetDoor()); if(!file_exists(base_name(ob))) filename = base_name(ob)+".c"; else filename = base_name(ob); --- 32,39 ---- return 0; } ! //tc("ob: "+identify(ob),"green"); ! if(ob->GetDoor() && sizeof(ob->GetDoor())) ob = load_object(ob->GetDoor()); if(!file_exists(base_name(ob))) filename = base_name(ob)+".c"; else filename = base_name(ob); *************** *** 42,47 **** --- 45,52 ---- write("This object lacks a working init function. Please run initfix on it as soon as possible."); } + //tc("ob: "+identify(ob),"blue"); + if(inherits(LIB_ROOM,ob)){ dudes = get_livings(ob,1); if(dudes) { diff -c -r --new-file ds2.0r18/lib/secure/sefun/security.c ds2.0r28/lib/secure/sefun/security.c *** ds2.0r18/lib/secure/sefun/security.c Sat Mar 11 11:20:56 2006 --- ds2.0r28/lib/secure/sefun/security.c Wed Jul 5 00:01:06 2006 *************** *** 40,47 **** --- 40,74 ---- return (member_array(who, ppl) != -1); } + int domain_admin(mixed pretender, string domain){ + mapping DomainsMap = ([]); + string write_perms = read_file("/secure/cfg/write.cfg"); + string *tmp_array = explode(write_perms, "\n"); + string *admin_array = ({}); + if(objectp(pretender)) pretender = pretender->GetKeyName(); + foreach(string line in tmp_array){ + string where, admins; + if(sscanf(line,"(/domains/%s/) %s", where, admins)){ + DomainsMap[where] = admins; + } + } + //tc("I think pretender is: "+identify(pretender)+", type: "+typeof(pretender),"yellow"); + if(!sizeof(DomainsMap[domain])) return 0; + admin_array = explode(DomainsMap[domain],":"); + //tc("will I return 0?"); + if(member_array(lower_case(pretender), admin_array) == -1){ + //tc("about to return 0"); + return 0; + } + else { + //tc("about to return 1"); + return 1; + } + } + int check_privs(mixed pretender, mixed target){ int x; + string domain, junk; if(stringp(pretender)) pretender = load_object(pretender); if(objectp(target)) target = base_name(target)+".c"; if(!stringp(target)) x= 1; *************** *** 56,61 **** --- 83,99 ---- grepp(target,homedir(pretender)) ) x= 17; else if(archp(pretender)) x= 18; else x= 9; + + if(stringp(target) && first_string_element(target,"/",1) == "domains"){ + //tc("entered new test sub","blue"); + if(sscanf(target,"/domains/%s/%s", domain, junk) == 2){ + //tc("entered subsub","blue"); + //tc("pretender: "+identify(pretender),"white"); + //tc("domain: "+identify(domain),"white"); + if(domain_admin(pretender, domain)) x = 19; + } + } + //tc("x: "+x); if(x < 10) return 0; if(x > 10) return 1; } diff -c -r --new-file ds2.0r18/lib/secure/sefun/sefun.c ds2.0r28/lib/secure/sefun/sefun.c *** ds2.0r18/lib/secure/sefun/sefun.c Fri Mar 24 14:41:23 2006 --- ds2.0r28/lib/secure/sefun/sefun.c Wed Jul 5 00:01:06 2006 *************** *** 8,13 **** --- 8,14 ---- #include #include #include + #include #include "sefun.h" #include "/secure/sefun/absolute_value.c" *************** *** 74,89 **** #include "/secure/sefun/query_carrying.c" #include "/secure/sefun/findobs.c" #include "/secure/sefun/query_names.c" - #include "/secure/sefun/groups.c" #include "/secure/sefun/ascii.c" mixed array users(){ ! return filter(efun::users(), (: environment($1) :) ); } int destruct(object ob) { string *privs; string tmp; if(previous_object(0) && previous_object(0) == ob) return efun::destruct(ob); if(!(tmp = query_privs(previous_object(0)))) return 0; --- 75,145 ---- #include "/secure/sefun/query_carrying.c" #include "/secure/sefun/findobs.c" #include "/secure/sefun/query_names.c" #include "/secure/sefun/ascii.c" + #include "/secure/sefun/wild_card.c" + #include "/secure/sefun/compare_array.c" + #include "/secure/sefun/legacy.c" + + + object find_object( string str ){ + if((int)master()->valid_apply(({ "SECURE", "ASSIST", "SNOOP_D" }))) return efun::find_object(str); + if(base_name(efun::find_object(str)) == "/secure/obj/snooper") return 0; + else return efun::find_object(str); + } + + varargs mixed objects(mixed arg1, mixed arg2){ + object array tmp_obs = efun::objects(); + + if(base_name(previous_object()) == SNOOP_D || archp(this_player())){ + return tmp_obs; + } + if(!arg1){ + return filter(tmp_obs, (: base_name($1) != "/secure/obj/snooper" :) ); + } + + if(arg1 && !arg2) { + object *ret_arr = ({}); + if(!functionp(arg1)) return 0; + foreach(object ob in filter(tmp_obs, (: base_name($1) != "/secure/obj/snooper" :) )){ + if(evaluate(arg1, ob)) ret_arr += ({ ob }); + } + return ret_arr; + } + + if(arg1 && arg2) { + object *ret_arr = ({}); + if(!functionp(arg1)) return 0; + if(!objectp(arg2)) return 0; + foreach(object ob in filter(tmp_obs, (: base_name($1) != "/secure/obj/snooper" :) )){ + if(call_other(arg2, arg1, ob)) ret_arr += ({ ob }); + } + return ret_arr; + } + + else return ({}); + } + + varargs string socket_address(mixed arg, int foo) { + string ret, port; + if(objectp(arg)) return efun::socket_address(arg); + ret = socket_status(arg)[4]; + port = last_string_element(ret,"."); + ret = replace_string(ret,"."+port,""); + if(!foo) return ret; + else return ret+" "+port; + } mixed array users(){ ! return filter(efun::users(), (: ($1) && environment($1) :) ); } int destruct(object ob) { string *privs; string tmp; + //tc("destruct sefun being called. ob is: "+identify(ob)+".","red"); + //tc("this_object is: "+identify(this_object())+".","red"); + //tc("previous objects are: "+identify(previous_object(-1))+".","yellow"); + //tc("calling stack is: "+get_stack()+".","red"); if(previous_object(0) && previous_object(0) == ob) return efun::destruct(ob); if(!(tmp = query_privs(previous_object(0)))) return 0; *************** *** 106,115 **** efun::shutdown(code); } varargs object snoop(object who, object target) { if(!target) return efun::snoop(who); ! //if(!creatorp(who)) return 0; ! if(!creatorp(who) && who->GetKeyName() != "s_bot" ) return 0; if(!((int)master()->valid_apply(({ "ASSIST" })))) { if(!((int)target->query_snoopable())) return 0; else return efun::snoop(who, target); --- 162,182 ---- efun::shutdown(code); } + int valid_snoop(object snooper, object target){ + if(member_group(target, PRIV_SECURE)) { + message("system", (string)snooper->GetCapName()+" is trying to snoop " + "you.", target); + if(!member_group(snooper, PRIV_SECURE)) return 0; + } + if(archp(snooper)) return 1; + if( base_name(snooper) == "/secure/obj/snooper" ) return 1; + if(creatorp(snooper) && playerp(target)) return 1; + return 0; + } + varargs object snoop(object who, object target) { if(!target) return efun::snoop(who); ! if(!creatorp(who) && base_name(who) != "/secure/obj/snooper" ) return 0; if(!((int)master()->valid_apply(({ "ASSIST" })))) { if(!((int)target->query_snoopable())) return 0; else return efun::snoop(who, target); *************** *** 123,129 **** } object query_snoop(object ob) { ! if(!userp(previous_object(0))) return 0; return efun::query_snoop(ob); } --- 190,197 ---- } object query_snoop(object ob) { ! if(base_name(previous_object()) != SNOOP_D) ! return 0; return efun::query_snoop(ob); } diff -c -r --new-file ds2.0r18/lib/secure/sefun/sefun.h ds2.0r28/lib/secure/sefun/sefun.h *** ds2.0r18/lib/secure/sefun/sefun.h Fri Mar 24 14:41:23 2006 --- ds2.0r28/lib/secure/sefun/sefun.h Wed Jul 5 00:01:06 2006 *************** *** 194,198 **** --- 194,218 ---- int securep(mixed guy); string convert_ascii(int i); varargs object get_random_living(object room, int foo); + varargs string socket_address(mixed arg, int foo); + varargs int debug(mixed msg, mixed val, string color); + int valid_timezone(string str); + varargs int tell_creators(string msg, string color); + varargs int tn(string str, string col, object room); + varargs int trr(string str, string col); + varargs string *wild_card(string str); + nomask int remove_dots(string str); + int domain_admin(string pretender, string domain); + int compare_array(mixed *arr1, mixed *arr2); + int arrcmp(mixed *arr1, mixed *arr2); + string append_line(string file, string *params, string repl); + varargs mixed alpha_crypt(mixed arg1, mixed arg2); + void set(mixed arg1, mixed arg2); + void query(mixed arg1, mixed arg2); + void personal_log(string str); + void add_sky_event(function f); + int assistp(mixed guy); + int elderp(object ob); + int testp(object ob); #endif /* l_sefun_h */ diff -c -r --new-file ds2.0r18/lib/secure/sefun/strings.c ds2.0r28/lib/secure/sefun/strings.c *** ds2.0r18/lib/secure/sefun/strings.c Fri Mar 24 14:41:23 2006 --- ds2.0r28/lib/secure/sefun/strings.c Wed Jul 5 00:01:06 2006 *************** *** 102,107 **** --- 102,109 ---- varargs mixed convert_string(string str, int flag) { mixed *ret = ({ 0, "" }); + if(!str || !sizeof(str) || str == "") return 0; + if( (str = trim(str)) == "" ) return 0; if( str[0] == '(' ) { switch(str[1]) { *************** *** 249,255 **** return newstring; } - int starts_with(string primary, string sub){ string rev, junk; //primary = replace_string(primary,"\t"," "); --- 251,256 ---- *************** *** 334,340 **** new_file += line; } - if(!tail_search) omit = 0; if(!line) done = 100; if(i == 999) done = 100; --- 335,340 ---- *************** *** 388,393 **** --- 388,399 ---- } + //If you try to use replace_matching_line and it doesn't work, + //it may be that the file in question is not a .c file. This sefun + //keys on .c file syntax to know where lines begin and end. If the + //string you're editing doesn't have, for example, semicolons, + //your line replacememnt probably won't work well. Instead use the + //sefun replace_line. varargs mixed replace_matching_line(string target, string substring, string replace, int i, string exclude){ int omit, done, tail_search, tag_it; string line, filename, new_file; *************** *** 460,475 **** return 0; } string replace_line(string file, string *params, string repl){ string *file_arr; int alarm; if(!file || !stringp(file)) return ""; - file_arr = explode(file, "\n"); foreach(string line in file_arr){ - alarm = 0; foreach(string element in params){ --- 466,481 ---- return 0; } + //This sefun is for non-code text. To replace lines in an LPC-code + //formatted string, use replace_matching_line instead. string replace_line(string file, string *params, string repl){ string *file_arr; int alarm; if(!file || !stringp(file)) return ""; file_arr = explode(file, "\n"); foreach(string line in file_arr){ alarm = 0; foreach(string element in params){ *************** *** 479,486 **** --- 485,514 ---- if(alarm == sizeof(params)){ file_arr[member_array(line,file_arr)] = repl; } + } + return implode(file_arr,"\n"); + } + + string append_line(string file, string *params, string repl){ + string *file_arr; + int alarm; + + if(!file || !stringp(file)) return ""; + file_arr = explode(file, "\n"); + + foreach(string line in file_arr){ + alarm = 0; + + foreach(string element in params){ + if(grepp(line,element)) alarm++; + } + + if(alarm == sizeof(params)){ + file_arr[member_array(line,file_arr)] += ("\n"+repl); + } + } return implode(file_arr,"\n"); } *************** *** 515,527 **** else return 0; } varargs string generate_tmp(mixed arg){ string ret; ! string randy = replace_string(replace_string(crypt(""+random(88)+11,""+random(88)+11),"/","XXX"),".","YYY"); if(!arg) return "/open/"+time()+".c"; - if(objectp(arg) && this_player() && creatorp(this_player())) ret = homedir(this_player())+"/tmp/"+last_string_element(base_name(arg),"/")+randy+time()+".c"; --- 543,579 ---- else return 0; } + varargs mixed alpha_crypt(mixed arg1, mixed arg2){ + string ret; + if(!intp(arg1) && !arg2) return 0; + if(intp(arg1)) { + if(arg1 > 64) arg1 = 64; + ret = crypt(""+random(arg1+2)+arg1,""+random(arg1+2)+arg1); + ret += crypt(""+random(arg1+2)+arg1,""+random(arg1+2)+arg1); + ret = replace_string(ret,"`",""); + ret = replace_string(ret,"!",""); + ret = replace_string(ret,"/",""); + ret = replace_string(ret,".",""); + return ret[0..(arg1 - 1)]; + } + + ret = crypt(arg1, arg2); + ret = replace_string(ret,"`",""); + ret = replace_string(ret,"!",""); + ret = replace_string(ret,"/",""); + ret = replace_string(ret,".",""); + + return ret; + } + + varargs string generate_tmp(mixed arg){ string ret; ! //string randy = replace_string(replace_string(crypt(""+random(88)+11,""+random(88)+11),"/","XXX"),".","YYY"); ! string randy = alpha_crypt(8); if(!arg) return "/open/"+time()+".c"; if(objectp(arg) && this_player() && creatorp(this_player())) ret = homedir(this_player())+"/tmp/"+last_string_element(base_name(arg),"/")+randy+time()+".c"; *************** *** 542,547 **** --- 594,600 ---- else if(creatorp(this_player())) ret = homedir(this_player())+"/tmp/"+randy+time()+".tmp"; else ret = "/open/"+randy+time()+".c"; + //tc("generate_tmp ret: "+ret); return ret; } diff -c -r --new-file ds2.0r18/lib/secure/sefun/wild_card.c ds2.0r28/lib/secure/sefun/wild_card.c *** ds2.0r18/lib/secure/sefun/wild_card.c Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/secure/sefun/wild_card.c Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,23 ---- + /* + * Brodbane@Eve 03/03/06 + * Adapted from original by Caliel@BloodRose + */ + varargs string *wild_card(string str) { + mixed pf; string *tmp, cwd; + if((cwd = absolute_path("cwd",str)) == "/") return ({ "/" }); + if((string)(pf= path_file(cwd)) == "/") pf[0] = ""; + if(!(tmp = get_dir(cwd))) tmp = ({}); + tmp -= ({ ".", ".." }); + if(!str || str[0] != '.') tmp = filter_array(tmp,"remove_dots",this_object()); + for(int i=0;i 1 && tmp[i][0..1] == "//") + tmp[i] = tmp[i][1..strlen(tmp[i])-1]; + } + return tmp; + } + + nomask int remove_dots(string str) { return !(str[0] == '.'); } + + diff -c -r --new-file ds2.0r18/lib/verbs/creators/add.c ds2.0r28/lib/verbs/creators/add.c *** ds2.0r18/lib/verbs/creators/add.c Mon Jan 23 08:58:37 2006 --- ds2.0r28/lib/verbs/creators/add.c Wed Jul 5 00:01:06 2006 *************** *** 63,70 **** --- 63,76 ---- str = base_name(ob2)+".c"; sourcefile = base_name(ob)+".c"; + if(userp(ob)){ + write("You can't do that to a player."); + return 1; + } + if(!living(ob2) && !inherits(LIB_STORAGE,ob2) && + !inherits(LIB_WORN_STORAGE,ob2) && !inherits(LIB_ROOM,ob2)){ write("That object is not intended to contain other objects. Addition halted."); write("If you are sure this is incorrect, then the target object may be "); diff -c -r --new-file ds2.0r18/lib/verbs/creators/copy.c ds2.0r28/lib/verbs/creators/copy.c *** ds2.0r18/lib/verbs/creators/copy.c Sun Jan 1 12:37:04 2006 --- ds2.0r28/lib/verbs/creators/copy.c Wed Jul 5 00:01:06 2006 *************** *** 42,47 **** --- 42,51 ---- return 1; } + if(userp(ob)){ + write("No."); + return 1; + } success = 0; sourcefile = ""; targetfile = ""; diff -c -r --new-file ds2.0r18/lib/verbs/creators/delete.c ds2.0r28/lib/verbs/creators/delete.c *** ds2.0r18/lib/verbs/creators/delete.c Tue Mar 28 23:23:42 2006 --- ds2.0r28/lib/verbs/creators/delete.c Wed Jul 5 00:01:06 2006 *************** *** 94,99 **** --- 94,104 ---- return 1; } + if(userp(ob1) || userp(ob2)){ + write("No."); + return 1; + } + if(environment(ob1) != ob2) { write("That doesn't exist there."); return 1; diff -c -r --new-file ds2.0r18/lib/verbs/creators/dest.c ds2.0r28/lib/verbs/creators/dest.c *** ds2.0r18/lib/verbs/creators/dest.c Fri Mar 24 14:41:48 2006 --- ds2.0r28/lib/verbs/creators/dest.c Wed Jul 5 00:01:06 2006 *************** *** 6,17 **** #include #include inherit LIB_VERB; static void create() { verb::create(); SetVerb("dest"); ! SetRules("OBS"); SetErrorMessage("dest what?"); SetHelp("Syntax: \n\n" "Destroy an object.\n" --- 6,18 ---- #include #include + inherit LIB_VERB; static void create() { verb::create(); SetVerb("dest"); ! SetRules("OBS","STR"); SetErrorMessage("dest what?"); SetHelp("Syntax: \n\n" "Destroy an object.\n" *************** *** 23,28 **** --- 24,35 ---- else return 1; } + mixed can_dest_str(){ + //The desting of strings is not yet supported. + //return 1; + return 0; + } + mixed do_dest_obj(object ob){ string name; if(base_name(ob) == LIB_DUMMY) { *************** *** 51,53 **** --- 58,78 ---- return 1; } + mixed do_dest_str(string str){ + object *objects; + //tc("str: "+str); + if(!objects = findobs(str)){ + write("No such thing was found."); + return 1; + } + if(sizeof(objects) != 1){ + write("The return list is ambiguous. Nothing was dested."); + return 1; + } + + objects[0]->eventDestruct(); + if(objects[0]) destruct(objects[0]); + if(objects[0]) write(file_name(objects[0])+" was not destructed."); + else write("Desting complete."); + return 1; + } diff -c -r --new-file ds2.0r18/lib/verbs/creators/modify.c ds2.0r28/lib/verbs/creators/modify.c *** ds2.0r18/lib/verbs/creators/modify.c Fri Mar 24 14:41:48 2006 --- ds2.0r28/lib/verbs/creators/modify.c Wed Jul 5 00:01:06 2006 *************** *** 76,81 **** --- 76,86 ---- return 1; } + if(userp(ob)){ + write("You may not modify a player."); + return 1; + } + return staff->eventModify(ob, str); } diff -c -r --new-file ds2.0r18/lib/verbs/creators/reload.c ds2.0r28/lib/verbs/creators/reload.c *** ds2.0r18/lib/verbs/creators/reload.c Mon Jan 16 23:01:05 2006 --- ds2.0r28/lib/verbs/creators/reload.c Wed Jul 5 00:01:06 2006 *************** *** 8,19 **** inherit LIB_VERB; static void create() { verb::create(); SetVerb("reload"); ! SetRules("OBJ", "STR OBJ", "STR here", "here"); SetErrorMessage("reload what?"); ! SetHelp("Syntax: \n\n" "This command loads into memory the file of the object " "you specify, and replaces the current copy with a new " "copy. If you change something about a sword you are " --- 8,21 ---- inherit LIB_VERB; + string libfile = "foo"; + static void create() { verb::create(); SetVerb("reload"); ! SetRules("OBJ", "STR OBJ", "STR here", "here", "every STR"); SetErrorMessage("reload what?"); ! SetHelp("Syntax: , \n\n" "This command loads into memory the file of the object " "you specify, and replaces the current copy with a new " "copy. If you change something about a sword you are " *************** *** 23,28 **** --- 25,37 ---- "inherited by the target object. If any of those objects " "or the target object's file fail to load, the object " "is not updated.\n" + " If you \"reload every npc\", then any loaded object that " + "inherits LIB_NPC gets reloaded. Other valid lib objects " + "that can be used this way are: room, sentient, armor, item.\n" + "Please note that if there are too many items to reload, " + "the command will fail with \"Too long evaluation\" errors.\n" + " Books, due to their processing-intensive load time, " + "are excluded from the \"every\" keyword.\n" "\nSee also: copy, create, delete, modify, initfix, add"); } *************** *** 31,36 **** --- 40,50 ---- else return 1; } + mixed can_reload_every_str(string str){ + if(!creatorp(this_player())) return "This command is only available to builders and creators."; + else return 1; + } + mixed can_reload_str_obj(string str) { return can_reload_obj(str); } *************** *** 42,47 **** --- 56,65 ---- return can_reload_obj("foo"); } mixed do_reload_obj(object ob) { + if(userp(ob)) { + write("No."); + return 1; + } return reload(ob); } *************** *** 61,63 **** --- 79,134 ---- if(wrd1 == "-r" && wrd2 = "here") reload(ob, 1); else return "Failed."; } + + mixed do_reload_every_str(string str){ + object *ob_pool = ({}); + //tc("str: "+str); + + if(!archp(this_player())){ + write("This verb is intended for arches only."); + return 1; + } + + switch(str){ + case "npc" : libfile = LIB_NPC; break; + case "sentient" : libfile = LIB_SENTIENT; break; + case "room" : libfile = LIB_ROOM; break; + case "weapon" : libfile = LIB_WEAPON; break; + case "item" : libfile = LIB_ITEM; break; + case "container" : libfile = LIB_STORAGE; break; + case "armor" : libfile = LIB_ARMOR; break; + case "worn_storage" : libfile = LIB_WORN_STORAGE; break; + default : libfile = "/lib/foo"; + } + + //tc("libfile: "+libfile); + + if(!file_exists(libfile+".c")){ + write("There is no such library file."); + return 1; + } + + load_object("/secure/cmds/creators/update")->cmd("-a -r "+libfile); + + ob_pool = filter(objects(), (: ( inherits(libfile, $1) && + !inherits(LIB_BOOK, $1) ) :) ); + + if(!sizeof(ob_pool)) { + write("None found."); + return 1; + } + + //tc("ob_pool: "+identify(ob_pool)); + + foreach(object ob in ob_pool){ + //if(ob) tc("reloading: "+file_name(ob),"red"); + if(ob) write("reloading: "+file_name(ob)); + reload(ob); + } + + write("Done."); + libfile = "foo"; + return 1; + } + + diff -c -r --new-file ds2.0r18/lib/verbs/items/drop.c ds2.0r28/lib/verbs/items/drop.c *** ds2.0r18/lib/verbs/items/drop.c Mon Jan 23 08:58:37 2006 --- ds2.0r28/lib/verbs/items/drop.c Wed Jul 5 00:01:06 2006 *************** *** 46,52 **** } mixed do_drop_obs(mixed *res) { ! object *obs; mixed tmp; if( !sizeof(res) ) { --- 46,52 ---- } mixed do_drop_obs(mixed *res) { ! object *obs, *eligible; mixed tmp; if( !sizeof(res) ) { *************** *** 61,67 **** foreach(string *list in ua) this_player()->eventPrint(list[0]); return 1; } ! foreach(object ob in obs) if( (tmp = (mixed)ob->eventDrop(this_player())) != 1 ) { if( stringp(tmp) ) this_player()->eventPrint(tmp); else this_player()->eventPrint("You cannot drop " + --- 61,73 ---- foreach(string *list in ua) this_player()->eventPrint(list[0]); return 1; } ! eligible=filter(obs, (: (!($1->GetWorn()) && environment($1) == this_player()) :)); ! if(!sizeof(eligible)){ ! write("Remove or unwield items before trying to drop them."); ! eligible = ({}); ! return 1; ! } ! foreach(object ob in eligible) if( (tmp = (mixed)ob->eventDrop(this_player())) != 1 ) { if( stringp(tmp) ) this_player()->eventPrint(tmp); else this_player()->eventPrint("You cannot drop " + diff -c -r --new-file ds2.0r18/lib/verbs/items/look.c ds2.0r28/lib/verbs/items/look.c *** ds2.0r18/lib/verbs/items/look.c Mon Jan 23 08:59:00 2006 --- ds2.0r28/lib/verbs/items/look.c Wed Jul 5 00:01:06 2006 *************** *** 79,86 **** } mixed do_look() { ! environment(this_player())->eventPrint((string)this_player()->GetName() + ! " looks around.", this_player()); this_player()->eventDescribeEnvironment(0); return 1; } --- 79,87 ---- } mixed do_look() { ! if(!this_player()->GetInvis()) ! environment(this_player())->eventPrint((string)this_player()->GetName() + ! " looks around.", this_player()); this_player()->eventDescribeEnvironment(0); return 1; } *************** *** 93,99 **** return do_look_at_str(str); } ! varargs mixed do_look_at_obj(object ob) { return ob->eventShow(this_player()); } --- 94,105 ---- return do_look_at_str(str); } ! varargs mixed do_look_at_obj(object ob, mixed arg) { ! if(ob->GetInvis() && !archp(this_player()) && ! base_name(ob) != LIB_DUMMY ){ ! write("There is no "+arg+" here."); ! return 1; ! } return ob->eventShow(this_player()); } diff -c -r --new-file ds2.0r18/lib/verbs/items/put.c ds2.0r28/lib/verbs/items/put.c *** ds2.0r18/lib/verbs/items/put.c Mon Jan 23 08:59:19 2006 --- ds2.0r28/lib/verbs/items/put.c Wed Jul 5 00:01:06 2006 *************** *** 11,22 **** #include "include/put.h" inherit LIB_VERB; static void create() { verb::create(); SetVerb("put"); SetSynonyms("place", "stick"); ! SetRules("OBS in OBJ", "OBS into OBJ", "OBS on OBJ", "OBS onto OBJ"); SetErrorMessage("Put what where?"); SetHelp("Syntax: \n" "Syntax: \n\n" --- 11,24 ---- #include "include/put.h" inherit LIB_VERB; + string *eligible; static void create() { verb::create(); SetVerb("put"); SetSynonyms("place", "stick"); ! SetRules("OBS in OBJ", "OBS into OBJ", "OBS on OBJ", "OBS onto OBJ", ! "WRD WRD in OBJ", "WRD WRD into OBJ", "WRD WRD on OBJ", "WRD WRD onto OBJ"); SetErrorMessage("Put what where?"); SetHelp("Syntax: \n" "Syntax: \n\n" *************** *** 25,39 **** "See also: get, give, drop"); } ! mixed can_put_obs_word_obj(mixed *res, string wrd, object storage) { ! if(wrd == "on" || wrd == "onto"){ ! if(storage && !inherits( "/lib/comp/surface", storage ) ) return "#That isn't a load-bearing surface."; ! } ! if(storage && storage->GetClosed()){ ! return "#That's closed."; ! } ! if(intp(check_light())) return this_player()->CanManipulate(); ! else return check_light(); } mixed can_put_obj_word_obj(object target, string wrd, object storage) { --- 27,39 ---- "See also: get, give, drop"); } ! ! mixed can_put_obs_word_obj(object *foo1, string wrd, object foo2) { ! //tc("1"); ! //tc("foo1: "+identify(foo1)); ! //tc("foo2: "+identify(foo2)); ! if(check_light()) return this_player()->CanManipulate(); ! else return 0; } mixed can_put_obj_word_obj(object target, string wrd, object storage) { *************** *** 52,75 **** object *obs; obs = filter(res, (: objectp :)); if( !sizeof(obs) ) { mixed *ua; ua = unique_array(res, (: $1 :)); ! write("That's not possible."); foreach(string *lines in ua) { ! write("That doesn't seem possible at the moment."); ! this_player()->eventPrint("That doesn't seem possible at the moment."); } return 1; } if(wrd == "in" || wrd == "into") { ! foreach(object ob in obs) storage->eventPutInto(this_player(), ob); } if(wrd == "on" || wrd == "onto") { ! foreach(object ob in obs) storage->eventPutOnto(this_player(), ob); } return 1; } --- 52,173 ---- object *obs; + //tc("2"); obs = filter(res, (: objectp :)); + + //tc("a"); if( !sizeof(obs) ) { mixed *ua; ua = unique_array(res, (: $1 :)); ! //tc("b"); foreach(string *lines in ua) { ! if(storage && storage->GetClosed()) ! write(capitalize(storage->GetShort())+" is closed."); ! else write("That doesn't seem possible at the moment."); ! return 1; } + //tc("c"); + if(storage && storage->GetClosed()) + write(capitalize(storage->GetShort())+" is closed."); + else write("That doesn't seem possible at the moment."); + return 1; + } + //tc("d"); + if(!sizeof(filter(obs, (: environment($1) == this_player() :)))){ + write("You don't seem to be in possession of that."); + eligible = ({}); + //tc("1"); + return 1; + } + eligible=filter(obs, (: (!($1->GetWorn()) && environment($1) == this_player()) :)); + if(!sizeof(eligible)){ + write("Remove or unwield items before trying to put them somewhere."); + eligible = ({}); + //tc("2"); return 1; } + //tc("eligible: "+identify(eligible)); if(wrd == "in" || wrd == "into") { ! foreach(object ob in eligible) ! storage->eventPutInto(this_player(), ob); } if(wrd == "on" || wrd == "onto") { ! foreach(object ob in eligible) ! storage->eventPutOnto(this_player(), ob); } + eligible = ({}); + return 1; + } + + mixed can_put_wrd_wrd_word_obj(string num, string curr,string wrd, mixed container) { + int amt; + + //tc("num: "+num); + //tc("curr: "+curr); + //tc("wrd: "+wrd); + //tc("container: "+identify(container)); + if( !num || !curr ) return 0; + if( (amt = to_int(num)) < 1 ) return "You cannot do that!"; + //tc("1","blue"); + if( (int)this_player()->GetCurrency(curr) < amt ) + return "You don't have that much " + curr + "."; + //tc("2","green"); + if(this_player()->GetLevel() < 4) { + write("Newbies cannot drop money."); + return "Newbies can't drop money."; + } + if(wrd == "on" || wrd == "onto"){ + if(container && !inherits( LIB_SURFACE, container ) ) return "#That isn't a load-bearing surface."; + } + //tc("3","red"); + if(container && container->GetClosed()){ + return "#That's closed."; + } + //tc("hmm"); + //return this_player()->CanManipulate(); + if(intp(check_light())) return this_player()->CanManipulate(); + else return check_light(); + } + + + mixed do_put_wrd_wrd_word_obj(string num, string curr, mixed wort, object ob) { + object pile, env; + int amt; + //tc("ob: "+identify(ob),"yellow"); + //tc("wort: "+wort,"yellow"); + if(wort == "on") wort = "onto"; + if(wort == "in") wort = "into"; + //tc("wort: "+wort,"yellow"); + + if(wort == "onto" && !inherits( LIB_SURFACE, ob ) ) { + //tc("wtf1"); + write("That isn't a load-bearing surface."); + return 1; + } + if(wort == "into" && inherits( LIB_SURFACE, ob ) ) { + //tc("wtf2"); + write("That's a surface. Try \"put on\""); + return 1; + } + + + amt = to_int(num); + env = environment(this_player()); + pile = new(LIB_PILE); + pile->SetPile(curr, amt); + if( !((int)pile->eventMove(ob)) || + (int)this_player()->AddCurrency(curr, -amt) == -1 ) { + this_player()->eventPrint("Something prevents your action."); + pile->eventDestruct(); + return 1; + } + this_player()->eventPrint("You put " + amt + " " + curr + + " "+wort+" "+ob->GetShort()+"."); + + environment(this_player())->eventPrint((string)this_player()->GetName() + + " puts some " + curr + " "+wort+" "+ob->GetShort()+".", + this_player()); return 1; } diff -c -r --new-file ds2.0r18/lib/verbs/items/sell.c ds2.0r28/lib/verbs/items/sell.c *** ds2.0r18/lib/verbs/items/sell.c Mon Jan 23 08:59:20 2006 --- ds2.0r28/lib/verbs/items/sell.c Wed Jul 5 00:01:06 2006 *************** *** 43,49 **** } mixed do_sell_obs_to_liv(object array items, object vendor) { ! object array obs; obs = filter(items, (: objectp :)); if( !sizeof(obs) ) { --- 43,49 ---- } mixed do_sell_obs_to_liv(object array items, object vendor) { ! object *obs, *eligible; obs = filter(items, (: objectp :)); if( !sizeof(obs) ) { *************** *** 55,61 **** } return 1; } ! return vendor->eventBuy(this_player(), obs); } mixed do_sell_liv_obs(object vendor, object array items) { --- 55,68 ---- } return 1; } ! eligible=filter(obs, (: (!($1->GetWorn()) && environment($1) == this_player()) :)); ! if(!sizeof(eligible)){ ! write("Remove or unwield items before trying to sell them."); ! eligible = ({}); ! return 1; ! } ! ! return vendor->eventBuy(this_player(), eligible); } mixed do_sell_liv_obs(object vendor, object array items) { diff -c -r --new-file ds2.0r18/lib/verbs/players/follow.c ds2.0r28/lib/verbs/players/follow.c *** ds2.0r18/lib/verbs/players/follow.c Mon Nov 7 13:34:11 2005 --- ds2.0r28/lib/verbs/players/follow.c Wed Jul 5 00:01:06 2006 *************** *** 21,26 **** --- 21,29 ---- "you to begin trailing the living being as it moves " "through Dead Souls.\n" "Otherwise, your following status is reported.\n" + "If the living being is interested in having you " + "follow them, they can issue the \"lead\" command " + "in order to avoid accidentally evading you.\n" "\n" "See also: evade, lead, tracking, stealth\n"); } diff -c -r --new-file ds2.0r18/lib/verbs/players/lead.c ds2.0r28/lib/verbs/players/lead.c *** ds2.0r18/lib/verbs/players/lead.c Mon Nov 7 13:34:11 2005 --- ds2.0r28/lib/verbs/players/lead.c Wed Jul 5 00:01:06 2006 *************** *** 29,35 **** this_player()->eventPrint(ob->GetName() + " is not following you."); return 1; } ! if( this_player()->SetAllowed(ob, 1) ) { ob->eventPrint((string)this_player()->GetName() + " is now leading you."); this_player()->eventPrint("You are now leading " + ob->GetName() + "."); } --- 29,35 ---- this_player()->eventPrint(ob->GetName() + " is not following you."); return 1; } ! if( this_player()->SetFollowed(ob, 1) ) { ob->eventPrint((string)this_player()->GetName() + " is now leading you."); this_player()->eventPrint("You are now leading " + ob->GetName() + "."); } diff -c -r --new-file ds2.0r18/lib/verbs/players/vote.c ds2.0r28/lib/verbs/players/vote.c *** ds2.0r18/lib/verbs/players/vote.c Mon Nov 7 13:34:11 2005 --- ds2.0r28/lib/verbs/players/vote.c Wed Jul 5 00:01:06 2006 *************** *** 16,22 **** verb::create(); SetVerb("vote"); SetRules("for STR"); ! SetErrorMessage("Who would you like to vote for?"); SetHelp("Syntax: \n" "Casts your vote for a candidate"); } --- 16,22 ---- verb::create(); SetVerb("vote"); SetRules("for STR"); ! SetErrorMessage("For whom would you like to vote?"); SetHelp("Syntax: \n" "Casts your vote for a candidate"); } diff -c -r --new-file ds2.0r18/lib/www/articles/copyright.html ds2.0r28/lib/www/articles/copyright.html *** ds2.0r18/lib/www/articles/copyright.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/articles/copyright.html Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,69 ---- + + + + + Intellectual property and Dead Souls + + + + +
Intellectual Property and Dead Souls

updated 23 June 2006


When I began work on Dead Souls, I hadn't
thought that I'd have much to worry about, in terms
of intellectual property, or IP. Given that Dead Souls
was itself "public domain" software, it didn't seem
like it would be an issue. Little did I know!

There have been some areas of concern for
folks in this regard, and this article is intended
to clarify my actions and intent when it comes to
Dead Souls and IP. The main issues break down into
three main categories:

The legal status of Dead Souls

The controversy over Cygwin GPL violation

The question of MudOS distribution



The legal status of Dead Souls

Dead Souls 1.1 was the final release of the
Dead Souls lib made by
Descartes in the late 1990's.
DS 1.1 was placed into the public domain, meaning
that Descartes released all copyright to the lib,
making it freely distributable in any form by any
one in any way, including commercially.

This was in stark contrast to the strict
reservation of copyright for his other mudlib, Nightmare IV.
Nightmare IV remained under his copyright, and it
further had a highly restrictive license which
imposed limits to its use beyond that which is normally
enforced through copyright law.

Descartes vigorously defended his NM IV licensing
and copyright, and to this day old-timers in the LP
mud community look back on Descartes's withdrawal of the
NM IV lib from public distribution with some bemusement.
Whatever one thinks of his motives, it must be said that
Descartes was effective at squelching the unauthorized
distribution of the Nightmare IV lib.

This has left some people with the impression
that Dead Souls is somehow tainted by restrictive
licensing. For Dead Souls 1.1, this is not true. DS 1.1
can be used in any way one sees fit.

Dead Souls 1.2 and above, however, are not public
domain. They are GPL, meaning that whatever one finds
in Dead Souls 1.x to 2.x that is *not* found in DS 1.1
does in fact retain copyright and its distribution is
subject to the requirements of the GPL.

Translated into layman's terms, this means that
the current versions of Dead Souls cannot be distributed
unless their source code is also distributed, they are
otherwise entirely free to be distributed whether
commercially or otherwise. The experienced LP coder at
this point will object: "Hey, that doesn't make sense! LPC
is an interpreted language, so distributing it is de facto
distribution of code!"

From a technical standpoint, it's pretty senseless
(with some exceptions) to GPL Dead Souls. The lib itself
runs in the form of plain text..there's no way to hide
the source even if you wanted to. In this sense, GPL'ing
DS is meaningless.

However, I wanted to distribute DS in Windows
binary format, which meant in this case using Cygwin. To
use Cygwin, I needed to comply with their licensing which
as GPL made it a prerequisite that Cygwin was to be distributed
porting other software only if that software complied with
GPL-style licensing. By making Dead Souls explicitly
GPL, I could comply with Cygwin licensing and distribute
the driver binary I created.

To clarify, whatever is in Dead Souls now that
was in Dead Souls 1.1 is still public domain software.
Whatever is in Dead Souls now that was not in Dead Souls
1.1 is copyrighted.

UPDATE: 23 June 06

Dead Souls is not GPL. Due to the incessant nitpicking
of pedants who are overconcerned with software licensing, I
am revoking GPL. Dead Souls is copyrighted, and you can download
it and use it under no obligation to share anything. However,
I retain distribution rights. When I have nothing better to
think about I will decide on some "official" license to slap
on it, or come up with my own.

But all I want to do is code the greatest LP lib ever,
and I am just through with thinking about licensing.

My guess is that some licensing Nazi will read this and
try to find a way to make my life difficult because I revoked
GPL. There is just no pleasing some people. Just leave me alone,
please. Can't you just leave me alone?


The controversy over Cygwin GPL violation

In early 2006, one of the sites that provided
downloads of Dead Souls to the public abruptly pulled it
from distribution. Apparently someone had complained
to the site administrator that Dead Souls was in violation
of the GPL, and it was improper to host it.

This was a shock to me, because I thought I
had been scrupulous in my adherence to Cygwin policy.

To summarize, there was a Windows version of DS
which contained a pre-compiled Windows executable, to
permit the mud to run in Windows. This executable was
created in the Cygwin environment, and the
only way it would run on a Windows computer is if that
computer had some files called dll's, or "dynamic link
libraries" from the Cygwin environment. Since the point
was sharing the lib with people unwilling or unable to
compile for Windows, including the dll's along with the
executable seemed like the reasonable thing to do.

I examined Cygwin's policy on distributing their
dll's, and based on my interpretation, it seemed ok. It
turns out my interpretation of their licensing was incorrect.

What I thought they meant was that if you have
possibly modified their dll's, you cannot distribute them unless
you also distribute the source code.

What they actually meant was that whether or not
you had modified the dll's, you cannot distribute them unless
you also distribute the source code.
 
I queried the Cygwin licensing discussion list and
searched their archives until I found an example like Dead Souls.
A software company used Cygwin dll's and distributed them
without source, but when told they were in violation of the
Cygwin license, they simply added the dll's source code to their
download page, and this satisfied the Cygwin licensing folks.

I changed the download pages for Dead Souls to
make available the source code for the Cygwin dll's I was
distributing, and the site administrator allowed the
Dead Souls downloads to continue.

That's it. That's the whole story. Some folks have
chosen to inflate this event into allegations of Dead Souls
containing "stolen" code, which is as baffling to me as it
is untrue.

UPDATE: 05 June 2006
It turns out that despite the efforts outlined above,
distributing the Cygwin linked executable is still impermissible
according to Cygwin. The problem is that MudOS is not Open
Source, meaning linking with it is considered (by many, though
not all) a violation of the Cygwin's GPL.

Please see the news page item on this issue.

UPDATE: 06 June 2006

Dead Souls no longer uses Cygwin in any way. Questions
of GPL compliance with Cygwin linked libraries are now dead.
There is a new Windows version of Dead Souls available, and
it is a native Windows executable.
 


The question of MudOS distribution

The question of MudOS distribution hinges partly on
the meaning of "fair use," which is a notoriously slippery
concept in the already hard to grasp field of copyright law.
I'd like to make a disclaimer here that I am not a
lawyer, and am therefore most certainly not a copyright
lawyer, which is a field as full of necromancy as any
mud you're likely to play. What I state here are my
opinions based on my layman's understanding of the law.

Copyright in the U.S. is generally understood
to mean the set of exclusive rights an author holds over
her work, and these rights flow from the Constitution of
the United States which empowers Congress to legislate
in this area. Congress has done so. In order to promote
the arts and innovation, the U.S. has made it law that the
only person with the right to distribute a work (such as a
book, music, etc) is the author. She may negotiate with
others to permit them to distribute also, but absent this
positive action on her part, the distribution or
reproduction of her work or even a derivative of it
is flatly against the law, be it commercial
or otherwise.

Unless...

Here's where it gets tricky. It is illegal to
copy and distribute Bon Jovi's music, period....unless
you're making a mix CD for a friend. The principle at work
here is "fair use," which is an extremely ill-defined
standard by which actually it's ok sometimes to
do things that ordinarily constitute violations of
copyright.

Other known fair uses are quoting for journalistic
purposes, mimicking for parody or satire, copying for
personal backups, etc.

The "known fair uses" are generally not enshrined
in statute law. They are known from precedent. When
a court rules that something is fair use, then we have
a general rule of thumb we can follow...until another
court rules otherwise. That's about as close to written
law as you're going to get on this: court decisions.

This means that in a case where things are not
spelled out for you in black and white, you have to
follow your best judgment and hope you don't get sued,
and if you do, hope you don't lose, and if you do, hope
you haven't caused actual harm to the complainant.

This is the situation with the distribution of
MudOS. I have asked Marius, the current maintainer, for
his permission to bundle MudOS with Dead Souls. I got
no reply, but I came upon this: Marius tells someone off

In that document you can see that Marius would
have been happy to let someone not only copy MudOS, but
actually take it over completely and lead it forward...
if only they had emailed him first. The key part of this
document is where he states,

"That's all it would have taken to get my blessing, either
implicitly as a result of my silence (which is most likely
what you would have gotten), or explicitly by my saying so
in response."

This is about as clear a signal as I'm likely
to get as to how the copyright holder feels about the
general distribution of MudOS. I hope he reads this and
goes on to give me explicit permission, but in the
absence of that, my good faith interpretation of his
statements leads me to the conclusion that he really
does not care and it's ok with him.

Which, in my layman's view, does not fall squarely
into "fair use" territory, but between that and a
tacit passive permission and the fact that no
action has been taken against web sites which feature
MudOS as a download, it is reasonable cause to interpret
the bundling of Dead Souls with MudOS as "not wrong."

This doesn't mean that Marius has somehow allowed
his copyright to lapse. Should he contact me to order
me to stop bundling MudOS with Dead Souls, I would be
obligated to do so.

For anyone in the Dead Souls community worried
about that, please note that this would not be a fatal
blow to the UNIX lib. It would just make downloading a
two step process, thus making it more difficult for
beginners. For Windows users, however, the effect *would*
be devastating, because most Windows users don't have
the skill or experience to compile their own driver
executable. Let's hope this doesn't come to pass.


Update, 09 June 2006


Thanks to the sharp looking out of Skout, I
was able to find Marius and we had the following conversation.
The only editing done here was excluding the noisy "Joe enters the room."
type messages, and formatting for clarity:

You tell Verbal: howdy. i'm the maintainer of dead souls, and i'm told you
maintain mudos. i'd like to ask for your explicit blessing in what I'm doing:
http://dead-souls.net/articles/copyright.html#3

Verbal tells you: Yep, that's me. I am also Marius of mudos.org
Verbal tells you: I got your email, but unfortunately my response bounced.
Verbal tells you: I'm fine with you distributing the MudOS driver bundled with Dead Souls.
Verbal tells you: I would ask that you contribute any patches you've applied to the mudos-patches mailing list, though.

You tell Verbal: sure thing. sorry i had to idle, visiting a friend in the hospital
You tell Verbal: i'll submit the diffs for sure...i'd just thought the list was dead
You tell Verbal: if you don't mind, i'll use a transcript of our conversation
on my webpage, so anyone in doubt can have their mind set at ease.

Verbal tells you: no problem. all of the lists are still alive, though there's
not much traffic.
Verbal tells you: go ahead and use the transcript. that's cool.

To the best of my ability to tell, it really is the
man himself I was talking to. Anyway, I hope it was, because
if it wasn't and he reads this, he might get awful pissed!

Dead Souls Homepage

+ + Binary files ds2.0r18/lib/www/articles/favicon.ico and ds2.0r28/lib/www/articles/favicon.ico differ diff -c -r --new-file ds2.0r18/lib/www/articles/forum_chat.html ds2.0r28/lib/www/articles/forum_chat.html *** ds2.0r18/lib/www/articles/forum_chat.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/articles/forum_chat.html Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,278 ---- + + + + + security bug forum chat + + + tacitus - 2006/06/17 05:48 
+
+ I'm all for healthy competition + and needling each other. I think
+ anyone who knows me knows I'm + anything but thin-skinned.
+ I enjoy a good romp either on gjs + or on justrage, or whatever.
+
+ This thing, though, crossed the + line between rough play
+ and actual harm.
+
+ I figured Tacitus would be + insufferably smug if he found
+ the bug he was looking for, but I + figured that was a small
+ price to pay for getting help + securing DS. What I did
+ not count on was him taking it + upon himself to delete
+ log files.
+
+ This is a serious problem, + because he was messing with
+ security, and if I can't tell + what he did, I have to
+ stop everything and reconstruct + the events by hand.
+
+ Whether it was malicious is + actually beside the point.
+ Either he's untrustworthy because + he was concealing bad
+ behavior, or he's untrustworthy + because he doesn't know
+ better than to tromp around + someone's logs as he pleases,
+ without so much as a hint of his + intentions to the
+ owner.
+
+ Either way, it was a breach of + trust I did not expect
+ from someone I've been supporting + as a leader in the
+ community.
+
+ I've been granted guest creator + and sometimes even guest
+ admin privileges on other + people's muds, and I have
+ never done anything but exactly + what I've announced
+ and only with permission, because + it's not my mud
+ and I understand that. This is + basic. It's obvious.
+ In someone else's house, you ask + before you perform
+ potentially irreversible changes, + or you can just
+ consider yourself a boor.
+
+ So there's that.
+
+ According to Tacitus he attempted + to delete logs without
+ asking permission out of a + concern that other people
+ might happen upon them and learn + the exploit. Aside
+ from the obvious objection that + he could have just
+ told me so I could decide for + myself, is the bizarre
+ fact that he went on gjs + intergossip to announce there
+ his achievement, and allowed + thespread of information about how
+ he did it. Any casual reader of + the gjs i3 log is
+ now in full possession of all the + details needed to
+ compromise a Dead Souls mud, if + given Creator status.
+
+ How this squares with his stated + intention of protecting
+ the community by deleting my logs + I can't say.
+
+ There are some folks out there + who find exploits in
+ commercial software, and share + the information
+ with the public in an attempt to + help people get
+ ahead of the curve. Even assuming + this is not
+ dangerous, it is common for + professional, responsible
+ programmers who find serious + flaws to give the
+ manufacturer a few days or weeks + to develop a
+ patch before outing the info. As + a colleague, this
+ is the least I would have + expected.
+
+ Instead I'm now spending what + little of the weekend
+ I had for myself reconstructing + free space to
+ find potentially deleted files, + and exhaustively
+ nailing down each exploit and + subexploit related to
+ this incident. Just because + Tacitus couldn't contain
+ his glee and pride at rooting me, + and couldn't
+ give me a couple of days to deal + with it
+ in a more deliberate and measured + way.
+
+ Well, Tacitus, you win. The big + bad Dead Souls
+ juggernaut had feet of clay, + after all.
+
+ However, you've lost any trust I + had in you, any
+ good will. Maybe it will change, + but at the moment
+ I just don't see myself feeling + up to dealing
+ with you. You didn't have to do + it this way.
+ I hope the schadenfreude was + worth it.
+
+ When you came back from watching + your
+ movie, this was your message:
+
+ Tacitus@TimMUD + <intergossip> How is that audit coming?
+
+
+ It's coming along fine. Thanks.
+
+ -Crat
+  
+

+
+ Re:tacitus - 2006/06/17 06:00
+
+ I think Cratylus made some very + valid points however I think we all know that I wasn't trying to be + malicious - I was simply excited by my discovery. Furthermore, you told + me you were snooping and then I paged the log file and then proceeded + to delete (However, either the access file hadn't reparsed or you had + already removed me from the arch group so it failed) the log file that + contained the commands (eval and call logs) I used to find the exploit. + From today's events, I can only conclude we didn't truly realize the + lack of trust we had in each other in the first place or you are trying + to use this as some sort of publicity stunt.
+
+ As for the information being + released on intermud, I did not release the information directly. + Rather Duuk was cleaver enough to pry enough out of him to figure it + out on his own and then proceed to make fun of you - I can see how your + feelings can be a bit hurt.
+
+ I know if this happened to my + lib, I'd be very much embarassed too and I can understand why you are + making this post. I humbly appologize.
+
+ P.S. The audit comment was to + Hellmonger because he joking said that he'd audit my mudlib for me. If + you know this and that means that you are now auditing my mudlib, I + look forward to the results.
+
+ Post edited by: somerville32, at: + 2006/06/17 06:02 Tacitus
+ Executive Director
+ Research, Education, and + Development
+ LPUniversity Foundation
+
+

+
+ Re:tacitus - 2006/06/17 + 06:18 
+
+ For the record, I don't remember + saying anything about
+ watching you. While you were + messing with my lib, I was
+ in the middle of helping Samael. + That was the level of
+ trust I had in you. When you + started crowing about your
+ success, I started snooping you, + and saw you trying
+ to delete logs. You can imagine + my dismay. Given
+ that you were admin, were + deleting logs without telling me,
+ and I didn't know what you'd do + next, I ridded you on the spot
+ and locked the mud, but alas, + you'd already made yourself
+ an elder, so you recreated your + character and logged back
+ in. Not knowing what you *had* + done or what you *planned*
+ to do, I killed the mud process, + unmounted the filesystem,
+ and began the tedious process of + intrusion forensics.
+
+ You really don't need to suggest + I feel hurt because of Duuk.
+
+ I feel betrayed because of *you*.
+
+ You seem intent on provoking me + by claiming that my
+ statements are for some purpose + other than telling the truth.
+
+ I would suggest you read my + statements as declarations
+ of what I believe to be true, + regardless of how uncomfortable
+ that might make you.
+
+ -Crat
+ + diff -c -r --new-file ds2.0r18/lib/www/articles/lpu.html ds2.0r28/lib/www/articles/lpu.html *** ds2.0r18/lib/www/articles/lpu.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/articles/lpu.html Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,15 ---- + + + + + Dead Souls and LPU + + + + +
Dead Souls and LPUniversity Libs

There is some question about the
relationship between the Dead Souls mudlib and
the LPUniversity mudlib. Hopefully the description
below will unmuddy those waters.

Think of LPUniversity as a lib designed
from the ground up with LPC education in mind. It
is intended to be a lib coder's lib: crafted to
precise specifications and tight tolerances.

You'll have to ask him, but it's my
impression that Tacitus intends the LPUniversity
lib to be a sort of gold standard of how
LP libs should be.

As such, it's going to take a long time
to get the LPUniversity lib into the kind of
shape it needs to be in order to have a high
adoption rate. You can think of it as a Rolls
Royce under construction, still up on the lift.

Dead Souls is ready for prime-time. Though
it lacks some fun stuff that will be added in
the future, everything you need is there for
making almost whatever you want, right away. It's
not perfect, but it works. If LPUniversity is
a Rolls on the build lift, Dead Souls is the
Honda Civic in your driveway. Nothing to scream
about, really, but it works great and takes you
where you need to go.

The two libs complement each other. The
point of Dead Souls has always been to get more
people using LPC. The point of the LPUniversity
umbrella project (which includes the LPUlib) has
been to get more people using LPC.

By affiliating with Dead Souls, LPU gains
a larger potential base of interested people.
Dead Souls can be downloaded and run now, and put
into production as quickly as you can build your
world for it. This active user base strengthens
the LPUniversity project by participating in the
LPC community.

By affiliating with the LPU project, Dead
Souls gains a resource for LPC discussion that
has been sorely needed. Discussion forums and healthy
competition between libs is the sort of thing that
breeds interest in Dead Souls, breeding interest in
LPC at large.

Everyone wins.

So that's pretty much it. The LPU lib is
the car that's going to r0x0r but isn't ready to
to roll yet. Dead Souls is the car that may not
look as pretty, but has it where it counts. It
actually turns over and gets you around.


Dead Souls Homepage

+ + diff -c -r --new-file ds2.0r18/lib/www/articles/mudmagic.html ds2.0r28/lib/www/articles/mudmagic.html *** ds2.0r18/lib/www/articles/mudmagic.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/articles/mudmagic.html Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,20 ---- + + + + + Kyndig and Dead Souls + + + + +
Kyndig and Dead Souls

Back in 2005, when the first prototype versions
of Dead Souls were ready to be released, I looked around
for a means to distribute the lib. I hit upon the
obvious, Sourceforge, immediately.

Eventually mudmagic.com came to my attention
because of its widespread recognition, influence in the
"mud community" (whatever *that* is), and obvious
depth and quality of its software archives. My code
was accepted, and soon enough I was granted ownership
of my little Dead Souls corner of the site.

There was a moment during which I found Kyndig's
enforcement a bit precipitous
, but at the time I
reasoned that, lacking thorough documentation on the
issue, I might have pulled the trigger on a GPL
violator just as quickly.

I shrugged off complaints against Kyndig as a
familiar variation of the "admins suck!!1!" song I've
often heard before. Non-admins typically have no idea
how punishing it is to be diligent in your duties, and
the Kyndig complaints sounded pretty much like the
ill-justified wailing of children I was familiar with.
I even went so far as to try to articulate this in
a flame thread that started over a controversial
banning on mudmagic. To my dismay, not only did my
post disappear, the entire mudmagic flame board went
away. This was the event that made me start to see
things differently. Like the "big twist" in an M. Night
Shyamalan movie, everything shifted over just one
degree, but it changed the meaning of everything
that had gone before. And, like an M. Night Shyamalan
movie, I felt dumb for not having seen it before it
was rubbed in my face.

I began to reevaluate the controversial banning
itself. Back when it happened, I'd thought that Tyche
richly deserved some sort of sanction because, well,
frankly, I just didn't like him much. When I heard
that Kyndig banned him, I thought that sounded way too
harsh, but assumed that as much as Tyche had been an
asshat with me, he'd probably been plenty annoying
to Kyndig too, and Kyndig probably just got sick of
dealing with his shit. I've gotten fed up with people
myself, and I wasn't in a position to judge Tyche's
punishment, really. I just shrugged and said, "good
riddance."

When I heard Samson had been banned, I was very
surprised. Based on the dispute I had seen on the
moderator list, it seemed clear to me that Samson
was pretty well justified in being angry, and that his
responses, though intemperate, were reasoned, non-
flaming, and pretty humorous to boot. Nothing I
saw seemed to justify Samson getting kicked, and
this made me extremely uneasy, but, again, I just
assumed I didn't know the whole story, and on Kyndig's
site, he's the boss. I let it go, and, as mentioned
above, even chided people for leaping to conclusions
about it.

The next straw was "the dog that didn't bark."
You know the Sherlock Holmes story where he figures out
the owner was was the culprit because on the night of
the crime the dog didn't bark? The next thing I
expected was a public declaration from Kyndig about
his reasons for his actions. I have led people before,
and good leadership requires that when you cut major
players from a team, you need to explain why in a way
that clearly demonstrates your reasoning, your
justification, and gets buy-in from everyone that you
did it for legitimate reasons, and not pettiness.

The reason this is important is that if you
don't let people in on your decision-making, then
cutting people doesn't look like a justified act of
administration. It looks like a vindictive purge.
There may have been some vague mention about keeping
the site stable and such, but nothing that spoke to
the remaining contributors and moderators in a way
that made the actions sound *right*. To me, anyway.

Even then I thought, "Well, maybe he's not a
good leader. Doesn't make him *wrong*."

Then came the removal of the flame board, and it
started to dawn on me that Kyndig's administration
might not just be flawed, it might be fundamentally
misguided. I'd heard rumors about Kyndig brooking no
dissent, but this was stunning all the same. It's one
thing to frown on people complaining, but to remove a
forum dedicated to complaining, because people complain
about *you*, is damned hard for me to sign off on. To
me it doesn't matter that there are business interests
to protect. Controlling information actually does work,
and it is an efficient means to protect your business,
but an organization that operates this way loses my
respect. It seems to me especially foolhardy to operate
this way in an internet business, where spirits tend to
be high and resistant to censorship.

It was at this time that I made a compromise I
regret. I decided that I might not like the way Kyndig
does business, but it *is* his business, and it is of
benefit to me in distributing my software. I mightn't
like it but his site was useful, and I wanted to continue
to use it to promote my work.

In rapid succession I have learned of more
outrages. I can't know for sure it's all true, because
it isn't first hand experience. But as best as I can
gather, the following has happened:

* People speaking up for Samson and/or Tyche on mudmagic
have been banned.

* People speaking against Kyndig on sites other than
mudmagic have been banned.

* Kyndig has enforced restrictive policies on people
unrelated to these issues, based on affiliation with Samson
and/or Tyche.

These are the things that to the best of my
knowledge actually have happened. There are many other
rumors and allegations I've heard, equally appalling,
that I cannot fairly say probably are true, so I'm
omitting them.

I've come to the conclusion that I can't in good
conscience continue to have Dead Souls hosted on Kyndig's
repository. I find his behavior abhorrent to the
ideals of openness, fairness, and good judgment. I find
his hostility to criticism to be failure of character. I
believe that his weaknesses as a leader make him unfit
to hold any authority over the distribution of Dead Souls.

This will come at some cost to me, I suspect.
Mudmagic was a swell place to host my content, and I
respect and admire many of the the folks still there. I
hold no grudge against them for their decision to stay
there and keep their mouths shut. They have their own
consciences and their own reasons, over which I am
not qualified to pass judgment. For me, I know this will
mean a slower adoption rate of Dead Souls in general.

But I cannot abide the idea of the mud community
seeing any affiliation between Dead Souls and Kyndig.
His association with my software taints it, corrupts
its image, and I find it intolerable.

I am therefore asserting my authority as
copyright holder of post v1.1 Dead Souls, and revoking
the privilege of distribution of that software from
Kyndig or any site under his control.


Dead Souls Homepage

+ + diff -c -r --new-file ds2.0r18/lib/www/articles/olc.html ds2.0r28/lib/www/articles/olc.html *** ds2.0r18/lib/www/articles/olc.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/articles/olc.html Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,16 ---- + + + + + Dead Souls and LPU + + + + +
Is On-Line Creation Good for LPC? 

Dead Souls includes a quick creation system, named,
aptly enough, QCS.

It was an incredible bitch to make, because it had to
account for and parse code that might be written
carelessly, or in accordance with odd formatting rules.

Additionally, the number of possible things to modify
on an LPMud is so mindbogglingly large that it made
for a task that was challenging both in complexity
and in scale.

I sweated through the months of pain not because I
felt it would be a nice feature, but because I felt it was
a *necessary* feature. Early in DS development, I wondered
why it wasn't being adopted more, and started looking
at what other libs had that DS didn't. When I took a
serious look at CoffeeMud, I was totally blown away. Granted,
CM has had 5 or more years of constant development
by a team of more than one person, but the results
really are remarkable.

Their build system was simple and elegant. It
allowed people who were not interested in learning
code to make neat stuff right away. It became immediately
obvious that to a new mud admin, deciding which way to
go, there was really no contest.

Should they go with a mud that requires effort,
discipline, and weeks/months of study before doing
anything cool? Or with CM which they can set up and
build on immediately?

I realized that there was no way at all to compete in
the modern lib marketplace without an OLC.

The arguments in favor of an OLC are predicated on
"wide adoption of one's codebase" being the goal. The
arguments I arrived at were the following:


* Experienced admins already have a codebase preference.
There is no need or point in trying to convert people.

* N00b admins generally will not accept having to work
hard to get a mud up.

* Getting n00bs to use DS necessarily means making it
easy to set up from the start.

* Without an OLC, DS was greek to most n00b admins.

* Even though most n00b muds will fail, having many failed
DS muds is still good progress, because it means many
non-admins will have been exposed to the codebase. It is from
this sort of initial code exposure that preferences
develop.

It was obvious to me that I couldn't get people to
use Dead Souls just because it was technically superior
under the hood. Ask the makers of the Betamax if technical
superiority equals market share. Ask the Macintosh.

Hoping people would see the genius in my code would
not suffice to make them adopt it. The only way to make
DS widely adopted was to make it easy, and make it fun.
That LPC has had a history of being difficult is
irrelevant. Having been one way doesn't mean it had to
stay that way, and indeed, it's probably the main reason
LPC is in decline.

In my mind, Dead Souls's Quick Creation System isn't
really about advocating a feature that makes it
technically superior to other LPMuds. QCS is entirely
neutral in this respect. It does nothing for the
fundamental lib on its own: it just interprets it. If
the underlying code is crap, the QCS can do nothing
to change that.

No, DS QCS isn't about technical superiority. It's
purely marketing. I didn't spend months slaving over
QCS because I thought it made DS *better*. I did it
because I thought it made DS *viable*. Not having it would
be like trying to sell a car without windshield, doors, or
mirrors. It pretty much doesn't matter how good the
engine is. People want what they want, and if you don't
give it to them, they'll go somewhere else.

The obvious argument against this position is
"it doesn't matter if lots of people use the lib, it
just matters that it is pure and beautiful".

That is a valid opinion, but it is not mine. That
opinion assumes that one is the best coder, and
nobody can improve on one's work, and one's work is
perfect. I don't believe that is true of anyone.

I want DS to be great. I know that I am limited
by my experiences, ideas, and expertise. Others
can help DS better. By making DS widespread, more
eyeballs examine it, and the chances are greater
that someone will make DS better in some way. With
enough of this agglutination of minor improvements,
DS can be better than anything I could have made it on
my own. Making sweaty 13 year olds happy with an easy
mudlib is a by-product. By making it easy, and making
it so many people will use it, it increases the
chances that a great coder will find it, love it,
and contribute to its greatness.

So, as goofy and lame as I felt, making a
n00b-friendly "anyone can build here" system, I felt
it was not only important, but *vital* to advancing
my agenda of making Dead Souls the best LPC mudlib
on the planet.



Dead Souls Homepage

+ + diff -c -r --new-file ds2.0r18/lib/www/articles/patches.html ds2.0r28/lib/www/articles/patches.html *** ds2.0r18/lib/www/articles/patches.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/articles/patches.html Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,22 ---- + + + + + Patches?!? + + + + +
Patches?!?


For the impatient, you may skip down to the "Summary"
section at the bottom of this post.


The Disclaimer
The first thing to understand is that I don't profit
from DS, and I'm the only guy developing the core lib.
I'm not saying this because I want sympathy. I'm
saying it because this makes me have a very tight
focus on what I can and can't do within the short
time I've been granted here on Earth.

My goal is to make Dead Souls the best, most kick-ass
LPC lib ever. I interpret this to mean that when I
see a flaw, or someone else points one out, I want
it fixed. And, well, the fixing falls to me.


The History
Over the past year, what this has meant is that I
fix a given version, and after a while of fixes
accumulating, I declare it to be a new release and
off it goes, into the world. At first this caused a
lot of grumbling, because it meant people had to
reinstall from scratch every time I made a release,
and this was a bit much for many people.

It occurred to me that I could compile a package that
had only the files that changed between releases. I
put this together, and people seemed to really like
being able to upgrade from one release to another,
without a full reinstall. Over time, this system
has been tweaked and refined somewhat, but in the
end, it's roughly the same type of thing it was back
when I produced the first one: a bunch of files.


The Mechanics
The patching process is just as primitive as it
sounds. You uncompress these files and copy them
over your existing mud. Simple. Efficient.

Player files, directories, and domains that are
created by you are left untouched.

For some people this system is problematic. Some folks
are proficient at modifying lib code, and if they
just overwrite their mud with the contents of a patch,
they might find that their lib work has been clobbered. This
would be bad. That is why my patch instructions
strenuously remind people to back up the current mud
before patching it.

There is no practical solution for this problem that
I can see. Because I am just one guy, and my goal
is lib code, and not patch-process-design, I have
decided to leave things as they are. In theory I could
write code that would analyze and modify files as
needed, rather than simply have the owner overwrite.
However, this is a lot more complicated than it sounds
to implement in LPC within the lib, and it is also
non-trivial to implement this at the OS level, given
that the process would have to work on multiple different
platforms.

It's my opinion that people sophisticated enough to
need a more specialized patching system are
sophisticated enough to work around my shortcomings
in this area. Indeed, I've heard of folks who just
download the complete new version, run diffs against the
old one, and then pick and choose what to add.

For now and the foreseeable future, upgrades are just
a Big Dumb Ball of Files...with one exception.

Each patch includes a file called /secure/daemon/update.c
which carries out special functions that are not dealt
with by just overwriting files. When you reboot the mud,
update.c will do things like remove broken/dangerous files,
rename files with incorrect names, and modify text in
files (such as config.h) which should not be overwritten
but need to be changed.


The Philosophy and Controversy
Believe it or not, I've had people become irrationally
angry at how often I make releases. Not just "That darn
Crat is driving me crazy", but actual, unhinged flaming
well beyond any reasonable context.

Don't believe me? Check it out for yourself:

http://www.justrage.com/article.php?story=cratylus_dead_souls_mudlib


It *is* true that I'm averaging a release every week
or two. The person is correct in that there are a lot
of bugs to fix, and that releases happen much, much
more often than they do for other muds.

I have no defense against this charge. All I can do
is explain the reason for it, and hope it is justification
enough.

When someone tells me Dead Souls has a bug, I want to
help them. I want to fix it. I feel responsible to the
mud community to do what I can to fix whatever problems
they've run into because they've adopted the lib I
wanted them to. This is probably irrational on my part,
and if I'm lucky, I'll stop feeling this way sometime
soon. But until I do, I feel driven to be a responsive
lib coder, and I fix stuff. And I release it.

The question is, "If Dead Souls is so lame it needs
constant patching, shouldn't you kill it?"

The thing is, Dead Souls is the best LPmud lib out
there that I know of, *right now*. If the standard is
going to be perfection, then there's no lib out there
that should be available. There's no LPC mudlib
out there that you can download that is as featured,
solid, widely adopted, and supported as Dead Souls. If
the criteria for killing a lib is that it's not
perfect, and if Dead Souls is among the libs to be killed,
then just about everything needs a good flush.

It should be noted that Dead Souls doesn't *need*
constant patching. With the exception of security
fixes, any patch, upgrade, or hotfix is entirely
optional. You can stop patching and upgrading at
any time, and strike out in your own direction with
the lib. And as a matter of fact, I'd be tickled
pink if you did. The sprouting of evolutionary branches
off Dead Souls would delight me, because it would be
good evidence that I have begun something that's
going to continue beyond what I've done with my own
little brain.


Summary

* Yes, I'm a bit defensive on this topic. To me, "there
are too many updates" sounds a lot like "stop working on
the lib", which (I think, understandably) makes me testy.

* Dead Souls is fine just the way it is. If you don't
want to update, don't. As it is, right now, it's better
than any other LP lib I know of that you can download.

* If you do update, make sure you back up your mud.

* If you have ideas about how I can make the update
process less painful, KEEP THEM TO YOURSELF. I am not in
the business of patch/upgrade design, and, I'm sorry,
but I am not going to spend more time on it. All I
want to do is make DS the best ever.

* If you want to design and write a less painful upgrade method
that I can implement on DS, that's great. Let me know
about it so that I can avoid doing anything that makes
your work more difficult. Just don't expect me to work on
it *with* you.


I know this sounds a bit harsh...I hope you folks know
me well enough that you'll forgive a bit of the rudeness.

What it boils down to is a decision on where my time is
spent, and I'm pretty much sticking to my original plan.

For what it's worth, the vast majority of upgraders that
follow the patch install instructions report nothing
but a smooth process.


Dead Souls Homepage

+ + diff -c -r --new-file ds2.0r18/lib/www/articles/tacitus.html ds2.0r28/lib/www/articles/tacitus.html *** ds2.0r18/lib/www/articles/tacitus.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/articles/tacitus.html Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,18 ---- + + + + + Tacitus + + + + +
Tacitus

Hey folks,

I'm getting the drift that some people feel there is some
sort of political big deal going on between Tacitus and me.

I just wanted to take this opportunity to clarify things
a bit.

Yes, I *do* have a problem with Tacitus-the-person, who has
personally offended me, put people at risk, and been an
all around source of unpleasantness for me lately.

However, I am not interested in, nor do I have the time for,
some kind of Kyndig/Samson style feud. I appreciate all the
supportive emails, and the kind words both on- and off- the
record. But in the end, all I want to do is make Dead Souls
the best LPC lib ever, and getting into a juvenile pissing match
is exactly the sort of thing that makes that difficult.

So, be aware of the fact that I want people to contribute to his
site, and I want LPU to be successful, because that is an
overall plus for Dead Souls. Please keep up the community
participation.

Whatever I've been doing lately to express my displeasure
with Tacitus has nothing to do with you guys, and I am not
interested in ganging up on anyone. Please just let me
be angry with Tacitus, and carry on with your business.

Thanks.

-Crat


Update 27 June 2006

People who missed the original event have been
puzzled over what I'm talking about here. For their
benefit, I'm posting three consecutive messages from
then which will help illustrate the problem. They
were originally posted on the LPU site.

Dead Souls Homepage

+ + diff -c -r --new-file ds2.0r18/lib/www/articles/why_ds.html ds2.0r28/lib/www/articles/why_ds.html *** ds2.0r18/lib/www/articles/why_ds.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/articles/why_ds.html Wed Jul 5 00:01:06 2006 *************** *** 0 **** --- 1,15 ---- + + + + + Dead Souls and LPU + + + + +
Why New Muds Should Use Dead Souls 

Normally I like to stay neutral, and say stuff like
'Use whatever codebase you're comfortable with, I don't
want to start a flamewar.' And today that would be half
right. I don't want to start a flamewar.

But I'd like to take a moment out to advocate LPmuds
for new mud admins. If this is going to get you all pissy
and flamey, you can just stop reading here.

I was inspired in part by recent discussions about the
division of labor between 'coders' and 'owners' and such on
other codebases. This seems bizarre to me. It's my opinion
that a mud 'owner' should be just as capable as any person
on her mud to build and code, and manage personnel besides. I
see it kind of like the role of a captain on a ship. The captain
may not have to be in the engine room answering 'ahead one
third', but she damn well should know *how* to, if the
situation calls for it.

A ship captain should know every inch of her ship, how
many lifeboats, etc. If the ship is not performing well,
she should be able to identify this and she should be able
to supervise the corrections, if necessary.

Obviously any metaphor has its limits. You can come up
with all sorts of reasons why the ship metaphor is flawed.
But the main reason I use it is the sense it carries of
ultimate responsibility resting on the shoulders of one
officer. Whatever happens on a ship, however successful its
mission, whatever disaster it incurs, all of it, is the
responsibility of the captain. The buck stops there.

So, to me, 'my mud is failing because I can't get a
coder' doesn't make any sense at all. Obviously a successful
mud will usually have a staff of more than one, but at
first, it's just you and your dream, man. You gotta build
that boat by yourself at first, before you can convince a
proper crew to join you.

And if you just get a prebuilt boat you don't know how
to customize, why should anyone join you, when they can just
get their own? And why should they listen to you, if you
don't even know enough to run it yourself? I see lots of
muds adrift at sea here, with a lone 'captain' at the bow,
calling out in the darkness for an experienced crew that
will never come.

I can only guess that the problem here is either fear
of C or inability to learn it fast enough to suit the admin.
I'm not addressing the newbie admins who are diligently
studying their C textbooks, determined to make a proper go
of it. I'm talking to those newbie admins who have decided
to make a mud and are determined to be admins and not C
coders.

If this is so, then my proposition is, forget about
starting a mud whose guts you don't intend to know inside
out. If C is too hard, and you doubt ever knowing it
well enough to rewrite commands and system code, then
you should drop your C based mud. You should think about
a codebase that uses a language you stand a chance of
picking up quickly and easily.

Yep. LPC. LPC is a 'coding language' in that it has
variables and objects and such. But these variables and
objects are not the 'bare metal' code elements
that you see in naked C. In LPC you have a level of
abstraction between you and that cold, hard C that makes
coding much easier...more like scripting than C coding.

Ok, let me ask you, in a Diku
style mud, how do you set a room so that you can't magically
teleport in or out? In Dead Souls, all you do is add this
to the file:

SetProperty('no teleport', 1);

In a Diku style mud, how would you have a mob respond
to a player saying something to them? In Dead Souls, you
just add this line to the mob's file:

AddTalkResponse('hello', 'hi!');

To make the mob do something when asked, you use AddCommandResponse.
To make it do or say something when *asked*, you use AddRequestResponse.
How would you do it in Diku?

Now, remember. This is not a 'Diku sucks' thread. For Diku
people, this stuff is presumably not that difficult. What I'm
showing you is how *trivial* this is to do, even for non-LPC people,
on LP muds. Don't get me wrong...you still need to spend a lot
of time going through docs, and looking at examples. But the
amount of time it takes to become LPC proficient is a tiny
fraction of the amount of time it takes to become C proficient
enough to handle mud coding.

You want a mud, you're not sure you can learn C fast enough,
and you aren't having luck finding a talented coder that will
bend to your will. I say your choice is obvious. Try an LP mud on
for size. Get your mud on.

Or wait for your knight in shining armor. Whichever comes first.

There are plenty of LP mud libs out there. I suggest you
take a look at Dead Souls. It's super easy to set up, and there is
an online intermud chat community ready to help answer your
questions.


Dead Souls Homepage

+ + diff -c -r --new-file ds2.0r18/lib/www/articles.html ds2.0r28/lib/www/articles.html *** ds2.0r18/lib/www/articles.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/articles.html Wed Jul 5 00:00:59 2006 *************** *** 0 **** --- 1,21 ---- + + + + + Dead Souls Articles + + + + +
Dead Souls Articles

No, this page isn't about parts of speech. Occasionally
I'll wax long-winded, and my rantings can qualify as free-standing
articles on a subject. This page allows me to separate that from
the rest of the site, so you can read my rants if you want,
or avoid them if you prefer.

These articles tend to be opinions, not technical
docs, so you can skip them without feeling pain.

If folks submit articles they've written they'd like
me to post here, I'll gladly accept them for consideration.



Why New Muds Should Use Dead Souls

Is OLC Good for LPC?

Intellectual Property and Dead Souls

Kyndig and Dead Souls

Patches?!?

Tacitus


Dead Souls Homepage

+ + diff -c -r --new-file ds2.0r18/lib/www/debugging.html ds2.0r28/lib/www/debugging.html *** ds2.0r18/lib/www/debugging.html Fri Mar 24 14:42:02 2006 --- ds2.0r28/lib/www/debugging.html Wed Jul 5 00:00:59 2006 *************** *** 4,136 **** Dead Souls debugging ! Debugging in Dead Souls
!
! So you've made some cool stuff but darn it, it doesn't work. There are ! various
! tools available in the Dead Souls lib to hunt down the source of the ! problem:
!
!
! elog
!
If the file is somewhere in your home directory, just type: elog 

This will provide you a listing of the last few lines of your personal
error log. Warning lines tell you about code that works but should
be fixed in some way. Lines that don't contain the word "Warning" are
error lines: they indicate something about your code that prevents
it from working. For example:

!
> update sample_room
!
---
*Error in loading object '/realms/cratylus/area/room/sample_room'
Object: /secure/cmds/creators/update at line 148

'<function>' at /secure/save/creators/c/cratylus (<function>) at /:0
'cmdAll' at /secure/save/creators/c/cratylus (/lib/command.c) at line 84
'cmd' at /secure/cmds/creators/update at line 109
'eventUpdate' at /secure/cmds/creators/update at line 148
'CATCH' at /secure/cmds/creators/update at line 148
Trace written to /log/catch
/realms/cratylus/area/room/sample_room: Error in update
*Error in loading object '/realms/cratylus/area/room/sample_room'
!
!


This output lets you know something is wrong, but
isn't very specific as to exactly what. If you look at your error
log, you probably will see something more detailed and helpful:


!
> elog
!
/log/errors/cratylus:

/realms/cratylus/area/room/sample_room.c line 10: Undefined variable 'Sample'
/realms/cratylus/area/room/sample_room.c line 10: parse error
!
!


Now you can see that the error is my syntax on
line 10. I would then use ed to examine the code, and specifically lines 9
through 11. It turns out that I forgot to put quotes around the room name,
so the parser tried to use it as a variable, which, of course, it couldn't.

If the file in question is in /secure, you'd type elog secure , or if
it's in /cmds, elog cmds , and so on.


dbxwhere & dbxframe

Two helpful debugging commands are dbxframe and dbxwhere. Let's
take a look at my broken sample_room.c file. We'll start with dbxwhere,
which lists for us the chain of events that led to the error. The
indivudual steps are called frames.

> dbxwhere
*Error in loading object '/realms/cratylus/area/room/sample_room'
Object: /secure/cmds/creators/update at line 148

#0: '<function>' at /secure/save/creators/c/cratylus (<function>) at /:0
#1: 'cmdAll' at /secure/save/creators/c/cratylus (/lib/command.c) at line 84
#2: 'cmd' at /secure/cmds/creators/update at line 109
#3: 'eventUpdate' at /secure/cmds/creators/update at line 148
#4: 'CATCH' at /secure/cmds/creators/update at line 148
!
! The output is similar to the update error we saw above, but in ! ennumerating the steps, dbxwhere
! lets us use dbxframe to get ! tighter detail on a given error frame:
!
! > dbxframe 4
! ------
!     /secure/cmds/creators/update.c:148 - CATCH(0)
!     ----------------------------------------------------------------
!         if( args == base_name(this_object()) ) {
!             this_player()->eventPrint("Cannot reload update after destruct.\n"
!               "It will be reloaded at next reference.");
!             ! return 0;
!         ! }
!     =>  tmp = catch(call_other(args, "???"));
!         ! if( !tmp ) {
!             if(identify(flags ^ U_AUTOMATED) ==
!     "8")this_player()->eventPrint(args + ": Ok");
!             ! return 1;
!         } else this_player()->eventPrint(args + ": Error in update\n" + tmp);
!         ! return 0;
!
!
!     We're now looking at the error context for error ! frame 4. The output of the command shows
! us part of the file that was performing the evaluation when the error ! occurred, and even
! points out the offending line using a text arrow: =>
!
!     In this particular case, the information is not that ! helpful. We are being told that
! the error occurred while we were using the update command, and it ! failed at the line
! where update does its thing. Duh, we knew that. The elog command was much more helpful.
!
!     Where this kind of tracing comes in handy is when ! you enounter a runtime error
! when you're not updating a file. For example, if I tried to enter that ! room, rather than
! update it, I'd get a big pukey error message and not know why. If you ! run into an
! unexpected error, dbxwhere ! will help you pinpoint it if elog ! doesn't provide useful information,
! and dbxframe will help detail the source of the problem.

!
Tail
!
!     This is a version of the unix tail command. It ! displays the last few lines of a file.
! This command is important for examining crucial log files:
!
! tail /log/catch
tail /log/runtime
!
tail /log/player_errors


!
Dead Souls Homepage
!

--- 4,404 ---- Dead Souls debugging + + ! Debugging ! in Dead Souls
!
! So you've ! made some cool stuff but darn it, it doesn't work. There are ! various
! tools ! available in the Dead Souls lib to hunt down the source of the ! problem:
!
! 1 elog
! 2 ! dbxframe and dbxwhere
! 3 ! tell_player() and debug()
! 4 tail
! 5 bk ! and restore
!
!
! elog
!
If the file is somewhere in your home directory, just type: elog 

This will provide you a listing of the last few lines of your personal
error log. Warning lines tell you about code that works but should
be fixed in some way. Lines that don't contain the word "Warning" are
error lines: they indicate something about your code that prevents
it from working. For example:

!
> update ! sample_room
!
---
*Error in loading object '/realms/cratylus/area/room/sample_room'
Object: /secure/cmds/creators/update at line 148

'<function>' at /secure/save/creators/c/cratylus (<function>) at /:0
'cmdAll' at /secure/save/creators/c/cratylus (/lib/command.c) at line 84
'cmd' at /secure/cmds/creators/update at line 109
'eventUpdate' at /secure/cmds/creators/update at line 148
'CATCH' at /secure/cmds/creators/update at line 148
Trace written to /log/catch
/realms/cratylus/area/room/sample_room: Error in update
*Error in loading object '/realms/cratylus/area/room/sample_room'
!
!


This output lets you know something is wrong, but
isn't very specific as to exactly what. If you look at your error
log, you probably will see something more detailed and helpful:


!
> elog
!
/log/errors/cratylus:

/realms/cratylus/area/room/sample_room.c line 10: Undefined variable 'Sample'
/realms/cratylus/area/room/sample_room.c line 10: parse error
!
!


Now you can see that the error is my syntax on
line 10. I would then use ed to examine the code, and specifically lines 9
through 11. It turns out that I forgot to put quotes around the room name,
so the parser tried to use it as a variable, which, of course, it couldn't.

If the file in question is in /secure, you'd type elog secure , or if
it's in /cmds, elog cmds , and so on.


dbxwhere & dbxframe

Two helpful debugging commands are dbxframe and dbxwhere. Let's
take a look at my broken sample_room.c file. We'll start with dbxwhere,
which lists for us the chain of events that led to the error. The
individual steps are called frames.

> dbxwhere
*Error in loading object '/realms/cratylus/area/room/sample_room'
Object: /secure/cmds/creators/update at line 148

#0: '<function>' at /secure/save/creators/c/cratylus (<function>) at /:0
#1: 'cmdAll' at /secure/save/creators/c/cratylus (/lib/command.c) at line 84
#2: 'cmd' at /secure/cmds/creators/update at line 109
#3: 'eventUpdate' at /secure/cmds/creators/update at line 148
#4: 'CATCH' at /secure/cmds/creators/update at line 148
!
! The output is ! similar to the update error we saw above, but in ! enumerating the steps, dbxwhere
! lets us use dbxframe to get ! tighter detail on a given error frame:
!
! > dbxframe ! 4
! ------
!     /secure/cmds/creators/update.c:148 - CATCH(0)
!     ----------------------------------------------------------------
!         if( args == base_name(this_object()) ) {
!             this_player()->eventPrint("Cannot reload update after destruct.\n"
!               "It will be reloaded at next reference.");
!             ! return 0;
!         ! }
!     ! =>  tmp = catch(call_other(args, "???"));
!         ! if( !tmp ) {
!             if(identify(flags ^ U_AUTOMATED) ==
!     "8")this_player()->eventPrint(args + ": Ok");
!             ! return 1;
!         } else this_player()->eventPrint(args + ": Error in update\n" + tmp);
!         ! return 0;
!
!
!     ! We're now looking at the error context for error ! frame 4. The output of the command shows
! us part of ! the file that was performing the evaluation when the error ! occurred, and even
! points out ! the offending line using a text arrow: =>
!
!     ! In this particular case, the information is not that ! helpful. We are being told that
! the error ! occurred while we were using the update command, and it ! failed at the line
! where update ! does its thing. Duh, we knew that. The elog command was much ! more helpful.
!
!     ! Where this kind of tracing comes in handy is when ! you encounter a runtime error
! when you're ! not updating a file. For example, if I tried to enter that ! room, rather than
! update it, ! I'd get a big pukey error message and not know why. If you ! run into an
! unexpected ! error, dbxwhere ! will help you pinpoint it if elog ! doesn't provide useful information,
! and dbxframe will help detail the source of the problem.

!
!
tell_player(), ! debug()
!
!     Sometimes it's hard to fix code if you don't know ! what it's doing. In
! the above example, you might want to know what the variable "args" is, ! if
! your code is behaving unexpectedly. You could find out by adding a line ! like:
!
! tell_player("cratylus", "args is: ! "+identify(args));
!
! or:
!
!
tell_player("cratylus", ! "%^BLUE%^args ! is: "+identify(args)+"%^RESET%^");

!
!     You could also use:
!
! debug("args is: ", args);
!
! or:
!
!
debug("args is: ", args, ! "blue");

!
!     ...which has the advantage of being shorter to type ! and you'll get
! the message more promptly. To be able to receive debug messages,
! you need to enable your debugging mode by typing:
!
! debug on
!
!     debug() is available in 2.0r20 and above.
!

!
tail
!
!     ! This is a version of the unix tail command. It ! displays the last few lines of a file.
! This command ! is important for examining crucial log files:
!
! tail ! /log/catch
tail /log/runtime
!
tail /log/player_errors


!
bk ! & restore
!
!
These commands ! aren't so much for debugging as they ! are for safe coding. Before you
! edit a file, ! it is a very good idea to back it up first. The bk command lets you
! quickly and ! conveniently back up a file before you edit it. When I ! typed:
!
! bk ! sample_room
!
! A file with a ! unique identifying number was created in my bak/ ! directory. If I
! were to type ! it again, then sample_room.c would get copied again to ! bak/, with
! a new unique ! number added to the name.
!
!     ! The number is basically the number of seconds ! elapsed since January 1, 1970.
! Adding this ! number, we can keep track of which backed up version of a ! file
! is most ! recent by looking at the name.
!
!     ! Suppose I edited a file called sample_npc.c. I use ! bk to back it up, make some changes,
! then use bk ! again, make some more changes, but now it won't update. I ! don't
! feel like ! debugging, I just need this file working again, so I want to ! restore from
! backup. The ! sequence of commands would look something like this:
!
! ed ! sample_npc.c
! bk ! sample_npc
! ed ! sample_npc.c
! update ! sample_npc.c
! <error ! occurs here>
! restore ! sample_npc
!
!     ! The reason identifying numbers are used is that you ! can also choose to
! restore the ! second-to-last backup version of a file, and other previous
! versions.
!     ! The very last backup version is effectively version ! 0, so it's not
! necessary to ! specify a number. If I wanted to restore the version I ! backed
! up before ! that one, I would type something like this:
!
! restore ! sample_npc 1
!
!     ! And if I wanted the version before that one, I'd ! specify 2 instead of 1,
! and so on.
!
!     ! Please note that this is an intentionally simple ! system. There are
! no menus, no ! version branches, or diff tracking. The reason for this is
! that it is ! not a versioning ! system. It is a backup ! system. It is a convenient
! tool to back ! out of screwups, not a development tool to test file ! versions.
!
!
!
Dead Souls Homepage
!

diff -c -r --new-file ds2.0r18/lib/www/doc/ds-admin-faq.html ds2.0r28/lib/www/doc/ds-admin-faq.html *** ds2.0r18/lib/www/doc/ds-admin-faq.html Fri Jan 27 22:56:29 2006 --- ds2.0r28/lib/www/doc/ds-admin-faq.html Wed Dec 31 19:00:00 1969 *************** *** 1,19 **** - - - Dead Souls Admin FAQ - - -
Dead Souls Admin FAQ, v1

Written by Cratylus @ Frontiers, October 2005

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

What's this FAQ about?


Really it's a misnomer, since as of this moment no Dead Souls 2.x
admins exist, but the FAQ format is a convenient one, so I'll
run with it.

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

How do I start?

Start by reading the Dead Souls FAQ for some background
on where this lib came from and what you can do with it.

Ok, I read it. Now what?

Presumably you have downloaded the most current Dead Souls
mudlib version and have installed it. If so, right now you
may be standing in the Dead Souls "start room", confused and
daunted. I'm going to assume you have some basic MUD experience
and knowledge...I'm not going to waste your time telling you about
traveling north or south, etc. If you do need such a tutorial,
try http://jrong.tripod.com/mudstart.html or http://www.clock.org/muds/mres/mfaq.html
or http://www.vpg.vil.ee/~michael/MUD_tutorial/toc.html

In Dead Souls you have a body, just like other
players. You have available to you all the commands of a
creator, as well as all administrative commands. Type
cd to move to your home directory, then ls to display its
contents. That's your own private work folder, which contains
your workroom and your personal area. We'll get to that stuff
later. For now type home to go to your workroom.

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

cfg/

General configuration files for timezone and such.

cmds/

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


daemon/

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


doc/

General documentation.


domains/

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


ftp/

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


include/

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


lib/

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


log/

Log files.


news/

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


obj/

Legacy directory. Mostly unused.


open/

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


realms/

This is where creator home directories are.


save/

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


secure/

This directory will be described in a separate section below.


shadows/

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


spells/

Pretty self explanatory. The spells daemon looks for spells here.


tmp/

A directory anyone can write to. Generally for swapping
data between objects, systems, or people.


verbs/

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

www/

Like the ftp directory, but for the MUD webserver.


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

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

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

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

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

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

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

tell_player("cratylus","Hi.")

This simplification of code will become more obviously
useful to you as you get more coding under your belt.




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

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

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

If you've never coded before, this is the hard part.
To understand what you're looking at when you run commands like
more /domains/town/weap/orcslayer.c you need to get comfortable
with LPC.
The brute force way of doing this is copying stuff
and then changing the descriptions, thus making new stuff.
This will work, but you'll waste time looking for examples of
exactly what you want to do..and you may not find them.
Instead, learning LPC will let you create whatever
you want, without relying on templates.

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

http://dead-souls.net/doc/basic

http://dead-souls.net/doc/intermediate



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

Well...ok. But you need to go through the docs
soon, ok? In the meantime, there are some tools available
to help you crank out some stuff immediately, to get a feel
for things.

Go to your workroom by typing home , then open chest .
Then type look in chest and get makers from chest . You
now have a thing maker and a room maker in your possession.
The room maker is a pretty stable product. The thing
maker is still very alpha as of this writing. Use it
at your own risk. To start the room maker, type rmake . To
start the thingmaker type tmake .

The makers will default to saving stuff in your
area/ directory, so once you save a room, type cd area/room .

Remember that you have to save your rooms and objects with a .c
at the end, otherwise they won't load.


Let's say you saved a room called testroom.c. You
can now exit the maker, type update testroom.c , then
goto testroom . Voila. You are in your very first room.

You can also load rooms you previously made with the
room maker. Just be aware of something very important: if you
hand edit files created by the room maker, they may no
longer load correctly on the room maker.

The thing maker is a much more wobbly product, but
you can use it to crank out simple objects. Loading
objects into it doesn't work, and because it is a much more
complicated thing to create different kinds of objects, it
is possible to create broken objects with the thing maker.


But really, you need to read the LPC files,
/doc/ed.txt , and /doc/basics.txt

Other useful tools in your chest are a remote
control and a medical tricorder.


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

As admin, you have access to the admintool
command. This opens a menu-driven admin system you
can use to manage some basic aspects of your new MUD.

Everything on admintool can be done with
commands, system calls, or file editing, but until
you get the hang of all that stuff, admintool
is a convenient shortcut.
In this example, you would type: admintool ,
then select option 3, then option l (that's a lowercase "L").

The oldfashioned way, if the new creator
were named dude, would be: encre dude

I know. But people like menus, so I made it.

What about intermud? How do I talk on that?

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

To enable intergossip and intercre, read
/doc/README for instructions.

Please note that intercre is where you ask coding
and technical questions only. Random chatting is not
tolerated on that channel.

Conversely, intergossip is mostly chat. Please
be warned that discussions on intergossip are usually
offensive, argumentative, and generally hostile.
This hostility is especially sharp when you
are identified as a "newbie". You will almost certainly
be mocked and insulted no matter what you say, but
especially if your first messages betray you as
ignorant of intergossip standards and traditions. I
strongly recommend you lurk on this channel for a few
days before saying anything.


What's this about a manual on Frontiers?

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

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

If your Dead Souls version is below 1.9r9, to
access these docs you'll need to connect to Frontiers
and pick up a Creator's Manual, which contains the
build documentation you can use until you upgrade
to a current version of the lib.

This has been made extra easy for you by implementing
a telnet room, just north of the default start room. Just
go north to the telnet room and type connect, and you'll be
connected to Frontiers. Create a player character,
then go north, east, east, north. You'll be in Kim's
bookstore. Now buy manual from kim. Type index to see
the available chapters. To read chapter 1, type chapter 1.
To read chapter 20, type: chapter 20.

To leave frontiers (if you connected through the
telnet room) type: dcon.


Anything else I should know?

Read the docs.

Even on intercre, which is generally not
rude, people can get snippy if they think you are being
lazy in your questions.

Take a look at http://www.catb.org/~esr/faqs/smart-questions.html
to understand how this works. It's not a MUD thing, it's true for
technical fora in general.


How do I add limbs to a race?

Edit /secure/cfg/races/<race>, then remove the race from the
races daemon, then add re-add the race. If you want players
to be able to play as this race, make sure you add the
numeral 1 on the addrace command. For example:

addrace jabberwock 1


How do I make my friend an admin?

Edit /secure/cfg/groups, and add their username to the ASSIST
group. Reboot the mud. This should give them all the access they need.


I don't like how the who command output looks! How can I change it?

Believe it or not, I actually get questions like this. I also
get stuff like "my workroom is broken! fix it!"

If there is something broken about the lib itself, such as
an insta-death bug or a command that crashes the mud, I am
happy and eager to hear about it, so I can implement the fix
in the next lib release.
However, if the problem you're having is that the lib,
by design, behaves in a way not to your liking, this isn't something
I'm likely to "fix" for you. For example, if you want a "who"
command with a cooler look, that's up to you to make. You're
the one coding a mud, so you need to take it upon yourself to
understand the code and modify it to suit your tastes.

All I did was change one thing in a file, and now it won't update. Help!

You should make it a habit to make backup copies of files
before editing them. That way, if you screw up the code, you can
just copy the backup to the original filename.

If you are using Windows, you need to be aware of the
linefeed problem. unix text files and DOS text files have different
formatting. If you edit files in Notepad, then try to update them,
you may find that the file no longer updates, no matter what
you do. The difference is usually invisible to you, so you can't
tell why a file that looks exactly the same as before now won't
work.

Dead Souls expects unix-formatted text, and if you feed it
something else, the results aren't likely to be to your
satisfaction. Make sure you use an editor that respects unix
text. In Windows 2000, WordPad seems to do a reasonable job of not
completely screwing things. It does, however, add carriage
returns to your lines, so when you look at them in ed, you'll
see a bunch of "^M" all over the place.

Finally, if you're sure it isn't a text compatibility problem,
you need to examine the error output to hunt down the source of
the error. The elog command is invaluable for this.

If the file is in your home directory, just type: elog .
This will provide you a listing of the last few lines of your personal
error log. Warning lines tell you about code that works but should
be fixed in some way. Lines that don't contain the word "Warning" are
error lines: they indicate something about your code that prevents
it from working. For example:

-
> update sample_room
-
---
*Error in loading object '/realms/cratylus/area/room/sample_room'
Object: /secure/cmds/creators/update at line 118

'<function>' at /secure/save/creators/c/cratylus (<function>) at /:0
'cmdAll' at /secure/save/creators/c/cratylus (/lib/command.c) at line 80
'cmd' at /secure/cmds/creators/update at line 82
'eventUpdate' at /secure/cmds/creators/update at line 118
'CATCH' at /secure/cmds/creators/update at line 118
Trace written to /log/catch
/realms/cratylus/area/room/sample_room: Error in update
*Error in loading object '/realms/cratylus/area/room/sample_room'
-
-


This output lets you know something is wrong, but
isn't very specific as to exactly what. If you look at your error
log, you probably will see something more detailed and helpful:


-
> elog
-
/log/errors/cratylus:

/realms/cratylus/area/room/sample_room.c line 20: Undefined variable 'Sample' before );
/realms/cratylus/area/room/sample_room.c line 20: parse error before );
-
-


Now you can see that the error is my syntax on
line 20. It turns out that I forgot to put quotes around the room name,
so the parser tried to use it as a variable, which, of course, it couldn't.

If the file in question is in /secure, you'd type elog secure , or if
it's in /cmds, elog cmds , and so on.


You may have to examine the catch and runtime error logs, too. You
can do so by running these commands:

tail /log/catch
tail /log/runtime


The mud editor is confusing the heck out of me. It's too hard to use.

Check out the MUD Editor tutorial. It should ease the pain a little.


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

Email me: <put my name here>@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
screencap would be appropriate.


- - - Cratylus
-
- Dead Souls Homepage
- \ No newline at end of file --- 0 ---- diff -c -r --new-file ds2.0r18/lib/www/doc/ds-faq.html ds2.0r28/lib/www/doc/ds-faq.html *** ds2.0r18/lib/www/doc/ds-faq.html Fri Jan 27 22:56:29 2006 --- ds2.0r28/lib/www/doc/ds-faq.html Wed Dec 31 19:00:00 1969 *************** *** 1,11 **** - - - Dead Souls FAQ - - -
Dead Souls FAQ, v1

Written by Cratylus @ Frontiers, October 2005

What is Dead Souls?

Primarily Dead Souls is a "mudlib". There is also a Dead Souls
MUD, but this is not what people generally mean when they refer to Dead Souls as a
game. It also happens that a book by the Russian author Nikolai Gogol is named Dead
Souls. That book is wholly unrelated to the Dead Souls software.

What is it for?

It's for building a game. If what you want to do is play a game,
you're looking for something else.

What is a mudlib?

Hang on, let me explain what a MUD is, first.

What is a MUD?

A MUD is a computer program that uses text (very rarely do MUDs
use graphics or sound) to describe virtual environments you can manipulate.
You enter a command, the program tells you how the virtual world responds
around you. Typically there are other people connected to the same program
over the Internet, and you can interact with them as well. A MUD can be mostly
social, or mostly game oriented, with quests and puzzles to solve or
villains to defeat. The name MUD is an acronym that originally stood for
"Multi-User Dungeon", in accord with the "Dungeons and Dragons" style of
many early MUDs. Now it stands for different things to different people,
but the basic concept of operation is the same, whether the game is set
on the moon, in Manhattan, or in Middle Earth.

Ok, now, what's a mudlib?

Generally there are two main parts to the MUD program. First is the
"driver". This is an executable program file (in Windows, you'd see the driver
has an .EXE extension) that enables the input and output of data, accepts
network connections, performs basic calculations, etc. The other part
is the mudlib, or, more properly, MUD object library. This is usually a
large set of files in plain text that the driver reads and uses as a
basis for the game. Some files provide information about rooms and
environments, some files provide information about objects or creatures,
etc. When players connect, the driver provides them the world that these
files describe.

When I configure Dead Souls, it says it is a MUD. If it is really a mudlib,
why would that be?

Dead Souls is not intended to be a fully-developed MUD when you
install it. Instead it provides you with the basic framework you need to
make a MUD of your own. After you set up Dead Souls, you should rename it,
and customize the lib (that is, library) files to create your own world. When
 you first run Dead Souls, you will have some rooms available to explore.
This is not your mud. It is just a set of sample places and objects to help
you understand how to build a MUD of your own. So in a way, Dead Souls provides
you a kind of "starter" MUD, but since it's just examples, you can't really
consider it a MUD until you change it to suit your creative vision.

Is Dead Souls really Nightmare in disguise?

Let's break this question down into its components:

What is Nightmare?

Nightmare is a mudlib. It was part of a branching of mud development
that occurred early in the days of popularized mudding. Some folks
decided to take MUD library development in a particular direction,
and eventually made available what is now known as the Nightmare mudlib.
Nightmare went through a few major changes, most notably from version 3
to version IV. By that time, the development of Nightmare was solely
managed by a coder who called himself Descartes.

What is the relationship between Nightmare and Dead Souls?

It appears that Dead Souls began as a "development" MUD. This means
that while Descartes ran his own MUD, he also worked on improving that MUD's
lib. It is unwise to make major changes to a MUD that people are playing on,
so the Dead Souls development MUD was one which served as a platform to
develop, extend, and improve the Nightmare lib without risking harm to active players.
Sometime after the release of the Nightmare IV mudlib, Descartes decided to
withdraw it from distribution. Based on their interpretation of copyright
law, people now do not distribute the Nightmare mudlib on Internet servers.
However, somewhat inexplicably, Descartes released the mudlib for his
development mud, Dead Souls, into the public domain. This meant that the
Dead Souls mudlib was completely free to be used by anyone in any way they
chose, be it distribution, modification, spindling or folding. Because Dead
Souls was the development mud for Nightmare Mud, which was the base of the
Nightmare mudlib, the relationship between the two is an extremely close one.

How close?

Frankly, almost identical. A close comparison of the Dead Souls lib
that Descartes released (version 1.1pre) against the last released Nightmare
lib (IVr6) reveals that they are very nearly the same thing, file for file.
The main differences between the two are:

* A small number of Nightmare library files aren't on Dead Souls.
* Dead Souls doesn't come with the driver or install script the Nightmare had.
* All documentation files were removed from Dead Souls.
* "Nightmare" in file headers was changed to say "Dead Souls"

This might sound like a lot of difference, but consider this: not counting
documentation, Nightmare IVr6 lib contained 1064 files and directories, and
the Dead Souls 1.1pre lib contains 1082. Dead Souls 1.1pre actually had more
lib material in it than the last release of Nightmare.

Why mess with Dead Souls, then?

The main problem was that Dead Souls was a bear to set up. Because
driver development had not stopped (the driver is a separate software project),
but lib development had, incompatibilities grew in number over time. Using
the original driver from 1997 created a MUD that lacked important features
of modern muds, and risked instability. Using a modern driver required a
modification of fundamental lib systems that required some expertise to
perform. People stopped using Nightmare because they couldn't get it, and
they didn't use Dead Souls because the damn thing didn't work right. My own
Nightmare lib MUD, Frontiers, continued to chug along, quietly fading into
obscurity along with all other Nightmare IV based MUDs, while scrappy young
newcomers like CoffeeMud lib started elbowing their way into the MUD community.

Then a funny thing happened. I really got into lib coding. I mean, full-on
lib obsession. I can't really explain it, other than to say that when I was
younger it seemed hard and impenetrable, but now that I've been working in a
technical field for years, I have the mental tools (and patience) required to
disassemble and understand complex systems. I got turned on by analyzing and
understanding stuff that I'd considered over my head in years past. But I
realized I was living in the past. I couldn't share my exciting lib ideas
and discoveries with anyone else, because the Nightmare LPC community was
in the very last stages of extinction.

I decided to do something about it. Maybe I'd be whistling into the wind,
tilting at windmills, or even worse, just talking to myself. But I decided
I'd make Dead Souls a viable lib for people to use, because it would be fun,
and because it might be nice to have other people to bounce ideas off of and
steal code from. At worst, I'd be doing nothing more pathetic than, say,
building model ships in my basement. At best, I might revive a once-thriving
MUD development community. Either way, it sounded like an enjoyable project,
so I proceeded.

Fine, but what's so special about Nightmare/Dead Souls? Why are you making such a
big deal of wanting people to use it? It isn't better than everything else,
surely. [insert mudlib name here] is newer and has [insert feature here] and [other feature]!

Yes, that may be. My experience with other libs is limited, and I'm sure
that Dead Souls pales in comparison to others in one feature or another. My only
answer to that is, go ahead and use the lib you're comfortable with. I make no
claims of superiority. Hell, I'll be the first to admit there are still things
to fix and systems to implement. But if you are not sure which lib to pick,
Dead Souls is an excellent choice as a solid, stable, flexible and powerful platform
to build your MUD. You can do anything in a MUD with LPC, and I mean anything.
If you happen to have Nightmare experience, Dead Souls will be a homecoming...
like an old comfortable shoe....but without the holes or the stink.

What's LPC?

LPC is a kind of programming language. Dead Souls lib files don't
just contain descriptions of places and things: they have a format that describes
their relationships to the driver and permits you to do fancy stuff...pretty much
any text MUD thing you can think of, you can do in LPC.

How do I get started?

Download the latest version from http://dead-souls.sourceforge.net/ 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
executable. The Unix driver is in source code form and must be compiled.
The lib files for both versions are identical.

What if I get stuck?

Review the documentation. It is available at the following sites:
http://frontiers.wcsu.ctstateu.edu/doc/
http://dead-souls.net/doc/

If those are down, please email me at [put my name here]@users.sourceforge.net
to let me know.

You can also try asking for help on the intercre network once
you have the MUD set up. Review /doc/README for how to enable intermud
network channels.

Or, once you're up, try telling me something across the intermud.
For example:

 tell cratylus@frontiers hello


Anything else?

Read the Dead Souls Admin FAQ.
- The end.
-
- Dead Souls Homepage
-
- \ No newline at end of file --- 0 ---- diff -c -r --new-file ds2.0r18/lib/www/doc/editor.html ds2.0r28/lib/www/doc/editor.html *** ds2.0r18/lib/www/doc/editor.html Fri Jan 27 22:56:29 2006 --- ds2.0r28/lib/www/doc/editor.html Wed Dec 31 19:00:00 1969 *************** *** 1,23 **** - - - Mud Editor Tutorial - - -
The ed Editor


This has always been the aspect of coding that new
creators have most trouble with. It's what discourages most
people from creating lots of stuff, in fact.

With Dead Souls, you can get away with avoiding ed
most of the time, by using the room maker and the thing maker.

But to add special functions to your code, like
magic items, smart NPC's (aka mobs), traps, hidden objects,
etc, you need to use ed, if you're going to be editing inside
the mud.

ed is a simple editing program. It is designed to
work on a line-by-line basis, so it is called a "line editor".

Let's start by looking at, and editing, a small file.
We've coded a sword, and we want to change its description
from "short sword" to "plain sword":


-
-

> cd /realms/cratylus/area/weap
1) I changed my working directory to my area weapons dir
/realms/cratylus/area/weap:
> ls
I listed the contents of that dir:
/realms/cratylus/area/weap/:
1 dagger.c 1 nco_sword.c~ 1 std_sword.c~
1 gsword.c 1 sharpsword.c 1 sword.c
001 gsword.c~ 1 staff.c
1 nco_sword.c 1 std_sword.c


> ed sword.c
I ran the ed command on the file sword.c.
/realms/cratylus/area/weap/sword.c, 641 bytes
:n
This makes the editor display line numbers next to the lines.
number on, list off
:1z This lists about 20 lines of text
1 /* /domains/Examples/weapon/sword.c
2 * from the Nightmare IV LPC Library
3 * a simple sword example, nothing fancy
4 * created by Descartes of Borg 950402
5 */
6
7 #include <lib.h>
8 #include <damage_types.h>
9 #include <vendor_types.h>
10
11 inherit LIB_ITEM;
12
13 static void create() {
14 item::create();
15 SetKeyName("short sword");
16 SetId( ({ "sword", "short sword" }) );
17 SetAdjectives( ({ "short" }) );
18 SetShort("a short sword");
19 SetLong("A cheap and rather dull short sword.");
20 SetMass(150);
21 SetDollarCost(50);
22 SetVendorType(VT_WEAPON);
:z
22 SetVendorType(VT_WEAPON);
23 SetClass(20);
24 SetDamageType(BLADE);
25 SetWeaponType("blade");
26 }
:15 I displayed line 15
15 SetKeyName("short sword");
:15c I used 'c' to replace line 15
15. * SetKeyName("plain sword"); I entered my replacement text
16. * . I entered a single dot on a blank line
:
16 SetId( ({ "sword", "short sword" }) );
:1z I listed about 20 lines, starting from line 1
1 /* /domains/Examples/weapon/sword.c
2 * from the Nightmare IV LPC Library
3 * a simple sword example, nothing fancy
4 * created by Descartes of Borg 950402
5 */
6
7 #include <lib.h>
8 #include <damage_types.h>
9 #include <vendor_types.h>
10
11 inherit LIB_ITEM;
12
13 static void create() {
14 item::create();
15 SetKeyName("plain sword");
16 SetId( ({ "sword", "short sword" }) );
17 SetAdjectives( ({ "short" }) );
18 SetShort("a short sword");
19 SetLong("A cheap and rather dull short sword.");
20 SetMass(150);
21 SetDollarCost(50);
22 SetVendorType(VT_WEAPON);
:18 I displayed line 18
18 SetShort("a short sword");
:18c I started the replacement of line 18
18. * SetShort("a plain sword"); I entered my replacement text
19. * . I entered a single dot on a blank line
:1z I displayed about 20 lines starting from line 1
1 /* /domains/Examples/weapon/sword.c
2 * from the Nightmare IV LPC Library
3 * a simple sword example, nothing fancy
4 * created by Descartes of Borg 950402
5 */
6
7 #include <lib.h>
8 #include <damage_types.h>
9 #include <vendor_types.h>
10
11 inherit LIB_ITEM;
12
13 static void create() {
14 item::create();
15 SetKeyName("plain sword");
16 SetId( ({ "sword", "short sword" }) );
17 SetAdjectives( ({ "short" }) );
18 SetShort("a plain sword");
19 SetLong("A cheap and rather dull short sword.");
20 SetMass(150);
21 SetDollarCost(50);
22 SetVendorType(VT_WEAPON);
:x I saved and exited
"/realms/cratylus/area/weap/sword.c" 26 lines 633 bytes
Exit from ed.
> update sword I loaded the file into memory
/realms/cratylus/area/weap/sword: Ok
-
-


Let's take this step by step:

1) I changed my working directory to my area weapons dir:
cd /realms/cratylus/area/weap

2) I listed the contents of that dir: ls

3) I ran the ed command on the file sword.c: ed sword.c

4) Within the editor, I issued the 'n' command. This makes the editor
display line numbers next to the lines.

5) Within the editor, I issued the '1z' command. What 'z' does is display
about 20 lines of the file (the exact number depends on your screen
settings. In my case it's 22). If you happen to be looking at line 1, it
will display lines 1 through to about 20. If you happen to be looking
at line 40, it will display from line 40 to about 60.
If you want to start looking at lines starting at line 15, you
can issue the '15z' command, which basically means "display about 20
lines starting at line 15".
In this case, I wanted to start from the beginning of the file,
so I issued '1z'.

6) '1z' stopped listing the file at line 22, so I entered 'z' again to
list the rest.

7) Since I want to change "short sword" to "plain sword", I examined each
line to find the word "short". I noticed that line 15 has "short" in it,
so to get a look at that line alone, I entered '15'.

8) Now that I'm sure line 15 needs to change, I issue the '15c' command.
'c' indicates that I want to change a line. '15c' means "delete whatever
was in line 15, and replace it with what I am about to type".

9) You can see that my editor prompt changed from ":" to "*". What this
means is that I am now in "input mode". Whatever I type now will be
added to the file. Since my last command in "command mode" was '15c',
I am now replacing that line with what I want the line to contain:
SetKeyName("plain sword");

10) Ok, I replaced the line, but I'm still in input mode. To go back to
command mode, I type a single period and enter, like this:
.

11) I'm back in command mode now. When I list the file contents with
'1z' I can see that line 15 now says what I wanted.

12) Now I see another line that needs changing, so I enter '18' to
get a closer look.

13) Sure enough, 18 needs to change, so I issue '18c'.

14) Like I did for line 15, I enter what the line should be.

15) To return to command mode, I enter a single period on a blank line.

16) I list the file contents, and see that my change was successful.

17) I'm finished making my changes, so I issue the 'x' command. 'x'
means "save the changes I have made, and exit the editor".

18) I am now at my regular command prompt. To load my changes to this
file, I type 'update sword'.


Editor basics, part 2



In the last section you saw what a simple line
replacement looks like in ed. Next we'll talk about some common
ed actions.

ADDING STUFF:

Suppose I want to specify that this sword requires only
one hand to wield it:

-
-

> ed sword.c started the editor
/realms/cratylus/area/weap/sword.c, 633 bytes
:n enabled line number printing
number on, list off
:15,22 listed lines 15 to 22
15 SetKeyName("plain sword");
16 SetId( ({ "sword", "short sword" }) );
17 SetAdjectives( ({ "short" }) );
18 SetShort("a plain sword");
19 SetLong("A cheap and rather dull short sword.");
20 SetMass(150);
21 SetDollarCost(50);
22 SetVendorType(VT_WEAPON);
:20a appended to the file after line 20
21. * SetHands(1); entered my added text
22. * . single dot on a blank line to exit input mode
:18,22 displayed line 18 through 22
18 SetShort("a plain sword");
19 SetLong("A cheap and rather dull short sword.");
20 SetMass(150);
21 SetHands(1);
22 SetDollarCost(50);
:x exited editor and saved
"/realms/cratylus/area/weap/sword.c" 27 lines 646 bytes
Exit from ed.
-
-


Here you can see that instead of 'c', which replaces, I
used 'a', which adds. I decided my new line would go after line
20, so I issued the command '20a'. Once I was done, I typed
a single dot on a blank line to exit "input mode". You'll notice
I didn't use the 'z' command. Instead, since I knew where my
changes would go, I decided to list lines 18 through 22 with
the command '18,22'. I then issued the 'x' command to save my
changes and exit the editor.
If had I wanted my addition to go in front of line 20,
I could have used the '20i' command.

DELETING LINES

Suppose I'm tired of seeing header lines that no
longer apply to this file. We can delete a single line, or
a range of lines, with the 'd' commmand:

-
> ed sword.c
-
/realms/cratylus/area/weap/sword.c, 646 bytes
:n enabled line number printing
number on, list off
:1,10 listed lines 1 to 10
1 /* /domains/Examples/weapon/sword.c
2 * from the Nightmare IV LPC Library
3 * a simple sword example, nothing fancy
4 * created by Descartes of Borg 950402
5 */
6
7 #include <lib.h>
8 #include <damage_types.h>
9 #include <vendor_types.h>
10
:1,5d deleted lines 1 to 5
:1,5 listed (the new) lines 1 to 5
1
2 #include <lib.h>
3 #include <damage_types.h>
4 #include <vendor_types.h>
5
:1d deleted blank line 1
:1z displayed the file starting at line 1
1 #include <lib.h>
2 #include <damage_types.h>
3 #include <vendor_types.h>
4
5 inherit LIB_ITEM;
6
7 static void create() {
8 item::create();
9 SetKeyName("plain sword");
10 SetId( ({ "sword", "short sword" }) );
11 SetAdjectives( ({ "short" }) );
12 SetShort("a plain sword");
13 SetLong("A cheap and rather dull short sword.");
14 SetMass(150);
15 SetHands(1);
16 SetDollarCost(50);
17 SetVendorType(VT_WEAPON);
18 SetClass(20);
19 SetDamageType(BLADE);
20 SetWeaponType("blade");
21 }
:x exited and saved
"/realms/cratylus/area/weap/sword.c" 21 lines 476 bytes
Exit from ed.
-
-


First I deleted lines 1 through 5 with the command '1,5d'.
Then, for good measure, I removed the remaining blank line '1d'.
Voila. Cleaner code.

REPLACING STRINGS

Well now I want to replace all instances of "short" with
"plain", and I don't feel like editing each matching line
manually. I can do a search and replace. First I will list which
lines need to change, then I will change them:

-
> ed sword.c
-
/realms/cratylus/area/weap/sword.c, 476 bytes
:n
enabled line number printing
number on, list off
:g/short/p
searched for and displayed lines containing "short"
10 SetId( ({ "sword", "short sword" }) );
11 SetAdjectives( ({ "short" }) );
13 SetLong("A cheap and rather dull short sword.");
:g/short/s/short/plain
searched for "short" and replaced with "plain"
:g/short/p
searched for "short" again but found none
:1z
listed file from line 1
1 #include <lib.h>
2 #include <damage_types.h>
3 #include <vendor_types.h>
4
5 inherit LIB_ITEM;
6
7 static void create() {
8 item::create();
9 SetKeyName("plain sword");
10 SetId( ({ "sword", "plain sword" }) );
11 SetAdjectives( ({ "plain" }) );
12 SetShort("a plain sword");
13 SetLong("A cheap and rather dull plain sword.");
14 SetMass(150);
15 SetHands(1);
16 SetDollarCost(50);
17 SetVendorType(VT_WEAPON);
18 SetClass(20);
19 SetDamageType(BLADE);
20 SetWeaponType("blade");
21 }
:1
moved to line 1
1 #include <lib.h>
:I
ran automatic indentation
Indenting entire code...
Indentation complete.
:1z
listed file from line 1
#include <lib.h>
#include <damage_types.h>
#include <vendor_types.h>

inherit LIB_ITEM;

static void create() {
item::create();
SetKeyName("plain sword");
SetId( ({ "sword", "plain sword" }) );
SetAdjectives( ({ "plain" }) );
SetShort("a plain sword");
SetLong("A cheap and rather dull plain sword.");
SetMass(150);
SetHands(1);
SetDollarCost(50);
SetVendorType(VT_WEAPON);
SetClass(20);
SetDamageType(BLADE);
SetWeaponType("blade");
}
:x
exited and saved
"/realms/cratylus/area/weap/sword.c" 21 lines 488 bytes
Exit from ed.
-
-


The command g/short/p showed me all the lines
that contained the substring "short". Then I ran the global
search and replace command to substitute "plain" for "short",
:g/short/s/short/plain
Then I searched again for the string "short" and
nothing came up, because it had been replaced.

Finally I went to line number 1 and issued the 'I'
command. This auto-indents the code, making it neater and
easier to read.


Editor basics, part 3



Now let's look at some common problems:


1) Accidental deletion


If you type 1,20d when you meant to type 1,2d you will end
up with a file 18 lines shorter than you intended. ed does not
have an "undo" command, so those lines will never come back.
However, if you quit the editor *without saving*, then that
deletion will not be committed to the file. You can issue the 'Q'
command:

:Q

To force quit without saving. Of course, if those lines
weren't already in the file, this won't help much.


2) Can't leave the editor


You try to write and exit, but get this:

:x
File command failed.

What this means is that for some reason, you can't write
to the file, so you don't exit the editor. What this usually means is that
you tried to edit a file that does not belong to you. Since you do not
have permission to modify the file, ed refuses to commit your changes.

There are two ways around this. If you don't really care
whether your changes are saved or not, you can just force quit the
editor with 'Q':

:Q
Exit from ed.

Your changes will be lost, but you'll be out of the editor.

If you really want to save this file, you'll have to save it
somewhere other than your current working directory (cwd). You can save
it to your home directory with the 'w' command, then force quit:

:w /realms/cratylus/sword.c
"/realms/cratylus/sword.c" 20 lines 478 bytes
:Q
Exit from ed.


3) Indent command fails


You try to auto-indent your code but get an error like this:

:I
Indenting entire code...
Unterminated string in line 13
Indentation halted.

This is pretty self explanatory. Indent relies on a certain
amount of coherence in your code, and if your syntax is sufficiently
munged, it can't figure out how to properly do its thing.
Examine the line that indent complains about, and also the
line before it. Sometimes a good line is accused of being bad, just
because it comes after a bad line.


4) I need to [something] in ed, but don't know how!


While in command mode, type 'h' and enter. You'll get
a handy list of ed commands available to you.


5) My ability/patience/time is limited. I want not to use ed.


I feel your pain. The currently available ways around
this are:

1) Shell account. If you can get shell, or command line access
to the computer that is running the mud, then you can probably
use an editor local to that computer (like vim) to edit files.
Chances are, though, that if you are a regular rank-and-file
creator, you will not be given shell access. Most system admins
consider giving random people off the net shell access
an abomination.

2) Server FTP/SFTP. The server that runs the mud might have an
ftp server or sftpd access. Again, most security-conscious sysadmins
will not permit Just Some Person Off The Internet to have this
kind of access.

3) Mud FTP. I don't like this option. Unix FTPD is a security
concern as it is. Using unsupported, un-warrantied mud network code
to provide ftp access to files seems to me to be equivalent to pulling
down your pants, bending over, and whistling for the Internet to
come visit. But...it's an option.

4) Client upload. This is actually the most sensible option, if
you are truly allergic to ed. You still need to use ed, but what
you can do is write your code in your favorite local editor, like
notepad or gvim or whatever. Then use your mud client (most of them
have an option to "send text") to send the code by running ed,
entering input mode, copying the code from your editor, and
pasting it into your client.
This is a somewhat awkward system, and ill-suited to
making minor changes. But it has the virtue of working well and
being a widely available option.

5) Suck it up. Really, you need to just get used to it. Don't
make me tell you stories about how when I was younger I had to
code using a VT terminal with no cut-and-paste, in an unheated,
locked computer lab 20'x10' in size, at 9600 bps. In a snowstorm.
Uphill both ways.



Dead Souls Homepage



- \ No newline at end of file --- 0 ---- diff -c -r --new-file ds2.0r18/lib/www/doc/example.html ds2.0r28/lib/www/doc/example.html *** ds2.0r18/lib/www/doc/example.html Fri Jan 27 22:56:29 2006 --- ds2.0r28/lib/www/doc/example.html Wed Dec 31 19:00:00 1969 *************** *** 1,865 **** - - - creation example page - - - This is a log of the creation of some items using the Dead Souls - creation system. It has
- not been modified in any way except to highlight the command lines and - adding comments.
-

-
-
- Dead Souls has been up for 2h 25m 38s.
- home
- /realms/testycre/workroom
- Testycre's workroom [e,d]
- You are standing in the workroom of the mighty Testycre!  
- You may return to the Creators' Hall by going down.
- A sample room is east.
- There is a sign here you can read.
- There is a sheet here you can read.
- A wooden chest is here.
-
-
- e
-
/realms/testycre/area/room/sample_room
- Sample Room [w]
- This is a room you can use as a template.
- A simple table is here.
- A fighter is standing here.
-
- //// This is - the standard sample room. We're about to create a new room to the east - of it.
- create room east test1
-
It appears you have write access to this area.
- It's a null mapping
- Indenting file...
- "/tmp/indent.1134436511.tmp.dat" 20 lines 330 bytes
- Exit from ed.
-
- You wave your hand, and a new exit appears.
- You begin uttering a magical incantation.
- Indenting file...
- "/tmp/indent.1134436511.tmp.dat" 27 lines 543 bytes
- Exit from ed.
-
- Indenting file...
- "/tmp/indent.1134436511.tmp.dat" 27 lines 544 bytes
- Exit from ed.
-
- e
-
/realms/testycre/area/room/test1
- Copy of /realms/testycre/area/room/sample_room.c [w]
- This is a room you can use as a template.
- A simple table is here.
- A fighter is standing here.
-
- //// We go - into the new room and see it is a copy of the old one. Let's change the - short description to avoid confusion:
- modify here short Room One
- Indenting file...
- "/tmp/indent.1134436526.tmp.dat" 27 lines 515 bytes
- Exit from ed.
-
- //// We don't - need the fighter from the other room here, so we remove him from this - new room's inventory.
- delete fighter
-
Indenting - file...
- "/tmp/indent.1134436532.tmp.dat" 26 lines 507 bytes
- Exit from ed.
-
- /realms/testycre/area/room/test1: Ok
- /realms/testycre/area/room/test1
- Room One [w]
- This is a room you can use as a template.
- A simple table is here.
-
-
- SetInventory modification complete.
- //// Let's make another room.
- create room east test2
- It appears you have write access to this area.
- It's a null mapping
- Indenting file...
- "/tmp/indent.1134436578.tmp.dat" 20 lines 324 bytes
- Exit from ed.
-
- You wave your hand, and a new exit appears.
- You begin uttering a magical incantation.
- Indenting file...
- "/tmp/indent.1134436578.tmp.dat" 27 lines 557 bytes
- Exit from ed.
-
- Indenting file...
- "/tmp/indent.1134436578.tmp.dat" 27 lines 525 bytes
- Exit from ed.
-
- e

- /realms/testycre/area/room/test2
- Copy of /realms/testycre/area/room/test1.c [w]
- This is a room you can use as a template.
- A simple table is here.
-
-
- modify here short Room 2
- Indenting file...
- "/tmp/indent.1134436590.tmp.dat" 26 lines 499 bytes
- Exit from ed.
-
- modify here long This is the - second test room.
- Indenting file...
- "/tmp/indent.1134436608.tmp.dat" 26 lines 487 bytes
- Exit from ed.
-
- //// We don't need that table - here.
- delete table
- Indenting file...
- "/tmp/indent.1134436612.tmp.dat" 25 lines 447 bytes
- Exit from ed.
-
- /realms/testycre/area/room/test2: Ok
- /realms/testycre/area/room/test2
- Room 2 [w]
- This is the second test room.
- SetInventory modification complete.
-
- //// We look at the file - contents to make sure what we're doing really is being written into the - room's code:
- more here
- #include <lib.h>
- #include "/realms/testycre/customdefs.h"
-
- inherit LIB_ROOM;
-
- static void create() {
-     room::create();
-     SetClimate("indoors");
-     SetAmbientLight(30);
-     SetShort("Room 2");
-     SetLong("This is the second test room.");
-     SetExits(([
-     "west" : "/realms/testycre/area/room/test1",
-       ]));
-
-     SetItems( ([
-     "template" : "That's what this is.",
-       ]) );
-
-     SetInventory(([
-       ]));
- }
-
- void init(){
-     ::init();
- }
-
- //// Let's make a new guy. - "guy" will be the filename.
- create npc guy
- I'm going to go with the appropriate area directory:
- /realms/testycre/area/npc/guy.c
- You wave your hand mysteriously and a generic npc materializes!
- l
- /realms/testycre/area/room/test2
- Room 2 [w]
- This is the second test room.
- A generic npc is standing here.
-
- //// This is the first thing - you should do, in order to avoid confusion.
- modify npc name guy
- Indenting file...
- "/tmp/indent.1134436801.tmp.dat" 15 lines 417 bytes
- Exit from ed.
-
- modify npc id
- This setting takes multiple values. If you have no more values to - enter, then
- enter a dot on a blank line. To cancel, enter a single q on a blank - line.
- You may now enter the next value. So far, it is blank.
- If you're done entering values, enter a dot on a blank line.
- dude
- You may now enter the next value. So far, we have: ({ "dude" })
- If you're done entering values, enter a dot on a blank line.
- fellow
- You may now enter the next value. So far, we have: ({ "dude", "fellow" - })
- If you're done entering values, enter a dot on a blank line.
- fella
- You may now enter the next value. So far, we have: ({ "dude", "fellow", - "fella"
- })
- If you're done entering values, enter a dot on a blank line.
-
- Entries complete. Final array is: ({ "dude", "fellow", "fella" })
- Indenting file...
- "/tmp/indent.1134436831.tmp.dat" 19 lines 442 bytes
- Exit from ed.
-
- /realms/testycre/tmp/guy1134436805: Ok
- /realms/testycre/area/npc/guy: Ok
- SetId modification complete.
- modify guy short The Dude
- Indenting file...
- "/tmp/indent.1134436855.tmp.dat" 19 lines 437 bytes
- Exit from ed.
-
- modify guy long This is just some - random guy.
- Indenting file...
- "/tmp/indent.1134436904.tmp.dat" 19 lines 408 bytes
- Exit from ed.
-
- modify guy adj
- This setting takes multiple values. If you have no more values to - enter, then
- enter a dot on a blank line. To cancel, enter a single q on a blank - line.
- You may now enter the next value. So far, it is blank.
- If you're done entering values, enter a dot on a blank line.
- just some
- You may now enter the next value. So far, we have: ({ "just some" })
- If you're done entering values, enter a dot on a blank line.
- random
- You may now enter the next value. So far, we have: ({ "just some", - "random" })
- If you're done entering values, enter a dot on a blank line.
- some
- You may now enter the next value. So far, we have: ({ "just some", - "random",
- "some" })
- If you're done entering values, enter a dot on a blank line.
-
- Entries complete. Final array is: ({ "just some", "random", "some" })
- Indenting file...
- "/tmp/indent.1134436924.tmp.dat" 19 lines 402 bytes
- Exit from ed.
-
- /realms/testycre/tmp/guy1134436912: Ok
- /realms/testycre/area/npc/guy: Ok
- SetAdjectives modification complete.
- l
- /realms/testycre/area/room/test2
- Room 2 [w]
- This is the second test room.
- The Dude is standing here.
-
-
- about dude

- /realms/testycre/area/npc/guy.c
-
- #include <lib.h>
-
- inherit LIB_SENTIENT;
-
- static void create() {
-     sentient::create();
-     SetKeyName("guy");
-     SetAdjectives( ({"just some", "random", "some"}) );
-     SetId( ({"dude", "fellow", "fella"}) );
-     SetShort("The Dude");
-     SetLong("This is just some random guy.");
-     SetLevel(1);
-     SetRace("human");
-     SetClass("explorer");
-     SetGender("male");
- }
- void init(){
-     ::init();
-
- //// Now a weapon for our new - guy. "hammer" is the filename.
- create weapon hammer
- I'm going to go with the appropriate area directory:
- /realms/testycre/area/weap/hammer.c
- You wave your hand mysteriously and a generic weapon materializes!
- modify weapon id hammer
- This setting takes multiple values. If you have no more values to - enter, then
- enter a dot on a blank line. To cancel, enter a single q on a blank - line.
- You may now enter the next value. So far, we have: ({ "hammer" })
- If you're done entering values, enter a dot on a blank line.
- warhammer
- You may now enter the next value. So far, we have: ({ "hammer", - "warhammer" })
- If you're done entering values, enter a dot on a blank line.
-
- Entries complete. Final array is: ({ "hammer", "warhammer" })
- Indenting file...
- "/tmp/indent.1134437181.tmp.dat" 19 lines 453 bytes
- Exit from ed.
-
- /realms/testycre/tmp/hammer1134437165: Ok
- /realms/testycre/area/weap/hammer: Ok
- SetId modification complete.
- modify weapon name hammer
- There is no weapon here.
- l
- /realms/testycre/area/room/test2
- Room 2 [w]
- This is the second test room.
- A generic weapon is here.
- The Dude is standing here.
-
- //// I accidentally - changed the id before the name. Oops! Easy enough to fix:
- modify hammer name hammer
- Indenting file...
- "/tmp/indent.1134437205.tmp.dat" 22 lines 474 bytes
- Exit from ed.
-
- about hammer
- /realms/testycre/area/weap/hammer.c
-
- #include <lib.h>
- #include <damage_types.h>
- #include <vendor_types.h>
-
- inherit LIB_ITEM;
-
- static void create() {
-     item::create();
-     SetKeyName("hammer");
-     SetId( ({"hammer", "warhammer"}) );
-     SetAdjectives( ({ "generic" }));
-     SetShort("a generic weapon");
-     SetLong("A weapon of indeterminate proportions.");
-     SetMass(50);
-     SetVendorType(VT_WEAPON);
-     SetClass(30);
-     SetDamageType(BLADE);
-     SetWeaponType("blade");
-
- }
- void init(){
-     ::init();
- }
- modify hammer damagetype blunt
- Indenting file...
- "/tmp/indent.1134437392.tmp.dat" 22 lines 474 bytes
- Exit from ed.
-
- modify hammer weapontype blunt
- Indenting file...
- "/tmp/indent.1134437398.tmp.dat" 22 lines 474 bytes
- Exit from ed.
-
- modify hammer mass 700
- Indenting file...
- "/tmp/indent.1134437414.tmp.dat" 22 lines 475 bytes
- Exit from ed.
-
- modify hammer hands 2
- Indenting file...
- "/tmp/indent.1134437422.tmp.dat" 23 lines 492 bytes
- Exit from ed.
-
- //// Let's see if all that - stuff really did go into the file:
- about hammer
- /realms/testycre/area/weap/hammer.c
-
- #include <lib.h>
- #include <damage_types.h>
- #include <vendor_types.h>
-
- inherit LIB_ITEM;
-
- static void create() {
-     item::create();
-     SetKeyName("hammer");
-     SetId( ({"hammer", "warhammer"}) );
-     SetAdjectives( ({ "generic" }));
-     SetShort("a generic weapon");
-     SetLong("A weapon of indeterminate proportions.");
-     SetHands(2);
-     SetMass(700);
-     SetVendorType(VT_WEAPON);
-     SetClass(30);
-     SetDamageType(BLUNT);
-
-     SetWeaponType("blunt");
- }
- void init(){
-     ::init();
- }
- modify hammer short a heavy - war hammer
- Indenting file...
- "/tmp/indent.1134437450.tmp.dat" 23 lines 494 bytes
- Exit from ed.
-
- modify hammer long This is an - extremely large and heavy hammer designed to be wielded in both hands - and used to hurt people very badly indeed.
- Indenting file...
- "/tmp/indent.1134437509.tmp.dat" 23 lines 579 bytes
- Exit from ed.
-
- modify hammer adj
- This setting takes multiple values. If you have no more values to - enter, then
- enter a dot on a blank line. To cancel, enter a single q on a blank - line.
- You may now enter the next value. So far, it is blank.
- If you're done entering values, enter a dot on a blank line.
- large
- You may now enter the next value. So far, we have: ({ "large" })
- If you're done entering values, enter a dot on a blank line.
- heavy
- You may now enter the next value. So far, we have: ({ "large", "heavy" - })
- If you're done entering values, enter a dot on a blank line.
- war
- You may now enter the next value. So far, we have: ({ "large", "heavy", - "war" })
- If you're done entering values, enter a dot on a blank line.
-
- Entries complete. Final array is: ({ "large", "heavy", "war" })
- Indenting file...
- "/tmp/indent.1134437531.tmp.dat" 23 lines 592 bytes
- Exit from ed.
-
- /realms/testycre/tmp/hammer1134437521: Ok
- /realms/testycre/area/weap/hammer: Ok
- SetAdjectives modification complete.
- about hammer
- /realms/testycre/area/weap/hammer.c
-
- #include <lib.h>
- #include <damage_types.h>
- #include <vendor_types.h>
-
- inherit LIB_ITEM;
-
- static void create() {
-     item::create();
-     SetKeyName("hammer");
-     SetAdjectives( ({"large", "heavy", "war"}) );
-     SetId( ({"hammer", "warhammer"}) );
-     SetShort("a heavy war hammer");
-     SetLong("This is an extremely large and heavy hammer - designed to be wielded
- in both hands and used to hurt people very badly indeed.");
-     SetHands(2);
-     SetMass(700);
-     SetVendorType(VT_WEAPON);
-     SetClass(30);
-     SetDamageType(BLUNT);
-
-     SetWeaponType("blunt");
- }
- void init(){
-     ::init();
- }
-
- //// It's a pretty heavy - hammer, so let's make sure our guy can wield it.
- modify guy level 10
- Indenting file...
- "/tmp/indent.1134437557.tmp.dat" 19 lines 403 bytes
- Exit from ed.
-
- //// With this simple command - we add the hammer to the permanent inventory of our guy.
- add hammer to guy
- ob2: /realms/testycre/area/npc/guy.c
- ob: /realms/testycre/area/weap/hammer.c
- Please enter a command for the NPC to perform with this item. If you - have no
- such command to enter, enter the number of these items you want to add:
- wield hammer
- Indenting file...
- "/tmp/indent.1134437569.tmp.dat" 22 lines 489 bytes
- Exit from ed.
-
- /realms/testycre/area/npc/guy: Ok
- Guy wields a heavy war hammer.
- SetInventory modification complete.
- exa guy
- This is just some random guy.
- The male human is in top condition.
- Guy is carrying:
- A heavy war hammer (wielded in left hand and right hand)
-
- about guy
- /realms/testycre/area/npc/guy.c
-
- #include <lib.h>
-
- inherit LIB_SENTIENT;
-
- static void create() {
-     sentient::create();
-     SetKeyName("guy");
-     SetAdjectives( ({"just some", "random", "some"}) );
-     SetId( ({"dude", "fellow", "fella"}) );
-     SetShort("The Dude");
-     SetLong("This is just some random guy.");
-     SetInventory(([
-     "/realms/testycre/area/weap/hammer" : "wield hammer",
-       ]));
-     SetLevel(10);
-     SetRace("human");
-     SetClass("explorer");
-     SetGender("male");
-
- }
- void init(){
-     ::init();
- }
-
- //// Making armor is just as - easy:
- create armor helmet
- I'm going to go with the appropriate area directory:
- /realms/testycre/area/armor/helmet.c
- You wave your hand mysteriously and generic armor materializes!
- modify armor name helmet
- Indenting file...
- "/tmp/indent.1134437645.tmp.dat" 18 lines 483 bytes
- Exit from ed.
-
- modify helmet id
- This setting takes multiple values. If you have no more values to - enter, then
- enter a dot on a blank line. To cancel, enter a single q on a blank - line.
- You may now enter the next value. So far, it is blank.
- If you're done entering values, enter a dot on a blank line.
- helm
- You may now enter the next value. So far, we have: ({ "helm" })
- If you're done entering values, enter a dot on a blank line.
- headgear
- You may now enter the next value. So far, we have: ({ "helm", - "headgear" })
- If you're done entering values, enter a dot on a blank line.
- cover
- You may now enter the next value. So far, we have: ({ "helm", - "headgear",
- "cover" })
- If you're done entering values, enter a dot on a blank line.
-
- Entries complete. Final array is: ({ "helm", "headgear", "cover" })
- Indenting file...
- "/tmp/indent.1134437661.tmp.dat" 22 lines 535 bytes
- Exit from ed.
-
- /realms/testycre/tmp/helmet1134437649: Ok
- /realms/testycre/area/armor/helmet: Ok
- SetId modification complete.
- modify helmet short a horned viking - helmet
- Indenting file...
- "/tmp/indent.1134437692.tmp.dat" 22 lines 544 bytes
- Exit from ed.
-
- modify helmet long Vikings - didn't really wear horned helmets into combat, but this one does look - formidable with its large bull horns and thick iron construction. It - should prove very protective.
- Indenting file...
- "/tmp/indent.1134437772.tmp.dat" 22 lines 666 bytes
- Exit from ed.
-
- modify helmet adj
- This setting takes multiple values. If you have no more values to - enter, then
- enter a dot on a blank line. To cancel, enter a single q on a blank - line.
- You may now enter the next value. So far, it is blank.
- If you're done entering values, enter a dot on a blank line.
- iron
- You may now enter the next value. So far, we have: ({ "iron" })
- If you're done entering values, enter a dot on a blank line.
- thick
- You may now enter the next value. So far, we have: ({ "iron", "thick" })
- If you're done entering values, enter a dot on a blank line.
- viking
- You may now enter the next value. So far, we have: ({ "iron", "thick", - "viking"
- })
- If you're done entering values, enter a dot on a blank line.
- horned
- You may now enter the next value. So far, we have: ({ "iron", "thick", - "viking",
- "horned" })
- If you're done entering values, enter a dot on a blank line.
- formidable
- You may now enter the next value. So far, we have: ({ "iron", "thick", - "viking",
- "horned", "formidable" })
- If you're done entering values, enter a dot on a blank line.
- protective
- You may now enter the next value. So far, we have: ({ "iron", "thick", - "viking",
- "horned", "formidable", "protective" })
- If you're done entering values, enter a dot on a blank line.
-
- Entries complete. Final array is: ({ "iron", "thick", "viking", - "horned",
- "formidable", "protective" })
- Indenting file...
- "/tmp/indent.1134437802.tmp.dat" 22 lines 722 bytes
- Exit from ed.
-
- /realms/testycre/tmp/helmet1134437782: Ok
- /realms/testycre/area/armor/helmet: Ok
- SetAdjectives modification complete.
- about helmet
- /realms/testycre/area/armor/helmet.c
-
- #include <lib.h>
- #include <armor_types.h>
- #include <damage_types.h>
- inherit LIB_ARMOR;
-
- static void create(){
-     armor::create();
-     SetKeyName("helmet");
-     SetAdjectives( ({"iron", "thick", "viking", - "horned", "formidable",
- "protective"}) );
-     SetId( ({"helm", "headgear", "cover"}) );
-     SetShort("a horned viking helmet");
-     SetLong("Vikings didn't really wear horned helmets - into combat, but this
- one does look formidable with its large bull horns and thick iron - construction.
- It should prove very protective.");
-     SetMass(50);
-     SetDamagePoints(100);
-     SetArmorType(A_BODY_ARMOR);
-     SetProtection(BLUNT, 20);
-     SetProtection(BLADE, 20);
-     SetProtection(KNIFE, 20);
-
- }
- void init(){
-     ::init();
- }
- modify helmet armortype helmet
- Indenting file...
- "/tmp/indent.1134437818.tmp.dat" 22 lines 718 bytes
- Exit from ed.
-
- modify helmet mass 200
- Indenting file...
- "/tmp/indent.1134437830.tmp.dat" 22 lines 719 bytes
- Exit from ed.
-
- modify helmet protection
- Your armor can protect against one or more of the following types of - damage:
- blunt, blade, knife, water, shock, cold, heat, gas, acid, magic, poison,
- disease, trauma, ..
-
- Please enter which ones your armor should protect from, one at a time.
- When you are done, please type a dot on a blank line.
- blunt
- You may now enter the next value. So far, we have: ({ "blunt" })
- If you're done entering values, enter a dot on a blank line.
- blade
- You may now enter the next value. So far, we have: ({ "blunt", "blade" - })
- If you're done entering values, enter a dot on a blank line.
- knife
- You may now enter the next value. So far, we have: ({ "blunt", "blade", - "knife"
- })
- If you're done entering values, enter a dot on a blank line.
- trauma
- You may now enter the next value. So far, we have: ({ "blunt", "blade", - "knife",
- "trauma" })
- If you're done entering values, enter a dot on a blank line.
-
- Protections list complete.
- Please enter the protection value for: BLUNT
- 15
- Please enter the protection value for: BLADE
- 20
- Please enter the protection value for: KNIFE
- 25
- Please enter the protection value for: TRAUMA
- 10
- This is where the mapping gets sent somewhere.
- ProtectionsMap is: ([ "BLADE" : 20, "BLUNT" : 15, "TRAUMA" : 10, - "KNIFE" : 25 ])
- Indenting file...
- "/tmp/indent.1134437901.tmp.dat" 23 lines 750 bytes
- Exit from ed.
-
- about helmet
- /realms/testycre/area/armor/helmet.c
-
- #include <lib.h>
- #include <armor_types.h>
- #include <damage_types.h>
- inherit LIB_ARMOR;
-
- static void create(){
-     armor::create();
-     SetKeyName("helmet");
-     SetAdjectives( ({"iron", "thick", "viking", - "horned", "formidable",
- "protective"}) );
-     SetId( ({"helm", "headgear", "cover"}) );
-     SetShort("a horned viking helmet");
-     SetLong("Vikings didn't really wear horned helmets - into combat, but this
- one does look formidable with its large bull horns and thick iron - construction.
- It should prove very protective.");
-     SetMass(200);
-     SetDamagePoints(100);
-     SetArmorType(A_HELMET);
-     SetProtection(BLADE, 20);
-     SetProtection(BLUNT, 15);
-     SetProtection(TRAUMA, 10);
-
-     SetProtection(KNIFE, 25);
- }
- void init(){
-     ::init();
- }
- l
- /realms/testycre/area/room/test2
- Room 2 [w]
- This is the second test room.
- A horned viking helmet and a heavy war hammer are here.
- The Dude is standing here.
-
-
- exa dude
- This is just some random guy.
- The male human is in top condition.
- Guy is carrying:
- A heavy war hammer (wielded in left hand and right hand)
-
- add helmet to dude
- ob2: /realms/testycre/area/npc/guy.c
- ob: /realms/testycre/area/armor/helmet.c
- Please enter a command for the NPC to perform with this item. If you - have no
- such command to enter, enter the number of these items you want to add:
- wear helmet
- Indenting file...
- "/tmp/indent.1134437927.tmp.dat" 23 lines 544 bytes
- Exit from ed.
-
- /realms/testycre/area/npc/guy: Ok
- Guy wields a heavy war hammer.
- Guy wears a horned viking helmet.
- SetInventory modification complete.
- exa dude
- This is just some random guy.
- The male human is in top condition.
- Guy is carrying:
- A heavy war hammer (wielded in left hand and right hand)
- A horned viking helmet (worn)
-
- //// Ok our dude is done. Let's clean up the room by updating it:

- update
- Updating environment
- /realms/testycre/area/room/test2: Ok
- l
- /realms/testycre/area/room/test2
- Room 2 [w]
- This is the second test room.
- pwd
- /realms/testycre:
- cd area/npc
- /realms/testycre/area/npc:
- //// We need to have the guy - present in order to add him to the room:
- clone guy
- Guy wields a heavy war hammer.
- Guy wears a horned viking helmet.
- You clone The Dude (/realms/testycre/area/npc/guy.c).
- add guy to room
- ob2: /realms/testycre/area/room/test2.c
- ob: /realms/testycre/area/npc/guy.c
- Please enter the number of these that you want to add:
- 1
- Indenting file...
- "/tmp/indent.1134437999.tmp.dat" 26 lines 485 bytes
- Exit from ed.
-
- /realms/testycre/area/room/test2: Ok
- /realms/testycre/area/room/test2
- Room 2 [w]
- This is the second test room.
- The Dude is standing here.
-
-
- SetInventory modification complete.
- update
- Updating environment
- /realms/testycre/area/room/test2: Ok
- //// That's it. Easy, - huh? Think of how much slogging through ed this would save you when - making a large area.
- l
- /realms/testycre/area/room/test2
- Room 2 [w]
- This is the second test room.
- The Dude is standing here.
-
-
- exa dude
- This is just some random guy.
- The male human is in top condition.
- Guy is carrying:
- A heavy war hammer (wielded in left hand and right hand)
- A horned viking helmet (worn)
-
- more here
- #include <lib.h>
- #include "/realms/testycre/customdefs.h"
-
- inherit LIB_ROOM;
-
- static void create() {
-     room::create();
-     SetClimate("indoors");
-     SetAmbientLight(30);
-     SetShort("Room 2");
-     SetLong("This is the second test room.");
-     SetExits(([
-     "west" : "/realms/testycre/area/room/test1",
-       ]));
-
-     SetItems( ([
-     "template" : "That's what this is.",
-       ]) );
-
-     SetInventory(([
-     "/realms/testycre/area/npc/guy" : 1,
-       ]));
- }
-
- void init(){
-     ::init();
- }
-
- quit
- Please come back another time!
-
-
Obviously you still need to - code some LPC in ed for complex stuff. But knocking out rooms and NPC's - and objects quickly helps you avoid getting bogged down in mechanics - when what you really want to do is build.
-
- Dead Souls Homepage
- \ No newline at end of file --- 0 ---- diff -c -r --new-file ds2.0r18/lib/www/downloads.html ds2.0r28/lib/www/downloads.html *** ds2.0r18/lib/www/downloads.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/downloads.html Wed Jul 5 00:00:59 2006 *************** *** 0 **** --- 1,62 ---- + + + + + Dead Souls Downloads + + + + +
Useful Downloads and Applications

Written by Cratylus @ Frontiers, June 2006

No program exists in a vacuum. For many people, their
operating systems generally provide all the software they
need to operate Dead Souls
adequately. But sometimes there
is just a better way.

In the spirit of the poor college student I was when I
started mudding, I will try to include only freeware or free
shareware apps here.

Windows editors

Windows clients

UNIX clients

Mudsbuilder client stuff


Windows editors:

The #1 problem in Windows is that the default plaintext
editor, Notepad, produces text that is not 100% compatible with the
mud. Windows plaintext and UNIX plaintext differ, believe it
or not. If you use notepad for editing mudos.cfg, for example,
your mud is likely to just fail to boot. This is because it
can no longer read the "incorrectly" formatted file.

The other big problem with Notepad and Wordpad is that
they often add formatting and characters to text files that
make them very ugly and hard to read from inside the mud.

The solution is to use a text editor that can save in
UNIX text format. The following URLs point to editors that I
have been told will do a good job of this. I can't vouch for
them, as they are 3rd party apps and I've never tested them, but
I am assured they are very good for this.

Notepad++ http://notepad-plus.sourceforge.net/uk/site.htm

WinVi http://www.winvi.de/en/



Windows clients:

I can't imagine using the default Windows telnet client for
long. It is so bereft of features as to be actually worse than the
crappiest UNIX (or even VMS!) clients from 1993...Windows telnet is
worse than the worst from thirteen years ago.

There are a ton of great Windows mud clients out there.
Anyway, that's what I hear. Back when I used windows, I used a free
version of Zmud, and sometimes a less preferred Gmud. Zmud is now
a non-free application, so you have to buy it to use it. However,
they do still allow free distribution of a crappy, super old
version of the client.

Some people swear by the free mudmagic telnet client.
I haven't tried it, so I can't vouch for it, but here's a link
to it too.

Gmud http://frontiers.wcsu.ctstateu.edu/gmud.exe


Old Zmud 3 from 1996 (not my prob if it's broken)
http://rugose.com/zmud.zip

MudMagic http://www.mudmagic.com/mud-client/downloads/mudmagic-1.8-setup.exe


UNIX clients:

The client I use is gmoo 0.5.6. It has its drawbacks, but it
works ok, in general, and I'm used to it. An older version of it is
gMOO 0.4.8, and I've found it's a little easier to compile on some
newer UNIXes, for reasons beyond me.

As with the Windows version, some people like the mudmagic
Linux client. As with the Windows version, I wouldn't know, but
here it is.

gmoo 0.5.6 http://frontiers.wcsu.ctstateu.edu/gmoo-0.5.6.tar.gz

gMOO 0.4.8 http://frontiers.wcsu.ctstateu.edu/gMOO-0.4.8.tar.gz

MudMagic http://www.mudmagic.com/mud-client/linux_download
+
+
+ Mudsbuilder + client stuff
+
+     There's a GUI client for building LPC areas called + Mudsbuilder.
+ Download + it from Sourceforge and see if it suits you. There is
+ also a related Windows + app. You can use this template file to create +
+ Dead Souls rooms in the Windows app(Thanks Saquivor!). You'll have
+ to modify the template a bit to get it working on the Linux app.
+
+     See the LPUniversity + forums posts from Saquivor.
+
+
+ The end.
+
+ Dead Souls Homepage
+
+
+ + diff -c -r --new-file ds2.0r18/lib/www/ds-admin-faq.html ds2.0r28/lib/www/ds-admin-faq.html *** ds2.0r18/lib/www/ds-admin-faq.html Fri Mar 24 14:34:51 2006 --- ds2.0r28/lib/www/ds-admin-faq.html Wed Jul 5 00:00:59 2006 *************** *** 4,26 **** Dead Souls Admin FAQ !
Dead Souls Admin FAQ, v2.4

Written by Cratylus @ Frontiers, October 2005
Updated March 2006

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

What's this FAQ about?


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


How do I start?

Start by reading the Dead Souls FAQ for some background
on where this lib came from and what you can do with it.


What's the QCS?

Please see the QCS example page for an explanation of this
important Dead Souls system.


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

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

When you log in, the system will read your playerfile for
a few seconds and then it will turn you into a creator. This
is so that you can examine code, try out the QCS, etc.

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

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

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

Dead Souls Admin FAQ + + !
Dead Souls Admin FAQ, v3.4

Written by Cratylus @ Frontiers, October 2005
Updated June 2006

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

What's this FAQ about?


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


0 How do I start?

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

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

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

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

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

6 How did you know my mud started up?

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

8 What's this about a manual on Frontiers?

9 How do I add limbs to a race?

10 How do I add a race?

11 How do I make my friend an admin?

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

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

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

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

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

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

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

19 What's this "Network room"?

20 The web server and FTP server don't work

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

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

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

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

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

26 The mudtime is all wrong!

27 The time of day is all wrong!

28 What happened to the roommaker and thingmaker?

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

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

31 Can people donate money to me for the mud?

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

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

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

35 How do I limit the use of intermud channels?

36 How do I get off intermud completely?

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

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

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

40 I want everyone to speak the same language.

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

42 How do I change the items new players receive?

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

44 Where can I get a Dead Souls mud hosted?

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

46 How are files organized in Dead Souls?

47 What are sefuns and efuns?

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

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

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

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

52 Is Dead Souls secure?

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

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

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

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

57 Intermud mail doesn't work

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

59 What does locking the mud do, exactly?

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

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

62 You need a development roadmap and task tracking

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

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

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

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

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

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

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

70 What do the version numbers mean?

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

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


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


74 How does player voting work?

75 What are "estates"?

76 What are "events"?

77 Where does user monitor data go?

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

79 Where is emote data kept?

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

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

82 How do I change my mud's name?

83 Help! I locked myself out!

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


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

86 Where are read/write restrictions kept?

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

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

89 What is "unguarded"?

90 Is intermud communication secure?

100 What should I not do?


How do I start?

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

read index in guide

read chapter 1 in guide

read chapter 2 in guide

etc.


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

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

When you log in, the system will read your playerfile for
a few seconds and then it will turn you into a creator. This
is so that you can examine code, try out the QCS, etc.

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

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

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

who
stat
wiz
create new npc generic
look at board
read 1 on board
home


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

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


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

As admin, you have access to the admintool
command. This opens a menu-driven admin system you
can use to manage some basic aspects of your new MUD.

Everything on admintool can be done with
commands, system calls, or file editing, but until
you get the hang of all that stuff, admintool
is a convenient shortcut.
In this example, you would type: who
stat
wiz
create new npc generic
look at board
read 1 on board
home


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

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


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

As admin, you have access to the admintool
command. This opens a menu-driven admin system you
can use to manage some basic aspects of your new MUD.

Everything on admintool can be done with
commands, system calls, or file editing, but until
you get the hang of all that stuff, admintool
is a convenient shortcut.
In this example, you would type: l (that's a lowercase "L").

The oldfashioned way, if the new creator
were named dude, would be: encre dude

I know. But people like menus, so I made it.


What about intermud? How do I talk on that?

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

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

You@YourMud <ds> blah blah

To enable intergossip and intercre, read
/doc/README for instructions.

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

Conversely, intergossip is mostly chat. Please
be warned that discussions on intergossip are usually
offensive, argumentative, and generally aggressive.
This hostility is especially sharp when you
are identified as a "newbie". You will almost certainly
be mocked and insulted no matter what you say, but
especially if your first messages betray you as
ignorant of intergossip standards and traditions. I
strongly recommend you lurk on this channel for a few
days before saying anything.

Really, I recommend you avoid the intergossip channel entirely.


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

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

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


How did you know my mud started up?

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

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

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

If this makes you feel like Big Brother
is watching you, you can probably just delete
the file /daemon/services/auth.c and then update
the file /daemon/services.c without causing harm
to your mud.


What's this about a manual on Frontiers?

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

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


How do I add limbs to a race?

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


How do I make my friend an admin?

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

cratylus:xyzzy

Xyzzy then needs to log out and log back in.


I don't like how the who command output looks! How can I change it?

Believe it or not, I actually get questions like this. I also
get stuff like "my workroom is broken! fix it!"

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


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

I'm a lib coder, not a web designer. Cut me slack. Or, edit it
for me and show me how it's done.


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

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

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


How can I change the colors of the channel messages?

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


How do I know what other muds use Dead Souls?


Go to the arch room. Type: arch

Then type
: read screen

This shows a list of muds that used Dead Souls and
joined intermud at some point. To see a list that
also includes obvious test muds, type: read printout

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


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

Your mud receives all sorts of network requests from the
intermud network, such are remote who (asking who is logged on),
remote finger (info on users), locate (trying to find a user
somewhere on i3), etc. Whenever your mud receives such a request,
it is announced in the Arch room. Note that these are normal,
and do not represent an attempt to undermine your security.


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

Type: call me->AddChannel("ds_test")
Then type: ds_test test

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


The web server and FTP server don't work

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

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

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

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


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

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


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

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


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

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

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

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


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

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


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

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


The mudtime is all wrong!

The mudtime command tells you what time it is in the game, not what time
it is in the real world.


The time of day is all wrong!

If you used admintool to change your timezone and the time of day is still
wrong, you may be using an OS with timekeeping that Dead Souls doesn't
understand. If this is so, figure out how many hours off you are, and
enter that value into the EXTRA_TIME_OFFSET parameter in /secure/include/config.h


What happened to the roommaker and thingmaker?

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


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

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

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


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

NO.

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

Can people donate money to me for the mud?

Yes.

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

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

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


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

Email me: <put my name here>@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
screencap would be helpful.


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

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

2) update /secure/daemon/master

3) update -r /lib/player

Instead of the updates you can reboot the mud.


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

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

2) update /secure/daemon/master

3) update /secure/lib/connect

Instead of the updates you can reboot the mud.


How do I limit the use of intermud channels?

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

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

3) update /secure/daemon/master

4) update /daemon/services/*

5) update /daemon/services

6) update /daemon/intermud

7) update /secure/daemon/chat

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


How do I get off intermud completely?

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

2) update /secure/daemon/master

3) update /daemon/intermud


How do I change the start room for the mud?

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

2) reboot the mud


I don't like having newbies get special treatment.

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

2) reboot the mud


I made a change to /lib/player.c and updated it, but I'm
not seeing a difference in my character.
l (that's a lowercase "L").

The oldfashioned way, if the new creator
were named dude, would be: encre dude

I know. But people like menus, so I made it.


What about intermud? How do I talk on that?

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

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

You@YourMud <ds> blah blah

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

Conversely, intergossip is mostly chat.

NOTE: If you use the switchrouter command to use
the *gjs Intermud 3 instead of the default *yatmim, Please
be warned that discussions on intergossip there are usually
offensive, argumentative, and generally aggressive.
This hostility is especially sharp when you
are identified as a "newbie". You will almost certainly
be mocked and insulted no matter what you say, but
especially if your first messages betray you as
ignorant of intergossip standards and traditions. I
strongly recommend you lurk on this channel for a few
days before saying anything.

Really, I recommend you avoid the *gjs router entirely.
Leave the default router settings alone and you won't
have to worry about this sort of thing.

The lpuni channel is a mix of
chat and official LPUniversity business. As of June 5 2006,
Blackdawn mud is bridging that channel, so it is accessible
from both i3 routers.


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

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

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

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

Dead Souls I3 Router Page



How did you know my mud started up?

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

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

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

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

You can also DISABLE_INTERMUD in that
same file.

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


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

Please see the router page for details.


What's this about a manual on Frontiers?

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

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


How do I add limbs to a race?

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


How do I add a race?

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

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

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

PLAYER_RACE 1

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

addrace wampa


For details:
help addrace


How do I make my friend an admin?

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

cratylus:xyzzy

Xyzzy then needs to log out and log back in.


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

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

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


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

I'm a lib coder, not a web designer. Cut me slack. Or, edit it
for me and show me how it's done.


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

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

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


How can I change the colors of the channel messages?

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


How do I know what other muds use Dead Souls?


mudlist -m dead

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


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

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

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

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


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

Type: ds_test test

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


What's this "Network room"?

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


The web server and FTP server don't work

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

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

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

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


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

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


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

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


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

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

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

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


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

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


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

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


The mudtime is all wrong!

The mudtime command tells you what time it is in the game, not what time
it is in the real world.


The time of day is all wrong!

If you used admintool to change your timezone and the time of day is still
wrong, you may be using an OS with timekeeping that Dead Souls doesn't
understand. If this is so, figure out how many hours off you are, and
enter that value into the EXTRA_TIME_OFFSET parameter in /secure/include/config.h

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


What happened to the roommaker and thingmaker?

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


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

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

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


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

NO.

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

Can people donate money to me for the mud?

Yes.

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

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

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


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

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

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


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

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

2) update /secure/daemon/master

3) update -r /lib/player

Instead of the updates you can reboot the mud.


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

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

2) update /secure/daemon/master

3) update /secure/lib/connect

Instead of the updates you can reboot the mud.


How do I limit the use of intermud channels?

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

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

3) update /secure/daemon/master

4) update /daemon/services/*

5) update /daemon/services

6) update /daemon/intermud

7) update /secure/daemon/chat

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


How do I get off intermud completely?

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

2) update /secure/daemon/master

3) update /daemon/intermud


How do I change the start room for the mud?

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

2) reboot the mud


I don't like having newbies get special treatment.

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

2) reboot the mud


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

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

2) reboot the mud

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


I want everyone to speak the same language.

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

2) reboot the mud

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

call players_name_here->SetNativeLanguage("English")



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

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

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

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

If you type: reload -r fighter

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

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

update -r /lib/creator

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


How do I change the items new players receive?

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

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


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

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

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

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

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

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



Where can I get a Dead Souls mud hosted?

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

There is at least one free mud hosting service I'm
aware of, and that's FrostMud. It's basically a guy and a Linux
server with room on it for muds. If you beg adequately, he might
let you put your mud on his server for free. I tested it and
Dead Souls installed and ran there without any problems. However,
he doesn't support anything, you're on your own, and bandwidth is
on a "you'll get it when it's there" basis.

There's no such thing as a free lunch. If you want
a reliably solid, well supported, feature-rich platform for your
mud, quit being a cheapskate and cough up the $20/mo. That's
like, what, one espresso every couple of days.

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

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


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

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

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

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

Please be aware that by doing so, you release your normal
copyright to the code and license it GPL, allowing me to publish it and
preventing you from revoking my right to distribute it.

You also represent that you *have* copyright to do this
in the first place, and hold me harmless in any subsequent
dispute between you and any other third party.

If you want to email me code but wish to retain normal
copyright, please state so clearly in the body of your email. I
will honor that request
(and it's the law so I don't really
have a choice). Just be aware I will not put code into Dead
Souls that anyone has non-GPL'ed copyright to.

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


How are files organized in Dead Souls?

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

at the time it was loaded.

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

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

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

If you type: reload -r fighter

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

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

update -r /lib/creator

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


How do I change the items new players receive?

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

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


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

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

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

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

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

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



Where can I get a Dead Souls mud hosted?

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

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

There's no such thing as a free lunch. If you want
a reliably solid, well supported, feature-rich platform for your
mud, quit being a cheapskate and cough up the $20/mo. That's
like, what, one espresso every couple of days.

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

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


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

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

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

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

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

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

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

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


How are files organized in Dead Souls?

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

throw my first red rock at the green goblin
should work, and should work the same everywhere on the
MUD. Verbs are a source of debate among some people, because
to folks accustomed to add_action commands, verbs seem
excessively complex.

www/

Like the ftp directory, but for the MUD webserver.


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

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


What are sefuns and efuns?

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

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

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

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

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

tell_player("cratylus","Hi.")

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



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

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

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

If you've never coded before, this is the hard part.
To understand what you're looking at when you run commands like


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


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

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

Other useful tools in your chest are a remote
control and a medical tricorder.


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

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

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

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



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

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


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

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

Start with chapter 31, like this:

read chapter 31 in my manual


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

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

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

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

callouts

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

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


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

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

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

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

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

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

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


Is Dead Souls secure?

The short answer is no, nothing I know of is "secure" in the
sense that you don't need to continually pay attention to it. If the
question is "Is Dead Souls particularly unsafe to run?" then the
answer is no. Just like any other Internet program you use, Dead Souls
is not an obvious security risk, so long as it is not used carelessly.
And, obviously, games of any kind, including Dead Souls, should never
be installed on any mission-critical, national security, public
safety, or health care server.

Dead Souls security involves two separate spheres:

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

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

The first sphere is probably most important. Presumably
you plan to run a mud on a computer that does other things too,
and you want to keep those things separate from your mud. The
most important thing to do is to avoid running Dead Souls as a
privileged user. In the case of Windows, this means that the
program should not be run by Administrator or anyone in the
Administrator group.
For unix users, this means that the driver should not run
under uid 0 (root).

The reason for this precaution is that if some genius
hacker manages to exploit some unknown weakness in the program,
it is better that the process they hack doesn't have full admin
privileges to the box.
This caution has little to do with Dead Souls specifically.
It is a warning I'd give to anyone planning to run any kind of network
server. You should take your own security seriously, and
if you do not understand your own security situation, you need to take
a step back and ask yourself if running a mud at all is a good idea.

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

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

Granular (more detailed) modification of user privileges
can be done by changing files in /secure/cfg to grant
users and groups specific privileges.


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

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


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

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


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

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

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

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


Intermud mail doesn't work

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


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

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


What does locking the mud do, exactly?

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


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

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


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

To find out what the next release will definitely
have, telnet to dead-souls.net 6666. If you don't
already have a character there, your new one will be
made a creator. You can then type:

more /doc/RELEASE_NOTES

to see what the development mud has. That is
what you can definitely expect to see in the next release.
Note that this will differ from the /doc/RELEASE_NOTES
on your mud, because as new stuff is added to the
devel mud, it gets documented in that mud's RELEASE_NOTES.
To find out what I'm working on, or what
I'm planning to work on, log into
dead-souls.net 6666
and type:

finger cratylus

You will see my .plan file, which is basically
the to-do list I work off of. Some of it is written
with the expectation that I'm the only one who needs to
understand it, so it may not all make sense to you.
Anything with an asterisk (*) in front of
it is being currently worked on.


You need a development roadmap and task tracking

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


How do I update a sefun without rebooting the mud?

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

update /secure/sefun/nit_pick.c

update /secure/sefun/sefun.c


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

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


What do the version numbers mean?

2.0r16 means "Major version 2, minor version 0, release number 16".
Releases happen pretty frequently, to add functionality and fix bugs
from the previous release. When the basic functionality of a minor
version is as bug free as reasonably possible, a new minor version
change happens.
Major version number changes are very rare and represent a
vast difference from the old major version. Versions 1 and 2 of
Dead Souls are so different as to be largely incompatible with each
other's code.
As of this writing, the goal of releasing version 2.1 looms.
The significance of this milestone is that Dead Souls 2.1 is
intended to be the fulfillment of the promise that there was in
version 1.1. After the release of Dead Souls 2.1, the focus of
development will be in adding major systems and functionality
that 1.1 was hoped to have, but never did.

! ! - ! Cratylus
!
! Dead Souls ! Homepage
--- 410,590 ---- style="font-weight: bold;">callouts

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

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


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

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

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

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

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

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

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


Is Dead Souls secure?

The short answer is no, nothing I know of is "secure" in the
sense that you don't need to continually pay attention to it. If the
question is "Is Dead Souls particularly unsafe to run?" then the
answer is no. Just like any other Internet program you use, Dead Souls
is not an obvious security risk, so long as it is not used carelessly.
And, obviously, games of any kind, including Dead Souls, should never
be installed on any mission-critical, national security, public
safety, or health care server.

Dead Souls security involves two separate spheres:

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

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

The first sphere is probably most important. Presumably
you plan to run a mud on a computer that does other things too,
and you want to keep those things separate from your mud. The
most important thing to do is to avoid running Dead Souls as a
privileged user. In the case of Windows, this means that the
program should not be run by Administrator or anyone in the
Administrator group.
For unix users, this means that the driver should not run
under uid 0 (root).

The reason for this precaution is that if some genius
hacker manages to exploit some unknown weakness in the program,
it is better that the process they hack doesn't have full admin
privileges to the box.
This caution has little to do with Dead Souls specifically.
It is a warning I'd give to anyone planning to run any kind of network
server. You should take your own security seriously, and
if you do not understand your own security situation, you need to take
a step back and ask yourself if running a mud at all is a good idea.

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

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

Granular (more detailed) modification of user privileges
can be done by changing files in /secure/cfg to grant
users and groups specific privileges.


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

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


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

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


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

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

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

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


Intermud mail doesn't work

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


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

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


What does locking the mud do, exactly?

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

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


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

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


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

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

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

To see what I'm working on, see http://dead-souls.net/plan.txt


You need a development roadmap and task tracking

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


How do I update a sefun without rebooting the mud?

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

update /secure/sefun/nit_pick.c

update /secure/sefun/sefun.c


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

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

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


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

It's a cheap workaround for a parser problem. The full fix
is forthcoming.


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

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


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

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

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


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

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


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

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


What do the version numbers mean?

2.0r16 means "Major version 2, minor version 0, release number 16".
Releases happen pretty frequently, to add functionality and fix bugs
from the previous release. When the basic functionality of a minor
version is as bug free as reasonably possible, a new minor version
change happens.
Major version number changes are very rare and represent a
vast difference from the old major version. Versions 1 and 2 of
Dead Souls are so different as to be largely incompatible with each
other's code.
As of this writing, the goal of releasing version 2.1 looms.
The significance of this milestone is that Dead Souls 2.1 is
intended to be the fulfillment of the promise that there was in
version 1.1. After the release of Dead Souls 2.1, the focus of
development will be in adding major systems and functionality
that 1.1 was hoped to have, but never did.


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

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

help switchrouter

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

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

It is unwise for newbies to talk on intergossip
while connected to the *gjs router. I don't know how many
times or ways I can warn you about this. Please keep in
in mind.


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

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

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

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

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

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

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


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

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

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

To make your new domain, use the domaincreate command:

domaincreate MistyDragonShireMysts

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

For more information on domainadmin, type:
help domainadmin

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



How does player voting work?

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


What are "estates"?

Any references to estates in Dead Souls code or
documentation are artifacts of pre-1.1 Nightmare code.
Estates in the Nightmare lib were player-owned areas,
which were granted to players of specific rank, status,
etc who could afford to buy the rights to them.
There is currently no estate support in Dead Souls,
though it is on the post 2.1 feature list.


What are "events"?

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

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

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

To see what events have been scheduled, type:
events

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

events

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

eval return remove_event(
1145159511)
!
!
Where does user monitor data go?

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


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

Edit the race file and have this line near the top:

PLAYER_RACE 1

Then use the removerace and addrace commands. For example:

removerace tauren
addrace tauren
!
For details:
help addrace


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

Emote data is saved in /save/soul.o

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

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


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

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

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

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


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

Use the command: resetpasswd


How do I change my mud's name?

1) type: admintool

2) select the "Driver" menu option

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

4) answer yes to rebooting


Help! I locked myself out!

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


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

SECURE gives you 100% admin privs to the mud.

ASSIST gives you most. The assistant admin position can
be fine tuned by reading the security code in /secure/daemon/master.c
and modifying it to suit you. This should only be done by
someone who fully understands every line in that file.

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

TEST lets the lib know you are a test character.

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

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

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


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

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

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


Where are read/write restrictions kept?

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


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

Type: help ticktock


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

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


What is "unguarded"?

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

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

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


Is intermud communication secure?

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

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

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

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

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

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

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


Therefore: do not tell secrets across intermud.


What should I not do?

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

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

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

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


! - ! Cratylus
!
! Dead ! Souls ! Homepage
!
diff -c -r --new-file ds2.0r18/lib/www/ds-creator-faq.html ds2.0r28/lib/www/ds-creator-faq.html *** ds2.0r18/lib/www/ds-creator-faq.html Fri Mar 24 14:42:02 2006 --- ds2.0r28/lib/www/ds-creator-faq.html Wed Jul 5 00:00:59 2006 *************** *** 4,33 **** Dead Souls Creator FAQ !
Dead Souls Creator FAQ, v2.3

Written by Cratylus @ Frontiers, March 2006

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

What's this FAQ about?


There are common issues and questions that crop
up for most new creators. This document is intended to
ease or at least shorten what can be a steep learning
curve.


!
!
Section 1: Getting Started


My question isn't on here. Where can I get an answer?

There are four main ways to get specific answers:

1) Ask your mud's administrator, or other creators on
your mud by using the cre channel, like this:

cre does the flux capacitor use verbs or add_actions?

To know what local channels are available on your
mud, type: lines


2) Your mud is probably on the intermud3 network. If
your administrator has not restricted intermud channels,
you should be able to ask questions on the Dead Souls
intermud channel, with a command like this:

ds hi! can someone tell me what room Leo lives in?

3) If intermud is down, or nobody is answering, or
you have a bug to report, you can also try emailing
me, the author of this doc, at: <my name here>@users.sourceforge.com


4) If intermud is down, you can also log into the
Dead Souls demo/development mud at dead-souls.net 6666
This mud automatically promotes users to
creator status, allowing guests to get a feel for
what developing on Dead Souls is like, and to provide
examples of current and not-yet-released lib code.
You can try to log into that mud and see if anyone
is available to answer your question.


Important note about asking on <ds>:

Part of the reason this FAQ was written is that
people who ask questions on the ds channel often do not
realize that same question has been asked many times
before. If you ask something like "how do I read the
channel messages I missed?" without first bothering to
read this doc and others, you just might get a response
that's less friendly than you might have expected.
People on the channel really want to help you,
but if it seems like you're not willing to put in the
time to try to help yourself, they might choose to
ignore you until you gather some clues on your own.

Something else to remember is that we are not
on your mud and we don't see what you see. "Why won't
my workroom update" lacks enough information to let
anyone try to help, but "when i try to update my
workroom I get <error message>" might.

Similarly, some things don't have an answer
that is suited to ds. "could someone help me
understand the score.c file?" or "how do quests work?"
have answers that are long, complex, and are
already covered in the documentation available
to you.

Some stuff just doesn't have an answer
that can be explained to you unless you already
have the experience you'd need to know the answer.
for example:

- How do I make a stargate that has a dial for
going to different places?

- How do I make it so a player can be on different
Dead Souls Creator FAQ + + !
Dead Souls Creator FAQ, v3.2

Written by Cratylus @ Frontiers, March 2006
Updated July 2006.

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

What's this FAQ about?


There are common issues and questions that crop
up for most new creators. This document is intended to
ease or at least shorten what can be a steep learning
curve.


Section 1: Getting Started

1.1 My question isn't on here. Where can I get an answer?

1.2 The ds channel is too spammy. It's distracting me.

1.3 All I did was change one thing in a file, and now it won't update. Help!

1.4 The mud editor is confusing the heck out of me. It's too hard to use.

1.5 When I log in, everything is screwed up, and I can't do anything!

1.6 Ok, I'm a creator now. What am I supposed to do?

1.7 This is weird...where is the online builder? How does new stuff get compiled?

1.8 I explored around in /domains/Ylsrim and <XYZ> is broken

1.9 I explored around in /domains/town and <XYZ> is broken


Section 2: Code

2.1 What's the QCS?

2.2 SetUnique doesn't work.

2.3 I made a magic wand that disappears after 10 minutes.
But if a player logs out and log back in, they have another 10 minutes!
How do I fix this?

2.4 Where is it saved?

2.5 How do I add or remove emotes?

2.6 How can I tell what files something inherits?


2.7 How can I find the filename of something?

2.8 What's the largest integer usable by the mud?

2.9 How can I find out what functions exist in something?

2.10 object::init() is broken!

2.11 if(ob->GetFoo()) seems to break, but I don't know why

2.12 How do I add color to my descriptions?

2.13 How do I turn the integer 42 into the string "forty-two"?

2.14 Can I use !=NULL as a test?

2.15 I want to create and test a new command for the mud,
but I'm not admin so I can't put anything in the normal command paths.
What can I do?

2.16 How do skills work?

2.17 How do classes work?

2.18 How do virtual rooms work?

2.19 How are files organized in Dead Souls?

2.20 What are lfuns, sefuns and efuns?

2.21 Why are there more sefun doc files than sefun files?

2.22 I edited a file but now the reload command is complaining.

2.23 this_player()->GetName() returns "A shadow" when the player is invis.

2.24 Is there a sefun for making a whole string uppercase?

2.25 What is the difference between filter() and foreach()? How do I use them?

2.26 member_array() is returning exactly the wrong thing

2.27 I'm trying to add two mappings together and the results are bizarre

2.28 When str = "abc", str[1] is 98, not "b". What gives?

2.29 How do I make an array1 that is the same as array2 but without an element?

2.30 How do I pass arguments to a pointer in a functional?

2.31 What does the tc() sefun do?

2.32 How can I find out how many items are in an array quickly?

2.33 My SetRead isn't working

2.34 My SetEnters/SetSmells/SetListens isn't working

2.35 Can I nest loops?

2.36 What should I do or not do in my code?

2.37 How much different or heavily modified is Dead Souls than stock LPC?

2.38 Is there a way to change the "default exit" room messages?

2.39 This dummy item is not at all behaving like I expected.

2.40 Clan objects do nothing but screw things up.

2.41 My NPC's stats are all hosed up.

2.42 This squirrel is taking *forever* to kill.

2.43 My room should not be entered/exited by just anyone. How
do I control this?


2.44 I zapped a monster, but instead of being dead, now it's undead!

2.45 How does the format for race files work?

2.46 How does the format for class files work?

2.47 What do Properties do?

2.48 How do I add a prehensile limb to a player or NPC?

2.49 How do I make a room occasionally display messages?

2.50 My functional isn't working!

2.51 I've read the Creator's Manual but I still don't understand mappings and arrays.

2.52 Why are call_outs so bad?

2.53 Fine. How am I supposed to create timed events, then?

2.54 I need a list of all the functions available.

2.55 How do I make an object you can [ jump on | climb | etc ] ?

2.56 Where is the list of available skills? How do I add skills?

2.57 Where is the list of available classes? How do I add a class?


2.58 Where is the list of available races?

2.59 How do languages work? Is there a list of them?

2.60 When I try to call test->SetLanguage("Bozo", 50), it sets it to 100%

2.61 How do I update an .h file?


Section 3: Intermud and channel stuff

3.1 How do I know what other muds are online on intermud?

3.2 Hey, LeetFooMud is online! How can I tell if Biff is logged on?

3.3 That's weird...mudlist says LeetFooMud is there but I'm not getting anything back.

3.4 I heard there are intermud channels that talk between other muds,
not just Dead Souls muds. How can I use them?

3.5 How do I emote on a channel?

3.6 How do I see what I missed on a channel?

3.7 I am sick and tired of the intermud network going down. Please fix it.

3.8 I just wanna chat. Is there a dschat channel?

3.9 I'll spam if I want to. You're not the boss of me.

3.10 This guy keeps hassling me on an intermud channel


Section 4: Miscellanea

4.1 I'm fighting the beggar with my staff and he's kicking my ass

4.2 Someone amputated all my limbs and I can't do anything!

4.3 How do I change my class?

4.4 People are talking to me in gibberish, even though it says they're speaking English.

4.5 What's this about Biff "unknowingly" telling me something?

4.6 How do I find the location of a verb or command?

4.7 Where is the "exa" command? Where is the "n" command?

4.8 How do I get something to happen to a random person in a room?

4.9 My wandering monster escaped from my workroom! How can I find him?

4.10 I ran findobj on something but it says no environment. Where is it?

4.11 How do I update everything in a directory?

4.12 I don't like getting colors on my screen. How do I stop it?

4.13 Um...I want colors back now please

4.14 I can type 'n' and move north, but 'north' doesn't work.

4.15 Why is there a bunch of stuff in ROOMS_FURNACE?

4.16 How do I change my screen and terminal settings?

4.17 ZOMG this is the best mudlib evar how can I evar thank you?

4.18 Dude this mudlib sux0rz @ss. What a waste of my time.

4.19 I'm seeing a filename but I can't read it.

4.20 Is there a command to go back to your previous directory
without having to type it all out again?



Section 5: Building

5.1 QCS is putting stuff where I don't want it.

5.2 How do I make a blank room, instead of copying the current one?

5.3 How do I build an area?

5.4 How do I make a quest?

5.5 Where's Leo?

5.6 Where are the vehicles and mounts?

5.7 I'm having trouble adding meals to my barkeep with QCS.

5.8 I heard DS has stargates. Where's an example?


5.9 I created a vendor, but he isn't responding to the "list" command.

5.10 I gave room with a default smell but I cannot get any other smells in there,

such as 'smell object' for example


!
!
Section 1: Getting Started


1.1 My question isn't on here. Where can I get an answer?

There are four main ways to get specific answers:

1) Ask your mud's administrator, or other creators on
your mud by using the cre channel, like this:

cre does the flux capacitor use verbs or add_actions?

To know what local channels are available on your
mud, type: lines


2) Your mud is probably on the intermud3 network. If
your administrator has not restricted intermud channels,
you should be able to ask questions on the Dead Souls
intermud channel, with a command like this:

ds hi! can someone tell me what room Leo lives in?

3) If intermud is down, or nobody is answering, or
you have a bug to report, you can also try emailing
me, the author of this doc, at: <my name here>@comcast.net


4) If intermud is down, you can also log into the
Dead Souls demo mud at rugose.com 6666
This mud automatically promotes users to
creator status, allowing guests to get a feel for
what developing on Dead Souls is like.
You can try to log into that mud and see if anyone
is available to answer your question. Intermud is disabled
there, though, so you won't be able to use the ds line
to ask questions.


Important note about asking on <ds>:

Part of the reason this FAQ was written is that
people who ask questions on the ds channel often do not
realize that same question has been asked many times
before. If you ask something like "how do I read the
channel messages I missed?" without first bothering to
read this doc and others, you just might get a response
that's less friendly than you might have expected.
People on the channel really want to help you,
but if it seems like you're not willing to put in the
time to try to help yourself, they might choose to
ignore you until you gather some clues on your own.

Something else to remember is that we are not
on your mud and we don't see what you see. "Why won't
my workroom update?" lacks enough information to let
anyone try to help, but "when i try to update my
workroom I get <error message>" might.

Similarly, some things don't have an answer
that is suited to ds. "could someone help me
understand the score.c file?" or "how do quests work?"
have answers that are long and complex, or are
already covered in the documentation available
to you.

Some stuff just doesn't have an answer
that can be explained to you unless you already
have the experience you'd need to know the answer.
for example:

- How do I make a stargate that has a dial for
going to different places?

- How do I make it so a player can be on different
look around depends on what plane they're on?

- How do I add limbs so people can wear stuff
like kneepads on the knee only?

These three questions illustrate things that are
totally doable, but whose explanation is so
complex and full of judgment calls that there
is no way of satisfying the question without
making you magically understand intermediate-level
LPC coding.
That doesn't mean they're bad ideas, or
even that hard to implement. It's just that
the questions can't be answered until you read
and understand the Creator's Manual, and by that
time, you'll know the answer on your own.

Make sure you've read the docs, then ask
the question in a way that makes it clear you aren't
just a lazy person who wants other people to do her
work, but rather a hardworking builder who has
tried to fix something and needs a specific answer
to a specific question that isn't already in the
FAQ's or the docs.

Critiques are welcome, but they should
be constructive. "This combat system is slow and
stupid" is unhelpful and might be taken as a
hostile statement. Instead you could phrase it
in a way such as: "Combat is slower than I
expected. Why? I used to play on LeetFooMud and it
took less than a minute to kill Tiamat." It's still
a bit clueless, but it's a fair question that can
be answered on its own terms without starting
a flamestorm.


The ds channel is too spammy. It's distracting me.

Enable or disable a channel by typing just its name. Like:

ds


All I did was change one thing in a file, and now it won't update. Help!

You should make it a habit to make backup copies of files
before editing them. That way, if you screw up the code, you can
just copy the backup to the original filename.

A convenient way to do this is the bk command. See
the debugging page for an example of its use.

If you are using Windows, you need to be aware of the
linefeed problem. unix text files and DOS text files have different
formatting. If you edit files in Notepad, then try to update them,
you may find that the file no longer updates, no matter what
you do. The difference is usually invisible to you, so you can't
tell why a file that looks exactly the same as before now won't
work.

Dead Souls expects unix-formatted text, and if you feed it
something else, the results aren't likely to be to your
satisfaction. Make sure you use an editor that respects unix
text. In Windows 2000, WordPad seems to do a reasonable job of not
completely screwing things. It does, however, add carriage
returns to your lines, so when you look at them in ed, you'll
see a bunch of "^M"'s all over the place.

If you still have trouble, take a look at the debugging page.


The mud editor is confusing the heck out of me. It's too hard to use.

Check out the MUD Editor tutorial. It should ease the pain a little.



When I log in, everything is screwed up, and I can't do anything!

This happens sometimes when you log out while carrying an object
with broken code. If for example, you are wearing a vest, and then you
edit the code for it, but it doesn't work anymore, then you log out,
what happens is the next time you log in the mud will try to restore an
item in your inventory that throws an error, and your login
gets stuck halfway.

If you find that when you log in things are all screwed up for
you, use the rescue login feature. For me, this means I would
login as cratylus_rescue instead of cratylus. My inventory
will get wiped before my playerfile is loaded, and I'll
be able to log in with no problems.


Ok, I'm a creator now. What am I supposed to do?

Ask your admin.

If you're like most other creators, you have
a creative vision you want to implement and share with others.
you want to create dragons, or spaceships, perhaps dragons
in spaceships. This makes you a "builder".

As a builder, your job is to learn how your mud
works so you can get your neat ideas turned into a
virtual reality. As you might have guessed, nobody is
going to jack into your brain and upload coding ability
into you. You need to learn how to move around, how
the creation system works, and yes, you'll need at least
some passing acquaintance with the stuff your mud is
made of: files written in the LPC language format.

The good news is that it's nowhere near as hard
to learn as C++. LPC is very powerful, but it doesn't
require you to be a master to get simple things done.

Your first steps as a new creator probably should
go something like this:

1) Talk to your admin. Understand what is expected of
you, and what the rules of your mud are.

look around depends on what plane they're on?

- How do I add limbs so people can wear stuff
like kneepads on the knee only?

These three questions illustrate things that are
totally doable, but whose explanation is so
complex and full of judgment calls that there
is no way of satisfying the question without
making you magically understand intermediate-level
LPC coding.
That doesn't mean they're bad ideas, or
even that hard to implement. It's just that
the questions can't be answered until you read
and understand the Creator's Manual, and by that
time, you'll know the answer on your own.

Make sure you've read the docs, then ask
the question in a way that makes it clear you aren't
just a lazy person who wants other people to do her
work, but rather a hardworking builder who has
tried to fix something and needs a specific answer
to a specific question that isn't already in the
FAQ's or the docs.

Critiques are welcome, but they should
be constructive. "This combat system is slow and
stupid" is unhelpful and might be taken as a
hostile statement. Instead you could phrase it
in a way such as: "Combat is slower than I
expected. Why? I used to play on LeetFooMud and it
took less than a minute to kill Tiamat." It's still
a bit clueless, but it's a fair question that can
be answered on its own terms without starting
a flamestorm.


The ds channel is too spammy. It's distracting me.

Enable or disable a channel by typing just its name. Like:

ds


All I did was change one thing in a file, and now it won't update. Help!

You should make it a habit to make backup copies of files
before editing them. That way, if you screw up the code, you can
just copy the backup to the original filename.

A convenient way to do this is the bk command. See
the debugging page for an example of its use.

If your file is in the /tmp directory, it won't update.
The lib uses /tmp for temporary system files, and as
a result, it is a security feature that files in /tmp can't
be loaded into memory.

If you are using Windows, you need to be aware of the
linefeed problem. unix text files and DOS text files have different
formatting. If you edit files in Notepad, then try to update them,
you may find that the file no longer updates, no matter what
you do. The difference is usually invisible to you, so you can't
tell why a file that looks exactly the same as before now won't
work.

Dead Souls expects unix-formatted text, and if you feed it
something else, the results aren't likely to be to your
satisfaction. Make sure you use an editor that respects unix
text. In Windows 2000, WordPad seems to do a reasonable job of not
completely screwing things. It does, however, add carriage
returns to your lines, so when you look at them in ed, you'll
see a bunch of "^M"'s all over the place.

Take a look at the third party downloads page for
some suggestions as to what to use instead of the default
Windows editors.

If you still have trouble, take a look at the debugging page.


The mud editor is confusing the heck out of me. It's too hard to use.

Check out the MUD Editor tutorial. It should ease the pain a little.


When I log in, everything is screwed up, and I can't do anything!

This happens sometimes when you log out while carrying an object
with broken code. If for example, you are wearing a vest, and then you
edit the code for it, but it doesn't work anymore, then you log out,
what happens is the next time you log in the mud will try to restore an
item in your inventory that throws an error, and your login
gets stuck halfway.

If you find that when you log in things are all screwed up for
you, use the rescue login feature. For me, this means I would
login as cratylus_rescue instead of cratylus. My inventory
will get wiped before my playerfile is loaded, and I'll
be able to log in with no problems.

If this doesn't work, there's a good chance that the room
you're spawning in has a problem. Try quitting and logging
in again. If that works ok, then it's very likely the
room was at fault. See if there are any messages in
/log/runtime pointing to it.


Ok, I'm a creator now. What am I supposed to do?

Ask your admin.

If you're like most other creators, you have
a creative vision you want to implement and share with others.
you want to create dragons, or spaceships, perhaps dragons
in spaceships. This makes you a "builder".

As a builder, your job is to learn how your mud
works so you can get your neat ideas turned into a
virtual reality. As you might have guessed, nobody is
going to jack into your brain and upload coding ability
into you. You need to learn how to move around, how
the creation system works, and yes, you'll need at least
some passing acquaintance with the stuff your mud is
made of: files written in the LPC language format.

The good news is that it's nowhere near as hard
to learn as C++. LPC is very powerful, but it doesn't
require you to be a master to get simple things done.

Your first steps as a new creator probably should
go something like this:

1) Talk to your admin. Understand what is expected of
you, and what the rules of your mud are.

5) Type wiz to go to the Creator's Hall, and if there
are any posts on the board, read them. To read the
first post: read 1. To read the second, read 2, and so on.
If you decide to write on the board,
remamber that to exit "writing" or "input" mode,
you need to enter a dot on a line all by itself,
like this:

.

6) Once you get a feel for how to move around,
what playing here is like, and how to do stuff, you
can start exploring your creator powers. To get
a grasp of the very basics of navigating through
files and directories, type:

more /doc/BASICS

Yes, you must include capital letters. Dead
Souls distinguishes between upper and lower case
letters in filenames.

To get a feel for what Dead Souls LPC code looks like,
wander about town and use the about command to read
code that compose the objects there. For example:

goto /domains/town/room/road

about here

about beggar

5) Type wiz to go to the Creator's Hall, and if there
are any posts on the board, read them. To read the
first post: read 1. To read the second, read 2, and so on.
If you decide to write on the board,
remember that to exit "writing" or "input" mode,
you need to enter a dot on a line all by itself,
like this:

.

6) Once you get a feel for how to move around,
what playing here is like, and how to do stuff, you
can start exploring your creator powers. To get
a grasp of the very basics of navigating through
files and directories, type:

more /doc/BASICS

Yes, you must include capital letters. Dead
Souls distinguishes between upper and lower case
letters in filenames.

To get a feel for what Dead Souls LPC code looks like,
wander about town and use the about command to read
code that compose the objects there. For example:

goto /domains/town/room/road

about here

about beggar

dest corpse

7) Once you're done having fun with your godlike
powers, it's time to start learning how to make
fun stuff of your own.

For a quick start in building, you
can start reading the Creator's Manual at
chapter 31, which is where the QCS section begins:

read chapter 31 in manual

read chapter 32 in manual

and so on.

That's fine to start with, but eventually
you'll need to read the whole Creator's Manual.
If you don't, 90% of the questions you ask about
code could be fairly answered with: "read the manual."


This is weird...where is the online builder? How does
new stuff get compiled?

Dead Souls can be very strange to people used
to non-LPC muds. This is because many other kinds of
muds use a system where the mud is written in C++,
and to make changes, you need to add C++ code to the
source, recompile it, then reboot the mud.
In that kind of system, building is done with
tools where you fill in blanks and code is generated
for you. I presume that some C++ expertise is
required for doing anything unusual or fancy.

If you come from this kind of environment,
you may be in for a little disorientation. On a Dead
Souls mud, there is no need for compiling code. You
don't need to reboot the mud for new stuff to
be available.

You can add your new Orc God of War to the
game (after you code him, of course) with two
simple commands:

update /realms/<you>/area/npc/grimmash.c

clone
/realms/<you>/area/npc/grimmash.c

You're now face to face with him. This makes
Dead Souls, like most LPC muds, very flexible in
what can be done, and very stable in terms of
needing few reboots. Reboots typically are
necessary only when someone breaks important
code, or to implement major mud-wide changes.

So, just write your code, and update it.
It's that simple. There are two main ways to do
this. The easiest way is with the QCS, or quick
creation system. With the QCS, you don't even need
to look at code. You just issue a few commands,
and your new whatever is there. Check out an example
of the QCS here.


To learn the QCS, read the Creator's
Manual starting on chapter 31.

The other way to create on-line is
with the ed command. The ed editor is a powerful
and flexible way of editing files. Some people
find it difficult at first, and you might even
be able to avoid it for a while if you mostly
just use QCS. However, you'll eventually need to
know a little about ed. For a tutorial, go here.

For more detailed documentation,
type: help ed


I explored around in /domains/Ylsrim and <XYZ> is broken

Ylsrim is kept in the distribution as a kind of
sentimental artifact. It's the demo area that the
original Dead Souls shipped with, and although
it's mostly been fixed up to work with Dead SOuls 2,
things can behave unexpectedly.


I explored around in /domains/town and <XYZ> is broken

Please send me an email and let me know, so I
can fix it. Also let me know if something in /domains/default
is hosed up.


!
Section 2: Code

What's the QCS?

Please see the QCS example page for an explanation of this
important Dead Souls system.



SetUnique doesn't work.

SetUnique() is probably doing something you
don't expect. When an item is loaded into memory, and
it has an inventory, it first checks each of those items
for whether it's supposed to be unique.
If it is supposed to be unique, then we look
through the list of loaded objects to see if there is
one of these items already cloned. If there is, then
we don't clone a new one.
What this means is that if I kidnap Leo the
archwizard and hold him in my workroom, another one will
not appear in the basement until my Leo is dested.

Note, however, that this does NOT mean that the
mud will never have two Leos. I can clone however many
Leos I want. But as long as one or more cloned Leos
exist, the basement will not make another. That's
what SetUnique means.

Now, if the behavior you're seeing is different
from what I described, maybe SetUnique is broken,
and you should email me with what you're seeing.


I made a magic wand that disappears after 10 minutes.
But if a player logs out and log back in, they have
another 10 minutes! How do I fix this?

What's happening is that you are keeping
track of how old the wand is, perhaps with a
variable named Age. But if the player quits and
logs back in, then the wand gets cloned again, resetting
all its values, including Age, to the original.

The way to make the Age variable survive
logouts is with AddSave. If you give your variable to
AddSave as an argument, that variable gets saved when
the user quits, and when they log back in, it is restored,
preventing cheating.

See /obj/wed_ring.c for an example.


Where is it saved?

In the player's playerfile, along with the values of all
the objects they were carrying when they quit.


How do I add or remove emotes?

That is an admin job. You admin would use the
addemote or removeemote commands.


How can I tell what files something inherits?

Use the showtree command. To know what files
are inherited by your robe, for example:

showtree /domains/default/armor/robe


How can I find the filename of something?

If it's in your environment: scan here
If it's in your possession: scan me

The number sign (#) and numbers at the end are that
object's unique identifier.


What's the largest integer usable by the mud?

2147483647


How can I find out what functions exist in something?

Get its filename and use the functions efun. For example:

eval return functions(load_object("/domains/town/obj/sign"))


object::init() is broken!

It isn't really. Unless you're coding a lib
item, you should not be inheriting LIB_OBJECT for
"tangible things" anyway. You should inherit LIB_ITEM.

The reason
object::init() fails is that LIB_OBJECT
doesn't have an init() function to call.


if(ob->GetFoo()) seems to break, but I don't know why

This function will error if ob does not exist. Unless
you are 100% positive ob will exist (and really, even if so),
it should look like this:

if(ob && ob->GetFoo())

Which means "if ob exists, and it has a foo".
This way, if there is no ob, the check stops right there
without getting hosed up on the next step.


How do I add color to my descriptions?

There are various markup tokens you can use for this. They look like this:

write("%^BOLD%^GREEN%^ This text would be in bold green letters %^RESET%^ and this would not.");

The %^RESET% is important. Without it, unpredictable things can happen.

To know what colors are available, type: colors

You should probably avoid color unless there is a compelling
reason for its use. Many mud admins discourage it because it can
distract from the game and cause uniformity issues: most mud
admins feel their mud text should look more or less
the same everywhere.


How do I turn the integer 42 into the string "forty-two"?

cardinal(42)


Can I use !=NULL as a test?

In theory, I guess so, but I doubt it'll work by default, and I'd
discourage you from doing anything so non-LPC-standard.
Instead try something like one of the following:

if(variable)
if(sizeof(variable))
if(variable != "")


I want to create and test a new command for the mud,
but I'm not admin so I can't put anything in the
normal command paths. What can I do?

Put your new command in your homedir's cmd/
subdirectory. A sample command is there already
to serve as a template. When you add a command, type:

update /daemon/command

for it to show up in your path.


How do skills work?

Skills are generally class-based, meaning that they are
specified in the class files found in /secure/cfg/classes.
Skills are only meaningful in terms of library objects that
understand them.

For example, a fighter's blade attack is useful because
player.c and combat.c make use of this skill as a
modifier.

But adding a basketweaving skill to a class is not
helpful unless there are library objects (looms, perhaps,
or straw) and verbs (weaving, maybe?) that make
use of that skill.

An upcoming feature is race-based skills, such
as poison bite or breath attack. These skills are
specified in /secure/cfg/races.


How do classes work?

Basically, having a class gives you special skills.
That's it. See the above section, "How do skills work?"


How do virtual rooms work?

Virtual rooms are rooms generated on the fly by a
virtual room server. You program that server with
the room descriptions, the number of them,
etc, and the virtual server can make available
a grid of rooms with your descriptions.

This allows you to create, for example,
a vast desert, or a large jungle, comprised of
dozens, or hundreds, or thousands of rooms
without having to manually code each and every
single room.

For an example, take a look at

/domains/town/virtual/



How are files organized in Dead Souls?


See the admin FAQ.


What are lfuns, sefuns and efuns?


Sefuns and efuns are functions available to all objects on the
mud. Any object may need to know what time() it is, so rather
than have a time() function in every file that needs it, which
could be many, there is a time() function built into the
game that any object can use. An efun is built into the
driver, so there is no LPC code to look at. A sefun is a
simulated efun, coded in LPC. Sefuns are kept in /secure/sefun.

Lfuns are functions specific to library objects. A shirt,
for example, has functions that a sword may not need, so
the LIB_ARMOR and LIB_WEAPON files contain their own functions,
not shared by other files (it's more complicated than this,
but that's the idea). These functions are library
functions, or lfuns. Typically they are found in the objects
defined by the files in /lib.

For a lot more detail on efuns and sefuns, see the
admin FAQ.


Why are there more sefun doc files than sefun files?

Sefun files, like /secure/sefun/strings.c, often contain
more than just one sefun. Therefore, there will be more
files documenting individual functions than there are
files containing sefuns.


I edited a file but now the reload command is complaining.

There are two commonly used commands for loading
objects: update and reload.

When you want to load a file into memory, you use
update, for example: update /domains/default/room/road

When you want to replace a cloned object with a
version that uses the latest code in a file, you
use reload, for example: reload my first red sword

reload doesn't work on files.

update doesn't work on cloned objects.


this_player()->GetName() returns "A shadow" when the player is invis.

Use this_player()->GetKeyName() instead.


Is there a sefun for making a whole string uppercase?

upper_case("omgwtfroflmao")


What is the difference between filter() and foreach()? How do I use them?

Both of these efuns can act on the individual members of an array.

For example, if you wanted to have an array named mystuff which
contains the filenames of all objects in your inventory that
inherit LIB_ARMOR:

using filter:

object *stuff = filter(deep_inventory(this_player()), (: inherits(LIB_ARMOR,$1) :) );
string *mystuff = filter(stuff, (: base_name($1)+".c" :) );

using foreach:

string *mystuff = ({});
foreach( object ob in
deep_inventory(this_player())){
if( inherits(LIB_ARMOR, ob) ) mystuff += ({
base_name(ob)+".c" });
}

There are arguments favoring the use of either. I won't get into
it. As far as I can tell, it's really a question of preference.
You can structure these functions more elegantly
than shown here, to best suit you. But this is the idea.


member_array() is returning exactly the wrong thing

It probably isn't. member_array() seems somewhat counterintuitive
at first, because it often returns a 0 as a "hit".

What this function is doing is checking to see whether the
first argument is a member of the array specified in the second
argument, and then tells you *which* element it is. for example:

member_array( "bar", ({ "foo", "bar", "baz" }) ) returns: 1

member_array( "foo", ({ "foo", "bar", "baz" }) ) returns: 0

Why does it return 0? Because "foo" is element 0 of the
array. If this_array ==
({ "foo", "bar", "baz" }), then
this_array[0] is "foo". So member_array("foo", this_array)
would return 0.

If the first argument is not a member of the array, member
array returns -1. So that:

member_array( "shiz", ({ "foo", "bar", "baz" }) ) returns: -1


Example:

Does this player know how to polka? Return 1 for yes:

RIGHT: if(member_array("polka dancing", this_player()->GetSkills()) != -1) return 1;

WRONG:
if(member_array("polka dancing", this_player()->GetSkills()) ) return 1;
 
The first way says "If 'polka dancing'
has an element number that isn't -1,
then it is a member, so let's return 1"

The second way says
"If 'polka dancing' has an element number that isn't 0,
then it is a member, so let's return 1"

The problem with the second way is that it is possible for "polka dancing"
to be element 0 in that array, and if it is, your code will incorrectly
tell you that you can't polka dance. But worse than this is that if
you actually can't polka dance, this second way will incorrectly tell
you that you can. Given random input, the second way would be wrong more than
half the time.


I'm trying to add two mappings together and the results are bizarre

Adding mappings together has to be done just so in order for
it to work the way one might expect. What can happen in
mapping arithmetic is that in the process of trying to
add the values of one mapping to another, you can change the
values of a mapping you didn't intend to. The deal is a
conflict between passing data by reference or by value. To
be sure that you don't accidentally modify an innocent
bystander, use the add_maps() sefun. For example:

MyMap = add_maps(HisMap, HerMap);

or

MyMap = add_maps(MyMap, HerMap);


When str = "abc", str[1] is 98, not "b". What gives?

What you're getting here is the ASCII code of element 1.
If you have to have that element as a string, use the
convert_ascii() sefun, like this:

convert_ascii(str[1])

You can instead use ranges, so that:

str[0..0] == "a"
str[1..1] == "b"
str[1..2] == "bc"

If you use ranges, do not use the convert_ascii() sefun.


How do I make an array1 that is the same as array2 but without an element?

To do this with just the first instance of the element:

array1 = array2 - ({ element });

To avoid any instance of the element:

array1 = filter(array2, (: $1 != element :) );


How do I pass arguments to a pointer in a functional?

With commas, like this:

(: eventKill, player :)

Your arguments will likely need to be global variables.


What should I do or not do in my code?

1) Avoid using call_out() as much as humanly possible.
Use heart_beat() to time things instead.

2) Don't code stuff that replicates itself.

3) Don't code stuff that circumvents security. For
example, knowing that an admin is logged on but
invisible isn't much help to you if he bans you
for coding a tool to find him.

4) foreach() and filter() are faster than for() loops,
and harder to screw up.

5) switch() is faster and more economical than if()
for multiple evaluations.

6) Don't use callouts.

7) Don't use add_action for something that already
has a verb. There is no point in making an add_action
for "throw", for example. It's just going to confuse
players when your "throw" doesn't behave the way
"throw" does everywhere else on the mud.

8) Callouts are bad, mkay?

9) Don't code delays by using loops. This affects the
whole mud. If an action is to be delayed, use heart_beat().

!
!
Section 3: Intermud and channel stuff


How do I know what other muds are online on intermud?

Type: mudlist

To see online Dead Souls muds type
: mudlist -m dead


Hey, LeetFooMud is online! How can I tell if Biff is logged on?

To see who's logged on: rwho leetfoomud
To tell Biff hello: dest corpse

7) Once you're done having fun with your godlike
powers, it's time to start learning how to make
fun stuff of your own.

For a quick start in building, you
can start reading the Creator's Manual at
chapter 31, which is where the QCS section begins:

read chapter 31 in manual

read chapter 32 in manual

and so on.

That's fine to start with, but eventually
you'll need to read the whole Creator's Manual.
If you don't, 90% of the questions you ask about
code could be fairly answered with: "read the manual."


This is weird...where is the online builder? How does
new stuff get compiled?

Dead Souls can be very strange to people used
to non-LPC muds. This is because many other kinds of
muds use a system where the mud is written in C++,
and to make changes, you need to add C++ code to the
source, recompile it, then reboot the mud.
In that kind of system, building is done with
tools where you fill in blanks and code is generated
for you. I presume that some C++ expertise is
required for doing anything unusual or fancy.

If you come from this kind of environment,
you may be in for a little disorientation. On a Dead
Souls mud, there is no need for compiling code. You
don't need to reboot the mud for new stuff to
be available.

You can add your new Orc God of War to the
game (after you code him, of course) with two
simple commands:

update /realms/<you>/area/npc/grimmash.c

clone /realms/<you>/area/npc/grimmash.c

You're now face to face with him. This makes
Dead Souls, like most LPC muds, very flexible in
what can be done, and very stable in terms of
needing few reboots. Reboots typically are
necessary only when someone breaks important
code, or to implement major mud-wide changes.

So, just write your code, and update it.
It's that simple. There are two main ways to do
this. The easiest way is with the QCS, or quick
creation system. With the QCS, you don't even need
to look at code. You just issue a few commands,
and your new whatever is there. Check out an example
of the QCS here.


To learn the QCS, read the Creator's
Manual starting on chapter 31.

The other way to create on-line is
with the ed command. The ed editor is a powerful
and flexible way of editing files. Some people
find it difficult at first, and you might even
be able to avoid it for a while if you mostly
just use QCS. However, you'll eventually need to
know a little about ed. For a tutorial, go here.

For more detailed documentation,
type: help ed


I explored around in /domains/Ylsrim and <XYZ> is broken

Ylsrim is kept in the distribution as a kind of
sentimental artifact. It's the demo area that the
original Dead Souls shipped with, and although
it's mostly been fixed up to work with Dead Souls 2,
things can behave unexpectedly. There will be
no new fixes to Ylsrim. Please consider it a museum
exhibit that stands as-is.


I explored around in /domains/town and <XYZ> is broken

Please send me an email and let me know, so I
can fix it. Also let me know if something in the default,
campus, or examples domain is hosed up.


!
Section 2: Code

What's the QCS?

Please see the QCS example page for an explanation of this
important Dead Souls system.


SetUnique doesn't work.

SetUnique() is probably doing something you
don't expect. When an item is loaded into memory, and
it has an inventory, it first checks each of those items
for whether it's supposed to be unique.
If it is supposed to be unique, then we look
through the list of loaded objects to see if there is
one of these items already cloned. If there is, then
we don't clone a new one.
What this means is that if I kidnap Leo the
archwizard and hold him in my workroom, another one will
not appear in the basement until my Leo is dested.

Note, however, that this does NOT mean that the
mud will never have two Leos. I can clone however many
Leos I want. But as long as one or more cloned Leos
exist, the basement will not make another. That's
what SetUnique means.

Now, if the behavior you're seeing is different
from what I described, maybe SetUnique is broken,
and you should email me with what you're seeing.


I made a magic wand that disappears after 10 minutes.
But if a player logs out and log back in, they have
another 10 minutes! How do I fix this?

What's happening is that you are keeping
track of how old the wand is, perhaps with a
variable named Age. But if the player quits and
logs back in, then the wand gets cloned again, resetting
all its values, including Age, to the original.

The way to make the Age variable survive
logouts is with AddSave. If you give your variable to
AddSave as an argument, that variable gets saved when
the user quits, and when they log back in, it is restored,
preventing cheating.

See /obj/wed_ring.c for an example.


Where is it saved?

In the player's playerfile, along with the values of all
the objects they were carrying when they quit. The file is
in /secure/save/[ players | creators ]/<first initial>/<name>.o


How do I add or remove emotes?

That is an admin job. You admin would use the
addemote or removeemote commands.


How can I tell what files something inherits?

Use the showtree command. To know what files
are inherited by your robe, for example:

showtree /domains/default/armor/robe


How can I find the filename of something?

If it's in your environment: scan here
If it's in your possession: scan me

The number sign (#) and numbers at the end are that
object's unique identifier.


What's the largest integer usable by the mud?

2147483647


How can I find out what functions exist in something?

Get its filename and use the functions efun. For example:

eval return functions(load_object("/domains/town/obj/sign"))


object::init() is broken!

It isn't really. Unless you're coding a lib
item, you should not be inheriting LIB_OBJECT for
"tangible things" anyway. You should inherit LIB_ITEM.

The reason object::init() fails is that LIB_OBJECT
doesn't have an init() function to call.


if(ob->GetFoo()) seems to break, but I don't know why

This function will error if ob does not exist. Unless
you are 100% positive ob will exist (and really, even if so),
it should look like this:

if(ob && ob->GetFoo())

Which means "if ob exists, and it has a foo".
This way, if there is no ob, the check stops right there
without getting hosed up on the next step.


How do I add color to my descriptions?

There are various markup tokens you can use for this. They look like this:

write("%^BOLD%^GREEN%^ This text would be in bold green letters %^RESET%^ and this would not.");

To make text blink, use this tag: %^FLASH%^

The %^RESET% is important. Without it, unpredictable things can happen.

To know what colors are available, type: colors

You should probably avoid color unless there is a compelling
reason for its use. Many mud admins discourage it because it can
distract from the game and cause uniformity issues: most mud
admins feel their mud text should look more or less
the same everywhere.


How do I turn the integer 42 into the string "forty-two"?

cardinal(42)


Can I use !=NULL as a test?

In theory, I guess so, but I doubt it'll work by default, and I'd
discourage you from doing anything so non-LPC-standard.
Instead try something like one of the following:

if(variable)
if(sizeof(variable))
if(variable != "")


I want to create and test a new command for the mud,
but I'm not admin so I can't put anything in the
normal command paths. What can I do?

Put your new command in your homedir's cmd/
subdirectory. A sample command is there already
to serve as a template. When you add a command, type:

update /daemon/command

for it to show up in your path.


How do skills work?

Skills are generally class-based, meaning that they are
specified in the class files found in /secure/cfg/classes.
Skills are only meaningful in terms of library objects that
understand them.

For example, a fighter's blade attack is useful because
player.c and combat.c make use of this skill as a
modifier.

But adding a basketweaving skill to a class is not
helpful unless there are library objects (looms, perhaps,
or straw) and verbs (weaving, maybe?) that make
use of that skill.

There are also race-based skills, such
as poison bite or breath attack. These skills are
specified in /secure/cfg/races.


How do classes work?

Basically, having a class gives you special skills.
That's it. See the above section, "How do skills work?"


How do virtual rooms work?

Virtual rooms are rooms generated on the fly by a
virtual room server. You program that server with
the room descriptions, the number of them,
etc, and the virtual server can make available
a grid of rooms with your descriptions.

This allows you to create, for example,
a vast desert, or a large jungle, comprised of
dozens, or hundreds, or thousands of rooms
without having to manually code each and every
single room.

For an example, take a look at

/domains/town/virtual/


How are files organized in Dead Souls?


See the admin FAQ.


What are lfuns, sefuns and efuns?


Sefuns and efuns are functions available to all objects on the
mud. Any object may need to know what time() it is, so rather
than have a time() function in every file that needs it, which
could be many, there is a time() function built into the
game that any object can use. An efun is built into the
driver, so there is no LPC code to look at. A sefun is a
simulated efun, coded in LPC. Sefuns are kept in /secure/sefun.

Lfuns are functions specific to library objects. A shirt,
for example, has functions that a sword may not need, so
the LIB_ARMOR and LIB_WEAPON files contain their own functions,
not shared by other files (it's more complicated than this,
but that's the idea). These functions are library
functions, or lfuns. Typically they are found in the objects
defined by the files in /lib.

For a lot more detail on efuns and sefuns, see the admin FAQ.


Why are there more sefun doc files than sefun files?

Sefun files, like /secure/sefun/strings.c, often contain
more than just one sefun. Therefore, there will be more
files documenting individual functions than there are
files containing sefuns.


I edited a file but now the reload command is complaining.

There are two commonly used commands for loading
objects: update and reload.

When you want to load a file into memory, you use
update, for example: update /domains/default/room/road

When you want to replace a cloned object with a
version that uses the latest code in a file, you
use reload, for example: reload my first red sword

reload doesn't work on files.

update doesn't work on cloned objects.

The reason there are two commands, instead of one all-purpose
one, is both historical and functional. The reason "reload"
exists is that I got sick of having to dest a thing, update
its file, then clone the thing every time I wanted to
test changes in its code. This was annoyingly tedious, so I
coded the reload() sefun and reload command.

However, update works just fine, and I wasn't about
to try to fix something that wasn't broken. It works, and
LPC old timers are used to it.

Further, it has a function sufficiently separate from
reload that it stands as a command on its own merits.


this_player()->GetName() returns "A shadow" when the player is invis.

Use this_player()->GetKeyName() instead.


Is there a sefun for making a whole string uppercase?

upper_case("omgwtfroflmao")


What is the difference between filter() and foreach()? How do I use them?

Both of these efuns can act on the individual members of an array.

For example, if you wanted to have an array named mystuff which
contains the filenames of all objects in your inventory that
inherit LIB_ARMOR:

using filter:

object *stuff = filter(deep_inventory(this_player()), (: inherits(LIB_ARMOR,$1) :) );
string *mystuff = filter(stuff, (: base_name($1)+".c" :) );

using foreach:

string *mystuff = ({});
foreach( object ob in deep_inventory(this_player())){
if( inherits(LIB_ARMOR, ob) ) mystuff += ({ base_name(ob)+".c" });
}

There are arguments favoring the use of either. I won't get into
it. As far as I can tell, it's really a question of preference.
You can structure these functions more elegantly
than shown here, to best suit you. But this is the idea.


member_array() is returning exactly the wrong thing

It probably isn't. member_array() seems somewhat counterintuitive
at first, because it often returns a 0 as a "hit".

What this function is doing is checking to see whether the
first argument is a member of the array specified in the second
argument, and then tells you *which* element it is. for example:

member_array( "bar", ({ "foo", "bar", "baz" }) ) returns: 1

member_array( "foo", ({ "foo", "bar", "baz" }) ) returns: 0

Why does it return 0? Because "foo" is element 0 of the
array. If this_array == ({ "foo", "bar", "baz" }), then
this_array[0] is "foo". So member_array("foo", this_array)
would return 0.

If the first argument is not a member of the array, member
array returns -1. So that:

member_array( "shiz", ({ "foo", "bar", "baz" }) ) returns: -1


Example:

Does this player know how to polka? Return 1 for yes:

RIGHT: if(member_array("polka dancing", this_player()->GetSkills()) != -1) return 1;

WRONG: if(member_array("polka dancing", this_player()->GetSkills()) ) return 1;
 
The first way says "If 'polka dancing' has an element number that isn't -1,
then it is a member, so let's return 1"

The second way says "If 'polka dancing' has an element number that isn't 0,
then it is a member, so let's return 1"

The problem with the second way is that it is possible for "polka dancing"
to be element 0 in that array, and if it is, your code will incorrectly
tell you that you can't polka dance. But worse than this is that if
you actually can't polka dance, this second way will incorrectly tell
you that you can. Given random input, the second way would be wrong more than
half the time.


I'm trying to add two mappings together and the results are bizarre

Adding mappings together has to be done just so in order for
it to work the way one might expect. What can happen in
mapping arithmetic is that in the process of trying to
add the values of one mapping to another, you can change the
values of a mapping you didn't intend to. The deal is a
conflict between passing data by reference or by value. To
be sure that you don't accidentally modify an innocent
bystander, use the add_maps() sefun. For example:

MyMap = add_maps(HisMap, HerMap);

or

MyMap = add_maps(MyMap, HerMap);


When str = "abc", str[1] is 98, not "b". What gives?

What you're getting here is the ASCII code of element 1.
If you have to have that element as a string, use the
convert_ascii() sefun, like this:

convert_ascii(str[1])

You can instead use ranges, so that:

str[0..0] == "a"
str[1..1] == "b"
str[1..2] == "bc"

If you use ranges, do not use the convert_ascii() sefun.


How do I make an array1 that is the same as array2 but without an element?

Two ways:

1) array1 = array2 - ({ element });

2) array1 = filter(array2, (: $1 != element :) );


How do I pass arguments to a pointer in a functional?

With commas, like this:

(: eventKill, player :)

Your arguments will likely need to be constants, tokens, and/or global variables.


What does the tc() sefun do?

It's something I coded for myself long ago, basically
a personalized debug(). However, people have been
asking for that functionality for themselves, so
the debug() sefun now carries this functionality. For
more information, type:

man debug


How can I find out how many items are in an array quickly?

sizeof(array)


My SetRead isn't working

You may need an item for each read. For example,
SetRead( ([ ({"alpha", "bravo", "charlie"}) : "Delta.", ]) )

May need something like this *above* it:

SetItems( ([ ({"alpha", "bravo", "charlie"}) : "A thing you can read.", ]) )


My SetEnters/SetSmells/SetListens isn't working

See above.


Can I nest loops?

Can you? Probably. Should you? Almost certainly not.
For loops and while loops are legal LPC, and you may even
see them here or there in older lib code. But they
should be avoided because they generate much more
lag than the more efficient foreach() and filter() efuns.


What should I do or not do in my code?

1) Avoid using call_out() as much as humanly possible.
Use heart_beat() to time things instead.

2) Don't code stuff that replicates itself.

3) Don't code stuff that circumvents security. For
example, knowing that an admin is logged on but
invisible isn't much help to you if he bans you
for coding a tool to find him.

4) foreach() and filter() are faster than for() loops,
and harder to screw up.

5) switch() is faster and more economical than if()
for multiple evaluations.

6) Don't use callouts.

7) Don't use add_action for something that already
has a verb. There is no point in making an add_action
for "throw", for example. It's just going to confuse
players when your "throw" doesn't behave the way
"throw" does everywhere else on the mud.

8) Callouts are bad, mkay?

9) Don't code delays by using loops. This affects the
whole mud. If an action is to be delayed, use heart_beat().


How much different or heavily modified is Dead Souls than stock LPC?

This is a difficult question to answer on its own terms. It's
roughly equivalent to:

Is Fedora different from stock UNIX, or will my Solaris programs work on it?

This DVD movie is in NTSC format, so my TV can handle it, right?

The terms used roughly correspond to the same
general thing, but the assumption here is that there is a
"stock" LPC, and you can transplant code from one LP mud to
another.
Sometimes these transplants can be done. Oftentimes not.
This is because LPC has been interpreted and implemented in
many slightly different ways by many slightly different versions
of many different drivers. The end product of the DVD is a movie
playing on your TV, but how it gets there is very different from
how a videocassette does it, even if it's the same movie and its
signal is encoded in NTSC in both cases.

If you have two LPmuds that use different drivers, it
can be much like the difference between a DVD and a videotape.
Sometimes, if the drivers are related, the difference is smaller,
like VHS versus Betamax, but you'll still be embarking on a
major project getting the movies from one to play on the other.

The result is that a coder from Discworld and a coder
from Nightmare can roughly speak the same language, and discuss
solutions to their problems that make sense. And each coder
could probably visit the other mud and work with a very
small learning curve.
But the code itself would probably require substantial
retooling to be interchanged.


Is there a way to change the "default exit" room messages?

Yes, but it involves some understanding of LPC. See
if Brodbane@Eve is listening on the ds channel. He
may have some tips.


This dummy item is weird.

Dummy items *are* weird. They exist because the
parsing system requires objects to act on. When you "look
at painting", the parser doesn't take "painting" as a
string to match. Through a magical mystical process
deep in the MudOS driver, the parser turns "painting" into
an object to act on.
It tries to find object in the area that match
this keyword, and if it finds one, it sends that object
a query about whether it can be looked at. Depending
on the response, the parser continues on to determine
what the verb (the command you issued) thinks should
happen to objects that can be looked at, and tries to
evaluate that event with the object as its target. The
process continues in a complex dance of "may I?
how so?" etc, until finally the painting, the verb, the
parser, and you come to an agreement as to what the
result of this looking should be.
Crucial to this process is that the painting
actually *exist* as an object, so it can be queried
for various functions. Without a "painting object" in
the room, there's no parsing that's going to
happen with it.
But what if this painting is just part of the
room description? You don't want to add a painting
to the inventory of a room just so people can look
at it. You want people to be able to "look at painting",
or "look at wall", or "look at ceiling" without
having to have all of these items be part of the
room's inventory. What a chore that would be!
This is where dummy items come in. They are
invisible objects that are set to respond to the names
they are assigned, such as "ceiling", "wall", etc,
handling the job of providing a description when
a person looks at the ceiling, wall, etc. These kinds
of dummy items are automatically created when a room
is loaded, based on what the SetItems directive of
the room contains.
You'll also find dummy items for special
tasks, like a dummy button to push in the town church.

Because of this specialized role, dummy
items are not intended to be picked up or manipulated
the way regular items are. If you clone a dummy
item, it's not going to behave the way you want
it to. A dummy item should only ever be brought into
existence by your code, not by the clone command.

 
Clan objects do nothing but screw things up.

Quite right! If you don't code a clan object
properly, it's extremely likely to have little effect
aside from screwing up a player's savefile so badly
that it needs to be destroyed.
Why is this? Clan object code is basically
legacy guild code from Dead Souls 1.x. In the old
versions of Dead Souls, guilds were player-run
institutions, operating basically as clubs, with
guild objects as a kind of membership token.
The version of LIB_GUILD that came with
Dead Souls 1.x was fatally buggy in various ways.
The most important way is that even if you got it
to work right, it did nothing useful. There was
no interaction with a guild or player daemon,
so if the guild leader quit, they lost their
guild leader status. Aside from holding an object
which designated them as a member of a particular
guild, LIB_GUILD provided no advantage.
I renamed it to LIB_CLAN, because as a
social-club object, that's a bit closer to its
role than "guild", which tended to cause much
confusion.
Eventually there will be a CLAN_D, and more
sophisticated error handling to prevent character
file corruption. For now (version 2.0 of Dead Souls),
just avoid using it.


My NPC's stats are all hosed up.

Make sure you have SetLevel() *after* SetRace() and SetClass().
Also make sure there's a working ::create() in your create
function. Some examples are:

::create();
npc::create();
vendor::create();

And make sure your init() function has an:

::init();


This squirrel is taking *forever* to kill.

The mud is calculating its health points based on level and
race. If your squirrel has 340hp, it'll seem unreasonably
tough. Use SetMaxHealthPoints() to cap its vitality to
something like, say, 5.


My room should not be entered/exited by just anyone. How
do I control this?

There are a couple of ways of controlling entry to a room.
Take a look at the "AddExit" method in:
/domains/town/room/valley.c

And also review the "CanReceive" style in:
/domains/town/room/wiz_hall.c

To prevent a room being exited unless certain conditions
are met, use CanRelease().

These strategies are not discussed in detail in the Creators Manual,
but the examples above should provide ample information as
to how to structure them.

Note that in general, objects with a CanReceive() override
should return ::CanReceive() unless there is a
good reason otherwise. It would look like this:

int CanReceive(object ob){

<if blah return 1>
<if bleh return 0>
<etc and so on>

return ::CanReceive();
}

Obviously the stuff between the <> symbols is pseudocode and
not LPC.


I zapped a monster, but instead of being dead, now it's undead!

Take a look at the code for this NPC. It probably has
eventDie() overridden in a way that does not return 1. This is
not necessarily wrong. You may *want* a monster that doesn't
die like normal monsters do. But if this behavior is unintended,
that is probably the cause.


How does the format for race files work?

Here's a template with parameters in parentheses for clarity:

RACE (race name here)
SENSITIVITY (low light threshold):(bright light threshold)
LANGUAGE (self-explanatory)
RESISTANCE (damage type):(how resistant we are to the damage)
STATS (name of the stat):(the average):(how important. 1 is high)
LIMB (limb name):(where it attaches):(how important. 1 is high):(armor types)
SKILL (skill name):(unused):(how important. 1 is high):(unused):(unused)

The unused fields in the skill section are reserved for
future implementation.

If the third field in the LIMB line is 1, losing that
limb will cause immediate death.

Special keywords can be appended for particular functionality.
These are:

FLYINGRACE (enables flying)
LIMBLESSRACE (enables limbless travel)
LIMBLESSCOMBATRACE (enables limbless combat)
NONBITINGRACE (some races can't or won't bite)
PLAYER_RACE 1 (enables the selection of this race for players)

Please note that while the LIB_BODY object does
specify a number of fingers, they aren't items that
can be severed, and their purpose mostly is determining
what kind of gloves you can wear.


How does the format for class files work?

Class files have only two types of
entry lines that Dead Souls currently supports.
The first is the name of the class.

Every line after that is presumed to be
a skill specification line, in the following
format:

skill name:starting level:importance to the class


What do Properties do?

Properties are a way to provide flexibility in
the lib. Objects usually work by having variables
that are modified by functions. This allows a player
to have, for example, a SpellBook variable which
contains the spells she knows, and this variable in
turn is affected by "spell learning" functions, etc.

Suppose, however, that I want to set a
variable in a player, but that variable does not
exist. This is tricky indeed, because it would
involve a modification to one or more library objects,
and reloading them...possibly requiring re-logins
or (very rarely) even rebooting the mud.

Instead you can use properties as a quick
and dirty way to get that functionality without
rewriting lib objects. For example, if you do
something like this:

present("lamp",this_player())->SetProperty("blessed", 1);

Then that lamp is blessed, and maybe now
a monster has a function like this:

if(present("lamp",this_player())->GetProperty("blessed")) RunAway();

SetProperty() and SetProperties() are just
convenient ways to create and modify custom variables in
objects and players on the fly. Strictly speaking this
is not good coding practice. Anything useful enough to
make into a Property is useful enough to do in another way.
However, it is available to you as another implement
in your coders' toolbox.


How do I add a prehensile limb to a player or NPC?

victim->AddLimb("tail", "torso", 2, ({A_WEAPON }))

See the Creator's Manual for details on adding, desting,
and removing limbs.


How do I make a room occasionally display messages?

Use SetAction. There is a well-commented example
of this in /domains/town/room/shore.c .


My functional isn't working!

Functionals are a kind of reference to a function. They
won't work everywhere. For the most part they serve as a pointer,
and are used the way a variable would be used. If the place you
put the functional wouldn't make sense for a variable, it wouldn't
make sense for the functional either. For example,

SetLong( (: ShowLong :) );

makes sense, because what's happening is that instead of
a string, your argument is a function that returns a string.

However, something like this wouldn't work,

if( Cabbages == Kings ) (: eventTalk :);

because you're treating a functional as if it were a function.
It isn't. In a case like this, your line should look like this:

if( Cabbages == Kings ) eventTalk();


I've read the Creator's Manual but I still don't understand mappings and arrays.

Yeah, they can be tricky to get a handle on. Let's suppose you're
going to set up a nautical commerce system, where you have to keep track
of ships and their data. You store ship data in a daemon, which is
an object that stays loaded in memory to manage information, but doesn't
actually exist as a cloned item in the game. We'll call it SHIPPING_D.

So, SHIPPING_D needs to keep track of how many ships there are.
I would do this with an array, not a mapping, because it is a simple
list, like this:

string *ship_list = ({ "Caine", "Bounty" });

That way, when SHIPPING_D gets queried for a list of all known
ships, it can just return that simple list. If you needed to add a
ship, you'd have the daemon perform this operation:

ship_list += ({ "Pequod" });

To remove a ship:

ship_list -= ({ "Caine" });

Suppose, however, that not only do you need to keep track of
ship names, but also their captains, crew complement, etc. You could try
to use an array for this, but it would be very unwieldy. This is because
to pick out specific elements, you need to use a number. For example,
if the ship_list array is ({ "Caine", "Bounty", "Pequod" }) then
ship_list[0] is "Caine" and ship_list[2] is "Pequod".
If you were to try having an array for each ship that
contained complex information, you'd have stuff like this:

ship_list += ({ "Caine", "Queeg", 117, "military", "destroyer minesweeper", 0 })

There are a couple of problems with this. First, the ship_list
array is going to be a bit of a mess. Second, you'll have to address the
ship's data elements by their array index number. For example, to know
the Caine's crew complement, you'll need to do something like this:

foreach(string *ship_data in ship_list){
if(ship_data[0] == "Caine") return ship_data[2];
}

The first step is to check each element in ship_list to
know if its first element is "Caine", then return its third element,
which is 117. Not only is this inelegant and overcomplicated,
it is not guaranteed to work. Careless manipulation of your subarrays
can result in elements being out of order, with potentially
disastrous results on your code. It's just not a wise way to
go about this. This is where mappings come in. Rather than the mess
above, we'd do it like this:

mapping AllShips = ([]);

AllShips["Caine"] = ([ "captain" : "Queeg", "complement" : 117, "type" : "military",
"class" : "destroyer minesweeper", "cargo" : 0 ]);

It looks more complicated, but in fact it's a major simplification
of your data and its access. Now you have a sure-fire way to query
a specific ship and its specific data elements without a shadow of doubt
as to what you'll get back.

Now if you want to know the name of the Caine's captain,
it looks like this:

return AllShips["Caine"]["captain"];

Basically this is a mapping inside a mapping. The mapping called
Caine contains the element "captain". Because the mapping Caine is an
element in the mapping AllShips, you access an element in it in the way
shown above.

In a less complicated example, mappings might be used, for
example to store information about, say, fish:

mapping FishTypes = ([ "carp" : "freshwater", "tuna" : "saltwater" ]);

So that FishTypes["carp"] is "freshwater".

To remove a mapping element, use the map_delete efun:

map_delete( FishTypes, "carp" );


Why are call_outs so bad?

Garfield@M*U*D <ds> I'm wondering.. Why are call_outs so bad?

Cratylus <ds> ya good question

Cratylus <ds> in themselves they arent. One call_out more or less wont make the angels cry

Garfield@M*U*D <ds> From what I can tell, they shouldn't be too bad if not implemented poorly.

Cratylus <ds> the problem is that if your creators get the idea call_outs are ok, you'll be swamped with them

Garfield@M*U*D <ds> Right. You want 10s of them, not 100s.

Cratylus <ds> and they, for reasons i cant explain to you because it's driver related, are expensive to run

Garfield@M*U*D <ds> Can't explain because you're not familiar with the driver?

Cratylus <ds> right

Garfield@M*U*D <ds> Right. Fair 'nuff.

Cratylus <ds> but i can vouch for the truth of the proposition

Cratylus <ds> limbs used to decompose, each with a call_out of its own

Cratylus <ds> if you released the rage virus into the menagerie, your mud would eventually crawl to a stop

<ds> Garfield@M*U*D hehs.

Garfield@M*U*D <ds> What amount of call_outs are we talking here? Hundreds? Thousands?

Cratylus <ds> fewer than 200 as i recall

Cratylus <ds> but the memory is hazy

Garfield@M*U*D <ds> Hrm. Ick.

Garfield@M*U*D <ds> I might peek at how they work.

Cratylus <ds> it also redlined the processor

Garfield@M*U*D <ds> Right.

Cratylus <ds> lucky for me i have a 4-way box


Fine. How am I supposed to create timed events, then?

There is a built in timing system that uses the heart_beat()
efun. To enable it, use set_heart_beat() on the object that is
to have a timed effect. set_heart_beat(1) gives the object about one
heart_beat per second. set_heart_beat(60) gives it a heart_beat
about once a minute.

Whenever the object has a heart_beat happen, the function
heart_beat() is called in it. So, for example, an NPC might have
a heart_beat function like this:

void heart_beat(){
this_object()->eventForce("say hi!");
}

If the NPC's create() function contains a set_heart_beat(10)
then it will say "Hi!" every ten seconds.

Another way to control it would be to have a counter.
You would define a global integer variable by putting in in the body
of the NPC's file before any functions are defined. For example:

int counter = 0;

somewhere before the create() function. Then your heart_beat
function might look like this:

void heart_beat(){
counter++;
if(counter > 10) {
this_object()->eventForce("say hi!");
counter = 0;
}
}

If the NPC's heart_beat is set to 1, then the NPC will make
his greeting about every ten seconds. If its heart_beat is set to
ten, then it'll take a minute and forty seconds per greeting. Note
that at the end of the if() check, the counter is reset to 0 if
the action is triggered.


I need a list of all the functions available.

If you read the section on efuns and sefuns, you have an
idea of what they are. They are documented in /doc/sefun and
/doc/efun , and doing a list of the dirs and subdirs there
will give you a "list" of them. The documentation on individual
sefuns and efuns is generally available through the man command,
for example: man sscanf

If you're looking for lists of library functions,
such as SetClass in LIB_WEAPON, your best bet is the help
command, like this:

help library objects weapon

help library objects creator

That will list the functions in the library object
you specify. As of this writing, the documentation on lfuns
is not yet as thorough as the documentation on efuns and sefuns,
but this documentation is an ongoing project whose output
should eventually improve.

A contributor to the mud community has made
available a wikified cross-reference of Dead Souls funs,
which you can find here:

http://lpuni.org/components/com_mambowiki/index.php/DeadSouls_Reference


How do I make an object you can [ jump on | climb | etc ] ?

Look for an example, and copy it. Take a look at the
code in the newbie mansion ladder for climb code. Take a look
at /domains/Ylsrim/room/bank_roof.c for an example of something
you can jump from. Other actions will have similar examples. The
sample domains are there for you to explore and find examples
of what you want to do.


Where is the list of available skills? How do I add skills?

Please read the Administrator's Guidebook chapter
entitled "Understanding the Lib", and skip to section named
"
Section IV: Skills".


Where is the list of available classes? How do I add a class?

Type: ls /secure/cfg/classes

To add a class, copy one of those files and call it
whatever the class should be. For example:

cd /secure/cfg/classes
cp thief farmer

The modify the new file to suit you. When
you're done, use admintool to add the class to the class
daemon. Type help admintool for information on that command.

Obviously, you'll need to be an admin or assistant
admin for this to work.


Where is the list of available races?

Type: ls /secure/cfg/races

For details on adding races, see the admin FAQ.


How do languages work? Is there a list of them?

There is no list of languages. It doesn't work that way.
There is no centralized language database, daemon, or anything
like that. Languages are basically like a skill: only useful to
the extent that lib objects make use of them.

A player might be able to understand Tamarian, but if
nobody else in the lib does, it isn't much use. If no written material
is in Tamarian besides, then the player's language ability is a waste.

On the other hand, if a player wants to be able to
understand orcs, all she has to do is find a language teacher
that can instruct her in that tongue. After enough lessons,
she will be at 100% fluency, and if she encounters written or
spoken information in Tangetto, she'll be able to understand
all of it.

To know what languages you understand, and to what
extent, use the command:

language

To make yourself fluent in English, type:

anglicize me

To make yourself fluent in all languages, type:

polyglottize me

Obviously these commands are available only to creators.


When I try to call test->SetLanguage("Bozo", 50), it sets it to 100%

Bozo is probably a newbie. If Bozo's player level is at or below
what is defined as newbie in /secure/include/config.h, then he understands
all languages at 100%. Raise his level above that, and you should see
his proficiency in that language drop to what you specified.


How do I update an .h file?

You don't, really. That's a header file, which contains code to
be included by a .c file. Only a .c file gets loaded into memory, so
to "update" an .h file, you update the .c file that includes it. In
the case of a global include, like daemons.h, you would update the
master object (also called the master daemon) thusly:

update /secure/daemon/master


!
!
Section 3: Intermud and channel stuff


How do I know what other muds are online on intermud?

Type: mudlist

To see online Dead Souls muds type: mudlist -m dead


Hey, LeetFooMud is online! How can I tell if Biff is logged on?

To see who's logged on: rwho leetfoomud
To tell Biff hello: <ds>: list ds@leetfoomud
To check out Biff's personal info: finger biff@leetfoomud


That's weird...mudlist says LeetFooMud is there but I'm not getting anything back.

The mudlist command reports on data retrieved the last time
the intermud daemon received an update. This means that if
LeetFooMud dropped off, say, 10 minutes ago, or if your own
intermud connection is down, your intermud commands are falling
into the void.

To see if your intermud connection is up, type: wiz
This takes you to the Creator's Hall, where a sign indicates
your mud's intermud connection status. This sign may be up
to 15 minutes out of date.

You can also test your mud's intermud connection with
the ping command, like this:

ping dead souls

ping frontiers


I heard there are intermud channels that talk between other muds,
not just Dead Souls muds. How can I use them?

Ask your admin. Those channels may not be open for
use on your mud.

If you talk on <ds>: list ds@leetfoomud
To check out Biff's personal info: finger biff@leetfoomud


That's weird...mudlist says LeetFooMud is there but I'm not getting anything back.

The mudlist command reports on data retrieved the last time
the intermud daemon received an update. This means that if
LeetFooMud dropped off, say, 10 minutes ago, or if your own
intermud connection is down, your intermud commands are falling
into the void.

To see if your intermud connection is up, type: wiz
This takes you to the Creator's Hall, where a sign indicates
your mud's intermud connection status. This sign may be up
to 15 minutes out of date.

You can also test your mud's intermud connection with
the ping command, like this:

ping dead souls

ping frontiers


I heard there are intermud channels that talk between other muds,
not just Dead Souls muds. How can I use them?

Ask your admin. Those channels may not be open for
use on your mud.

If you talk on <ds>. <intercre> is for code and technical
questions ONLY. Do not ever spam it or use it for chatting.

I strongly discourage you from talking on <intergossip>. I
assure you nothing good will come of it.


Howdo I emote on a channel?

Add the word
"emote" to the channel command. For example:


creemote compels your silence.

gets seen on the channel as:
<cre> Cratylus compels your silence.


Howdo I see what I missed on a channel?

To see the recent messages, use hist. For example:

hist ds

To see older stuff, look in /log/chan


I am sick and tired of the intermud network going down. Please fix it.

That's really out of my hands. I don't maintain the router.
I've been toying with the idea of setting up a separate intermud3
network with the Dead Souls site as the router, but I haven't
had much time to invest into it. I'm looking for volunteers to
help me set that up, and also volunteers to help me fix the
Dead Souls imc2 implementation, which is very close to working.

If you can't help with either one, then I'm sorry,
but you'll have to be patient a little longer until I can get
those volunteers.


I just wanna chat. Is there a dschat channel?

No, and there probably won't be one. You can chat to some extent
on the <ds> line, but if you're perceived as being a spammy
chatty source of noise, you may be asked to cool it.
If you really want to just chat, then use <intergossip>,
since that's what it's there for. Ask your admin for how to
do this. I don't recommend it, but I'd rather you expose
<intergossip> to your boredom than <ds>.
Alternately, there's a <ds_test> channel which is
intended specifically for spammy channel tests and such. Add
that channel to yourself and blab away, though not many
people will be listening. See /doc/README for how to add
channels to yourself.


I'll spam if I want to. You're not the boss of me.

It's true, I can't do much if you're determined to be a
jerk. If you consistently abuse channels, your admin may
be asked to limit your channel access. In extreme cases,
your mud may find itself banned from the channel in
question.
I can only appeal to your sense of fair play.
Spamming hurts people who have nothing to do with whatever
you're pissed off about. Please don't make whatever your
problem is with someone a headache for everyone.

!
Section ! 4: Miscellanea
!
!

! Someone ! amputated all my limbs and I can't do anything!
!
! If your body ! gets damaged you can restore yourself to your
! normal ! physical status by typing:
!
! heal ! me
!
!
! People ! are ! talking to me in gibberish, even though it says they're
! speaking ! English.
!
! If your race is not human, your default language is not English, ! therefore
! someone ! speaking in English would not be understood by you. As a
! creator, you ! can avoid players' tedious language learning process
! and simply ! type:
!
! call ! me->SetLanguage("English",100)
!
!     Obviously this will work for other languages too.


! What's this about Biff "unknowingly" telling me something?

! If you are invis and a player or someone on another rmud tells
! to you, they get an error message about you not being around. So,
! they told to you, but do not know you actually got the message,
! since you don't seem logged on.
!

!
! How ! do I find the location of a verb or command?
!
! Use the which ! command. For example:
!
! which ! zap
!
! which ! update
!
! If 'which' ! doesn't find it, the command is probably built into
! some object ! you inherit, like the command shell or the
! hooks for the chat daemon. Or it may be an add_action bound to a
! nearby object. To see what commands objects or inherited
! files might be providing you, type:

localcmds
!
!

! How ! do I make a quest?
!
!     ! Think of a quest in terms of the result. The result of a quest is
! a player ! receiving quest points and a quest title.
!
!     ! This means that pretty much anything can be a quest. If
! you've coded ! a rock to provide quest points and a quest title
! when it is ! picked up, well, there's your Rock Quest. However,
! you usually ! want to make things a bit more challenging.
!     ! A quest can be as boring as "pick up the red rock" or
! it can be a ! challenging metaphysical inquiry into the
! nature of ! consciousness. If quest points and a quest title are
! at the end of ! a series of actions, then that series of actions
! is a quest.
!
!     ! What those actions should be are entirely up to your
! imagination. ! Review the orcslayer quest in the Player's
! Handbook for ! an example. You did read the ! Player's Handbook,
! right?
!     ! Take a look at Leo the Archwizard's code for an example
! of the ! mechanics of solving a quest.
!
!
! Where's ! Leo?

!
! Read the ! Player's Handbook already, please.
!
!
My wandering monster escaped from my workroom! How can
I find him?

If its name is jabberwock, try:

findobj jabberwock

You can also probably just:

goto jabberwock
!
! I ! ran findobj on something but it says no environment. Where is it?
!
! Right where ! it says. Some objects create a "master copy" of themselves
! when they are ! cloned. This copy remains loaded in memory even if
! that cloned ! object goes away. You can distinguish between cloned
! objects and ! master copies by the number sign  and number at the end
! of cloned ! objects. The master copy has no instance number. It is
! simply loaded ! code, and does not "exist" in a way accessible to your player
! object on the ! mud.
!
! Sometimes a ! cloned object will lose its environment. This is usually
! caused by an ! error and is not a good thing. Dead Souls runs a
! "reaper" ! daemon that periodically searches memory for cloned
! objects that lack an environment, and they are destroyed.


! How do I ! update everything in a directory?

! You really shouldn't. There are very few cases I can think
! of where updating an entire directory is something an average
! creator needs to do. How often do you edit multiple
! files at once without individually updating them? Good
! coding practice is to update the one file you just worked on to know
! if it works at all.
!
! I also discourage it because when you do this, you lag the mud
! considerably. I/O is the most resource intensive kind of operation,
! and updating is on its own quite resource intensive. Updating a
! directory with dozens of files in it will cause a noticeable hiccup
! in the rest of the mud.

! If you are determined to do this
, though, the command is :

! update /path/to/dir/*

!

- I don't - like getting colors on my screen. How do I stop it?

! Type: terminal unknown

then type: save


! Um...I ! want colors back now please

!
Type: terminal ansi
!
! then type: save

!
!
! I can type ! 'n' and move north, but 'north' doesn't work.
!
! Technically, you can't 'n' either. When you type 'n', what
! it happening is that your preset alias turns that 'n'
! into the command line 'go north'.
!     Because you do not have an alias 'north' that expands
! to 'go north', 'north' doesn't take you anywhere. But
! go north will.

!
!
! ZOMG ! this is the best mudlib evar how can I evar thank you?
!
! Writing an ! honest review of the lib at http://www.mudmagic.com/codes/download/lpc/mudos/dead_souls
! would be ! great, along with a rating you feel is appropriate. I seem to have ! pissed
! somebody off ! over there (he knows who he is), and he has made it a project to give
! Dead Souls ! crappy ratings whenever a new release comes out.
!
! Posting your honest opinion and ! rating there would be a lovely way to
! thank me for ! the effort of putting this lib together.
!
! But really, I ! did it for the fun of it, so it's not necessary.
!

!
Dude this mudlib sux0rz @ss. What a waste of my time.

I'm sure Dead Souls has lots of things that you don't
like, but I can't fix them if I don't know what they are.
Post an honest review and rating at mudmagic so I can
understand the lameness, and so others can benefit
for your suggestions.
! ! - ! Cratylus
!
! Dead ! Souls Homepage
--- 529,1059 ---- style="color: rgb(0, 0, 153);"><ds>. <intercre> is for code and technical
questions ONLY. Do not ever spam it or use it for chatting.

I strongly discourage you from talking on <intergossip>. I
assure you nothing good will come of it. This warning only
applies to the old intermud.org router, known as *gjs. The
intermud channel on the new *yatmim router is much
friendlier to newbies.

How do I emote on a channel?

Add the word
"emote" to the channel command. For example:

creemote compels your silence.

gets seen on the channel as:
<cre> Cratylus compels your silence.

You can also add a colon to the message, like this:

cre :compels your silence.


How do I see what I missed on a channel?

To see the recent messages, use hist. For example:

hist ds

To see older stuff, look in /log/chan


I am sick and tired of the *gjs intermud network going down. Please fix it.

See the Dead Souls Intermud Router page.


I just wanna chat. Is there a dschat channel?

If you really want just to chat, then use <intergossip>,
since that's what it's there for. Ask your admin for how to
do this. I'd rather you expose <intergossip> to your boredom
than <ds>. Note that <intergossip> on *gjs is usually hostile to
newbies.
Alternately, there's a <ds_test> channel which is
intended specifically for spammy channel tests and such.


I'll spam if I want to. You're not the boss of me.

It's true, I can't do much if you're determined to be a
jerk. If you consistently abuse channels, your admin may
be asked to limit your channel access. In extreme cases,
your mud may find itself banned from the channel in
question.
I can only appeal to your sense of fair play.
Spamming hurts people who have nothing to do with whatever
you're pissed off about. Please don't make whatever your
problem is with someone a headache for everyone.

This guy keeps hassling me on an intermud channel

Sometimes people just can't leave well enough alone,
and they spam. Some people just don't have anything
to say that you want to hear. For such situation,
use the earmuff command. For example:

earmuff tatianna

And you will not receive channel messages from
that person. The reverse command is unmuff.
Earmuffing is also good when someone from
a non-European-language mud sends well-meaning
but garbled, escape-code filled gibberish. If
she doesn't understand your English language
requests to stop spamming, you can just earmuff her.

!
Section ! 4: Miscellanea
!
!
!
I'm fighting the beggar with my staff and he's kicking my ass
!
!     ! For one thing, you're a creator. Quit goofing around. If
! you want to ! fight monsters and stuff, create a test
! player ! character.
!
!     ! Next, you're probably still a Level 1 character. This
! makes you a ! wimp. Raise your level with this command:
!
! call ! me->SetLevel(20)
!
!     ! Now get the medical tricorder from your workroom's
! chest and ! raise your stats. Give yourself 100 strength.
! Why not?
!
!     If you're carrying a chest, table, chair, and ! everything
! else you've come across, you will be unable to do much
! during combat. Try to wield a weapon, hold a couple of
! shopping bags and boxes, and see how well you do against
! a pissed off real-life enemy. You won't last long. So either
! drop all the crap you're lugging around, or put it in
! a backpack and wear the pack.
!
!     ! Put the staff in your robe and quit using it as
! a weapon. ! It's a creating tool. Not only is it a
! poor weapon, ! by default you lack double-handed
! weapon ! skills, making you really crappy at using
! a really ! crappy weapon. No wonder the orcs were
! beating you ! like an animal. Get a carving knife
! from the ! mansion. Or an orcslayer. Or hell, just
! use the zap ! command and stop wasting time. You
! should have ! characters for this.
!
!
!
!
Someone amputated all my limbs and I can't do anything!
!
! If your body ! gets damaged you can restore yourself to your
! normal ! physical status by typing:
!
! heal ! me
!
!
!
How do I change my class?
!
!
Again ! with the pretending to be a ! player. Seriously,
! you need a ! test player char so that if you screw something
! up, you don't ! screw *yourself* up.
!
! But, if ! you're determined:
!
! call me->ChangeClass("thief")
!
!
Your ! stats and levels will probably be all weird and
! hosed up. ! Just raise your player level, that will probably
! fix it.
!

!
!
!
People are talking to me in gibberish, even though it 
says they're
speaking English.

!
! If your race is not human, your default language is not English, ! therefore
! someone ! speaking in English would not be understood by you. As a
! creator, you ! can avoid players' tedious language learning process
! and simply ! type:
!
! call ! me->SetLanguage("English",100)
!
!     Obviously this will work for other languages too.


!
!
! What's this about Biff "unknowingly" telling me something?

! If you are ! invis and a player or someone on another mud tells
! to you, they ! get an error message about you not being around. So,
! they told to ! you, but do not know you actually got the message,
! since you ! don't seem logged on.
!
!
!
!
How do I find the location of a verb or command?
!
! Use the which ! command. For example:
!
! which ! zap
!
! which ! update
!
! If 'which' ! doesn't find it, the command is probably built into
! some object ! you inherit, like the command shell or the
! hooks for the chat daemon. Or it may be an add_action bound to a
! nearby ! object. To see what commands objects or inherited
! files might ! be providing you, type:

localcmds
!
!
!
!
 Where are the "exa" and "n" commands?

When you type some commands, like exa, n, or i,
what happens is that your command shell recognizes
them as aliases, and turns the alias into the appropriate
command.
An alias is like a nickname, or shorter word,
for a command or series of commands. To see the aliases
you currently have, type:
alias

To make a new alias:
alias ml mudlist

To make an alias that replaces a specific command
while permitting you to supply arguments to it:
alias ig intergossip $*

To remove an alias:
alias ig

After modifying aliases, make sure to type:
save 
!     !
!
 How do I get something to happen to a random person in a room?
! You can ! pick a ! random winner (or victim) for your action by using the ! get_random_living()
! sefun. For ! details on its usage:
!
! man ! get_random_living
!
! You may also ! find the get_livings() sefun useful.
!
!
!
!
My wandering monster escaped from my workroom! How can
I find him?

If its name is jabberwock, try:

findobj jabberwock

You can also probably just:

goto jabberwock
!
!
!
I ran findobj on something but it says no environment. Where is it?
!
! Right where ! it says. Some objects create a "master copy" of themselves
! when they are ! cloned. This copy remains loaded in memory even if
! that cloned ! object goes away. You can distinguish between cloned
! objects and ! master copies by the number sign  and number at the end
! of cloned ! objects. The master copy has no instance number. It is
! simply loaded ! code, and does not "exist" in a way accessible to your player
! object on the ! mud.
!
! Sometimes a ! cloned object will lose its environment. This is usually
! caused by an ! error and is not a good thing. Dead Souls runs a
! "reaper" ! daemon that periodically searches memory for cloned
! objects that lack an environment, and they are destroyed.


!
!
How do I update everything in a directory?
!
! You really ! shouldn't. There are very few cases I can think
! of where ! updating an entire directory is something an average
! creator needs ! to do. How often do you edit multiple
! files at once ! without individually updating them? Good
! coding ! practice is to update the one file you just worked on to know
! if it works ! at all.

! I also ! discourage it because when you do this, you lag the mud
! considerably. ! I/O is the most resource intensive kind of operation,
! and updating ! is on its own quite resource intensive. Updating a
! directory ! with dozens of files in it will cause a noticeable hiccup
! in the rest ! of the mud.

! If you are ! determined to do this, though, the command is :

! update ! /path/to/dir/*


!
!
I don't like getting colors on my screen. How do I stop it?
!
! Type: terminal ! unknown

then type: save


!
!
Um...I want colors back now please
!
! Type: terminal ! ansi
!
! then type: save

!
!
!
 I can type 'n' and move north, but 'north' doesn't work.
!
! Technically, ! you can't 'n' either. When you type 'n', what
! it happening ! is that your preset alias turns that 'n'
! into the ! command line 'go ! north'.
!     ! Because you do not have an alias 'north' that expands
! to 'go ! north', ! 'north' doesn't take you anywhere. But
! go ! north ! will.
!
!
!
!
 Why is there a bunch of stuff in ROOMS_FURNACE?
!
! The QCS is ! designed to attempt the graceful handling
! of unusual ! events. Sloppy code, non-working objects,
! etc. Part of ! this design is avoiding a situation
! where an ! object's destruction affects your local
! environment ! (and this happens a bit more often than
! you might ! think).
!     ! To avoid some types of unpleasantness, QCS doesn't
! try to ! immediately destruct objects when replacing them.
! Instead, they ! are moved, along with whatever problems
! they might ! have, to ROOMS_FURNACE. That is a room
! where things ! go to be destructed quietly. Every
! second or so, ! the contents of that room are destroyed,
! and their ! bits recycled.
!     ! A few other items in the lib use the furnace,
! notably the ! recycling bins and the reload command.
!

! How ! do I change ! my screen and terminal settings?
!
! help ! terminal
!
! help ! screen
!
! screen ! 79 24
!
!
!
 ZOMG this is the best mudlib evar how can I evar thank you?
!
! No need, ! citizen. Merely doing my job.
!
! Just let me ! know what bugs you find, and how I can
! make the lib ! better.
!
!
!
Dude this mudlib sux0rz @ss. What a waste of my time.

I'm sure Dead Souls has lots of things that you don't
like, but I can't fix them if I don't know what they are.
Email me so that I can understand the lameness, and so
others can benefit for your suggestions.


I'm seeing a filename but I can't read it.

If you try command and you get something like:

/secure/foo/bar: No such reference.

It means you don't have read access to that
file or directory. I've someone make a stink about
how a file they can't read shouldn't be visible to them
or some such thing. However, I think he was just
being difficult. Some files you can't read, even
though you have access to the directory they're in.
That's the story.


Is there a command to go back to your previous directory
without having to type it all out again?

The shell has a few handy builtins.

To go up a directory: cd ..

To go to your home dir: cd ~

To go to your area directory cd ~/area

To go to the /domains dir: cd ^

To go to /domains/default: cd ^default

To go to the directory you were in before the current one: cd ~-


!

! Section ! 5: Building
!
!
!
QCS is putting stuff where I don't want it.

QCS is a way to use simple commands to manipulate
complex files. Sometimes the conversion between simple
and complex causes unusual compromises and outcomes.

When you create a new room, what QCS does
is look at the room you're currently in. Let's say
you're standing in /realms/you/area/room/test1.c. And
you issue the command

create room east test2

In this case, "test2" is considered a "relative path",
which means that you didn't provide QCS with *exactly* where
you want the file to be. You told QCS to figure out where
to put that file.
When QCS has to guess where a new room goes,
it simply assumes that the room goes in the same directory
as the current room. So, in this case, you're going to
make a file with this path:

/realms/you/area/room/test2.c

Suppose that this is not where you want the new
room to be. you want it to go into /realms/you/testrooms/.
In this case, you need to tell QCS the "full path", like this:

create room east /realms/you/testrooms/test2

When you create non-room objects, also known as
tangible items, QCS guesses in a slightly different way.
If you provide a relative name, then QCS looks at your
current working directory (cwd). Based on the type of item,
QCS looks for a directory with the appropriate name. For
example, if your cwd is /realms/you/foo, and the type of
object is a weapon, then QCS looks for a directory named
"/realms/you/foo/weap/". If it exists, it puts your new
file there. Otherwise it tries to put it in "/realms/you/weap/".
And if that doesn't work, it'll default to your home area
weapon directory, which is "/realms/you/area/weap/".

If you've been granted domain admin status, and
you are using QCS to work on your new domain, it's therefore
very important that your cwd be in the right place in the
domain directory for it to work. Otherwise, your new stuff may
wind up in your default area dir, and you could go nuts
trying to find it.

Of course, you can avoid all ambiguity by simply
using a full path, like:

create weapon /domains/My_Spiffy_Domain/weap/fruitcake

 
How do I make a blank room, instead of copying the current one?
!     ! You'll always copy the old room, that's just how
! QCS works. But you can quickly change it to a blank
! room by entering the new room and issuing this command:
!
! copy /obj/room
!
!
! How do I create an area?
!
!     You have a default area directory in your
! homedir. By default, your QCS creations get put in there.
! However, if your area is ever going to be put into
! play, it could be inconvenient to move it into the
! /domains directory, because every file reference will
! have to be changed.
!     If your admins use unix and perl, this is trivial.
! If not, it's a real obstacle.
!
!     Therefore, if you're going to work on an area
! that will someday be open to the public, it's a
! good idea to start in the /domains dir. Your admin
! will need to create the appropriate directories.
! For example, if the domain is to be FunkyTown, you'll
! need /domains/FunkyTown, /domains/FunkyTown/room, and
! so on.
!
!     You will also need to have your admin make
! you a domain admin of FunkyTown with the domainadmin
! command. This will permit you to use QCS there.
!
!     That's the technical part of getting started
! with an area. The hard part is that you need to
! know what you're doing, you have to have a creative
! vision, and the language skills to make it evocative,
! immersive, and worth playing in. That's up
! to you...I can't help you with that.
!
!
!
How do I make a quest?
  
Think of a quest in terms of the result.
The result of a quest is a player receiving quest
points and a quest title.
   
This means that pretty much anything can
be a quest. If you've coded a rock to provide
quest points and a quest title when it is
picked up, well, there's your Rock Quest. However,
you usually want to make things a bit more challenging.

A quest can be as boring as "pick up the red rock"
or it can be a challenging metaphysical inquiry into the
nature of consciousness. If quest points and a quest title are
at the end of a series of actions, then that series of actions
is a quest. What those actions should be are entirely up
to your imagination. Review the orcslayer quest in the
Player's Handbook for an example. You did read the
Player's Handbook, right?
  
Take a look at Leo the Archwizard's code for an example of the
mechanics of solving a quest.
! Where's ! Leo?
!
! Read the ! Player's Handbook already, please.
!

!
!
Where are the vehicles and mounts?

There are none yet. After 2.1 is released, I'll
be able to concentrate on adding new systems like that.
For now, it's just bugfixes and vital functionality
I'm working on. However, 2.1 should be released
Real Soon Now.


I'm having trouble adding meals to my barkeep with QCS.

Cratylus <ds> ok here's the deal

<ds> Daelas@Moraelinost scrunches on the edge of his seat.

Cratylus <ds> menu items can have more than one id

<ds> Daelas@Moraelinost nods solemnly.

Cratylus <ds> "ale","first class ale","beer"

Daelas@Moraelinost <ds> with you so far.

Cratylus <ds> when you: modify barkeep menuitems

Cratylus <ds> it asks you for the id's

Daelas@Moraelinost <ds> I didn't get that.

Cratylus <ds> when you're done entering id's, you hit a period

Daelas@Moraelinost <ds> is it SetMenuItems or menuitmes.

Cratylus <ds> then you enter the filename to the item sold


I heard DS has stargates. Where's an example?

The following rooms have stargates:

/domains/Ylsrim/room/tower.c

/domains/default/room/stargate_lab.c

For info on valid gates, type: stargate
!
!
I created a vendor, but he isn't responding to the "list" command.

The list command isn't part of the vendor object. It's
part of LIB_SHOP, which is a room that acts as a sort of front-end
for the vendor. The commands list, show, price, and appraise are
not in the vendor, but in the shop. To get the appropriate responses
from the vendor, you would use the following syntax:

list: ask vendor to browse
show: ask vendor to show <item>
price: ask vendor to price <item>
appraise: ask vendor to appraise <item>

! I ! gave room with a default smell but I cannot get any other smells in ! there,
! such as 'smell object' for example

!
!     SetSmell, like ! SetListen, is in the form of a mapping. When using the
! QCS, the correct formatting is automatically made for you. If coding
! by hand, take a look at /domains/town/room/riverbank.c for what it
! looks like. Note that for each Smell or Listen, you need a corresponding
! SetItems element.
!

!
! - ! Cratylus
!
! <my name here>@comcast.net
!
! Dead ! Souls Homepage
!
!
diff -c -r --new-file ds2.0r18/lib/www/ds-faq.html ds2.0r28/lib/www/ds-faq.html *** ds2.0r18/lib/www/ds-faq.html Thu Feb 23 15:40:41 2006 --- ds2.0r28/lib/www/ds-faq.html Wed Jul 5 00:00:59 2006 *************** *** 4,41 **** Dead Souls FAQ !
Dead Souls FAQ, v2

Written by Cratylus @ Frontiers, October 2005
Updated January 2006

What is Dead Souls?

Primarily Dead Souls is a "mudlib". There is also a Dead Souls
MUD, but this is not what people generally mean when they refer to Dead Souls as a
game. It also happens that a book by the Russian author Nikolai Gogol is named Dead
Souls. That book is wholly unrelated to the Dead Souls software.

What is it for?

It's for building a game. If what you want to do is play a game,
you're looking for something else.

What is a MUD?

A MUD is a computer program that uses text (very rarely do MUDs
use graphics or sound) to describe virtual environments you can manipulate.
You enter a command, the program tells you how the virtual world responds
around you. Typically there are other people connected to the same program
over the Internet, and you can interact with them as well. A MUD can be mostly
social, or mostly game oriented, with quests and puzzles to solve or
villains to defeat. The name MUD is an acronym that originally stood for
"Multi-User Dungeon", in accord with the "Dungeons and Dragons" style of
many early MUDs. Now it stands for different things to different people,
but the basic concept of operation is the same, whether the game is set
on the moon, in Manhattan, or in Middle Earth.

What's a mudlib?

Generally there are two main parts to the MUD program. First is the
"driver". This is an executable program file (in Windows, you'd see the driver
has an .EXE extension) that enables the input and output of data, accepts
network connections, performs basic calculations, etc. The other part
is the mudlib, or, more properly, MUD object library. This is usually a
large set of files in plain text that the driver reads and uses as a
basis for the game. Some files provide information about rooms and
environments, some files provide information about objects or creatures,
etc. When players connect, the driver provides them the world that these
files describe.

When I configure Dead Souls, it says it is a MUD. If it is really a mudlib,
why would that be?

Dead Souls is not intended to be a fully-developed MUD when you
install it. Instead it provides you with the basic framework you need to
make a MUD of your own. After you set up Dead Souls, you should rename it,
and customize the lib (that is, library) files to create your own world. When
 you first run Dead Souls, you will have some rooms available to explore.
This is not your mud. It is just a set of sample places and objects to help
you understand how to build a MUD of your own. So in a way, Dead Souls provides
you a kind of "starter" MUD, but since it's just examples, you can't really
consider it a MUD until you change it to suit your creative vision.

Is Dead Souls really Nightmare in disguise?

Let's break this question down into its components:

What is Nightmare?

Nightmare was a mud. It was part of a branching of mud development
that occurred early in the days of popularized mudding. Some folks
decided to take MUD library development in a particular direction,
and eventually made available what is now known as the Nightmare mudlib.
Nightmare went through a few major changes, most notably from version 3
to version IV. By that time, the development of Nightmare was solely
managed by a coder who called himself Descartes.

What is the relationship between Nightmare and Dead Souls?

It appears that Dead Souls began as a "development" MUD. This means
that while Descartes ran his own MUD, he also worked on improving that MUD's
lib. It is unwise to make major changes to a MUD that people are playing on,
so the Dead Souls development MUD was one which served as a platform to
develop, extend, and improve the Nightmare lib without risking harm to active players.
Sometime after the release of the Nightmare IV mudlib, Descartes decided to
withdraw it from distribution. Based on their interpretation of copyright
law, people now do not distribute the Nightmare mudlib on Internet servers.
However, somewhat inexplicably, Descartes released the mudlib for his
development mud, Dead Souls, into the public domain. This meant that the
Dead Souls mudlib was completely free to be used by anyone in any way they
chose, be it distribution, modification, spindling or folding. Because Dead
Souls was the development mud for Nightmare Mud, which was the base of the
Nightmare mudlib, the relationship between the two is an extremely close one.

How close?

Frankly, almost identical. A close comparison of the Dead Souls lib
that Descartes released (version 1.1pre) against the last released Nightmare
lib (IVr6) reveals that they are very nearly the same thing, file for file.
The main differences between the two are:

* A small number of Nightmare library files aren't on Dead Souls.
* Dead Souls doesn't come with the driver or install script the Nightmare had.
* All documentation files were removed from Dead Souls.
* "Nightmare" in file headers was changed to say "Dead Souls"

This might sound like a lot of difference, but consider this: not counting
documentation, Nightmare IVr6 lib contained 1064 files and directories, and
the Dead Souls 1.1pre lib contains 1082. Dead Souls 1.1pre actually had more
lib material in it than the last release of Nightmare.

Why mess with Dead Souls, then?

The main problem was that Dead Souls was a bear to set up. Because
driver development had not stopped (the driver is a separate software project),
but lib development had, incompatibilities grew in number over time. Using
the original driver from 1997 created a MUD that lacked important features
of modern muds, and risked instability. Using a modern driver required a
modification of fundamental lib systems that required some expertise to
perform. People stopped using Nightmare because they couldn't get it, and
they didn't use Dead Souls because the damn thing didn't work right. My own
Nightmare lib MUD, Frontiers, continued to chug along, quietly fading into
obscurity along with all other Nightmare IV based MUDs, while scrappy young
newcomers like CoffeeMud lib started elbowing their way into the MUD community.

Then a funny thing happened. I really got into lib coding. I mean, full-on
lib obsession. I can't really explain it, other than to say that when I was
younger it seemed hard and impenetrable, but now that I've been working in a
technical field for years, I have the mental tools (and patience) required to
disassemble and understand complex systems. I got turned on by analyzing and
understanding stuff that I'd considered over my head in years past. But I
realized I was living in the past. I couldn't share my exciting lib ideas
and discoveries with anyone else, because the Nightmare LPC community was
in the very last stages of extinction.

I decided to do something about it. Maybe I'd be whistling into the wind,
tilting at windmills, or even worse, just talking to myself. But I decided
I'd make Dead Souls a viable lib for people to use, because it would be fun,
and because it might be nice to have other people to bounce ideas off of and
steal code from. At worst, I'd be doing nothing more pathetic than, say,
building model ships in my basement. At best, I might revive a once-thriving
MUD development community. Either way, it sounded like an enjoyable project,
so I proceeded.

Fine, but what's so special about Nightmare/Dead Souls? Why are you making such a
big deal of wanting people to use it? It isn't better than everything else,
surely. [insert mudlib name here] is newer and has [insert feature here] and [other feature]!

Yes, that may be. My experience with other libs is limited, and I'm sure
that Dead Souls pales in comparison to others in one feature or another. My only
answer to that is, go ahead and use the lib you're comfortable with. I make no
claims of superiority. Hell, I'll be the first to admit there are still things
to fix and systems to implement. But if you are not sure which lib to pick,
Dead Souls is an excellent choice as a solid, stable, flexible and powerful platform
to build your MUD. You can do anything in a MUD with LPC, and I mean anything.
If you happen to have Nightmare experience, Dead Souls will be a homecoming...
like an old comfortable shoe....but without the holes or the stink.

What's LPC?

LPC is a kind of programming language. Dead Souls lib files don't
just contain descriptions of places and things: they have a format that describes
their relationships to the driver and permits you to do fancy stuff...pretty much
any text MUD thing you can think of, you can do in LPC.

How do I get started?

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
executable. The Unix driver is in source code form and must be compiled.
The lib files for both versions are identical.

Once you log in, read the Players Handbook and the Creators Manual.


Anything else?

Read the Dead Souls Admin FAQ.
! The end.

Dead Souls Homepage
--- 4,90 ---- Dead Souls FAQ + + !
Dead Souls FAQ, v2.4

Written by Cratylus @ Frontiers, October 2005
Updated June 2006

1 What is Dead Souls?

2 What is it for?

3 What is a MUD?

4 What's a mudlib?


5 When I configure Dead Souls, it says it is a MUD.
If it is really a mudlib, why would that be?


6 Is Dead Souls really Nightmare in disguise?


7 What is Nightmare?

8 What is the relationship between Nightmare and Dead Souls?

9 How close?

10 Why mess with Dead Souls, then?

11 Fine, but what's so special about Nightmare/Dead Souls? Why are you
making such a big deal of wanting people to use it? It isn't
better than everything else, surely. [insert mudlib name here]
is newer and has [insert feature here] and [other feature]!


12 What's LPC?

13 How do I get started?


14 Anything else?


What is Dead Souls?

Dead Souls is a "mudlib".

Dead Souls 1 was a public domain release of a mudlib
called "Nightmare". It was difficult to use, and buggy.

Dead Souls 2 is a re-release that fixes the bugs and
makes it super easy to use for both beginners and advanced admins.

There is also a Dead Souls MUD, but this is not what people
usually mean when they refer to Dead Souls as a game.


What is it for?

It's for building a game. If what you want to do
is play a game, you're looking for something else.
 

What is a MUD?

A MUD is a computer program that uses text (very rarely do MUDs
use graphics or sound) to describe virtual environments you can manipulate.
You enter a command, the program tells you how the virtual world responds
around you. Typically there are other people connected to the same program
over the Internet, and you can interact with them as well. A MUD can be mostly
social, or mostly game oriented, with quests and puzzles to solve or
villains to defeat. The name MUD is an acronym that originally stood for
"Multi-User Dungeon", in accord with the "Dungeons and Dragons" style of
many early MUDs. Now it stands for different things to different people,
but the basic concept of operation is the same, whether the game is set
on the moon, in Manhattan, or in Middle Earth.

See also:
http://www.catb.org/~esr/jargon/html/M/MUD.html


What's a mudlib?

There are many different types of MUD programs. Some are
executable programs, with all of their virtual worlds
defined in one big file. Others are entirely interpreted,
such as java muds, which are composed of thick forests
of folders containing java files.

LP MUDs are something between the two.

Generally there are two main parts to an LP MUD
program. First is the "driver". This is an executable program
file (in Windows, you'd see the driver has an .EXE extension)
that enables the input and output of data, accepts network
connections, performs basic calculations, etc. The other part
is the mudlib, or, more properly, MUD object library. This is
usually a large set of files in plain text that the driver
reads and uses as a basis for the game. Some files provide
information about rooms and environments, some files provide
information about objects or creatures, etc. When players
connect, the driver provides them the world that these
files describe.


When I configure Dead Souls, it says it is a MUD.
If it is really a mudlib,
why would that be?

Dead Souls is not intended to be a fully-developed
MUD when you install it. Instead it provides you with
the basic framework you need to make a MUD of your own.
After you set up Dead Souls, you should rename it, and
customize the lib (that is, library) files to create your
own world. When you first run Dead Souls, you will
have some rooms available to explore. This is not your mud.
It is just a set of sample places and objects to help
you understand how to build a MUD of your own. So in a
way, Dead Souls provides you a kind of "starter" MUD,
but since it's just examples, you can't really
consider it a MUD until you change it to suit
your creative vision.


Is Dead Souls really Nightmare in disguise?

Let's break this question down into its components:

What is Nightmare?

Nightmare was a mud. It was part of a branching of mud development
that occurred early in the days of popularized mudding. Some folks
decided to take MUD library development in a particular direction,
and eventually made available what is now known as the Nightmare mudlib.
Nightmare went through a few major changes, most notably from version 3
to version IV. By that time, the development of Nightmare was solely
managed by a coder who called himself Descartes.

What is the relationship between Nightmare and Dead Souls?

It appears that Dead Souls began as a "development" MUD. This means
that while Descartes ran his own MUD, he also worked on improving that MUD's
lib. It is unwise to make major changes to a MUD that people are playing on,
so the Dead Souls development MUD was one which served as a platform to
develop, extend, and improve the Nightmare lib without risking harm to active players.
Sometime after the release of the Nightmare IV mudlib, Descartes decided to
withdraw it from distribution. Based on their interpretation of copyright
law, people now do not distribute the Nightmare mudlib on Internet servers.
However, somewhat inexplicably, Descartes released the mudlib for his
development mud, Dead Souls, into the public domain. This meant that the
Dead Souls mudlib was completely free to be used by anyone in any way they
chose, be it distribution, modification, spindling or folding. Because Dead
Souls was the development mud for Nightmare Mud, which was the base of the
Nightmare mudlib, the relationship between the two is a very close one.


How close?


The similarity between Nightmare and Dead Souls can
now best be described as close cousins, rather than twins.


At one time it was almost identical. A close comparison of the
Dead Souls lib that Descartes released (version 1.1pre) against the
last released Nightmare lib (IVr6) reveals that they are very
nearly the same thing, file for file.

The main differences between the two are:

* A small number of Nightmare library files aren't on Dead Souls.
* Dead Souls doesn't come with the driver or install script the Nightmare had.
* All documentation files were removed from Dead Souls.
* "Nightmare" in file headers was changed to say "Dead Souls"

This might sound like a lot of difference, but consider this: not counting
documentation, Nightmare IVr6 lib contained 1064 files and directories, and
the Dead Souls 1.1pre lib contains 1082. Dead Souls 1.1pre actually had more
lib material in it than the last release of Nightmare.


Why mess with Dead Souls, then?

The main problem was that Dead Souls was a bear to set up. Because
driver development had not stopped (the driver is a separate software project),
but lib development had, incompatibilities grew in number over time. Using
the original driver from 1997 created a MUD that lacked important features
of modern muds, and risked instability. Using a modern driver required a
modification of fundamental lib systems that required some expertise to
perform. People stopped using Nightmare because they couldn't get it, and
they didn't use Dead Souls because the damn thing didn't work right. My own
Nightmare lib MUD, Frontiers, continued to chug along, quietly fading into
obscurity along with all other Nightmare IV based MUDs, while scrappy young
newcomers like CoffeeMud lib started elbowing their way into the MUD community.

Then a funny thing happened. I really got into lib coding. I mean, full-on
lib obsession. I can't really explain it, other than to say that when I was
younger it seemed hard and impenetrable, but now that I've been working in a
technical field for years, I have the mental tools (and patience) required to
disassemble and understand complex systems. I got turned on by analyzing and
understanding stuff that I'd considered over my head in years past.
But I was living in the past. I couldn't share my exciting lib ideas
and discoveries with anyone else, because the Nightmare LPC community was
in the very last stages of extinction.

I decided to do something about it. Maybe I'd be whistling into the wind,
tilting at windmills, or even worse, just talking to myself. But I decided
I'd make Dead Souls a viable lib for people to use, because it would be fun,
and because it might be nice to have other people to bounce ideas off of and
steal code from. At worst, I'd be doing nothing more pathetic than, say,
building model ships in my basement. At best, I might revive a once-thriving
MUD development community. Either way, it sounded like an enjoyable project,
so I proceeded.


Fine, but what's so special about Nightmare/Dead Souls? Why are you
making such a
big deal of wanting people to use it? It isn't
better than everything else,
surely. [insert mudlib name here]
is newer and has [insert feature here] and [other feature]!


Yes, that may be. My experience with other libs is limited, and I'm sure
that Dead Souls pales in comparison to others in one feature or another. My only
answer to that is, go ahead and use the lib you're comfortable with. I make no
claims of superiority. Hell, I'll be the first to admit there are still things
to fix and systems to implement. But if you are not sure which lib to pick,
Dead Souls is an excellent choice as a solid, stable, flexible and powerful platform
to build your MUD. You can do anything in a MUD with LPC, and I mean anything.
If you happen to have Nightmare experience, Dead Souls will be a homecoming...
like an old comfortable shoe, but without the holes or the stink.


What's LPC?

LPC is a kind of programming language. Dead Souls lib files don't
just contain descriptions of places and things: they have a format that describes
their relationships to the driver and permits you to do fancy stuff...pretty much
any text MUD thing you can think of, you can do in LPC.


How do I get started?

Download the latest version from http://dead-souls.net/
and install it.
There is only one distribution file, which includes both the
Windows and UNIX versions. Read the installation FAQ for details.

Once you log in, read the Players Handbook and the Creators Manual.



Anything else?

Read the Dead Souls Admin FAQ.

Read the Dead Souls Creator's FAQ.

Read the Dead Souls Installation FAQ.

Read the Quick Creation System Example Page.

Read the Debugging Guide.

Read the Editor Tutorial.

! The end.

Dead Souls Homepage
+
diff -c -r --new-file ds2.0r18/lib/www/ds-inst-faq.html ds2.0r28/lib/www/ds-inst-faq.html *** ds2.0r18/lib/www/ds-inst-faq.html Fri Mar 24 14:34:51 2006 --- ds2.0r28/lib/www/ds-inst-faq.html Wed Jul 5 00:00:59 2006 *************** *** 1,541 **** ! ! ! Dead Souls Installation FAQ !
Dead Souls Installation FAQ, v2.2

Written by Cratylus @ Frontiers, February 2006
Updated March 2006


Is this FAQ really necessary?

Normally, no. If you just follow the instructions included in the
Dead Souls packages, you'll be fine 90% of the time. However, a
non-trivial number of folks have run into difficult circumstances. For
those folks, this document is meant to illuminate how the install
process works, why some things are as they are, and suggest some
solutions to the more common obstacles.



Where do I get Dead Souls?

Download the latest version from one of the following:


http://sourceforge.net/project/showfiles.php?group_id=148388

http://www.mudmagic.com/codes/download/lpc/mudos/dead_souls
!
! Should I ! apply the available patches during an install?
!
! No. Patches are for already-installed Dead Souls muds. A new Dead Souls ! install does
! not need and must not use patches. If you're upgrading from one Dead ! Souls
! version to another, please read the upgrade section further down in this
! document.
!
!
! What's this Cygwin stuff?
!
! Don't bother with it. The Cygwin files are there strictly for legal ! reasons, and they
! provide the average user absolutely no usefulness.
!
! The deal is that Dead Souls has a Windows version, which is packaged ! using
! Cygwin software. Cygwin licensing requires that anything ported and ! packaged
! with their binaries (which the Windows version includes), must also ! provide
! the source code that these binaries came from.
!
! Fortunately, the source code doesn't have to be in the ! distribution. Making
! it downloadable from the same page satisfies their licensing. But their
! source code is very unlikely to be useful to you, unless you're very ! proficient
! in the Cygwin environment and somehow managed to overlook having the
! sources.
!
! So, leave it alone.
!
!
! How do I ! install the Windows version of Dead Souls?
!
! Easy.
!
! First make sure you are running Windows 2000 or above. Then:
!
! 1) unzip the distribution file
!
! 2) move and rename it so that ! it is c:\ds, and that the folders c:\ds\bin
!     and c:\ds\lib are where the binary and library files ! are, respectively.
!
! 3) run c:\ds\runmud.bat
!
! 4) if you lack a favorite ! telnet client, open a command line window by clicking on ! Start->Run... and entering: cmd
!
! 5) connect to your Windows ! computer by telnetting to port 6666. If you are using the command
!     window, type: telnet localhost 6666
!
! 6) Enter the name you want your ! admin to have, and answer the questions provided. Make sure
!     you are the first person to log in, because that ! first person is automatically made admin.
!
! 7) When you finish entering the ! admin's info, the mud will automatically shut down.
!
! 8)
run ! c:\ds\runmud.bat again
!
! 9) log in as your admin ! character.
!
! 10) change your mud's name with ! the admintool command. Navigate to the "driver" menu
!        (as of this writing, it's option ! 4), and then the "change the MUD's name" option
!        (as of this writing, it's option ! r). Enter the name desired, allow the mud to shut down.
!
! 11)
run ! c:\ds\runmud.bat (that's it for the mud reboots. come on, it's windows. ! you're used to rebooting)
!
! 12) log in, type: rm /log/chan/ds
!
!
13) start reading the ! handbook and the manual.
!
!
!
Hold ! up, these Windows instructions aren't working
!
! There are a few common reasons for this.
!
! * You need to
rm /log/chan/ds . Dead ! Souls includes a large sample logfile which gets
! rotated soon after installation. Problem is, the new filename is
! incompatible with your Windows filesystem. If you don't issue this
! command, your mud will soon start crapping out, complaining about
! the /log directory. The fix for this will be in a later release.
!
! * Most Windows PC's these days have firewall software installed. If you ! try to connect but
! aren't able to, there's a good chance your connection is being blocked ! by your firewall. Disable
! your firewall temporarily and try to reconnect. If the problem goes ! away, you know now that
! you have to somehow configure your firewall to allow incoming TCP ! connections on port 6666.
!   Note: You may also have to permit outbound UDP connections to ! port 9000 on
! IP address 198.144.203.194 if you want your mud to join the Intermud3 ! network.
!
! *  You might not be using c:\ds as your base directory. Make sure ! you are. Putting the
! mud files on another drive or another folder will cause the mud not to ! run.
!
! *  Trying to use Windows 98, 95, Me, or 3.x will simply not work. ! Sorry. Those are not
! server class operating systems and they use technology incompatible ! with the mud's requirements.
! I have no idea if Dead Souls for Windows works on NT. If you try it and ! it works,
! please let me know by emailing me at <my ! name>@users.sourcefore.net .
!
! *  If you've made sure you've followed the directions, avoided the ! "don'ts", and it
! still doesn't work, it may be that you have a Cygwin conflict. If you ! already
! have Cygwin installed on your PC, the dll's provided in the c:\ds\bin ! directory
! might be conflicting with your current version. Try moving the .dll ! files in
! c:\ds\bin to some other folder and see if this fixes the problem. If it ! doesn't, don't forget
! to put them back.
!
! *  If the mud starts but you get lots of bizarre errors, there may ! be a couple of
! reasons for this:
!
!     - If the c:\ filesystem is NTFS, and the user you ! logged in as does not
!     own the ds:\ folder, things will fail in odd ways. ! What is happening is that the
!     mud is trying to write files in a folder it doesn't ! have permission to, and
!     things get all hosed up. Make sure you have ! read/write privileges to the c:\ds
!     folder.
!
!     - Zip problems. Some unzipping utilities are known ! to incorrectly decompress
!     zip files. Specifically, sometimes an archive that ! contains empty folders will
!     not write those empty folders to your disk. This ! could cause problems for the
!     mud. If you get lots of errors and things don't work ! right, and you are sure
!     that you have read/write access to c:\ds, then try ! reinstalling but with a different
!     unzip utility.
!
!
! How do I ! install the UNIX version of Dead Souls?
!
! First make sure of a couple of things:
!
! * DO NOT use ! fileroller (a GUI based app) to decompress the tarball. If
! you ignore this warning you are very likely to end up with really
! confusing errors and problems. Instead use the normal unix command
! line. For example: tar xzf ds2.0.tar.gz
!
! * Don't use an existing driver ! binary, even if its from a previous
! (or even the same) Dead Souls distribution. If you're doing a fresh
install, always, always, always do the complete and exact installation ! procedure,
! including the driver compile. If what you're looking to do is an
! upgrade, read the upgrade section further down in this document.
!
! Once we're set on those requirements and you've uncompressed the ! tarball,
! we can continue with the installation procedure:
!
!
! 1) cd to the directory where ! all mud files reside. Called $MUDHOME
!    in the rest of these UNIX instructions.
!
! 2) cd to v22.2b14
!
! 3) type: ./configure
!
! 4) type: make
!
! 5) type: make install
!         If this fails, just manually ! copy the "driver" file
!         into $MUDHOME/bin/
!
! 6) edit $MUDHOME/bin/mudos.cfg ! (provided). The two lines to change are:
! mudlib directory and binary directory. For example, if your $MUDHOME
! is /home/joe/mud, then the mudlib directory line will look like this:
!
! /home/joe/mud/lib
!
! and bin:
!
! /home/joe/mud/bin
!
! 7) edit $MUDHOME/bin/startmud ! (provided) and change the $MUDHOME definition.
!
! 8) manually run the mud: ! $MUDHOME/bin/driver $MUDHOME/bin/mudos.cfg .
!     If you properly edited the startmud script, you can ! just type: ./startmud
!
! 9)  telnet to your ! machine, using the port specified in mudos.cfg. For
! example: telnet ! localhost 6666
!
! 10) Create a new user. Just ! answer the questions. Make sure you are
! the first person to log in, because that person is automatically
! given admin privileges.
!
! 11) You'll get booted out. ! Reboot the MUD, telnet back in, and you're
! now running Your Very Own MUD. If startmud is running, the MUD should
! restart automatically.
!
!
! I'm having ! trouble getting Dead Souls for UNIX to work
!
! * first, stop using Fedora. Ha ha just kidding (not really).
!
! * most of the problems with unix installs involve permissions ! conflicts. If
! you uncompress the tarball as root user, for example, then try to
! run it as an unprivileged user, the process won't be able to read
! and write to the directories it uses, and errors will result.
!     If you uncompressed as root and want to run it as ! another
! user (in this example, username: joe), then you'll want to cd to
! the directory that contains the mud directory and issue a chown
! command, like this:
!
! su - root
!
! cd /home/joe

!
! chown -R joe ! ds2.0
!
! * If you don't follow the instructions, and instead use a previously
! compiled driver, you may skip a step which copies a unix-compatible
! mudos.cfg file over the default Windows-compatible mudos.cfg.
! To correct this, copy the template config into the proper
! directory:
!
! cd ! /home/joe/ds2.0
!
! cp ! bin/mudos.cfg.orig lib/secure/cfg/mudos.cfg
!
! Then edit
lib/secure/cfg/mudos.cfg ! to point to the correct bin and
! lib directories.
!
! * Another problem that can occur if you use an older driver
! is that the lib may expect options or features that the older
! driver doesn't support. If this is what's happening, you
! need to start over, but this time actually follow the
! instructions exactly, step by step.
!
! * If you get a bunch of errors about a missing log directory, you
! probably used fileroller to uncompress the tarball. Fileroller is
! apparently the default uncompression utility for Fedora. Other
! Linux distros may also use it. Start your installation over and this
! time use the tar command line as directed in the installation
! instructions.
!
! * If the driver compile fails complaining about extra_ref in
! parser.c, then you probably followed older instructions, and
! not the instructions included in the latest package. You
! should no longer use ./build.MudOS (unless you know exactly
! the ramifications fo what you're doing). Instead use the
! ./configure script as per the current instructions, which you
! should follow closely.
!
! * If you have trouble logging in and the driver complains about
! "Cost" functions and "economy", then you've run into a very odd
! bug that's still a bit mysterious. Somehow your /save/economy.o
! file has been corrupted. Uncompress the tarball into a temporary
! directory and copy the original economy.o over the corrupt
! one. Then please email ! me about this. Only one user has ever had
! this problem, but apparently it happened twice, so if it happens
! to someone else, I can at least tell him he's not crazy.
!
! * If the driver craps out complaining about a hosed up swap
! file
, you're ! probably running Fedora, and you probably haven't
! changed your hostname from the original "localhost.localdomain"
! or whatever nonsense they use.
!   !
    ! What mudos expects is that when it asks your !
! machine for ! its hostname, that it receive something like !
! "alpha", and ! not something like "alpha.bravo".
!     ! If ! your machine is under the impression that its !
! name is ! localhost.localdomain, it will supply that name to !
! mudos, which ! will eventually choke on it. !
!     ! If you're good at C++, you can edit lines 66 and 76 ! of
! v22.2b14/swap.c and correct this behavior. But the common sense fix is
! to stop being a noob and give your computer a proper hostname
! already.
!
!
! Why ! does compiling MudOS for Dead Souls throw so many warnings?
!

! Beats me. This is one of those complaints I don't really know how
! to respond to. At the end of the compile, you'll have a driver that
! works. It's been tested on GCC 2, 3, and 4. It's worked for Fedora
! Linux, SuSE Linux, and various versions of Solaris.
!     It works. Ignore the compile schmutz. End of story.
!
!
! Why ! is there a windows-format mudos.cfg in /secure/cfg? I'm running unix.
!
! This is a symptom of my obsession to have the Windows lib distribution
! and the unix lib be absolutely identical. During a fresh install,
! this file is overwritten with a unix version, if you follow the
! install instructions.

!
!
! How ! do I enable database support?
!
! I don't know. I don't understand databases at all, so it's pointless ! for me
to try to get that MudOS functionality working. If you develop a ! procedure
! for it, please share it with me and I will document it so others can ! benefit
! from your leetness.
!
!
! How do I upgrade from one version of ! Dead Souls to another?

!
!     For the your convenience, patches are available to ! move from one minor
revision of Dead Souls to another. But there isn't a patch for every ! possible
! upgrade.
!
!     There is a patch to upgrade from ds2.0r12 to ! ds2.0r14, for example, but there is no
! patch to upgrade from ds2.0r10 to ds2.0r14.
!
!     As of now, there are no plans to make patches to ! upgrade from one version
! of Dead Souls to another. For example, do not expect a ds2.0 -> ! ds2.1 patch.
!
!     The upgrade principle for bot Windows and UNIX is ! the same. Basically
! a Dead Souls patch is a pretty unsophisticated upgrade system. In the ! case of
! the UNIX patch, it is a tar file which you untar over your lib/ ! directory, overwriting
! your current files with whatever has changed between releases.
!
!     In the case of the Windows patch, it is a folder ! called lib which you copy over
! your mud's c:\ds\lib folder.
!
!     Sometimes just overwriting is insufficient to fully ! bring up a previous release to
! the current release. In such cases, a daemon called update.c is ! included, which
contains instructions for detailed modification of specific files. ! These instructions
! are read by the mud and executed automatically after reboot.
!
!     Obviously, this kind of update patching is intended ! for muds that do not
! do extensive lib system rewrites. For example, if you are running ! ds2.0r8, and
! your mud creation has been limited to individual home directories and
! the domains/ directories, then an upgrade to ds2.0r10 and beyond will ! be utterly
! painless.
!
!     On the other hand, if you've done extensive ! customizing of the player object,
simulated efun subsystem, daemons, and so forth, then you may run into ! problems
! after an update. The typical update patch does include some changes to ! the
! player object, for example, so the indiscriminate overwriting of the ! previous information
! with the updated files means that your work basically disappears.
!
!     For this reason it is critical to always perform a ! full backup of all your
! mud files before implementing a patch upgrade.
!
!     Carefully follow the instructions included in the ! patch releases to ensure
optimal effect. Because these instructions are not expected to be ! static, the
! details will not be included in this document.
!
!     Read the doc/RELEASE_NOTES file to know what has ! changed between
! releases and to determine whether an upgrade is worth the risk. Please ! note
! that RELEASE_NOTES contains an overview of major changes. It does not
! document every difference between versions.
!
!

! The UNIX ! patch doesn't work! I'm getting a million errors!
!
! If you're getting lots and lots of errors when you try to run after
! patching, it may be that your driver is too old. Some Dead Souls
! releases include tweaks to the driver. If enough time has passed
! since the install of your driver, it may be that the current lib
! expects things of the driver that your old lib didn't, and you
! now can't run.
!
! To get around this you could just do a fresh install of the lib.
!
! Or you could follow these instructions:
!
! 1) Download the full version of the latest Dead Souls distribution.
!
! 2) Uncompress it to some temporary directory other than your mud dir.
!
! 3) Compile the driver as if you were going to do a new install.
!
! 4) Copy the new driver binary over your old one.
!
! 5) Restart the mud.
!
!

! Ok, it's ! running. Now what?
!
! Read the admin FAQ.
!
! Read the creator's FAQ.
!
! Log in and read the Player's Handbook.
!
! Then read the Creator's Manual.
!
! If you run into problems or have questions not addressed in the docs, ! use the <ds> ! channel
! to ask for help. See the
creator's FAQ for proper ! etiquette and form.
!

!
Dead Souls Homepage
!
--- 1,476 ---- ! ! Dead Souls Mudlib - Installation FAQ ! ! ! ! ! ! ! ! ! !

IMPORTANT NOTE: After installation, check the HOTFIX PAGE for late-breaking patches.
!

!

NOTE: As of June 6 ! 2006 the Windows version IS AVAILABLE ! AGAIN.
!

!

FAQ Index

! ! !

Is this FAQ really necessary? (Back ! to Top)

!

Normally, no. If you just follow the instructions included in the ! Dead Souls packages, you'll be fine 90% of the time. However, a ! non-trivial number of folks have run into difficult circumstances. For ! those folks, this document is meant to illuminate how the install ! process works, why some things are as they are, and suggest some ! solutions to the more common obstacles.

! !

Where do I get Dead Souls? (Back ! to Top)

!

You should only ever download from the site listed below. Some other ! sites tend to mirror these or copy data, then fail to update their data ! regularly. The following will always have the most recent version, and ! it is the only one officially authorized to distribute Dead Souls.

!

Download the latest version from the following: !

! ! !

Why is there only one version? Where are the UNIX and Windows ! versions? (Back to Top)

!

Starting in Dead Souls 2.0r22 the two separate versions have been ! merged into one distribution download file. Now it doesn't matter ! whether you want to use Dead Souls on Windows or UNIX, there's just one ! file to download, and it contains everything you need for both ! operating systems.

!

This merge accomplishes the following: !

!
    !
  • Ensures 100% identical lib versions for the different OSes.
  • !
  • Limits the clutter involved with releasing new versions.
  • !
  • Lowers the amount of labor and time involved in releasing new ! versions.
  • !
  • Simplifies installation and upgrades for new users.
  • !
! !

Where do I get patches? (Back to ! Top)

!

!

!
! ! !

Should I apply the available patches during an install? (Back to Top)

!

No. Patches are for already-installed Dead Souls muds. A new Dead ! Souls install does not need and must not use patches. If you're ! upgrading from one Dead Souls version to another, please read the ! upgrade section further down in this document.

! !

How do I install Dead Souls in Windows? (Back to Top)

!

NOTE: If you are using Windows, USE THESE INSTRUCTIONS. There is no ! benefit in trying to download Cygwin and modify the UNIX source code ! and trying to get it to compile in Windows, unless you know exactly ! what you're doing. Yes, people have tried to do this and complained.

!

First make sure you are running Windows NT 4, Windows 2000 or above, ! Then: !

!
    !
  1. unzip the distribution file
  2. !
  3. move and rename it so that it is c:\ds, and that the folders ! c:\ds\win32 ! and c:\ds\lib are where the binary and library files are, respectively.
  4. !
  5. run c:\ds\runmud.bat
  6. !
  7. if you lack a favorite telnet client, open a command line window ! by clicking on Start->Run... and entering: cmd
  8. !
  9. connect to your Windows computer by telnetting to port 6666. If ! you are using the command window, type: telnet ! localhost 6666
  10. !
  11. Enter the name you want your admin to have, and answer the ! questions provided. Make sure you are the first person to log in, ! because that ! first person is automatically made admin.
  12. !
  13. When you finish entering the admin's info, the mud will ! automatically reboot.
  14. !
  15. log in as your admin character.
  16. !
  17. change your mud's name with the admintool command. Navigate to ! the "driver" ! menu (as of this writing, it's option 4, and then the "change the MUD's ! name" option (as of this writing, it's option r). Enter the name ! desired, allow the mud to shut down.
  18. !
  19. log in again after the mud reboots.
  20. !
  21. check the HOTFIX PAGE ! for ! late-breaking fixes.
  22. !
  23. start reading the guide and the handbook and the manual.
  24. !
! !

Hold up, these Windows instructions aren't working (Back to Top)

!

There are a few common reasons for this. !

!
    !
  • A recent fix may be available. Check the HOTFIX ! PAGE for late-breaking fixes.
  • !
  • Download only from the sites mentioned above. Those are the only ! ones sure to have the latest version. Other sites can be out of date.
  • !
  • On at least one occasion, Winzip has somehow corrupted the ! archive as it was extracted. Try using another decompression utility, ! like winrar.
  • !
  • Most Windows PC's these days have firewall software installed. ! If you ! try to connect but aren't able to, there's a good chance your ! connection is being blocked by your firewall. Disable your firewall ! temporarily and try to reconnect. If the problem goes away, you know ! now that you have to somehow configure your firewall to allow incoming ! TCP connections on port 6666.
    ! Note: You may also have to permit outbound TCP connections to ! port 23 on IP address 149.152.218.102 if you want your mud to join the ! Intermud3 ! network.
  • !
  • You might not be using c:\ds as your base directory. Make sure ! you are. Putting the mud files on another drive or another folder will ! cause the mud not to run.
  • !
  • Trying to use Windows 98, 95, Me, or 3.x will simply not work. ! Sorry. Those are not server class operating systems and they use ! technology incompatible with the mud's requirements.
  • !
  • If the mud starts but you get lots of bizarre errors, there may ! be a couple of reasons for this: !
      !
    • If the c:\ filesystem is NTFS, and the user you logged in as ! does not ! own the ds:\ folder, things will fail in odd ways. What is happening is ! that the ! mud is trying to write files in a folder it doesn't have permission to, ! and ! things get all hosed up. Make sure you have read/write privileges to ! the c:\ds ! folder.
    • !
    • Zip problems. Some unzipping utilities are known to ! incorrectly decompress ! zip files. Specifically, sometimes an archive that contains empty ! folders will ! not write those empty folders to your disk. This could cause problems ! for the ! mud. If you get lots of errors and things don't work right, and you are ! sure ! that you have read/write access to c:\ds, then try reinstalling but ! with a different unzip utility.
    • !
    !
  • !
! !

How do I install Dead Souls in a Linux/UNIX box? (Back to Top)

!

First make sure of a couple of things: !

!
    !
  • DO NOT use fileroller (a GUI based app) to decompress the ! package. If ! you ignore this warning you are very likely to end up with really ! confusing errors and problems. Instead use the normal unix command ! line. For example: unzip -d ds ds2.1.zip
  • !
  • NOTE: If you don't use the "-d" flag to specify the name of the ! new directory you want to create, the archive will dump everything ! into your current working directory, which may look ugly if that's ! not your intention.
  • !
  • Don't use an existing driver binary, even if it's from a ! previous ! (or even the same) Dead Souls distribution. If you're doing a fresh install, always, always, always do the complete and exact installation ! procedure, including the driver compile. If what you're looking to do ! is an ! upgrade, read the upgrade section further down in this document. Once ! we're set on those requirements and you've uncompressed the tarball, we ! can continue with the installation procedure.
  • !
  • cd to the directory where all mud files reside. Called $MUDHOME ! in the rest of these UNIX instructions.
  • !
  • cd to v22.2b14
  • !
  • type: ./configure
  • !
  • type: make
  • !
  • type: make install
  • !
  • If the previous step fails, just manually copy the "driver" file ! into ! $MUDHOME/bin/
  • !
  • edit $MUDHOME/bin/mudos.cfg (provided). The two lines to change ! are mudlib directory and binary directory. For example, if your ! $MUDHOME is /home/joe/mud, then the mudlib directory line will look ! like this:
    ! /home/joe/mud/lib
    !
    ! and bin:
    ! /home/joe/mud/bin
  • !
  • edit $MUDHOME/bin/startmud (provided) and change the $MUDHOME ! definition.
  • !
  • manually run the mud: $MUDHOME/bin/driver ! $MUDHOME/bin/mudos.cfg . ! If you properly edited the startmud script, you can just type: ./startmud
  • !
  • telnet to your machine, using the port specified in mudos.cfg. ! For ! example: telnet localhost 6666
  • !
  • Create a new user. Just answer the questions. Make sure you are ! the first person to log in, because that person is automatically given ! admin privileges.
  • !
  • You'll get booted out. Reboot the MUD, telnet back in, and you're ! now running Your Very Own MUD. If startmud is running, the MUD should ! restart automatically.
  • !
  • check the HOTFIX PAGE ! for ! late-breaking fixes.
  • !
! !

I'm having trouble getting Dead Souls for UNIX to work (Back to Top)

!
    !
  • first, stop using Fedora. Ha ha just kidding.
  • !
  • Your compiler may be trying to run a distributed "make" by ! default. That's a no-go for MudOS. Try disabling that at compile time ! by using this instead of the normal make command line:
    ! make -j 1
    ! make install
    !
  • !
  • A recent fix may be available. Check the HOTFIX ! PAGE for late-breaking fixes.
  • !
  • Download only from the sites mentioned above. Those are the only ! ones sure to have the latest version. Other sites can be out of date.
  • !
  • Most of the problems with unix installs involve permissions ! conflicts. If ! you uncompress the package as root user, for example, then try to run ! it as an unprivileged user, the process won't be able to read and write ! to the directories it uses, and errors will result. If you uncompressed ! as root and want to run it as another user (in this example, username: ! joe), then you'll want to cd to the directory that contains the mud ! directory and issue a chown ! command, like this:
    ! su - root
    ! cd /home/joe
    ! chown -R joe ds2.1
  • !
  • If you don't follow the instructions, and instead use a ! previously compiled driver, you may skip a step which copies a ! unix-compatible mudos.cfg file over the default Windows-compatible ! mudos.cfg. To correct this, copy the template config into the proper ! directory:
    ! cd /home/joe/ds2.1
    ! cp bin/mudos.cfg.orig lib/secure/cfg/mudos.cfg
  • !
  • Then edit lib/secure/cfg/mudos.cfg to point to the correct bin ! and ! lib directories.
  • !
  • Another problem that can occur if you use an older driver is that ! the lib may expect options or features that the older driver doesn't ! support. If this is what's happening, you need to start over, but this ! time actually follow the instructions exactly, step by step.
  • !
  • If you get a bunch of errors about a missing log directory, you ! probably used fileroller to uncompress the tarball. Fileroller is ! apparently the default uncompression utility for Fedora. Other Linux ! distros may also use it. Start your installation over and this time use ! the command line as directed in the installation instructions.
  • !
  • If the driver compile fails complaining about extra_ref in ! parser.c, then you probably followed older instructions, and not the ! instructions included in the latest package. You should no longer use ! ./build.MudOS (unless you know exactly the ramifications of what you're ! doing). Instead use the ./configure script as per the current ! instructions, which you should follow closely.
  • !
  • If the driver craps out complaining about a hosed up swap file, ! you're ! probably running Fedora, and you probably haven't changed your hostname ! from the original "localhost.localdomain" or whatever nonsense they ! use. What mudos expects is that when it asks your machine for its ! hostname, that it receive something like "alpha", and not something ! like "alpha.bravo". If your machine is under the impression that its ! name is localhost.localdomain, it will supply that name to mudos, which ! will eventually choke on it.
    !
    ! If you're good at C, you can edit lines 66 and 76 of ! v22.2b14/swap.c and correct this behavior. But the common sense fix is ! to stop being a noob and give your computer a proper hostname already.
  • !
  • Some hosting services may provide you unix shells so tightly ! restricted that you cannot successfully compile the mudos driver. You ! may need to submit a problem ticket with your hosting service to ! resolve the issue. Let them know that the source compiles fine on ! various versions of SuSE and Fedora, as well as Solaris 8, 9, and 10, ! various BSD's, and even IRIX (!). If you can get them to give me a free ! temporary account for testing purposes, I'll take a look and see if I ! can help.
    !
  • !
    !
! !

Why does compiling MudOS for Dead Souls throw so many warnings? ! (Back to Top)

!

Beats me. This is one of those complaints I don't really know how ! to respond to. At the end of the compile, you'll have a driver that ! works. It's been tested on GCC 2, 3, and 4. It's worked for Fedora ! Linux, SuSE Linux, and various versions of Solaris. It works. Ignore ! the compile schmutz.

! !

Why is there a windows-format mudos.cfg in /secure/cfg? I'm running ! unix. ! (Back to Top)

!

This is a symptom of my obsession to have the Windows lib and the ! unix lib be absolutely identical. During a fresh install, this file is ! overwritten with a unix version, if you follow the install instructions.

! !

How do I enable database support? ! (Back to Top)

!

I don't know. I don't understand databases at all, so it's pointless ! for me to try to get that MudOS functionality working. If you develop a ! procedure for it, please share it with me and I will document it so ! others can ! benefit from your leetness. I might suggest that it's probably easier ! to do this using LPC sockets in the lib, rather than trying to do it ! using driver-level support. If you don't know what that means, you'll ! need to play around with Dead Souls for a while, get the hang of it, ! and then revisit the question.
!

! !

How do I upgrade from one version of Dead Souls to another? ! (Back to Top)

!

For your convenience, patches are available to move from one minor revision of Dead Souls to another. But there isn't a patch for every ! possible upgrade. ! There is a patch to upgrade from ds2.0r12 to ds2.0r14, for example, but ! there is no patch to upgrade from ds2.0r10 to ds2.0r14. As of now, ! there are no plans to make patches to upgrade from one version of Dead ! Souls to another. For example, do not expect a ds2.0 -> ds2.1 patch.

!

The upgrade for both Windows and UNIX is the same. Basically a Dead ! Souls patch is a pretty unsophisticated upgrade system. In the case of ! the UNIX patch, you use the tar command to copy the patch files over ! your existing lib directory.

!

In the case of the Windows patch, it is a folder called lib which ! you copy over your mud's c:\ds\lib folder. Sometimes just overwriting ! is insufficient to fully bring up a previous release to the current ! release. In such cases, a daemon called update.c is included, which contains instructions for detailed modification of specific files. ! These instructions are read by the mud and executed automatically after ! reboot.

!

Obviously, this kind of update patching is intended for muds that do ! not do extensive lib system rewrites. For example, if you are running ! ds2.0r21, and ! your mud creation has been limited to individual home directories and ! the domains/ directories, then an upgrade to ds2.0r22 and beyond will ! be utterly ! painless.

!

On the other hand, if you've done extensive customizing of the ! player object, simulated efun subsystem, daemons, and so forth, then you may run into ! problems after an update. The typical update patch does include some ! changes to the player object, for example, so the indiscriminate ! overwriting of the previous information with the updated files means ! that your work basically disappears.

!

For this reason it is critical always to perform a full backup of ! all your mud files before implementing a patch upgrade. Carefully ! follow the instructions included in the patch releases to ensure optimal effect. Because these instructions are not expected to be ! static, the details will not be included in this document. Read the /doc/RELEASE_NOTES file ! to know what has changed between releases and to determine whether an ! upgrade is worth the risk. Please note that RELEASE_NOTES contains an ! overview of major changes. It does not document every difference ! between versions. !

!

The patch doesn't work! I'm getting a million errors! ! (Back to Top)

!

If you're getting lots and lots of errors when you try to run after ! patching, it may be that your driver is too old. Some Dead Souls ! releases include tweaks to the driver. If enough time has passed since ! the install of your driver, it may be that the current lib expects ! things of the driver that your old lib didn't, and you now can't run. ! To get around this you could just do a fresh install of the lib. Or you ! could follow these instructions:

!

For UNIX: !

!
    !
  1. Download the full version of the latest Dead Souls distribution.
  2. !
  3. Uncompress it to some temporary directory other than your mud dir.
  4. !
  5. Compile the driver as if you were going to do a new install.
  6. !
  7. Copy the new driver binary over your old one.
  8. !
  9. Restart the mud.
  10. !
!

For Windows: !

!
    !
  1. Shut down the mud.
  2. !
  3. Download the full version of the latest Dead Souls distribution.
  4. !
  5. Uncompress it to some temporary directory other than your mud dir.
  6. !
  7. Copy the new driver binary over your old one ( ! c:\ds\win32\driver.exe ).
  8. !
  9. Restart the mud.
  10. !
! !

Ok, it's running. Now what? (Back ! to Top)

!

Log in and read the following:

! !

The End (Back to Top)

!

Return to Dead Souls ! Homepage

!
!

Last Updated June 2006

diff -c -r --new-file ds2.0r18/lib/www/ds-lpu-faq.html ds2.0r28/lib/www/ds-lpu-faq.html *** ds2.0r18/lib/www/ds-lpu-faq.html Fri Mar 24 14:34:51 2006 --- ds2.0r28/lib/www/ds-lpu-faq.html Wed Dec 31 19:00:00 1969 *************** *** 1,29 **** - - - - - Dead Souls LPU FAQ - - -
Dead Souls LPUniversity FAQ, v1

Written by Cratylus @ Dead Souls, March 2006


What's LPUniversity?

LPUniversity is an umbrella project intended to embrace and
support the continued use of LPC. Among its goals is providing a
forum, base of support, and general rally point for folks interested
in LPC and LPMuds.
Given the complementary interests of Dead Souls and LPU,
Dead Souls is in the process of affiliating with LPU, with the goal
of a more formalized alliance down the road. If all goes well, Dead
Souls will be a standard platform for LPC training, demos, and so on.


I thought LPUniversity was/had a lib already.

Originally LPUniversity formed around the premise of
a new mudlib that followed in the footsteps of TMI-1 and TMI-2.
These muds were designed as training grounds and reference
sources for the LPC community.
However, the objectives of LPUniversity the project
are not the same as those of LPUniversity the mudlib. The
mudlib named LPUniversity continues to be developed, and
is part of the program of LPC advancement that LPUniversity
the project is dedicated to.


So LPUniversity the mudlib and LPUniversity the project are
separate. Where does Dead Souls come into the picture?

The LPUniversity lib is "built from scratch"
and is still early in its development cycle.
While it is valuable and intended to be highly
advanced, it is not quite yet a viable platform for
folks to run a production mud on.

Dead Souls is a proven platform with dozens of
muds already running it. No Dead Souls 2 muds are open
to players yet, but the muds using it are busy working
toward that goal, with demonstrably well-founded
confidence in the current state of the lib being ready
for area development.

Because Dead Souls is a lib that is "ready for
prime time", it is suited to provide the kind of
environment the LPUniversity project can use to further
its interests.


Good for them. What's in it for Dead Souls?

As stated elsewhere in Dead Souls FAQs, my
primary goals for developing and distributing the
Dead Souls mudlib include:

1) The fun of it.
2) Getting other people to use it.
3) Sharing new code ideas between DS muds.

A successful alliance with LPU provides
wider access to the development community through
the use of LPU's organizational and promotional
resources.
This is valuable because, as the developer
of DS, I pretty much have my hands full with
coding. Attracting talented developers to pitch
in is hard to do, even with all the time in
the world.


Who's the boss of whom?

This alliance is best termed as a work in
progress at the moment. Nothing is finalized or
formalized, because both sides want to ensure that
their interests don't face risk.

At the moment, Dead Souls and LPUniverity
share a proud affiliation. Details and official
written words regarding the relationship between
the two are not yet cast in stone.

- Dead Souls Homepage
-
- - --- 0 ---- diff -c -r --new-file ds2.0r18/lib/www/editor.html ds2.0r28/lib/www/editor.html *** ds2.0r18/lib/www/editor.html Fri Mar 24 14:42:02 2006 --- ds2.0r28/lib/www/editor.html Wed Jul 5 00:00:59 2006 *************** *** 6,12 **** Mud Editor Tutorial !
The ed Editor


This has always been the aspect of coding that new
creators have most trouble with. It's what discourages most
people from creating lots of stuff, in fact.

With Dead Souls, you can get away with avoiding ed
most of the time, by using the room maker and the thing maker.

But to add special functions to your code, like
magic items, smart NPC's (aka mobs), traps, hidden objects,
etc, you need to use ed, if you're going to be editing inside
the mud.

ed is a simple editing program. It is designed to
work on a line-by-line basis, so it is called a "line editor".

Let's start by looking at, and editing, a small file.
We've coded a sword, and we want to change its description
from "short sword" to "plain sword":


--- 6,15 ---- Mud Editor Tutorial ! ! !
The ed Editor


This has always been the aspect of coding that new
creators have most trouble with. It's what discourages most
people from creating lots of stuff, in fact.

With Dead Souls, you can get away with avoiding ed
most of the time, by using the room maker and the thing maker.

But to add special functions to your code, like
magic items, smart NPC's (aka mobs), traps, hidden objects,
etc, you need to use ed, if you're going to be editing inside
the mud.

ed is a simple editing program. It is designed to
work on a line-by-line basis, so it is called a "line editor".

Let's start by looking at, and editing, a small file.
We've coded a sword, and we want to change its description
from "short sword" to "plain sword":


diff -c -r --new-file ds2.0r18/lib/www/example.html ds2.0r28/lib/www/example.html *** ds2.0r18/lib/www/example.html Thu Feb 23 15:40:41 2006 --- ds2.0r28/lib/www/example.html Wed Jul 5 00:00:59 2006 *************** *** 1,884 **** ! ! ! creation example page ! What's the ! QCS?
!

QCS stands for Quick Creation System. The QCS is a
series of commands and modules that lets you create stuff
easily and quickly. Before the QCS, if you wanted to make
an orc, you would edit the text file by hand, or copy
a template file and use an editor to manually change the
lines you needed to modify. This could be a tiresome
process, as the standard editor can be a bit awkward, and
making dozens of objects this way could be real torture for
beginners.

The QCS changes all of that. Rather than use an
editor to meodify files, the QCS gives you commands that
permit you to modify objects on the fly. This means that
orc creation for example could involve just the following
simple steps (please note "npc" is another word for "mob"):

create npc new_orc

modify npc name orc

modify orc short a mean-looking orc

modify orc long A typical orc: nasty, brutish, and short.

modify orc race orc

And that's it. All your modifications automatically
get written to new_orc.c (usually in your area directory),
and you now have an npc you can add to a room. Adding things
to rooms is just as easy. Creating weapons, armor, and other
objects is done the same way.

For complete details and examples, read the
QCS chapters in the Creators Manual. The QCS section starts
in chapter 31.
!
! This is a log of the creation of some items using the Dead Souls ! creation system. It has
! not been modified in any way except to highlight the command lines and ! adding comments.
!

!
!
! Dead Souls has been up for 2h 25m 38s.
! home
! /realms/testycre/workroom
! Testycre's workroom [e,d]
! You are standing in the workroom of the mighty Testycre!  
! You may return to the Creators' Hall by going down.
! A sample room is east.
! There is a sign here you can read.
! There is a sheet here you can read.
! A wooden chest is here.
!
!
! e
!
/realms/testycre/area/room/sample_room
! Sample Room [w]
! This is a room you can use as a template.
! A simple table is here.
! A fighter is standing here.
!
! //// This is ! the standard sample room. We're about to create a new room to the east ! of it.
! create room east test1
!
It appears you have write access to this area.
! It's a null mapping
! Indenting file...
! "/tmp/indent.1134436511.tmp.dat" 20 lines 330 bytes
! Exit from ed.
!
! You wave your hand, and a new exit appears.
! You begin uttering a magical incantation.
! Indenting file...
! "/tmp/indent.1134436511.tmp.dat" 27 lines 543 bytes
! Exit from ed.
!
! Indenting file...
! "/tmp/indent.1134436511.tmp.dat" 27 lines 544 bytes
! Exit from ed.
!
! e
!
/realms/testycre/area/room/test1
! Copy of /realms/testycre/area/room/sample_room.c [w]
! This is a room you can use as a template.
! A simple table is here.
! A fighter is standing here.
!
! //// We go ! into the new room and see it is a copy of the old one. Let's change the ! short description to avoid confusion:
! modify here short Room One
! Indenting file...
! "/tmp/indent.1134436526.tmp.dat" 27 lines 515 bytes
! Exit from ed.
!
! //// We don't ! need the fighter from the other room here, so we remove him from this ! new room's inventory.
! delete fighter
!
Indenting ! file...
! "/tmp/indent.1134436532.tmp.dat" 26 lines 507 bytes
! Exit from ed.
!
! /realms/testycre/area/room/test1: Ok
! /realms/testycre/area/room/test1
! Room One [w]
! This is a room you can use as a template.
! A simple table is here.
!
!
! SetInventory modification complete.
! //// Let's make another room.
! create room east test2
! It appears you have write access to this area.
! It's a null mapping
! Indenting file...
! "/tmp/indent.1134436578.tmp.dat" 20 lines 324 bytes
! Exit from ed.
!
! You wave your hand, and a new exit appears.
! You begin uttering a magical incantation.
! Indenting file...
! "/tmp/indent.1134436578.tmp.dat" 27 lines 557 bytes
! Exit from ed.
!
! Indenting file...
! "/tmp/indent.1134436578.tmp.dat" 27 lines 525 bytes
! Exit from ed.
!
! e

! /realms/testycre/area/room/test2
! Copy of /realms/testycre/area/room/test1.c [w]
! This is a room you can use as a template.
! A simple table is here.
!
!
! modify here short Room 2
! Indenting file...
! "/tmp/indent.1134436590.tmp.dat" 26 lines 499 bytes
! Exit from ed.
!
! modify here long This is the ! second test room.
! Indenting file...
! "/tmp/indent.1134436608.tmp.dat" 26 lines 487 bytes
! Exit from ed.
!
! //// We don't need that table ! here.
! delete table
! Indenting file...
! "/tmp/indent.1134436612.tmp.dat" 25 lines 447 bytes
! Exit from ed.
!
! /realms/testycre/area/room/test2: Ok
! /realms/testycre/area/room/test2
! Room 2 [w]
! This is the second test room.
! SetInventory modification complete.
!
! //// We look at the file ! contents to make sure what we're doing really is being written into the ! room's code:
! more here
! #include <lib.h>
! #include "/realms/testycre/customdefs.h"
!
! inherit LIB_ROOM;
!
! static void create() {
!     room::create();
!     SetClimate("indoors");
!     SetAmbientLight(30);
!     SetShort("Room 2");
!     SetLong("This is the second test room.");
!     SetExits(([
!     "west" : "/realms/testycre/area/room/test1",
!       ]));
!
!     SetItems( ([
!     "template" : "That's what this is.",
!       ]) );
!
!     SetInventory(([
!       ]));
! }
!
! void init(){
!     ::init();
! }
!
! //// Let's make a new guy. ! "guy" will be the filename.
! create npc guy
! I'm going to go with the appropriate area directory:
! /realms/testycre/area/npc/guy.c
! You wave your hand mysteriously and a generic npc materializes!
! l
! /realms/testycre/area/room/test2
! Room 2 [w]
! This is the second test room.
! A generic npc is standing here.
!
! //// This is the first thing ! you should do, in order to avoid confusion.
! modify npc name guy
! Indenting file...
! "/tmp/indent.1134436801.tmp.dat" 15 lines 417 bytes
! Exit from ed.
!
! modify npc id
! This setting takes multiple values. If you have no more values to ! enter, then
! enter a dot on a blank line. To cancel, enter a single q on a blank ! line.
! You may now enter the next value. So far, it is blank.
! If you're done entering values, enter a dot on a blank line.
! dude
! You may now enter the next value. So far, we have: ({ "dude" })
! If you're done entering values, enter a dot on a blank line.
! fellow
You may now enter the next value. So far, we have: ({ "dude", "fellow" ! })
! If you're done entering values, enter a dot on a blank line.
! fella
You may now enter the next value. So far, we have: ({ "dude", "fellow", ! "fella"
! })
! If you're done entering values, enter a dot on a blank line.
!
! Entries complete. Final array is: ({ "dude", "fellow", "fella" })
! Indenting file...
! "/tmp/indent.1134436831.tmp.dat" 19 lines 442 bytes
! Exit from ed.
!
! /realms/testycre/tmp/guy1134436805: Ok
! /realms/testycre/area/npc/guy: Ok
! SetId modification complete.
! modify guy short The Dude
! Indenting file...
! "/tmp/indent.1134436855.tmp.dat" 19 lines 437 bytes
! Exit from ed.
!
! modify guy long This is just some ! random guy.
! Indenting file...
! "/tmp/indent.1134436904.tmp.dat" 19 lines 408 bytes
! Exit from ed.
!
! modify guy adj
! This setting takes multiple values. If you have no more values to ! enter, then
! enter a dot on a blank line. To cancel, enter a single q on a blank ! line.
! You may now enter the next value. So far, it is blank.
! If you're done entering values, enter a dot on a blank line.
! just some
! You may now enter the next value. So far, we have: ({ "just some" })
! If you're done entering values, enter a dot on a blank line.
! random
You may now enter the next value. So far, we have: ({ "just some", ! "random" })
! If you're done entering values, enter a dot on a blank line.
! some
You may now enter the next value. So far, we have: ({ "just some", ! "random",
! "some" })
! If you're done entering values, enter a dot on a blank line.
!
! Entries complete. Final array is: ({ "just some", "random", "some" })
! Indenting file...
! "/tmp/indent.1134436924.tmp.dat" 19 lines 402 bytes
! Exit from ed.
!
! /realms/testycre/tmp/guy1134436912: Ok
! /realms/testycre/area/npc/guy: Ok
! SetAdjectives modification complete.
! l
! /realms/testycre/area/room/test2
! Room 2 [w]
! This is the second test room.
! The Dude is standing here.
!
!
! about dude

! /realms/testycre/area/npc/guy.c
!
! #include <lib.h>
!
! inherit LIB_SENTIENT;
!
! static void create() {
!     sentient::create();
!     SetKeyName("guy");
!     SetAdjectives( ({"just some", "random", "some"}) );
!     SetId( ({"dude", "fellow", "fella"}) );
!     SetShort("The Dude");
!     SetLong("This is just some random guy.");
!     SetLevel(1);
!     SetRace("human");
!     SetClass("explorer");
!     SetGender("male");
! }
! void init(){
!     ::init();
!
! //// Now a weapon for our new ! guy. "hammer" is the filename.
! create weapon hammer
! I'm going to go with the appropriate area directory:
! /realms/testycre/area/weap/hammer.c
! You wave your hand mysteriously and a generic weapon materializes!
! modify weapon id hammer
! This setting takes multiple values. If you have no more values to ! enter, then
! enter a dot on a blank line. To cancel, enter a single q on a blank ! line.
! You may now enter the next value. So far, we have: ({ "hammer" })
! If you're done entering values, enter a dot on a blank line.
! warhammer
You may now enter the next value. So far, we have: ({ "hammer", ! "warhammer" })
! If you're done entering values, enter a dot on a blank line.
!
! Entries complete. Final array is: ({ "hammer", "warhammer" })
! Indenting file...
! "/tmp/indent.1134437181.tmp.dat" 19 lines 453 bytes
! Exit from ed.
!
! /realms/testycre/tmp/hammer1134437165: Ok
! /realms/testycre/area/weap/hammer: Ok
! SetId modification complete.
! modify weapon name hammer
! There is no weapon here.
! l
! /realms/testycre/area/room/test2
! Room 2 [w]
! This is the second test room.
! A generic weapon is here.
! The Dude is standing here.
!
! //// I accidentally ! changed the id before the name. Oops! Easy enough to fix:
! modify hammer name hammer
! Indenting file...
! "/tmp/indent.1134437205.tmp.dat" 22 lines 474 bytes
! Exit from ed.
!
! about hammer
! /realms/testycre/area/weap/hammer.c
!
! #include <lib.h>
! #include <damage_types.h>
! #include <vendor_types.h>
!
! inherit LIB_ITEM;
!
! static void create() {
!     item::create();
!     SetKeyName("hammer");
!     SetId( ({"hammer", "warhammer"}) );
!     SetAdjectives( ({ "generic" }));
!     SetShort("a generic weapon");
!     SetLong("A weapon of indeterminate proportions.");
!     SetMass(50);
!     SetVendorType(VT_WEAPON);
!     SetClass(30);
!     SetDamageType(BLADE);
!     SetWeaponType("blade");
!
! }
! void init(){
!     ::init();
! }
! modify hammer damagetype blunt
! Indenting file...
! "/tmp/indent.1134437392.tmp.dat" 22 lines 474 bytes
! Exit from ed.
!
! modify hammer weapontype blunt
! Indenting file...
! "/tmp/indent.1134437398.tmp.dat" 22 lines 474 bytes
! Exit from ed.
!
! modify hammer mass 700
! Indenting file...
! "/tmp/indent.1134437414.tmp.dat" 22 lines 475 bytes
! Exit from ed.
!
! modify hammer hands 2
! Indenting file...
! "/tmp/indent.1134437422.tmp.dat" 23 lines 492 bytes
! Exit from ed.
!
! //// Let's see if all that ! stuff really did go into the file:
! about hammer
! /realms/testycre/area/weap/hammer.c
!
! #include <lib.h>
! #include <damage_types.h>
! #include <vendor_types.h>
!
! inherit LIB_ITEM;
!
! static void create() {
!     item::create();
!     SetKeyName("hammer");
!     SetId( ({"hammer", "warhammer"}) );
!     SetAdjectives( ({ "generic" }));
!     SetShort("a generic weapon");
!     SetLong("A weapon of indeterminate proportions.");
!     SetHands(2);
!     SetMass(700);
!     SetVendorType(VT_WEAPON);
!     SetClass(30);
!     SetDamageType(BLUNT);
!
!     SetWeaponType("blunt");
! }
! void init(){
!     ::init();
! }
! modify hammer short a heavy ! war hammer
! Indenting file...
! "/tmp/indent.1134437450.tmp.dat" 23 lines 494 bytes
! Exit from ed.
!
! modify hammer long This is an ! extremely large and heavy hammer designed to be wielded in both hands ! and used to hurt people very badly indeed.
! Indenting file...
! "/tmp/indent.1134437509.tmp.dat" 23 lines 579 bytes
! Exit from ed.
!
! modify hammer adj
! This setting takes multiple values. If you have no more values to ! enter, then
! enter a dot on a blank line. To cancel, enter a single q on a blank ! line.
! You may now enter the next value. So far, it is blank.
! If you're done entering values, enter a dot on a blank line.
! large
! You may now enter the next value. So far, we have: ({ "large" })
! If you're done entering values, enter a dot on a blank line.
! heavy
You may now enter the next value. So far, we have: ({ "large", "heavy" ! })
! If you're done entering values, enter a dot on a blank line.
! war
You may now enter the next value. So far, we have: ({ "large", "heavy", ! "war" })
! If you're done entering values, enter a dot on a blank line.
!
! Entries complete. Final array is: ({ "large", "heavy", "war" })
! Indenting file...
! "/tmp/indent.1134437531.tmp.dat" 23 lines 592 bytes
! Exit from ed.
!
! /realms/testycre/tmp/hammer1134437521: Ok
! /realms/testycre/area/weap/hammer: Ok
! SetAdjectives modification complete.
! about hammer
! /realms/testycre/area/weap/hammer.c
!
! #include <lib.h>
! #include <damage_types.h>
! #include <vendor_types.h>
!
! inherit LIB_ITEM;
!
! static void create() {
!     item::create();
!     SetKeyName("hammer");
!     SetAdjectives( ({"large", "heavy", "war"}) );
!     SetId( ({"hammer", "warhammer"}) );
!     SetShort("a heavy war hammer");
!     SetLong("This is an extremely large and heavy hammer ! designed to be wielded
! in both hands and used to hurt people very badly indeed.");
!     SetHands(2);
!     SetMass(700);
!     SetVendorType(VT_WEAPON);
!     SetClass(30);
!     SetDamageType(BLUNT);
!
!     SetWeaponType("blunt");
! }
! void init(){
!     ::init();
! }
!
! //// It's a pretty heavy ! hammer, so let's make sure our guy can wield it.
! modify guy level 10
! Indenting file...
! "/tmp/indent.1134437557.tmp.dat" 19 lines 403 bytes
! Exit from ed.
!
! //// With this simple command ! we add the hammer to the permanent inventory of our guy.
! add hammer to guy
! ob2: /realms/testycre/area/npc/guy.c
! ob: /realms/testycre/area/weap/hammer.c
! Please enter a command for the NPC to perform with this item. If you ! have no
! such command to enter, enter the number of these items you want to add:
! wield hammer
! Indenting file...
! "/tmp/indent.1134437569.tmp.dat" 22 lines 489 bytes
! Exit from ed.
!
! /realms/testycre/area/npc/guy: Ok
! Guy wields a heavy war hammer.
! SetInventory modification complete.
! exa guy
! This is just some random guy.
! The male human is in top condition.
! Guy is carrying:
! A heavy war hammer (wielded in left hand and right hand)
!
! about guy
! /realms/testycre/area/npc/guy.c
!
! #include <lib.h>
!
! inherit LIB_SENTIENT;
!
! static void create() {
!     sentient::create();
!     SetKeyName("guy");
!     SetAdjectives( ({"just some", "random", "some"}) );
!     SetId( ({"dude", "fellow", "fella"}) );
!     SetShort("The Dude");
!     SetLong("This is just some random guy.");
!     SetInventory(([
!     "/realms/testycre/area/weap/hammer" : "wield hammer",
!       ]));
!     SetLevel(10);
!     SetRace("human");
!     SetClass("explorer");
!     SetGender("male");
!
! }
! void init(){
!     ::init();
! }
!
! //// Making armor is just as ! easy:
! create armor helmet
! I'm going to go with the appropriate area directory:
! /realms/testycre/area/armor/helmet.c
! You wave your hand mysteriously and generic armor materializes!
! modify armor name helmet
! Indenting file...
! "/tmp/indent.1134437645.tmp.dat" 18 lines 483 bytes
! Exit from ed.
!
! modify helmet id
This setting takes multiple values. If you have no more values to ! enter, then
! enter a dot on a blank line. To cancel, enter a single q on a blank ! line.
! You may now enter the next value. So far, it is blank.
! If you're done entering values, enter a dot on a blank line.
! helm
! You may now enter the next value. So far, we have: ({ "helm" })
! If you're done entering values, enter a dot on a blank line.
! headgear
You may now enter the next value. So far, we have: ({ "helm", ! "headgear" })
! If you're done entering values, enter a dot on a blank line.
! cover
You may now enter the next value. So far, we have: ({ "helm", ! "headgear",
! "cover" })
! If you're done entering values, enter a dot on a blank line.
!
! Entries complete. Final array is: ({ "helm", "headgear", "cover" })
! Indenting file...
! "/tmp/indent.1134437661.tmp.dat" 22 lines 535 bytes
! Exit from ed.
!
! /realms/testycre/tmp/helmet1134437649: Ok
! /realms/testycre/area/armor/helmet: Ok
! SetId modification complete.
! modify helmet short a horned viking ! helmet
! Indenting file...
! "/tmp/indent.1134437692.tmp.dat" 22 lines 544 bytes
! Exit from ed.
!
! modify helmet long Vikings ! didn't really wear horned helmets into combat, but this one does look ! formidable with its large bull horns and thick iron construction. It ! should prove very protective.
! Indenting file...
! "/tmp/indent.1134437772.tmp.dat" 22 lines 666 bytes
! Exit from ed.

! modify helmet adj
This setting takes multiple values. If you have no more values to ! enter, then
! enter a dot on a blank line. To cancel, enter a single q on a blank ! line.
! You may now enter the next value. So far, it is blank.
! If you're done entering values, enter a dot on a blank line.
! iron
! You may now enter the next value. So far, we have: ({ "iron" })
! If you're done entering values, enter a dot on a blank line.
! thick
! You may now enter the next value. So far, we have: ({ "iron", "thick" })
! If you're done entering values, enter a dot on a blank line.
! viking
You may now enter the next value. So far, we have: ({ "iron", "thick", ! "viking"
! })
! If you're done entering values, enter a dot on a blank line.
! horned
You may now enter the next value. So far, we have: ({ "iron", "thick", ! "viking",
! "horned" })
! If you're done entering values, enter a dot on a blank line.
! formidable
You may now enter the next value. So far, we have: ({ "iron", "thick", ! "viking",
! "horned", "formidable" })
! If you're done entering values, enter a dot on a blank line.
! protective
You may now enter the next value. So far, we have: ({ "iron", "thick", ! "viking",
! "horned", "formidable", "protective" })
! If you're done entering values, enter a dot on a blank line.
!
Entries complete. Final array is: ({ "iron", "thick", "viking", ! "horned",
! "formidable", "protective" })
! Indenting file...
! "/tmp/indent.1134437802.tmp.dat" 22 lines 722 bytes
! Exit from ed.
!
! /realms/testycre/tmp/helmet1134437782: Ok
! /realms/testycre/area/armor/helmet: Ok
! SetAdjectives modification complete.
! about helmet
! /realms/testycre/area/armor/helmet.c
!
! #include <lib.h>
! #include <armor_types.h>
! #include <damage_types.h>
! inherit LIB_ARMOR;
!
! static void create(){
!     armor::create();
!     SetKeyName("helmet");
!     SetAdjectives( ({"iron", "thick", "viking", ! "horned", "formidable",
! "protective"}) );
!     SetId( ({"helm", "headgear", "cover"}) );
!     SetShort("a horned viking helmet");
!     SetLong("Vikings didn't really wear horned helmets ! into combat, but this
! one does look formidable with its large bull horns and thick iron ! construction.
! It should prove very protective.");
!     SetMass(50);
!     SetDamagePoints(100);
!     SetArmorType(A_BODY_ARMOR);
!     SetProtection(BLUNT, 20);
!     SetProtection(BLADE, 20);
!     SetProtection(KNIFE, 20);
!
! }
! void init(){
!     ::init();
! }
! modify helmet armortype helmet
! Indenting file...
! "/tmp/indent.1134437818.tmp.dat" 22 lines 718 bytes
! Exit from ed.
!
! modify helmet mass 200
! Indenting file...
! "/tmp/indent.1134437830.tmp.dat" 22 lines 719 bytes
! Exit from ed.
!
! modify helmet protection
Your armor can protect against one or more of the following types of ! damage:
! blunt, blade, knife, water, shock, cold, heat, gas, acid, magic, poison,
! disease, trauma, ..
!
! Please enter which ones your armor should protect from, one at a time.
! When you are done, please type a dot on a blank line.
! blunt
! You may now enter the next value. So far, we have: ({ "blunt" })
! If you're done entering values, enter a dot on a blank line.
! blade
You may now enter the next value. So far, we have: ({ "blunt", "blade" ! })
! If you're done entering values, enter a dot on a blank line.
! knife
You may now enter the next value. So far, we have: ({ "blunt", "blade", ! "knife"
! })
! If you're done entering values, enter a dot on a blank line.
! trauma
You may now enter the next value. So far, we have: ({ "blunt", "blade", ! "knife",
! "trauma" })
! If you're done entering values, enter a dot on a blank line.
!
! Protections list complete.
! Please enter the protection value for: BLUNT
! 15
! Please enter the protection value for: BLADE
! 20
! Please enter the protection value for: KNIFE
! 25
! Please enter the protection value for: TRAUMA
! 10
! This is where the mapping gets sent somewhere.
ProtectionsMap is: ([ "BLADE" : 20, "BLUNT" : 15, "TRAUMA" : 10, ! "KNIFE" : 25 ])
! Indenting file...
! "/tmp/indent.1134437901.tmp.dat" 23 lines 750 bytes
! Exit from ed.
!
! about helmet
! /realms/testycre/area/armor/helmet.c
!
! #include <lib.h>
! #include <armor_types.h>
! #include <damage_types.h>
! inherit LIB_ARMOR;
!
! static void create(){
!     armor::create();
!     SetKeyName("helmet");
!     SetAdjectives( ({"iron", "thick", "viking", ! "horned", "formidable",
! "protective"}) );
!     SetId( ({"helm", "headgear", "cover"}) );
!     SetShort("a horned viking helmet");
!     SetLong("Vikings didn't really wear horned helmets ! into combat, but this
! one does look formidable with its large bull horns and thick iron ! construction.
! It should prove very protective.");
!     SetMass(200);
!     SetDamagePoints(100);
!     SetArmorType(A_HELMET);
!     SetProtection(BLADE, 20);
!     SetProtection(BLUNT, 15);
!     SetProtection(TRAUMA, 10);
!
!     SetProtection(KNIFE, 25);
! }
! void init(){
!     ::init();
! }
! l
! /realms/testycre/area/room/test2
! Room 2 [w]
! This is the second test room.
! A horned viking helmet and a heavy war hammer are here.
! The Dude is standing here.
!
!
! exa dude
! This is just some random guy.
! The male human is in top condition.
! Guy is carrying:
! A heavy war hammer (wielded in left hand and right hand)
!
! add helmet to dude
! ob2: /realms/testycre/area/npc/guy.c
! ob: /realms/testycre/area/armor/helmet.c
! Please enter a command for the NPC to perform with this item. If you ! have no
! such command to enter, enter the number of these items you want to add:
! wear helmet
! Indenting file...
! "/tmp/indent.1134437927.tmp.dat" 23 lines 544 bytes
! Exit from ed.
!
! /realms/testycre/area/npc/guy: Ok
! Guy wields a heavy war hammer.
! Guy wears a horned viking helmet.
! SetInventory modification complete.
! exa dude
! This is just some random guy.
! The male human is in top condition.
! Guy is carrying:
! A heavy war hammer (wielded in left hand and right hand)
! A horned viking helmet (worn)
!
! //// Ok our dude is done. Let's clean up the room by updating it:

! update
! Updating environment
! /realms/testycre/area/room/test2: Ok
! l
! /realms/testycre/area/room/test2
! Room 2 [w]
! This is the second test room.
! pwd
! /realms/testycre:
! cd area/npc
! /realms/testycre/area/npc:
! //// We need to have the guy ! present in order to add him to the room:
! clone guy
! Guy wields a heavy war hammer.
! Guy wears a horned viking helmet.
! You clone The Dude (/realms/testycre/area/npc/guy.c).
! add guy to room
! ob2: /realms/testycre/area/room/test2.c
! ob: /realms/testycre/area/npc/guy.c
! Please enter the number of these that you want to add:
! 1
! Indenting file...
! "/tmp/indent.1134437999.tmp.dat" 26 lines 485 bytes
! Exit from ed.
!
! /realms/testycre/area/room/test2: Ok
! /realms/testycre/area/room/test2
! Room 2 [w]
! This is the second test room.
! The Dude is standing here.
!
!
! SetInventory modification complete.
! update
! Updating environment
! /realms/testycre/area/room/test2: Ok
! //// That's it. Easy, ! huh? Think of how much slogging through ed this would save you when ! making a large area.
! l
! /realms/testycre/area/room/test2
! Room 2 [w]
! This is the second test room.
! The Dude is standing here.
!
!
! exa dude
! This is just some random guy.
! The male human is in top condition.
! Guy is carrying:
! A heavy war hammer (wielded in left hand and right hand)
! A horned viking helmet (worn)
!
! more here
! #include <lib.h>
! #include "/realms/testycre/customdefs.h"
!
! inherit LIB_ROOM;
!
! static void create() {
!     room::create();
!     SetClimate("indoors");
!     SetAmbientLight(30);
!     SetShort("Room 2");
!     SetLong("This is the second test room.");
!     SetExits(([
!     "west" : "/realms/testycre/area/room/test1",
!       ]));
!
!     SetItems( ([
!     "template" : "That's what this is.",
!       ]) );
!
!     SetInventory(([
!     "/realms/testycre/area/npc/guy" : 1,
!       ]));
! }
!
! void init(){
!     ::init();
! }
!
! quit
! Please come back another time!
!
!
Obviously you still need to ! code some LPC in ed for complex stuff. But knocking out rooms and NPC's ! and objects quickly helps you avoid getting bogged down in mechanics ! when what you really want to do is build.
!
! Dead Souls Homepage
--- 1,739 ---- ! ! Dead Souls Mudlib - Quick Creation System ! ! ! ! ! ! ! ! ! !

Index

! !

QCS Described

!

The Quick Creation System (or QCS) is a series of commands and ! modules that lets you create rooms, objects, exits, and NPCs easily and ! quickly. Before the QCS, if you wanted to make an orc, you would edit ! the text file by hand, or copy a template file and use an editor to ! manually change the lines you needed to modify. This could be a ! tiresome process, as the standard editor can be a bit awkward, and ! making dozens of objects this way could be real torture for beginners.

!

The QCS changes all of that. Rather than use an editor to modify ! files, the QCS gives you commands that permit you to modify objects on ! the fly. This means that orc creation, for example, could involve just ! the following simple steps (please note "NPC" is another word for ! "Mob"):

!
!
    !
  • create npc new_orc
  • !
  • modify npc name orc
  • !
  • modify orc short a mean-looking orc
  • !
  • modify orc long A typical orc: nasty, ! brutish, and short.
  • !
  • modify orc race orc
  • !
!
!

And that's it. All your modifications automatically get written to ! new_orc.c (usually in your area directory), and you now have an npc you ! can add to a room. Adding things to rooms is just as easy. Creating ! weapons, armor, and other objects are done the same way. For complete ! details and examples, read the ! QCS chapters in the Creators Manual. The QCS section starts in chapter ! 31.

!

Example Log

!

Below you will find an excerpt from an short building session using ! Dead Souls. This should be more or less exactly what you'll see by ! entering ! the commands hilighted in red.

!
!

The first thing we need to do is get back to our personal work room. ! We can ! do this using the home command.

!
! home !
/realms/testycre/workroom
Testycre's workroom [e,d]
You are standing in the workroom of the mighty Testycre!
You may return to the Creators' Hall by going down.
A sample room is east.
There is a sign here you can read.
There is a sheet here you can read.
A wooden chest is here.
!
!

Next, we move east to a sample room that is created automatically ! for us. ! We'll be experimenting in here.

!
! east
!
!
/realms/testycre/area/room/sample_room
Sample Room [e, w]
This is a room you can use as a template.
A simple table is here.
A fighter is standing here.
!
! !

Room Creation (Back to Top)

!

This is the standard sample room. We're about to create a new room ! to the north of it via the create command.

!
! create room north test1 !
It appears you have write access to this area.
It's a null mapping
Indenting file...
"/tmp/indent.1134436511.tmp.dat" 20 lines 330 bytes
Exit from ed.

You wave your hand, and a new exit appears.
You begin uttering a magical incantation.
Indenting file...
"/tmp/indent.1134436511.tmp.dat" 27 lines 543 bytes
Exit from ed.

Indenting file...
"/tmp/indent.1134436511.tmp.dat" 27 lines 544 bytes
Exit from ed.
!
!

We can now move east to our new room. Notice how it says it's a copy ! of our sample room.

!
! n !
/realms/testycre/area/room/test1
Copy of /realms/testycre/area/room/sample_room.c [s]
This is a room you can use as a template.
A simple table is here.
A fighter is standing here.
!
!

Now we'll change the short description to avoid confusion between ! our ! original sample room and the newly created one. Note that a room's ! short ! description appears as its title or name near the top of the text when ! a ! user looks at it.

!
! modify here short Room One !
Indenting file...
"/tmp/indent.1134436526.tmp.dat" 27 lines 515 bytes
Exit from ed.
!
!

We don't need the fighter from the other room here, so we remove him ! from this new room's inventory.

!
! delete fighter !
Indenting
file...
"/tmp/indent.1134436532.tmp.dat" 26 lines 507 bytes
Exit from ed.

/realms/testycre/area/room/test1: Ok
/realms/testycre/area/room/test1
Room One [w]
This is a room you can use as a template.
A simple table is here.

SetInventory modification complete.
!
!

Now we'll make another room.

!
! create room east test2 !
It appears you have write access to this area.
It's a null mapping
Indenting file...
"/tmp/indent.1134436578.tmp.dat" 20 lines 324 bytes
Exit from ed.

You wave your hand, and a new exit appears.
You begin uttering a magical incantation.
Indenting file...
"/tmp/indent.1134436578.tmp.dat" 27 lines 557 bytes
Exit from ed.

Indenting file...
"/tmp/indent.1134436578.tmp.dat" 27 lines 525 bytes
Exit from ed.
!
!

We'll move east into the newly created room.

!
! e !
/realms/testycre/area/room/test2
Copy of /realms/testycre/area/room/test1.c [w]
This is a room you can use as a template.
A simple table is here.
!
!

Once again, we'll rename our new room.

!
! modify here short Room 2 !
Indenting file...
"/tmp/indent.1134436590.tmp.dat" 26 lines 499 bytes
Exit from ed.
!
!

We can now set the room's long description. This will show up as the ! body of the room when a player types look.

!
! modify here long This is the second test room. !
Indenting file...
"/tmp/indent.1134436608.tmp.dat" 26 lines 487 bytes
Exit from ed.
!
!

We don't need that table here, let's delete it.

!
! delete table !
Indenting file...
"/tmp/indent.1134436612.tmp.dat" 25 lines 447 bytes
Exit from ed.

/realms/testycre/area/room/test2: Ok
/realms/testycre/area/room/test2
Room 2 [w]
This is the second test room.
SetInventory modification complete.
!
!

For the sake of self-assurance, we can look at the room's file to ! make ! sure that our modifications are actually being saved.

!
! more here !
#include <lib.h>
#include "/realms/testycre/customdefs.h"

inherit LIB_ROOM;

static void create() {
room::create();
SetClimate("indoors");
SetAmbientLight(30);
SetShort("Room 2");
SetLong("This is the second test room.");
SetExits(([
"west" : "/realms/testycre/area/room/test1",
]));

SetItems( ([
"template" : "That's what this is.",
]) );

SetInventory(([
]));
}

void init(){
::init();
}
!
! !

NPC Creation (Back to Top)

!

Now we'll create a new NPC (Mob) called "guy". The file name will ! also ! be "guy".

!
! create npc guy !
I'm going to go with the appropriate area directory:
/realms/testycre/area/npc/guy.c
You wave your hand mysteriously and a generic npc materializes!
!
!

We can look at our new room and see ! the NPC ! standing there.

!
! l !
/realms/testycre/area/room/test2
Room 2 [w]
This is the second test room.
A generic npc is standing here.
!
!

The first thing to do is to rename the new NPC in order to avoid ! confusion. An NPC's name is what the lib refers to the NPC as.

!
! modify npc name guy !
Indenting file...
"/tmp/indent.1134436801.tmp.dat" 15 lines 417 bytes
Exit from ed.
!
!

We can now set one or more NPC aliases, called "ids". Note that in ! the ! following example, we enter three different ones, all of which point to ! the ! same NPC. A player could look at any of ! these ! IDs and get the NPC.

!
! modify npc id !
This setting takes multiple values. If you have no more values to
enter, then enter a dot on a blank line. To cancel, enter a single q on a blank
line.
You may now enter the next value. So far, it is blank.
If you're done entering values, enter a dot on a blank line.
dude ! You may now enter the next value. So far, we have: ({ "dude" }) ! If you're done entering values, enter a dot on a blank line. ! fellow You may now enter the next value. So far, we have: ({ "dude", "fellow" ! }) ! If you're done entering values, enter a dot on a blank line. ! fella You may now enter the next value. So far, we have: ({ "dude", "fellow", ! "fella" ! }) ! If you're done entering values, enter a dot on a blank line. ! . ! Entries complete. Final array is: ({ "dude", "fellow", "fella" }) ! Indenting file... ! "/tmp/indent.1134436831.tmp.dat" 19 lines 442 bytes ! Exit from ed. ! ! /realms/testycre/tmp/guy1134436805: Ok ! /realms/testycre/area/npc/guy: Ok ! SetId modification complete. !
!
!

Now we'll set the NPCs short description, or name. Any condition ! such as ! "is standing here" is appended to the end of the NPC's short ! description, ! so don't end it with a period or any other punctuation.

!
! modify guy short The Dude !
Indenting file...
"/tmp/indent.1134436855.tmp.dat" 19 lines 437 bytes
Exit from ed.
!
!

We'll set the long description. This is what is shown when someone ! actually ! looks directly at the NPC.

!
! modify guy long This is just some random guy !
Indenting file...
"/tmp/indent.1134436904.tmp.dat" 19 lines 408 bytes
Exit from ed.
!
!

Adjectives are useful for complementing NPCs and other objects. For ! example, if our guy is 'oily' or 'hairy' as described in his long ! description, a player ! would be able to do a look oily guy and ! see the guy even if "oily" isn't in his actual name/id.

!
! modify guy adj !
This setting takes multiple values. If you have no more values to
enter, then enter a dot on a blank line. To cancel, enter a single q on a blank
line.
You may now enter the next value. So far, it is blank.
If you're done entering values, enter a dot on a blank line.
hairy ! You may now enter the next value. So far, we have: ({ "just some" }) ! If you're done entering values, enter a dot on a blank line. ! stinky You may now enter the next value. So far, we have: ({ "just some", ! "random" }) ! If you're done entering values, enter a dot on a blank line. ! oily You may now enter the next value. So far, we have: ({ "just some", ! "random", ! "some" }) ! If you're done entering values, enter a dot on a blank line. ! . ! Entries complete. Final array is: ({ "just some", "random", "some" }) ! Indenting file... ! "/tmp/indent.1134436924.tmp.dat" 19 lines 402 bytes ! Exit from ed. ! ! /realms/testycre/tmp/guy1134436912: Ok ! /realms/testycre/area/npc/guy: Ok ! SetAdjectives modification complete. !
!
!

Let's look at our room and see if the Dude is appearing as expected.

!
! look !
/realms/testycre/area/room/test2
Room 2 [w]
This is the second test room.
The Dude is standing here.
!
!

We'll check out the Dude's file and see how QCS has set up the NPC ! for us.

!
! about dude !
/realms/testycre/area/npc/guy.c

#include <lib.h>

inherit LIB_SENTIENT;

static void create() {
sentient::create();
SetKeyName("guy");
SetAdjectives( ({"just some", "random", "some"}) );
SetId( ({"dude", "fellow", "fella"}) );
SetShort("The Dude");
SetLong("This is just some random guy.");
SetLevel(1);
SetRace("human");
SetClass("explorer");
SetGender("male");
}

void init(){
::init();
!
! !

Weapon Creation (Back to Top)

!

Now we'll create a weapon for our NPC. "hammer" is the filename.

!
! create weapon hammer !
I'm going to go with the appropriate area directory:
/realms/testycre/area/weap/hammer.c
You wave your hand mysteriously and a generic weapon materializes!
!
!

And then set the hammer's ID(s)

!
! modify weapon id hammer !
This setting takes multiple values. If you have no more values to
enter, then enter a dot on a blank line. To cancel, enter a single q on a blank
line.
You may now enter the next value. So far, we have: ({ "hammer" })
If you're done entering values, enter a dot on a blank line.
warhammer You may now enter the next value. So far, we have: ({ "hammer", ! "warhammer" }) ! If you're done entering values, enter a dot on a blank line. ! . ! Entries complete. Final array is: ({ "hammer", "warhammer" }) ! Indenting file... ! "/tmp/indent.1134437181.tmp.dat" 19 lines 453 bytes ! Exit from ed. ! ! /realms/testycre/tmp/hammer1134437165: Ok ! /realms/testycre/area/weap/hammer: Ok ! SetId modification complete. !
!
!

And now we will set the weapon's name to "hammer".

!
! modify weapon name hammer !
There is no weapon here.
look ! /realms/testycre/area/room/test2 ! Room 2 [w] ! This is the second test room. ! A generic weapon is here. ! The Dude is standing here. !
!
!

What's happened here is that we changed the weapon's ID before the ! name. ! Luckily, this is easy to fix.

!
! modify hammer name hammer !
Indenting file...
"/tmp/indent.1134437205.tmp.dat" 22 lines 474 bytes
Exit from ed.
!
!

Now we'll look at the hammer's file to see how it looks.

!
! about hammer !
/realms/testycre/area/weap/hammer.c

#include <lib.h>
#include <damage_types.h>
#include <vendor_types.h>

inherit LIB_ITEM;

static void create() {
item::create();
SetKeyName("hammer");
SetId( ({"hammer", "warhammer"}) );
SetAdjectives( ({ "generic" }));
SetShort("a generic weapon");
SetLong("A weapon of indeterminate proportions.");
SetMass(50);
SetVendorType(VT_WEAPON);
SetClass(30);
SetDamageType(BLADE);
SetWeaponType("blade");

}
void init(){
::init();
}
!
!

We can now set the hammer's damage type to blunt for a nice crushing ! effect.

!
! modify hammer damagetype blunt !
Indenting file...
"/tmp/indent.1134437392.tmp.dat" 22 lines 474 bytes
Exit from ed.
!
!

And now set the weapon type.

!
! modify hammer weapontype blunt !
Indenting file...
"/tmp/indent.1134437398.tmp.dat" 22 lines 474 bytes
Exit from ed.
!
!

Similarly, set the mass.

!
! modify hammer mass 700 !
Indenting file...
"/tmp/indent.1134437414.tmp.dat" 22 lines 475 bytes
Exit from ed.
!
!

We will now make the weapon require two hands to use.

!
! modify hammer hands 2 !
Indenting file...
"/tmp/indent.1134437422.tmp.dat" 23 lines 492 bytes
Exit from ed.
!
!

We'll double-check our hammer's file now to see if everything was ! set.

!
! about hammer !
/realms/testycre/area/weap/hammer.c

#include <lib.h>
#include <damage_types.h>
#include <vendor_types.h>

inherit LIB_ITEM;

static void create() {
item::create();
SetKeyName("hammer");
SetId( ({"hammer", "warhammer"}) );
SetAdjectives( ({ "generic" }));
SetShort("a generic weapon");
SetLong("A weapon of indeterminate proportions.");
SetHands(2);
SetMass(700);
SetVendorType(VT_WEAPON);
SetClass(30);
SetDamageType(BLUNT);

SetWeaponType("blunt");
}

void init(){
::init();
}
!
!

Now we'll set that short description.

!
! modify hammer short a heavy war hammer !
Indenting file...
"/tmp/indent.1134437450.tmp.dat" 23 lines 494 bytes
Exit from ed.
!
!

And our long description...

!
! modify hammer long This is an extremely large and ! heavy hammer designed to be wielded in both hands and used to hurt ! people very badly indeed. !
Indenting file...
"/tmp/indent.1134437509.tmp.dat" 23 lines 579 bytes
Exit from ed.
!
!

Setting some adjectives.

!
! modify hammer adj !
This setting takes multiple values. If you have no more values to
enter, then enter a dot on a blank line. To cancel, enter a single q on a blank
line.
You may now enter the next value. So far, it is blank.
If you're done entering values, enter a dot on a blank line.
large ! You may now enter the next value. So far, we have: ({ "large" }) ! If you're done entering values, enter a dot on a blank line. ! heavy You may now enter the next value. So far, we have: ({ "large", "heavy" ! }) ! If you're done entering values, enter a dot on a blank line. ! war You may now enter the next value. So far, we have: ({ "large", "heavy", ! "war" }) ! If you're done entering values, enter a dot on a blank line. ! . ! Entries complete. Final array is: ({ "large", "heavy", "war" }) ! Indenting file... ! "/tmp/indent.1134437531.tmp.dat" 23 lines 592 bytes ! Exit from ed. ! ! /realms/testycre/tmp/hammer1134437521: Ok ! /realms/testycre/area/weap/hammer: Ok ! SetAdjectives modification complete. !
!
!

And finally, look at our hammer file.

!
! about hammer !
/realms/testycre/area/weap/hammer.c

#include <lib.h>
#include <damage_types.h>
#include <vendor_types.h>

inherit LIB_ITEM;

static void create() {
item::create();
SetKeyName("hammer");
SetAdjectives( ({"large", "heavy", "war"}) );
SetId( ({"hammer", "warhammer"}) );
SetShort("a heavy war hammer");
SetLong("This is an extremely large and heavy hammer designed to be wielded
in both hands and used to hurt people very badly indeed.");
SetHands(2);
SetMass(700);
SetVendorType(VT_WEAPON);
SetClass(30);
SetDamageType(BLUNT);

SetWeaponType("blunt");
}

void init(){
::init();
}
!
!

It's a pretty heavy hammer, so let's make sure our guy can wield it.

!
! modify guy level 10 !
Indenting file...
"/tmp/indent.1134437557.tmp.dat" 19 lines 403 bytes
Exit from ed.
!
!

With this simple command we add the hammer to the permanent ! inventory of our guy.

!
! add hammer to guy !
ob2: /realms/testycre/area/npc/guy.c
ob: /realms/testycre/area/weap/hammer.c
Please enter a command for the NPC to perform with this item. If you
have no such command to enter, enter the number of these items you want to add:
wield hammer ! Indenting file... ! "/tmp/indent.1134437569.tmp.dat" 22 lines 489 bytes ! Exit from ed. ! ! /realms/testycre/area/npc/guy: Ok ! Guy wields a heavy war hammer. ! SetInventory modification complete. !
!
!

And now we take a look at our guy.

!
! exa guy !
This is just some random guy.
The male human is in top condition.
Guy is carrying:
A heavy war hammer (wielded in left hand and right hand)
!
!

And check the guy's file.

!
! about guy !
/realms/testycre/area/npc/guy.c

#include <lib.h>

inherit LIB_SENTIENT;

static void create() {
sentient::create();
SetKeyName("guy");
SetAdjectives( ({"just some", "random", "some"}) );
SetId( ({"dude", "fellow", "fella"}) );
SetShort("The Dude");
SetLong("This is just some random guy.");
SetInventory(([
"/realms/testycre/area/weap/hammer" : "wield hammer",
]));
SetLevel(10);
SetRace("human");
SetClass("explorer");
SetGender("male");
}

void init(){
::init();
}
!
! !

Armor Creation (Back to Top)

!

Making armor is just as easy.

!
! create armor helmet !
I'm going to go with the appropriate area directory:
/realms/testycre/area/armor/helmet.c
You wave your hand mysteriously and generic armor materializes!
modify armor name helmet ! Indenting file... ! "/tmp/indent.1134437645.tmp.dat" 18 lines 483 bytes ! Exit from ed. ! ! modify helmet id This setting takes multiple values. If you have no more values to ! enter, then enter a dot on a blank line. To cancel, enter a single q on a blank ! line. ! You may now enter the next value. So far, it is blank. ! If you're done entering values, enter a dot on a blank line. ! helm ! You may now enter the next value. So far, we have: ({ "helm" }) ! If you're done entering values, enter a dot on a blank line. ! headgear You may now enter the next value. So far, we have: ({ "helm", ! "headgear" }) ! If you're done entering values, enter a dot on a blank line. ! cover You may now enter the next value. So far, we have: ({ "helm", ! "headgear", ! "cover" }) ! If you're done entering values, enter a dot on a blank line. ! . ! Entries complete. Final array is: ({ "helm", "headgear", "cover" }) ! Indenting file... ! "/tmp/indent.1134437661.tmp.dat" 22 lines 535 bytes ! Exit from ed. ! ! /realms/testycre/tmp/helmet1134437649: Ok ! /realms/testycre/area/armor/helmet: Ok ! SetId modification complete. ! modify helmet short a horned viking helmet ! Indenting file... ! "/tmp/indent.1134437692.tmp.dat" 22 lines 544 bytes ! Exit from ed. ! ! modify helmet long Vikings
didn't really wear horned helmets into combat, but this one does look
formidable with its large bull horns and thick iron construction. It
should prove very protective.
! Indenting file... ! "/tmp/indent.1134437772.tmp.dat" 22 lines 666 bytes ! Exit from ed.
! modify helmet adj This setting takes multiple values. If you have no more values to ! enter, then enter a dot on a blank line. To cancel, enter a single q on a blank ! line. ! You may now enter the next value. So far, it is blank. ! If you're done entering values, enter a dot on a blank line. ! iron ! You may now enter the next value. So far, we have: ({ "iron" }) ! If you're done entering values, enter a dot on a blank line. ! thick ! You may now enter the next value. So far, we have: ({ "iron", "thick" }) ! If you're done entering values, enter a dot on a blank line. ! viking You may now enter the next value. So far, we have: ({ "iron", "thick", ! "viking" ! }) ! If you're done entering values, enter a dot on a blank line. ! horned You may now enter the next value. So far, we have: ({ "iron", "thick", ! "viking", ! "horned" }) ! If you're done entering values, enter a dot on a blank line. ! formidable You may now enter the next value. So far, we have: ({ "iron", "thick", ! "viking", ! "horned", "formidable" }) ! If you're done entering values, enter a dot on a blank line. ! protective You may now enter the next value. So far, we have: ({ "iron", "thick", ! "viking", ! "horned", "formidable", "protective" }) ! If you're done entering values, enter a dot on a blank line. ! . Entries complete. Final array is: ({ "iron", "thick", "viking", ! "horned", ! "formidable", "protective" }) ! Indenting file... ! "/tmp/indent.1134437802.tmp.dat" 22 lines 722 bytes ! Exit from ed. ! ! /realms/testycre/tmp/helmet1134437782: Ok ! /realms/testycre/area/armor/helmet: Ok ! SetAdjectives modification complete. ! about helmet ! /realms/testycre/area/armor/helmet.c ! ! #include <lib.h> ! #include <armor_types.h> ! #include <damage_types.h> ! inherit LIB_ARMOR; ! ! static void create(){ ! armor::create(); ! SetKeyName("helmet"); ! SetAdjectives( ({"iron", "thick", "viking", ! "horned", "formidable", ! "protective"}) ); ! SetId( ({"helm", "headgear", "cover"}) ); ! SetShort("a horned viking helmet"); ! SetLong("Vikings didn't really wear horned helmets into combat, but this one ! does look formidable with its large bull horns and thick iron construction. It ! should prove very protective."); ! SetMass(50); ! SetDamagePoints(100); ! SetArmorType(A_BODY_ARMOR); ! SetProtection(BLUNT, 20); ! SetProtection(BLADE, 20); ! SetProtection(KNIFE, 20); ! } ! ! void init(){ ! ::init(); ! } ! modify helmet armortype helmet ! Indenting file... ! "/tmp/indent.1134437818.tmp.dat" 22 lines 718 bytes ! Exit from ed. ! ! modify helmet mass 200 ! Indenting file... ! "/tmp/indent.1134437830.tmp.dat" 22 lines 719 bytes ! Exit from ed. ! ! modify helmet protection Your armor can protect against one or more of the following types of ! damage: ! blunt, blade, knife, water, shock, cold, heat, gas, acid, magic, poison, ! disease, trauma, .. ! ! Please enter which ones your armor should protect from, one at a time. ! When you are done, please type a dot on a blank line. ! blunt ! You may now enter the next value. So far, we have: ({ "blunt" }) ! If you're done entering values, enter a dot on a blank line. ! blade You may now enter the next value. So far, we have: ({ "blunt", "blade" ! }) ! If you're done entering values, enter a dot on a blank line. ! knife You may now enter the next value. So far, we have: ({ "blunt", "blade", ! "knife" ! }) ! If you're done entering values, enter a dot on a blank line. ! trauma You may now enter the next value. So far, we have: ({ "blunt", "blade", ! "knife", ! "trauma" }) ! If you're done entering values, enter a dot on a blank line. ! . ! Protections list complete. ! Please enter the protection value for: BLUNT ! 15 ! Please enter the protection value for: BLADE ! 20 ! Please enter the protection value for: KNIFE ! 25 ! Please enter the protection value for: TRAUMA ! 10 ! This is where the mapping gets sent somewhere. ProtectionsMap is: ([ "BLADE" : 20, "BLUNT" : 15, "TRAUMA" : 10, ! "KNIFE" : 25 ]) ! Indenting file... ! "/tmp/indent.1134437901.tmp.dat" 23 lines 750 bytes ! Exit from ed. ! ! about helmet ! /realms/testycre/area/armor/helmet.c ! ! #include <lib.h> ! #include <armor_types.h> ! #include <damage_types.h> ! inherit LIB_ARMOR; ! ! static void create(){ ! armor::create(); ! SetKeyName("helmet"); ! SetAdjectives( ({"iron", "thick", "viking", ! "horned", "formidable", ! "protective"}) ); ! SetId( ({"helm", "headgear", "cover"}) ); ! SetShort("a horned viking helmet"); ! SetLong("Vikings didn't really wear horned helmets into combat, but this one ! does look formidable with its large bull horns and thick iron construction. ! It should prove very protective."); ! SetMass(200); ! SetDamagePoints(100); ! SetArmorType(A_HELMET); ! SetProtection(BLADE, 20); ! SetProtection(BLUNT, 15); ! SetProtection(TRAUMA, 10); ! ! SetProtection(KNIFE, 25); ! } ! ! void init(){ ! ::init(); ! } ! l ! /realms/testycre/area/room/test2 ! Room 2 [w] ! This is the second test room. ! A horned viking helmet and a heavy war hammer are here. ! The Dude is standing here. ! ! exa dude ! This is just some random guy. ! The male human is in top condition. ! Guy is carrying: ! A heavy war hammer (wielded in left hand and right hand) ! ! add helmet to dude ! ob2: /realms/testycre/area/npc/guy.c ! ob: /realms/testycre/area/armor/helmet.c ! Please enter a command for the NPC to perform with this item. If you have no ! such command to enter, enter the number of these items you want to add: ! wear helmet ! Indenting file... ! "/tmp/indent.1134437927.tmp.dat" 23 lines 544 bytes ! Exit from ed. ! ! /realms/testycre/area/npc/guy: Ok ! Guy wields a heavy war hammer. ! Guy wears a horned viking helmet. ! SetInventory modification complete. ! exa dude ! This is just some random guy. ! The male human is in top condition. ! Guy is carrying: ! A heavy war hammer (wielded in left hand and right hand) ! A horned viking helmet (worn) !
!
! !

Adding Room Resets (Back to Top)

!

Ok our dude is done. Let's clean up the room by updating it.

!
! update !
Updating environment
/realms/testycre/area/room/test2: Ok
look ! /realms/testycre/area/room/test2 ! Room 2 [w] ! This is the second test room. ! pwd ! /realms/testycre: ! cd area/npc ! /realms/testycre/area/npc: !
!
!

We need to have the guy present in order to add him to the room:

!
! clone guy !
Guy wields a heavy war hammer.
Guy wears a horned viking helmet.
You clone The Dude (/realms/testycre/area/npc/guy.c).
add guy to room ! ob2: /realms/testycre/area/room/test2.c ! ob: /realms/testycre/area/npc/guy.c ! Please enter the number of these that you want to add: ! 1
Indenting file... ! "/tmp/indent.1134437999.tmp.dat" 26 lines 485 bytes ! Exit from ed. ! ! /realms/testycre/area/room/test2: Ok ! /realms/testycre/area/room/test2 ! Room 2 [w] ! This is the second test room. ! The Dude is standing here. ! ! SetInventory modification complete. ! update ! Updating environment ! /realms/testycre/area/room/test2: Ok !
!
!

That's it. Easy, huh? Think of how much slogging through ed this ! would save you when making a large area. !

!
look !
/realms/testycre/area/room/test2
Room 2 [w]
This is the second test room.
The Dude is standing here.

exa dude ! This is just some random guy. ! The male human is in top condition. ! Guy is carrying: ! A heavy war hammer (wielded in left hand and right hand) ! A horned viking helmet (worn) ! ! more here ! #include <lib.h> ! #include "/realms/testycre/customdefs.h" ! ! inherit LIB_ROOM; ! ! static void create() { ! room::create(); ! SetClimate("indoors"); ! SetAmbientLight(30); ! SetShort("Room 2"); ! SetLong("This is the second test room."); ! SetExits(([ ! "west" : "/realms/testycre/area/room/test1", ! ])); ! ! SetItems( ([ ! "template" : "That's what this is.", ! ]) ); ! ! SetInventory(([ ! "/realms/testycre/area/npc/guy" : 1, ! ])); ! } ! ! void init(){ ! ::init(); ! } ! ! quit ! Please come back another time! !
!
!
!

The End (Back to Top)

!

Obviously you still need to code some LPC in ed for complex stuff. ! But knocking out rooms and NPC's and objects quickly helps you avoid ! getting bogged down in mechanics when what you really want to do is ! build.

! Return to Dead Souls Homepage Binary files ds2.0r18/lib/www/favicon.ico and ds2.0r28/lib/www/favicon.ico differ diff -c -r --new-file ds2.0r18/lib/www/hotfix.html ds2.0r28/lib/www/hotfix.html *** ds2.0r18/lib/www/hotfix.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/hotfix.html Wed Jul 5 19:58:20 2006 *************** *** 0 **** --- 1,71 ---- + + + + Dead Souls Mudlib - Hotfixes + + + + + + + + + + +

Nothing's prefect. This is + most certainly true of anything I've + touched.

+

This page contains the late-breaking bugfixes found between Dead + Souls releases. Only important bugs are addressed here. Feature + enhancements and minor bugfixes become available on full release.

+

All of the fixes listed here will be included in the next release. + They + are provided here early in order to address potential problems.

+

For Dead Souls 2.0r25 + and below, + the + following fixes are available: +

+
    +
  • There is a serious + security problem that + affects all versions of Dead Souls below 2.0r26. The only fix + is to apply the patch to upgrade to 2.0r26. That patch + is available + now. This patch can be applied to any version of Dead Souls + above 2.0r20. If you plan to patch from pre- r26 to r27, you must reboot the mud between the + installation of the two separate patches.
    +
  • +
+
+

For Dead Souls 2.0r27, + the + following fixes are available: +

+
    +
  • Right as I was about to release r27, someone asked an innocent + question about bulletin boards, and I made a minor change to how they + work to address a problem. You'd think I'd have learned my lesson about + this sort of thing. The result is that bulletin boards don't work well + on 2.0r27. To fix it, copy this file over + /secure/daemon/bboard.c and this file over + /secure/obj/arch_board.c .
    +
  • +
+
+
+ + + Binary files ds2.0r18/lib/www/images/Thumbs.db and ds2.0r28/lib/www/images/Thumbs.db differ Binary files ds2.0r18/lib/www/images/lpuni_afiliated.png and ds2.0r28/lib/www/images/lpuni_afiliated.png differ diff -c -r --new-file ds2.0r18/lib/www/index.html ds2.0r28/lib/www/index.html *** ds2.0r18/lib/www/index.html Fri Mar 24 14:34:51 2006 --- ds2.0r28/lib/www/index.html Wed Jul 5 00:49:19 2006 *************** *** 1,128 **** ! Dead Souls Mudlib ! ! !
!
SourceForge.net Logo
!
!
!
!
!
!
!
The Dead Souls Mud ! Library version 2
!

!
!
!         The Frontiers LPC ! Preservation Foundation is proud to present the release of Dead ! Souls 2 after a long period of development. This distribution is ! optimized for ! the latest current version of MudOS, and the lib has been thoroughly ! updated. Extensive documentation has been added for players and for ! creators, and a new Quick Creation System ! makes world creation an absolute breeze. There is even a Windows ! version!
!
! What is Dead Souls? The Dead ! Souls MUD Library is a multi-user text based adventure creation system. It allows the user to build their own adventure game which can be played over the internet simultaneously by many people. It ! is designed for both experienced and beginner MUD admins.
!
!
Why use Dead Souls? If ! you love another mudlib, then go ahead and keep using it. We're not ! here to persuade anyone to stop doing what they prefer. Dead Souls is ! targeted at three main audiences:
!
!
! 1) People who are new to ! creating and running a MUD, and need a mudlib that is well-coded, ! well-featured, well-documented, and works great right out of the box. Dead Souls comes configured with a working combat system, races (with limbs and detailed body stats), classes, magic system, emotes, postures (even flying), built-in ftp and web servers, menu-driven MUD administration tool, intermud network channels, QCS, a sample town loaded with examples of objects and quests, banking, economics, ! variable description based on time-of-day, and much, much more.
!
!
2) People who ! liked the ! old Nightmare code base and want to get their hands on a lib with the ! old Nightmare magic that actually works.
!
! 3) Folks who tried their ! hand at older, unsupported mudlibs (nothing against your lib. I'm sure ! it's great) but are looking for something more modern and currently ! maintained.
!
!
!
!
!
Download Dead Souls From ! SourceForge-or-Download ! Dead Souls From MudMagic
!
! * Read the Dead Souls FAQ *  !   !                * Read ! the Admin FAQ *
!
!
Installation Guide (for UNIX and ! for Windows)

-
More technical docs:
- Creator FAQ             - Debugging FAQ         - Editor Tutorial       -   The Quick Creation System         -

-

-
-
-
-
-
-
-
The - Dead Souls project is in the process of affiliating with LPUniversity. - Please visit the DS LPU FAQ for more - information.
-
!
!
!

Home ! / Project Home ! / Game ! Client Downloads ! / Contact us
!

!

Standard ! disclaimers about installing ! stuff at your own risk apply.

!
--- 1,133 ---- ! Dead Souls Mudlib ! ! ! ! ! ! ! ! ! !
!

The Frontiers LPC Preservation ! Foundation is proud to present the release of Dead Souls 2 after a long ! period of development.

!

This distribution is optimized for the latest version of MudOS, and ! the lib has been thoroughly updated. Extensive documentation has been ! added for players and for creators, and a Quick ! Creation System ! makes world creation an absolute breeze. The download package also ! includes a version that will run on Microsoft Windows.
!

!

What is Dead Souls?

!

The Dead ! Dead Souls MUD Library is a multi-user text based adventure creation system. It allows the user to build their own adventure game which can be played over the internet simultaneously by many people. It ! is designed for both experienced and beginner MUD admins.

!

Why use Dead Souls?

!

If you love another mudlib, then go ahead and keep using it. We're ! not here to persuade anyone to stop doing what they prefer. Dead Souls ! is targeted at three main audiences:

!
    !
  1. People who are new to creating and running a MUD, and need a ! mudlib that is well-coded, well-featured, well-documented, and works ! great right out of the box. Dead Souls comes configured with a working combat system, races (with limbs and detailed body stats), classes, magic system, emotes, postures (even flying), built-in ftp and web servers, menu-driven MUD administration tool, intermud network channels, QCS, a sample town loaded with examples of objects and quests, banking, economics, ! variable description based on time-of-day, and much, much more.
  2. !
  3. People who liked the old Nightmare code base and want to get ! their hands on a lib with the old Nightmare magic that actually works.
  4. !
  5. Folks who tried their hand at older, unsupported mudlibs but are ! looking for something more modern and currently maintained.
  6. !
! ! ! ! ! ! ! ! ! ! ! !
!

Download Links:

! !
!

Frequently Asked Questions and Docs

! !
!

Non-Technical Information

! !
!

Additional Technical Docs

! !
!

New! ! See the LPMud information page
!

! !
! ! ! Binary files ds2.0r18/lib/www/lpuni_afiliated.png and ds2.0r28/lib/www/lpuni_afiliated.png differ diff -c -r --new-file ds2.0r18/lib/www/news.html ds2.0r28/lib/www/news.html *** ds2.0r18/lib/www/news.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/news.html Wed Jul 5 19:58:21 2006 *************** *** 0 **** --- 1,377 ---- + + + + Dead Souls News Page + + + + + + +
+
+
+
+
+
The + Dead Souls News + Page
+
+
+

+ 05 July 2006
+
+ router news:
+     The gjs router has been down for a week now, and
+ we may see some refugee muds start to make their
+ home on our router, yatmim (which by the way, stands
+ for Yet Another TMI Mud, which is how the router
+ started out. It's a DS mud now.) Yatmim is public and
+ so all are welcome, but there are some rules folks
+ need to abide by. The point of yatmim was to have
+ a reliable router for DS muds, but also one where
+ new people wouldn't be afraid to ask for help.
+
+     Please see the new router rules page + for more info.
+
+ update news:
+     Version 2.0r27 is out. I'm ever grateful to the
+ folks who find problems and report them...without
+ their help Dead Souls would take much longer to
+ get where it's going. Thanks, guys.
+
+     It probably still has a bug or two, specifically in
+ message boards. As usual, hotfixes will be posted
+ on the hotfix page. As + usual, please let me know what
+ bugs you find.
+
+     One of the new features in r27 is that the install
+ process will now work on Wolfpaw servers, so you folks
+ staying away because you couldn't get it to work, come
+ on in. The water's fine. Just be sure to run make -j 1
+ instead of just make.
+
+     For those uncomfortable with frequent patching,
+ please be aware that it isn't absolutely necessary.
+ See the patch + article for more details.
+
+     Note that for those unwilling to follow the
+ standard patch procedure, diffs are being made
+ available here.
+
+ LPUni news:
+     Tacitus has made some improvements to the front page.
+ Let's hope he keeps that up and fleshes out the rough
+ draft we see today.
+
+     He has also set up a "mud farm", with various LP
+ lib flavors running. Take a look in particular at the
+ Dead Souls 1.1 mud he's hosting. It should be interesting
+ to see how different it is from DS2. The address is:
+ lpuni.org 6501
+
+
+ Sourceforge news:
+     In case you haven't noticed, I'm relying less
+ and less on Sourceforge. They're great and everything,
+ but lately they've been down a lot, and it made me
+ realize I'm depending on them for stuff I can do
+ myself. The download stats are totally misleading,
+ and all their fancy project management stuff is just
+ a waste on me.
+     So you can pretty much figure on releases and
+ patches showing up here first and more often than
+ on Sourceforge.
+    
+
+ 23 June 2006
+
+     I've been frustrated for some time with the way
+ the LPUniversity site seems almost intentionally
+ designed to be confusing and inscrutable to newbie
+ mudders. For example, if I didn't happen to know
+ the site is supposed to be an LPC mud resource, the
+ front page wouldn't be much help in informing me.
+
+     So I bought a domain with the single purpose
+ of clarifying things. It's a shame I had to take it
+ upon myself, but you know what they say about things
+ done right.
+
+     The lpmuds.net site + is intended to be a simple,
+ easy-to-read description of LP muds. What they are,
+ where you can get some, and where you can go to
+ talk about them. None of this fancy calendaring,
+ plenipotentiary council executive meetings, soup for
+ the needy, whatever.
+
+     It's just a web site with information that I
+ hope is useful.
+
+     If you have any suggestions or requests about
+ what the site should have, please let me know.
+
+     On another note, please be aware that Dead Souls
+ is no longer GPL. For more information, please see
+ this + article.
+
+     Saquivor has found a neat creation GUI that he's
+ adapting for DS use. Keep an eye on the downloads page
+ for a DS template. It should be available soon.
+
+
+ 18 June 2006
+
+     The 2.0r26 + patch is out. Anyone under that rev is
+ subject to having their mud compromised by any creator
+ at any time. Please upgrade NOW if + you haven't already
+ done so.
+
+     As to the issue of Tacitus, please see this link.
+
+
+ 16 June 2006
+
+     As usual, good news and bad news. The good news + first. Tacitus
+ helped discover a serious security flaw in Dead Souls. Woot!
+ Congratulations to him for being clever, and thanks for
+ helping secure DS.
+
+     The bad news is that all versions of DS are + affected, so
+ you should lock your DS muds (using admintool) and avoid
+ promoting anyone to a Creator position until the patch
+ is in place. Hopefully I'll be able to cook something up
+ this evening.
+
+     The other bad news is that I found Tacitus trying
+ to delete log files on the dev Dead Souls mud. I think I
+ was fortunate that he missed a couple of details in rooting
+ me, so he failed. However, until I can account for every
+ free inode with recovery software, the dev mud will
+ be locked also. Sadface.
+
+     For some reason, he also chose to go online and + announce
+ the details of the flaw without giving me a chance to
+ address it. This means you are rather exposed, so please
+ make sure to only allow very + trusted people to Creator postions.
+
+
+
+ 13 June 2006
+
+     The I3 + router box suffered a storage subsystem failure:
+ around 8pm the fiber array crapped out and took down the raid volume
+ the I3 router mud was on. As of 9:20 I3 is back up.
+
+
+ 09 June 2006
+
+     ROXOR. I discussed with Marius the MudOS bundling
+ question. Here's the + scoop.
+
+
+
+ 06 June 2006
+
+     I am so delighted I could pop any moment. Earlier
+ today I checked the LPU forums while at a work site,
+ and was just blown away to see Saquivor had solved
+ the Windows sockets problem. I was all smiles, and
+ could barely wait to get to my desk to poke at it.
+
+     Then...sadface. It looked like we solved the + technical
+ problem of networking, but the next problem involved GPL
+ code. MinGW used libcrypto that I could not be sure
+ was not GPL, and the native Win32 binary we made required
+ that dll.
+
+     In a burst of uncharacteristic optimism, I went
+ about seeing if I could obviate the GPL library in
+ question, and eventually solved the problem by using
+ the MudOS built-in MD5 hash auth mechanism. JOY. I
+ had to get pretty violent with the crypto code, but
+ it appears to work well, and is far more secure than
+ the old system.
+
+     The only drawback is that new passwords are not + compatible
+ with old passwords. A driver change will mean some
+ pain. Fortunately this is an unusual situation.
+
+     In the interest of cross-platform compatibility I
+ plan to make the Unix side of the DS distro MD5 auth
+ also. This will probably happen in the release following
+ the release I plan to make this evening.
+
+
+
+ 05 June 2006
+
+     I spent the entire weekend hacking at MudOS to
+ try to compile a native Win32 binary. I made a solid
+ amount of progress, and I'm almost there, but I
+ need help. Please see if you + can lend a hand.
+
+     I called RedHat bright and early today, to get
+ in touch with the Cygwin licensing people. Predictably,
+ I got no straight answers, and I am now officially waiting
+ for a call beck from a Sales Rep named Mike within
+ then next two to three business days.
+
+     What do you suppose are the chances that a Sales
+ representative will offer me what I want for free?
+ ----
+
+     He got back to me! And the verdict is:
+
+ " That license costs 25K per + year.  I did not mention it as an option + because you mentioned you we looking for a free/low cost option. The + Buyout license doesn't qualify.
+ Mike "
+ ----
+
+    
CASE CLOSED.
+
+
+
+
03 June 2006
+
+     The good news is that version 2.0r24 of Dead Souls
+ is now available for download + from Sourceforge.
+
+     The bad news is that thanks to another + observation
+ from that member of the mud community
, it's come to my
+ attention that despite my best efforts, the Windows
+ version of Dead Souls *still* may violate GPL.
+
+     I am erring on the side of caution and have unbundled
+ the Windows binary and Cygwin dll's from the Dead Souls
+ distribution.
+
+     I very much hope to have a Windows solution soon,
+ as a substantial number of the Dead Souls userbase
+ is on Windows, and presumably there are other folks
+ interested in using it.
+
+     If you can provide me with instructions on how to
+ make a non-license-violating MudOS binary, or if
+ you wish to provide me that binary already compiled,
+ I'd be delighted to accept that contribution for
+ consideration.
+
+ Until then, hang tight. We'll figure something out.
+
+
+
+
01Jun06
+
+
+     Dead Souls has been removed from the mudmagic file
+ repository. For details, please read this article.
+
+     I'm delighted to announce that Alexander + Tau has been
+ promoted to a position of substantial admin authority at
+ LPUniversity, and he has created a Dead + Souls forum just
+ for us! W00t! Congratulations, Alex. I'm certain you will
+ do an excellent job.
+
+     I've released a new article dealing with Dead Souls
+ and intellectual property
, which tends toward the dry side,
+ but it addresses issues that Dead Souls admins may have
+ brought up to them. It's intended as a reference for the
+ "official" position of Dead Souls on such matters.
+
+     You may have noticed a sexy new CSS style format for
+ some of the pages on the DS site. This is thanks to
+ Kelvin's + efforts. He took my challenge of "if you don't
+ like the site's look, do something about it" seriously,
+ and boy, it sure is easier to read, isn't it? Thank you,
+ Kelvin.
+
+
+
+
+ 22May06
+
+     If there's one thing that bugs me it's news pages for
+ projects that turn into personal blogs. I can't promise it
+ won't happen here, but I'll make the effort.
+
+     I've updated the front page a bit for clarity. It was
+ getting so *I* couldn't read it. I'm a fan of simple readable
+ text, and I hope it's easier to get what you need from it.
+     Also added a cute little favicon.
+
+     As of the current version, 2.0r22, Dead Souls is now + a
+ single download package...just one file to download whether
+ you run the Windows version or the UNIX/source code version.
+     The same is true for the patch. One file to rule + them.
+
+     I've been asked by people how they can give back to
+ the Dead Souls community. Easy. Evangelize. Tell people what
+ you honestly think of the lib. If someone's in doubt as
+ to which codebase to choose, point them our way.
+
+     If you can help me promote the lib, you've done a
+ good service. The more people use Dead Souls, the stronger
+ we are as a community. Join the MUD forums and spread the
+ word, or if that's not your style, lurk until the opportunity
+ presents itself to give us a good old shameless plug.
+
+     Also, spend some time on the LPUniversity + forums.
+ Create a login, and chat a bit. Liven the place up.
+
+
+ +
+
+
Dead Souls Home  +
+ + diff -c -r --new-file ds2.0r18/lib/www/qcs.html ds2.0r28/lib/www/qcs.html *** ds2.0r18/lib/www/qcs.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/qcs.html Wed Jul 5 00:00:59 2006 *************** *** 0 **** --- 1,1166 ---- + + + + Dead Souls Mudlib - Quick Creation System + + + + + + + + + + + + +

Index

+ + +

QCS Described

+

The Quick Creation System (or QCS) is a series of commands and modules that + lets you create rooms, objects, exits, and NPCs easily and quickly. Before the + QCS, if you wanted to make an orc, you would edit the text file by hand, or + copy a template file and use an editor to manually change the lines you needed + to modify. This could be a tiresome process, as the standard editor can be a bit + awkward, and making dozens of objects this way could be real torture for + beginners.

+

The QCS changes all of that. Rather than use an editor to modify files, the + QCS gives you commands that permit you to modify objects on the fly. This means + that orc creation, for example, could involve just the following simple steps + (please note "NPC" is another word for "Mob"):

+ +
+
    +
  • create npc new_orc
  • +
  • modify npc name orc
  • +
  • modify orc short a mean-looking orc
  • +
  • modify orc long A typical orc: nasty, brutish, and short.
  • +
  • modify orc race orc
  • +
+
+ +

And that's it. All your modifications automatically get written to new_orc.c + (usually in your area directory), and you now have an npc you can add to a room. + Adding things to rooms is just as easy. Creating weapons, armor, and other + objects are done the same way. For complete details and examples, read the + QCS chapters in the Creators Manual. The QCS section starts in chapter 31.

+ +

Example Log

+

Below you will find an excerpt from an short building session using + Dead Souls. This should be more or less exactly what you'll see by entering + the commands hilighted in red.

+
+ +

The first thing we need to do is get back to our personal work room. We can + do this using the home command.

+ +
+ home +
+ /realms/testycre/workroom
+ Testycre's workroom [e,d]
+ You are standing in the workroom of the mighty Testycre!
+ You may return to the Creators' Hall by going down.
+ A sample room is east.
+ There is a sign here you can read.
+ There is a sheet here you can read.
+ A wooden chest is here.
+ 
+
+ +

Next, we move east to a sample room that is created automatically for us. + We'll be experimenting in here.

+ +
+ east +
+ /realms/testycre/area/room/sample_room
+ Sample Room [w]
+ This is a room you can use as a template.
+ A simple table is here.
+ A fighter is standing here.
+ 
+
+ + +

Room Creation (Back to Top)

+

This is the standard sample room. We're about to create a new room to the + east of it via the create command.

+ +
+ create room east test1 +
+ It appears you have write access to this area.
+ It's a null mapping
+ Indenting file...
+ "/tmp/indent.1134436511.tmp.dat" 20 lines 330 bytes
+ Exit from ed.
+ 
+ You wave your hand, and a new exit appears.
+ You begin uttering a magical incantation.
+ Indenting file...
+ "/tmp/indent.1134436511.tmp.dat" 27 lines 543 bytes
+ Exit from ed.
+ 
+ Indenting file...
+ "/tmp/indent.1134436511.tmp.dat" 27 lines 544 bytes
+ Exit from ed.
+ 
+
+ +

We can now move east to our new room. Notice how it says it's a copy + of our sample room.

+ +
+ e +
+ /realms/testycre/area/room/test1
+ Copy of /realms/testycre/area/room/sample_room.c [w]
+ This is a room you can use as a template.
+ A simple table is here.
+ A fighter is standing here.
+ 
+
+ +

Now we'll change the short description to avoid confusion between our + original sample room and the newly created one. Note that a room's short + description appears as its title or name near the top of the text when a + user looks at it.

+ +
+ modify here short Room One +
+ Indenting file...
+ "/tmp/indent.1134436526.tmp.dat" 27 lines 515 bytes
+ Exit from ed.
+ 
+
+ +

We don't need the fighter from the other room here, so we remove him from + this new room's inventory.

+ +
+ delete fighter +
+ Indenting
+ file...
+ "/tmp/indent.1134436532.tmp.dat" 26 lines 507 bytes
+ Exit from ed.
+ 
+ /realms/testycre/area/room/test1: Ok
+ /realms/testycre/area/room/test1
+ Room One [w]
+ This is a room you can use as a template.
+ A simple table is here.
+ 
+ SetInventory modification complete.
+ 
+
+ +

Now we'll make another room.

+ +
+ create room east test2 +
+ It appears you have write access to this area.
+ It's a null mapping
+ Indenting file...
+ "/tmp/indent.1134436578.tmp.dat" 20 lines 324 bytes
+ Exit from ed.
+ 
+ You wave your hand, and a new exit appears.
+ You begin uttering a magical incantation.
+ Indenting file...
+ "/tmp/indent.1134436578.tmp.dat" 27 lines 557 bytes
+ Exit from ed.
+ 
+ Indenting file...
+ "/tmp/indent.1134436578.tmp.dat" 27 lines 525 bytes
+ Exit from ed.
+ 
+
+ +

We'll move east into the newly created room.

+ +
+ e +
+ /realms/testycre/area/room/test2
+ Copy of /realms/testycre/area/room/test1.c [w]
+ This is a room you can use as a template.
+ A simple table is here.
+ 
+
+ +

Once again, we'll rename our new room.

+ +
+ modify here short Room 2 +
+ Indenting file...
+ "/tmp/indent.1134436590.tmp.dat" 26 lines 499 bytes
+ Exit from ed.
+ 
+
+ +

We can now set the room's long description. This will show up as the + body of the room when a player types look.

+ +
+ modify here long This is the second test room. +
+ Indenting file...
+ "/tmp/indent.1134436608.tmp.dat" 26 lines 487 bytes
+ Exit from ed.
+ 
+
+ +

We don't need that table here, let's delete it.

+ +
+ delete table +
+ Indenting file...
+ "/tmp/indent.1134436612.tmp.dat" 25 lines 447 bytes
+ Exit from ed.
+ 
+ /realms/testycre/area/room/test2: Ok
+ /realms/testycre/area/room/test2
+ Room 2 [w]
+ This is the second test room.
+ SetInventory modification complete.
+ 
+
+ +

For the sake of self-assurance, we can look at the room's file to make + sure that our modifications are actually being saved.

+ +
+ more here +
+ #include <lib.h>
+ #include "/realms/testycre/customdefs.h"
+ 
+ inherit LIB_ROOM;
+ 
+ static void create() {
+  room::create();
+  SetClimate("indoors");
+  SetAmbientLight(30);
+  SetShort("Room 2");
+  SetLong("This is the second test room.");
+  SetExits(([
+  "west" : "/realms/testycre/area/room/test1",
+  ]));
+ 
+  SetItems( ([
+  "template" : "That's what this is.",
+  ]) );
+ 
+  SetInventory(([
+  ]));
+ }
+ 
+ void init(){
+  ::init();
+ }
+ 
+
+ + +

NPC Creation (Back to Top)

+

Now we'll create a new NPC (Mob) called "guy". The file name will also + be "guy".

+ +
+ create npc guy +
+ I'm going to go with the appropriate area directory:
+ /realms/testycre/area/npc/guy.c
+ You wave your hand mysteriously and a generic npc materializes!
+ 
+
+ +

We can look at our new room and see the NPC + standing there.

+ +
+ l +
+ /realms/testycre/area/room/test2
+ Room 2 [w]
+ This is the second test room.
+ A generic npc is standing here.
+ 
+
+ +

The first thing to do is to rename the new NPC in order to avoid + confusion. An NPC's name is what the lib refers to the NPC as.

+ +
+ modify npc name guy +
+ Indenting file...
+ "/tmp/indent.1134436801.tmp.dat" 15 lines 417 bytes
+ Exit from ed.
+ 
+
+ +

We can now set one or more NPC aliases, called "ids". Note that in the + following example, we enter three different ones, all of which point to the + same NPC. A player could look at any of these + IDs and get the NPC.

+ +
+ modify npc id +
+ This setting takes multiple values. If you have no more values to
+ enter, then enter a dot on a blank line. To cancel, enter a single q on a blank
+ line.
+ You may now enter the next value. So far, it is blank.
+ If you're done entering values, enter a dot on a blank line.
+ dude
+ You may now enter the next value. So far, we have: ({ "dude" })
+ If you're done entering values, enter a dot on a blank line.
+ fellow
+ You may now enter the next value. So far, we have: ({ "dude", "fellow"
+ })
+ If you're done entering values, enter a dot on a blank line.
+ fella
+ You may now enter the next value. So far, we have: ({ "dude", "fellow",
+ "fella"
+ })
+ If you're done entering values, enter a dot on a blank line.
+ .
+ Entries complete. Final array is: ({ "dude", "fellow", "fella" })
+ Indenting file...
+ "/tmp/indent.1134436831.tmp.dat" 19 lines 442 bytes
+ Exit from ed.
+ 
+ /realms/testycre/tmp/guy1134436805: Ok
+ /realms/testycre/area/npc/guy: Ok
+ SetId modification complete.
+ 
+
+ +

Now we'll set the NPCs short description, or name. Any condition such as + "is standing here" is appended to the end of the NPC's short description, + so don't end it with a period or any other punctuation.

+ +
+ modify guy short The Dude +
+ Indenting file...
+ "/tmp/indent.1134436855.tmp.dat" 19 lines 437 bytes
+ Exit from ed.
+ 
+
+ +

We'll set the long description. This is what is shown when someone actually + looks directly at the NPC.

+ +
+ modify guy long This is just some +
+ random guy.
+ Indenting file...
+ "/tmp/indent.1134436904.tmp.dat" 19 lines 408 bytes
+ Exit from ed.
+ 
+
+ +

Adjectives are useful for complementing NPCs and other objects. For example, + if our guy is 'oily' or 'hairy' as described in his long description, a player + would be able to do a look oily guy and + see the guy even if "oily" isn't in his actual name/id.

+ +
+ modify guy adj +
+ This setting takes multiple values. If you have no more values to
+ enter, then enter a dot on a blank line. To cancel, enter a single q on a blank
+ line.
+ You may now enter the next value. So far, it is blank.
+ If you're done entering values, enter a dot on a blank line.
+ hairy
+ You may now enter the next value. So far, we have: ({ "just some" })
+ If you're done entering values, enter a dot on a blank line.
+ stinky
+ You may now enter the next value. So far, we have: ({ "just some",
+ "random" })
+ If you're done entering values, enter a dot on a blank line.
+ oily
+ You may now enter the next value. So far, we have: ({ "just some",
+ "random",
+ "some" })
+ If you're done entering values, enter a dot on a blank line.
+ .
+ Entries complete. Final array is: ({ "just some", "random", "some" })
+ Indenting file...
+ "/tmp/indent.1134436924.tmp.dat" 19 lines 402 bytes
+ Exit from ed.
+ 
+ /realms/testycre/tmp/guy1134436912: Ok
+ /realms/testycre/area/npc/guy: Ok
+ SetAdjectives modification complete.
+ 
+
+ +

Let's look at our room and see if the Dude is appearing as expected.

+ +
+ look +
+ /realms/testycre/area/room/test2
+ Room 2 [w]
+ This is the second test room.
+ The Dude is standing here.
+ 
+
+ +

We'll check out the Dude's file and see how QCS has set up the NPC for us.

+ +
+ about dude +
+ /realms/testycre/area/npc/guy.c
+ 
+ #include <lib.h>
+ 
+ inherit LIB_SENTIENT;
+ 
+ static void create() {
+  sentient::create();
+  SetKeyName("guy");
+  SetAdjectives( ({"just some", "random", "some"}) );
+  SetId( ({"dude", "fellow", "fella"}) );
+  SetShort("The Dude");
+  SetLong("This is just some random guy.");
+  SetLevel(1);
+  SetRace("human");
+  SetClass("explorer");
+  SetGender("male");
+ }
+ 
+ void init(){
+  ::init();
+ 
+
+ + +

Weapon Creation (Back to Top)

+

Now we'll create a weapon for our NPC. "hammer" is the filename.

+ +
+ create weapon hammer +
+ I'm going to go with the appropriate area directory:
+ /realms/testycre/area/weap/hammer.c
+ You wave your hand mysteriously and a generic weapon materializes!
+ 
+
+ +

And then set the hammer's ID(s)

+ +
+ modify weapon id hammer +
+ This setting takes multiple values. If you have no more values to
+ enter, then enter a dot on a blank line. To cancel, enter a single q on a blank
+ line.
+ You may now enter the next value. So far, we have: ({ "hammer" })
+ If you're done entering values, enter a dot on a blank line.
+ warhammer
+ You may now enter the next value. So far, we have: ({ "hammer",
+ "warhammer" })
+ If you're done entering values, enter a dot on a blank line.
+ .
+ Entries complete. Final array is: ({ "hammer", "warhammer" })
+ Indenting file...
+ "/tmp/indent.1134437181.tmp.dat" 19 lines 453 bytes
+ Exit from ed.
+ 
+ /realms/testycre/tmp/hammer1134437165: Ok
+ /realms/testycre/area/weap/hammer: Ok
+ SetId modification complete.
+ 
+
+ +

And now we will set the weapon's name to "hammer".

+ +
+ modify weapon name hammer +
+ There is no weapon here.
+ look
+ /realms/testycre/area/room/test2
+ Room 2 [w]
+ This is the second test room.
+ A generic weapon is here.
+ The Dude is standing here.
+ 
+
+ +

What's happened here is that we changed the weapon's ID before the name. + Luckily, this is easy to fix.

+ +
+ modify hammer name hammer +
+ Indenting file...
+ "/tmp/indent.1134437205.tmp.dat" 22 lines 474 bytes
+ Exit from ed.
+ 
+
+ +

Now we'll look at the hammer's file to see how it looks.

+ +
+ about hammer +
+ /realms/testycre/area/weap/hammer.c
+ 
+ #include <lib.h>
+ #include <damage_types.h>
+ #include <vendor_types.h>
+ 
+ inherit LIB_ITEM;
+ 
+ static void create() {
+  item::create();
+  SetKeyName("hammer");
+  SetId( ({"hammer", "warhammer"}) );
+  SetAdjectives( ({ "generic" }));
+  SetShort("a generic weapon");
+  SetLong("A weapon of indeterminate proportions.");
+  SetMass(50);
+  SetVendorType(VT_WEAPON);
+  SetClass(30);
+  SetDamageType(BLADE);
+  SetWeaponType("blade");
+ 
+ }
+ void init(){
+  ::init();
+ }
+ 
+
+ +

We can now set the hammer's damage type to blunt for a nice crushing + effect.

+ +
+ modify hammer damagetype blunt +
+ Indenting file...
+ "/tmp/indent.1134437392.tmp.dat" 22 lines 474 bytes
+ Exit from ed.
+ 
+
+ +

And now set the weapon type.

+ +
+ modify hammer weapontype blunt +
+ Indenting file...
+ "/tmp/indent.1134437398.tmp.dat" 22 lines 474 bytes
+ Exit from ed.
+ 
+
+ +

Similarly, set the mass.

+ +
+ modify hammer mass 700 +
+ Indenting file...
+ "/tmp/indent.1134437414.tmp.dat" 22 lines 475 bytes
+ Exit from ed.
+ 
+
+ +

We will now make the weapon require two hands to use.

+ +
+ modify hammer hands 2 +
+ Indenting file...
+ "/tmp/indent.1134437422.tmp.dat" 23 lines 492 bytes
+ Exit from ed.
+ 
+
+ +

We'll double-check our hammer's file now to see if everything was set.

+ +
+ about hammer +
+ /realms/testycre/area/weap/hammer.c
+ 
+ #include <lib.h>
+ #include <damage_types.h>
+ #include <vendor_types.h>
+ 
+ inherit LIB_ITEM;
+ 
+ static void create() {
+  item::create();
+  SetKeyName("hammer");
+  SetId( ({"hammer", "warhammer"}) );
+  SetAdjectives( ({ "generic" }));
+  SetShort("a generic weapon");
+  SetLong("A weapon of indeterminate proportions.");
+  SetHands(2);
+  SetMass(700);
+  SetVendorType(VT_WEAPON);
+  SetClass(30);
+  SetDamageType(BLUNT);
+ 
+  SetWeaponType("blunt");
+ }
+ 
+ void init(){
+  ::init();
+ }
+ 
+
+ +

Now we'll set that short description.

+ +
+ modify hammer short a heavy war hammer +
+ Indenting file...
+ "/tmp/indent.1134437450.tmp.dat" 23 lines 494 bytes
+ Exit from ed.
+ 
+
+ +

And our long description...

+ +
+ modify hammer long This is an extremely large and heavy + hammer designed to be wielded in both hands and used to hurt people very badly + indeed. +
+ Indenting file...
+ "/tmp/indent.1134437509.tmp.dat" 23 lines 579 bytes
+ Exit from ed.
+ 
+
+ +

Setting some adjectives.

+ +
+ modify hammer adj +
+ This setting takes multiple values. If you have no more values to
+ enter, then enter a dot on a blank line. To cancel, enter a single q on a blank
+ line.
+ You may now enter the next value. So far, it is blank.
+ If you're done entering values, enter a dot on a blank line.
+ large
+ You may now enter the next value. So far, we have: ({ "large" })
+ If you're done entering values, enter a dot on a blank line.
+ heavy
+ You may now enter the next value. So far, we have: ({ "large", "heavy"
+ })
+ If you're done entering values, enter a dot on a blank line.
+ war
+ You may now enter the next value. So far, we have: ({ "large", "heavy",
+ "war" })
+ If you're done entering values, enter a dot on a blank line.
+ .
+ Entries complete. Final array is: ({ "large", "heavy", "war" })
+ Indenting file...
+ "/tmp/indent.1134437531.tmp.dat" 23 lines 592 bytes
+ Exit from ed.
+ 
+ /realms/testycre/tmp/hammer1134437521: Ok
+ /realms/testycre/area/weap/hammer: Ok
+ SetAdjectives modification complete.
+ 
+
+ +

And finally, look at our hammer file.

+ +
+ about hammer +
+ /realms/testycre/area/weap/hammer.c
+ 
+ #include <lib.h>
+ #include <damage_types.h>
+ #include <vendor_types.h>
+ 
+ inherit LIB_ITEM;
+ 
+ static void create() {
+  item::create();
+  SetKeyName("hammer");
+  SetAdjectives( ({"large", "heavy", "war"}) );
+  SetId( ({"hammer", "warhammer"}) );
+  SetShort("a heavy war hammer");
+  SetLong("This is an extremely large and heavy hammer designed to be wielded
+   in both hands and used to hurt people very badly indeed.");
+  SetHands(2);
+  SetMass(700);
+  SetVendorType(VT_WEAPON);
+  SetClass(30);
+  SetDamageType(BLUNT);
+ 
+  SetWeaponType("blunt");
+ }
+ 
+ void init(){
+  ::init();
+ }
+ 
+
+ +

It's a pretty heavy hammer, so let's make sure our guy can wield it.

+ +
+ modify guy level 10 +
+ Indenting file...
+ "/tmp/indent.1134437557.tmp.dat" 19 lines 403 bytes
+ Exit from ed.
+ 
+
+ +

With this simple command we add the hammer to the permanent inventory of our + guy.

+ +
+ add hammer to guy +
+ ob2: /realms/testycre/area/npc/guy.c
+ ob: /realms/testycre/area/weap/hammer.c
+ Please enter a command for the NPC to perform with this item. If you
+ have no such command to enter, enter the number of these items you want to add:
+ wield hammer
+ Indenting file...
+ "/tmp/indent.1134437569.tmp.dat" 22 lines 489 bytes
+ Exit from ed.
+ 
+ /realms/testycre/area/npc/guy: Ok
+ Guy wields a heavy war hammer.
+ SetInventory modification complete.
+ 
+
+ +

And now we take a look at our guy.

+ +
+ exa guy +
+ This is just some random guy.
+ The male human is in top condition.
+ Guy is carrying:
+ A heavy war hammer (wielded in left hand and right hand)
+ 
+
+ +

And check the guy's file.

+ +
+ about guy +
+ /realms/testycre/area/npc/guy.c
+ 
+ #include <lib.h>
+ 
+ inherit LIB_SENTIENT;
+ 
+ static void create() {
+  sentient::create();
+  SetKeyName("guy");
+  SetAdjectives( ({"just some", "random", "some"}) );
+  SetId( ({"dude", "fellow", "fella"}) );
+  SetShort("The Dude");
+  SetLong("This is just some random guy.");
+  SetInventory(([
+  "/realms/testycre/area/weap/hammer" : "wield hammer",
+  ]));
+  SetLevel(10);
+  SetRace("human");
+  SetClass("explorer");
+  SetGender("male");
+ }
+ 
+ void init(){
+  ::init();
+ }
+ 
+
+ + +

Armor Creation (Back to Top)

+

Making armor is just as easy.

+ +
+ create armor helmet +
+ I'm going to go with the appropriate area directory:
+ /realms/testycre/area/armor/helmet.c
+ You wave your hand mysteriously and generic armor materializes!
+ modify armor name helmet
+ Indenting file...
+ "/tmp/indent.1134437645.tmp.dat" 18 lines 483 bytes
+ Exit from ed.
+ 
+ modify helmet id
+ This setting takes multiple values. If you have no more values to
+ enter, then enter a dot on a blank line. To cancel, enter a single q on a blank
+ line.
+ You may now enter the next value. So far, it is blank.
+ If you're done entering values, enter a dot on a blank line.
+ helm
+ You may now enter the next value. So far, we have: ({ "helm" })
+ If you're done entering values, enter a dot on a blank line.
+ headgear
+ You may now enter the next value. So far, we have: ({ "helm",
+ "headgear" })
+ If you're done entering values, enter a dot on a blank line.
+ cover
+ You may now enter the next value. So far, we have: ({ "helm",
+ "headgear",
+ "cover" })
+ If you're done entering values, enter a dot on a blank line.
+ .
+ Entries complete. Final array is: ({ "helm", "headgear", "cover" })
+ Indenting file...
+ "/tmp/indent.1134437661.tmp.dat" 22 lines 535 bytes
+ Exit from ed.
+ 
+ /realms/testycre/tmp/helmet1134437649: Ok
+ /realms/testycre/area/armor/helmet: Ok
+ SetId modification complete.
+ modify helmet short a horned viking helmet
+ Indenting file...
+ "/tmp/indent.1134437692.tmp.dat" 22 lines 544 bytes
+ Exit from ed.
+ 
+ modify helmet long Vikings
+ didn't really wear horned helmets into combat, but this one does look
+ formidable with its large bull horns and thick iron construction. It
+ should prove very protective.
+ Indenting file...
+ "/tmp/indent.1134437772.tmp.dat" 22 lines 666 bytes
+ Exit from ed.
+ 
+ modify helmet adj + This setting takes multiple values. If you have no more values to + enter, then enter a dot on a blank line. To cancel, enter a single q on a blank + line. + You may now enter the next value. So far, it is blank. + If you're done entering values, enter a dot on a blank line. + iron + You may now enter the next value. So far, we have: ({ "iron" }) + If you're done entering values, enter a dot on a blank line. + thick + You may now enter the next value. So far, we have: ({ "iron", "thick" }) + If you're done entering values, enter a dot on a blank line. + viking + You may now enter the next value. So far, we have: ({ "iron", "thick", + "viking" + }) + If you're done entering values, enter a dot on a blank line. + horned + You may now enter the next value. So far, we have: ({ "iron", "thick", + "viking", + "horned" }) + If you're done entering values, enter a dot on a blank line. + formidable + You may now enter the next value. So far, we have: ({ "iron", "thick", + "viking", + "horned", "formidable" }) + If you're done entering values, enter a dot on a blank line. + protective + You may now enter the next value. So far, we have: ({ "iron", "thick", + "viking", + "horned", "formidable", "protective" }) + If you're done entering values, enter a dot on a blank line. + . + Entries complete. Final array is: ({ "iron", "thick", "viking", + "horned", + "formidable", "protective" }) + Indenting file... + "/tmp/indent.1134437802.tmp.dat" 22 lines 722 bytes + Exit from ed. + + /realms/testycre/tmp/helmet1134437782: Ok + /realms/testycre/area/armor/helmet: Ok + SetAdjectives modification complete. + about helmet + /realms/testycre/area/armor/helmet.c + + #include <lib.h> + #include <armor_types.h> + #include <damage_types.h> + inherit LIB_ARMOR; + + static void create(){ + armor::create(); + SetKeyName("helmet"); + SetAdjectives( ({"iron", "thick", "viking", + "horned", "formidable", + "protective"}) ); + SetId( ({"helm", "headgear", "cover"}) ); + SetShort("a horned viking helmet"); + SetLong("Vikings didn't really wear horned helmets into combat, but this one + does look formidable with its large bull horns and thick iron construction. It + should prove very protective."); + SetMass(50); + SetDamagePoints(100); + SetArmorType(A_BODY_ARMOR); + SetProtection(BLUNT, 20); + SetProtection(BLADE, 20); + SetProtection(KNIFE, 20); + } + + void init(){ + ::init(); + } + modify helmet armortype helmet + Indenting file... + "/tmp/indent.1134437818.tmp.dat" 22 lines 718 bytes + Exit from ed. + + modify helmet mass 200 + Indenting file... + "/tmp/indent.1134437830.tmp.dat" 22 lines 719 bytes + Exit from ed. + + modify helmet protection + Your armor can protect against one or more of the following types of + damage: + blunt, blade, knife, water, shock, cold, heat, gas, acid, magic, poison, + disease, trauma, .. + + Please enter which ones your armor should protect from, one at a time. + When you are done, please type a dot on a blank line. + blunt + You may now enter the next value. So far, we have: ({ "blunt" }) + If you're done entering values, enter a dot on a blank line. + blade + You may now enter the next value. So far, we have: ({ "blunt", "blade" + }) + If you're done entering values, enter a dot on a blank line. + knife + You may now enter the next value. So far, we have: ({ "blunt", "blade", + "knife" + }) + If you're done entering values, enter a dot on a blank line. + trauma + You may now enter the next value. So far, we have: ({ "blunt", "blade", + "knife", + "trauma" }) + If you're done entering values, enter a dot on a blank line. + . + Protections list complete. + Please enter the protection value for: BLUNT + 15 + Please enter the protection value for: BLADE + 20 + Please enter the protection value for: KNIFE + 25 + Please enter the protection value for: TRAUMA + 10 + This is where the mapping gets sent somewhere. + ProtectionsMap is: ([ "BLADE" : 20, "BLUNT" : 15, "TRAUMA" : 10, + "KNIFE" : 25 ]) + Indenting file... + "/tmp/indent.1134437901.tmp.dat" 23 lines 750 bytes + Exit from ed. + + about helmet + /realms/testycre/area/armor/helmet.c + + #include <lib.h> + #include <armor_types.h> + #include <damage_types.h> + inherit LIB_ARMOR; + + static void create(){ + armor::create(); + SetKeyName("helmet"); + SetAdjectives( ({"iron", "thick", "viking", + "horned", "formidable", + "protective"}) ); + SetId( ({"helm", "headgear", "cover"}) ); + SetShort("a horned viking helmet"); + SetLong("Vikings didn't really wear horned helmets into combat, but this one + does look formidable with its large bull horns and thick iron construction. + It should prove very protective."); + SetMass(200); + SetDamagePoints(100); + SetArmorType(A_HELMET); + SetProtection(BLADE, 20); + SetProtection(BLUNT, 15); + SetProtection(TRAUMA, 10); + + SetProtection(KNIFE, 25); + } + + void init(){ + ::init(); + } + l + /realms/testycre/area/room/test2 + Room 2 [w] + This is the second test room. + A horned viking helmet and a heavy war hammer are here. + The Dude is standing here. + + exa dude + This is just some random guy. + The male human is in top condition. + Guy is carrying: + A heavy war hammer (wielded in left hand and right hand) + + add helmet to dude + ob2: /realms/testycre/area/npc/guy.c + ob: /realms/testycre/area/armor/helmet.c + Please enter a command for the NPC to perform with this item. If you have no + such command to enter, enter the number of these items you want to add: + wear helmet + Indenting file... + "/tmp/indent.1134437927.tmp.dat" 23 lines 544 bytes + Exit from ed. + + /realms/testycre/area/npc/guy: Ok + Guy wields a heavy war hammer. + Guy wears a horned viking helmet. + SetInventory modification complete. + exa dude + This is just some random guy. + The male human is in top condition. + Guy is carrying: + A heavy war hammer (wielded in left hand and right hand) + A horned viking helmet (worn) +
+
+ + +

Adding Room Resets (Back to Top)

+

Ok our dude is done. Let's clean up the room by updating it.

+ +
+ update +
+ Updating environment
+ /realms/testycre/area/room/test2: Ok
+ look
+ /realms/testycre/area/room/test2
+ Room 2 [w]
+ This is the second test room.
+ pwd
+ /realms/testycre:
+ cd area/npc
+ /realms/testycre/area/npc:
+ 
+
+ +

We need to have the guy present in order to add him to the room:

+ +
+ clone guy +
+ Guy wields a heavy war hammer.
+ Guy wears a horned viking helmet.
+ You clone The Dude (/realms/testycre/area/npc/guy.c).
+ add guy to room
+ ob2: /realms/testycre/area/room/test2.c
+ ob: /realms/testycre/area/npc/guy.c
+ Please enter the number of these that you want to add:
+ 1ook
+ Indenting file...
+ "/tmp/indent.1134437999.tmp.dat" 26 lines 485 bytes
+ Exit from ed.
+ 
+ /realms/testycre/area/room/test2: Ok
+ /realms/testycre/area/room/test2
+ Room 2 [w]
+ This is the second test room.
+ The Dude is standing here.
+ 
+ SetInventory modification complete.
+ update
+ Updating environment
+ /realms/testycre/area/room/test2: Ok
+ 
+
+ +

That's it. Easy, huh? Think of how much slogging through ed this would save + you when making a large area. +

+ look +
+ /realms/testycre/area/room/test2
+ Room 2 [w]
+ This is the second test room.
+ The Dude is standing here.
+ 
+ exa dude
+ This is just some random guy.
+ The male human is in top condition.
+ Guy is carrying:
+ A heavy war hammer (wielded in left hand and right hand)
+ A horned viking helmet (worn)
+ 
+ more here
+ #include <lib.h>
+ #include "/realms/testycre/customdefs.h"
+ 
+ inherit LIB_ROOM;
+ 
+ static void create() {
+  room::create();
+  SetClimate("indoors");
+  SetAmbientLight(30);
+  SetShort("Room 2");
+  SetLong("This is the second test room.");
+  SetExits(([
+  "west" : "/realms/testycre/area/room/test1",
+  ]));
+ 
+  SetItems( ([
+  "template" : "That's what this is.",
+  ]) );
+ 
+  SetInventory(([
+  "/realms/testycre/area/npc/guy" : 1,
+  ]));
+ }
+ 
+ void init(){
+  ::init();
+ }
+ 
+ quit
+ Please come back another time!
+ 
+
+ +
+

The End (Back to Top)

+

Obviously you still need to code some LPC in ed for complex stuff. But + knocking out rooms and NPC's and objects quickly helps you avoid getting bogged + down in mechanics when what you really want to do is build.

+ Return to Dead Souls Homepage + + diff -c -r --new-file ds2.0r18/lib/www/router.html ds2.0r28/lib/www/router.html *** ds2.0r18/lib/www/router.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/router.html Wed Jul 5 19:58:21 2006 *************** *** 0 **** --- 1,210 ---- + + + + Dead Souls I3 router + + + + + + +
+ +
+
+
+
+
The + Dead Souls + Intermud3 Router
+
+
+
+ What is + the Dead Souls router? + It's an intermud protocol version 3
+ router which follows intermud standards ( http://intermud.org + ) and
+ was written by the + legendary Tim@TimMUD.
+
+
+ What are + the rules?
+
+ Please read the router + rules page.
+
+
+ Is it + private?
+
+ No. Everyone is welcome.
+
+
+ What is the IP and port?  + This may occasionally change. Such changes
+ will be posted here when they happen. The current port and address is:
+
+
+
Name: *yatmim IP: 149.152.218.102 +     port: 23
+
+
+
How + do I set it up?
+
+
To + switch back and forth between the routers, use the
+ switchrouter command. For syntax and instructions,
+ type: help switchrouter
+
+
+ It doesn't + work
+
+
     There are a few possible reasons for + this, mostly
+ centered around the router being paranoid about
+ security. The router resets frequently, and on that
+ reset, your mud will be authenticated. Just be patient.
+ If it's been more than a day or so, email me at
+ <my name here>@comcast.net
+

+
+ What's the + point of a new router? Who died and made you intermud king?
+
+     On the morning of 27 March 2006, the intermud.org i3 + router stopped
+ functioning. There had been some talk on the dead_souls channel of how
+ unreliable the i3 router was, and how we should make our own,
+ etc, yakety schmakety.
+     March 27th was the last straw. For Dead Souls + developers, the
+ dead_souls intermud channel was a vital resource for development + discussion
+ and support. After being down for 24 hours, I decided it was time to
+ implement a router that the Dead Souls muds could count on.
+
+
+ Why did + you change it from port 25 to port 23?
+
+     During testing, it was discovered that some ISP's + and hosting services block
+ outbound connections to port 25, presumably for anti-spam reasons. Since
+ port 23 is very often open for outbound connections, and it is rarely
+ spam-firewalled, it seemed like a good choice. It's not like we were + doing
+ anything else with it.
+
+
+ Isn't a + low port a security risk?
+
+     It's not running the way you think.
+
+
+
Is this + router actually any more stable? What's the uptime?
+
+     It looks like there's good potential for this
+ router to be just as stable as the old *gjs, if not
+ more so. The biggest danger comes from the fact that
+ it's running on a computer on the campus of a university
+ I went to 15 years ago, so some bored network admin
+ might notice it and pull the plug. Should that ever
+ happen, the new IP will be posted here.
+
+     The most likely thing to happen is that the machine
+ it's on could lose power, despite being on UPS. If
+ this happens, channel communication will be limited
+ until someone emails me and tells me I need to
+ reload channels. On the todo list is a plan to make
+ channel data persist across server resets.
+
+     In general, however, in the past few months,
+ *gjs has failed quite a few times, while *yatmim has
+ been going strong without a single hiccup.
+
+
+ You should + integrate your router with *gjs and enable failover
+
+     I will, just as soon as you send me the network code
+ to do it. Until then, this is what you get.
+
+
+ Does it + bridge to the *gjs router?
+
+ No.
+
+
+ How does + the router work?
+
+     Tim@TimMUD wrote a swell LPC based router that is
+ basically a bunch of .h files you put into a TMI-2
+ mud. You tinker with the settings a bit, and your TMI-2
+ mud becomes an intermud router.
+     I got rather violent on his code and shoehorned it
+ into Dead Souls. It's a testament to Tim's skill that
+ my crude fumblings were able to get the thing ported
+ and working.
+
+
+ Is router + code part of Dead Souls?
+
+ With Tim's blessing I've included his I3 router
+ in the Dead Souls distribution, after removing/replacing
+ some non-Tim code. This means that any Dead Souls
+ mud can serve as a router, should it wish to
+ establish its own private intermud network. Eventually
+ these individual routers may be part of a failover
+ network, but there are no firm plans for this in place.
+
+
+ How do I + become my own I3 router?
+
+ Read the code in /secure/daemon/i3router. Understand it.
+ Then modify it to suit you. I won't be posting step-
+ by-step instructions on how to do this, because I believe
+ this is one of those things that you really need to
+ figure out on your own. If you can't figure it out
+ by reading the code, I argue you have no business
+ running the router.
+
+
+ - Cratylus
+
+
+
+
+
+
+
Dead Souls Home
+ +
+
+
+
+
+
+
+
+
+ + diff -c -r --new-file ds2.0r18/lib/www/router_rules.html ds2.0r28/lib/www/router_rules.html *** ds2.0r18/lib/www/router_rules.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/router_rules.html Wed Jul 5 19:58:23 2006 *************** *** 0 **** --- 1,146 ---- + + + + Dead Souls I3 router + + + + + + +
+ +
+
+
+
+
Dead + Souls Router Rules
+
+
+
+
1) The point of this + router being up is not free speech.
+
+ 2) This router is up for the + following purposes:
+
+     * To provide technical help for LP muds.
+     * To provide a friendly space for chat between muds.
+     * To test and improve mud communication systems, + such as intermud mail.
+
+ 3) The router is not up for + testing security of an I3 router. Attempting
+    to exploit the router is not permitted, and not "cool". If + you find
+    a security weakness please email me so I can handle it + discreetly.
+    You will get full credit for the discovery when the patch + comes out.
+
+ 4) The following channels are + reserved for the topics described below:
+
+
+ + + + + + + + + + + + + + + + + + + + + + + +
dsDead Souls mud code talk
ds_testtesting testing 1, 2, 3, etc
intergossipgeneral offtopic stuff
lpuniLPUniversity discussion
intercregeneral technical chatter
+
+

+ 5) The following are not + tolerated on those channels: hate speech, social engineering
+    hacks, unwarranted hostility to newbies, spamming, + commercial advertising. All of
+    these will be judged by my subjective opinion of what + constitutes a violation.
+    Types of violations can be added to this list without + warning by me.
+
+ 6) You may create up to 8 + intermud channels for your mud. These channels can
+    have any content you want that is permissible by all + applicable laws. I
+    don't want to control the intermud with an iron hand. I + just want those five
+    channels listed above to be a safe place for newbies to + congregate, socialize,
+    and/or get work done.
+
+ 7) If you don't like these + rules, set up your own router. Or go play on the
+    gjs router, if ever it comes back up.
+
+ 8) I will not help or support + you in any way in setting up a router, or
+    in creating a channel for your mud. These undocumented + procedures require
+    expertise to accomplish that you have to earn on your own + by reading
+    the code on your mud and the i3 specs ( intermud.org ).
+
+ 9) I will not ban a mud just + because of your tattle tales. I expect you
+    to handle your own personal problems. If someone bugs you, + use the earmuff
+    command. Earmuff the person, or earmuff the mud, or just + stay off the
+    channel in question. The chances I'll step into something + like this
+    are slight, so don't look to me to solve your online + disputes. I'm
+    your Dutch uncle, not your coddling mommy.
+
+
+
+ Note: I'm not normally this + harsh or fascistic. I just want to make things clear
+ right from the start, because I refuse to get into who was
+ mean to whom on what channel. It's a waste of everyone's time. If you + break
+ the rules, I will probably ask you politely to stop, or I may just
+ ban you. Please be reasonable and play nice, or don't come into my + house.
+

+ - Cratylus <my name here> @comcast.net
+
+
+
Dead Souls Home  +
+
+
+
+
+
+
+
+
+
+ + diff -c -r --new-file ds2.0r18/lib/www/style.css ds2.0r28/lib/www/style.css *** ds2.0r18/lib/www/style.css Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/style.css Wed Jul 5 00:00:59 2006 *************** *** 0 **** --- 1,133 ---- + div#header { + border-bottom:3px outset blue; + } + + p#headertext { + text-align:center; + font-size:x-large; + margin:0px; + padding-top:5px; + } + + p#subheadertext { + text-align:center; + margin:0px; + padding:0px; + padding-bottom:10px; + } + + div#bodytextcontainer { + margin-left:7px; + margin-right:7px; + } + + div#footer { + border-top:3px inset blue; + padding:2px; + text-align:right; + padding-top:5px; + margin-top:10px; + height:45px; + } + + div#footer img, p, a, div { + vertical-align:middle; + } + + table { + margin-left:auto; + margin-right:auto; + } + + td { + vertical-align: top; + padding:3px; + padding-left:8px; + border:1px outset navy; + padding-bottom:15px; + background: rgb(236,240,255); + color:black; + } + + h1 { + font-size:large; + } + + h2 { + padding:2px; + margin:2px; + font-size:medium; + border-bottom:1px solid gray; + } + + ul { + padding-top:0px; + padding-bottom:0px; + margin:0px; + } + + li { + padding-top:2px; + padding-bottom:2px; + } + + ul.input { + list-style-type:none; + padding-left:10px; + } + + div.inputcontainer { + border:1px solid gray; + background:rgb(236,240,255); + color:black; + font-family:monospace; + padding:5px; + } + + hr { + border: 1px dashed navy; + } + + img { + border:none; + } + + a { + color:blue; + } + + a:visited { + color:navy; + } + + a:hover { + color:red; + } + + a:active { + color:purple; + } + + p { + padding:0px; + } + + .centered { + margin-left:auto; + margin-right:auto; + } + + .centered_txt { + text-align:center; + } + + .command { + color:red; + font-weight:bold; + font-family:monospace; + } + + .backtotop { + font-size:small; + font-weight:normal; + } diff -c -r --new-file ds2.0r18/lib/www/verbs.html ds2.0r28/lib/www/verbs.html *** ds2.0r18/lib/www/verbs.html Wed Dec 31 19:00:00 1969 --- ds2.0r28/lib/www/verbs.html Wed Jul 5 00:00:59 2006 *************** *** 0 **** --- 1,126 ---- + + + + + Verb Tutorial + + + + +
The Verb

Note: This page is for advanced coders who need to
create new verbs, or modify existing ones. Newbie
coders should not assume they need to know everything
here.

The verb is like anything else. Exactly as
good as you make it, no more and no less. Deconstructing
a new verb for the first time can be confusing, but
in doing so you will gain a better understanding of
the parsing system Dead Souls uses.

Please note, if there's anything here hard to
follow or understand, you need to review the Creator's
Manual for key LPC concepts.


The verb itself

Rules and tokens

can's and do's

The objects

References


The verb itself

Let's take a look at the code for a verb, and dissect
it for meaning.
+
#include <lib.h>

inherit LIB_VERB;

static void create() {
verb::create();
SetVerb("buy");
SetSynonyms("purchase");
SetRules("STR from LIV");
SetErrorMessage("Buy what from whom?");
SetHelp("Syntax: <buy ITEM from VENDOR>\n\n"
"Blah blah this is the help message.");
}

mixed can_buy_str_from_liv(string str) {
if( this_player()->GetParalyzed() ) {
return "You cannot do anything.";
}
return this_player()->CanManipulate();
}

mixed do_buy_str_from_liv(string str, object vendor) {
return vendor->eventSell(this_player(), remove_article(lower_case(str)));
}


If you never looked at a verb before, it can
look rather alien and disgusting, like a dead facehugger.
But like the facehugger, it's actually quite beautiful
in its own way.
Let's dissect and comment it now:


#include <lib.h>
// This include statement allows us to use macros, or nicknames,
// for certain things. Specifically, the lib include gives us
// knowledge of what we mean by LIB_VERB.

inherit LIB_VERB;
// This line tells us that we will be inheriting all the
// functions and variables defined in /lib/verb.c .

static void create() {
// The create function is like main() in C/C++. A function that
// is *always* called when an object is loaded. Therefore,
// anything important goes inside here.

verb::create();
// The :: operator is called the "scope resolution operator".
// That's a fancy way of saying that we are trying to use
// a function that exists somewhere in the inheritance tree, and
// not in this individual file. The verb::create() line above
// is saying "At this point, execute any directives in the
// create() function of LIB_VERB". This is necessary because
// the create() function we define here will override the create()
// function we inherit, and that overridden function might have
// had important stuff in it we need to have happen.
// If you didn't understand any of that, you should probably
// stop reading this tutorial and get started on reading
// the Creator's manual.

SetVerb("buy");
// This identifies what word the parser should associate
// with this verb.

SetSynonyms("purchase");
// Self explanatory. This is where you specify words with a
// similar meaning that should also be associated with this verb.

SetRules("STR from LIV");
// Here's one of the new and exotic features of verbs. Rules and tokens.
// When the parser catches the "buy" word from the user's input,
// it will check to see if the rest of the words in the
// command line conform the the known set of rules for the verb.
// if they don't, the parser will error. We'll go over the rules
// a bit further on.

SetErrorMessage("Buy what from whom?");
// By default, the parser's error messages aren't terribly
// descriptive or helpful...usually it's along the lines
// of "You can't X the Y". The line above lets you provide the
// user a clue as to how to better avail themselves of the
// verb's functionality.

SetHelp("Blah blah this is the help message.");
// When the user types "help buy", this is what they get.

// The create function ends here, with the close brace
// below this line.
}


mixed can_buy_str_from_liv(string str) {
// This function does some very rudimentary checks of
// whether the user can use the verb. The can_* type
// functions will be discussed in more detail a bit
// further on.

if( this_player()->GetParalyzed() ) {
return "You cannot do anything.";
}
// Pretty self-explanatory. An obvious check.

return this_player()->CanManipulate();
// The player object has a CanManipulate() function. If
// the player has no prehensile limbs (i.e. "wielding limbs",
// like hands) then the CanManipulate() function in their
// object returns 0. Since the line above returns whatever
// CanManipulate() returns, that means that if the player
// is missing both hands, he can't sell anything. The verb
// will fail.

mixed do_buy_str_from_liv(string str, object vendor) {
// Like the can_* functions, do_ functions will get more
// treatment further on. This is generally where the actual
// "doing" of the verb gets fired off, if appropriate.

return vendor->eventSell(this_player(), remove_article(lower_case(str)));
// Did you notice that this function is declared as type "mixed"?
// This allows us to return weird stuff, like in this case where
// we're returning the result of a function call. We're not
// 100% sure what data type eventSell() in the vendor returns,
// so mixed covers all the bases. Whatever eventSell() returns,
// that's what gets returned here. If the parser got this far,
// then the verb's execution was successful.
// That doesn't necessarily mean that the player successfully
// sold anything. It may be he lacks enough quatloos for the
// shizbat. But that is no concern of the verb. That is the
// business of the eventSell() function it called on the vendor.
}


Rules and tokens

By a magic I do not fully understand myself, the
parser (which lives in the compiled driver binary, meaning
it was written in C and therefore inscrutable to me) can
actually work out from your command line what object you meant
to do what to with what.

For example, if you are in a room full of orcs,
and you type:

kill orcs

The parser actually susses out that orcs are objects
in your environment, and that you intend to act on more than
one of them. The parser will go on to check the attack verb
for its known rules. The rules for "attack" look like this:

SetRules("LVS", "only LVS","LVS only")

The parser sees that you meant two objects that
are living, and sure enough, the attack verb will accept
"multiple living things" as a rule. In this case, the
matched rule is the first one, with the token LVS.

Hold on there, you say. What if I typed kill orc ,
in the singular? This would still match the first rule,
because LVS doesn't just stand for "multiple living things".
It's rather more like "one or more living things".

If the first attack token were LIV instead, then
killing a singular orc would succeed in the parser, but
killing plural orcs would probably fail.

The second rule has two tokens. One is an object
token, LVS, where object is meant in a semi-grammatical sense.
The other is a prepositional token, which is also meant in
a semi-grammatical sense.

The way "object" and "preposition" are handled in
the parser's grammar is not the way they are handled in
English grammar. For example, you may be feeling indignant
at being told that "only" is a preposition. Obviously, in
English, it isn't. However, the parser isn't as linguistically
sophisticated as you. For the parser, anything used
periverbally that isn't an object is a preposition. Please don't
email me telling me I don't know my English grammar. When I
talk subject, object, and preposition here, I am using
the parser's simplified grammar.

As you might have guessed, an "object token" in this case
is the noun that the verb will be working with. Note that the
subject is assumed to be the caller, or player, that invoked the
verb's execution, and does not have an explicit token identified.

So, back to our second rule. "only LVS" means that
I can issue a command like this:

kill only the second orc

And the parser will not reject it. However, failing
to use the preposition token explicitly allowed in a rule
will cause the parser to error. Trying to:

kill merely the second orc

will not bring joy.

The known object tokens are:

LIV - one living thing
LVS - one or more living things
OBJ - one object
OBS - one or more objects
STR - a string of characters
WRD - a generic thing that may be a string, object, or living thing

To get a list of known preposition tokens, type:

eval return MASTER_D->parse_command_prepos_list()


can's and do's

Following the create() fun you saw two types of functions:
can_* and do_*. These are sometimes called "applies". When you see
someone referring to an apply, they mean a function called by the driver.

Notionally, the can_ applies are meant to test the
validity of the verb's execution, and the do_ applies are
meant to perform the actions required.

In practice, this is only somewhat the case. Whether
it's a bug or feature, the can_ applies tend to mangle the
arguments they receive. Pretty much no matter what the
argument is, it gets turned into a string. It's a peculiar
"gotcha" that will have you spinning your wheels for a long time
if you don't happen to know it.

That doesn't mean the can_ applies are useless. They are
in fact necessary. If the can_ apply doesn't exist, or doesn't
return a positive integer, the do_ apply won't happen, meaning your
verb won't execute. Since the can_ applies are somewhat hobbled,
use them for quick, obvious sanity checks, like "is this
player dead" or "does she have hands to manipulate anything with".

If you need to do a check, for example, to ensure that
the vendor is an elf, that means that you need to make a
call to that vendor object. Since the can_ applies won't
handle object arguments, this check will need to happen in the
do_ function.

Some examples of can_ and do_ verb applies:

can_throw_obj()

Pretty obvious. The command in question would be something
like "throw switch" perhaps.

can_throw_obj_word_obj()

A little trickier. Now we're allowing for a wildcard prepositional token. Here
the command might be "throw ball at benny", but because the token
is not explicitly listed (that would be
something like can_throw_obj_at_obj())
and the target is not explicitly a living thing, this apply
also matches "throw the sword in the lake". Note it won't match
"throw the jacks on the floor".


do_read_str_on_obj(string str, object ob)

If your verb has a can
_read_str_word_obj(string str, object ob) apply that
returned 1, then this sweet baby gets called. Presumably here you'd
have the verb call the object and tell it to do something with the
arguments provided. Here is where the actual reading action begins.


Alas, the work of parser applies is not done. The object in
question must have matching direct_ and indirect_ applies, otherwise,
error occurs. These applies are discussed in the next section.



The objects

As you can see, the thing that gives a do_ apply
its whammy is a call to an object. That's the point of a verb,
is doing something, and in the case above, its:

return vendor->eventSell(this_player(), remove_article(lower_case(str)));

However, if you make a verb like this, and then
just try to use it, it'll fail. This is because the driver
needs the objects it acts on to have applies that
correspond to the do_ applies.

The corresponding applies are direct_ and indirect_ ,
and the appropriate one must exist in the subject and
object...that is, both you and the thing you're trying to
act on.

Verb applies are usually added to the lib
objects that are appropriate. For example, let's take
the "press" verb. When you "push the button", the parser
checks with the verb daemon, VERBS_D, to find out if
"push" means anything. Sure enough, it's a synonym for
"press", so the parser checks out the rules for press.

Eventually the parser decides all the t's are
crossed and i's are dotted, and it's tim to actually
see whether the "button" you're talking about is
pressable. It does this by calling the following apply
in the button object:

direct_press_obj(<the button object is the argument here>)

If the button does not have this function,
or if the function returns 0, the parser errors, assuming
that you're trying to press something that isn't
supposed to be pressable. Therefore, if you're going to
make a button somewhere, or a wall or anything that
should do something when pushed, it will need to
have that function in it. The way it looks is something
like this:


mixed direct_press_obj(object target) {
return CanPress(this_player());
}

Now, this gets complicated, because the CanPress()
fun is a function that checks to see whether the
relationship between the button, the presser, and the lib
permits the pressing.

If you're going to have an object that is
pressed, it's going to be a right pain in the butt to
code all the necessary checks into that object. Fortunately,
you don't need to. If you make a pressable thing, you don't
need to code all that stuff yourself. Just have it
inherit LIB_PRESS, which is a file that already
contains the applies you need.


But, we're not done. You'll need to understand
a couple more things to be able to construct your new verb.

direct and indirect refer to the relationship
of two objects on a command line. If all you have is
"throw ball", there's no need to worry about object relationship.
But what if the command is "shoot nice guy eddy with pistol"?
Or, supposer the player types "shoot pistol at eddy"?

The parser needs to differentiate between the two,
but it isn't nearly sophisticated enough to understand the
concept of who is acting on whom. The parser just needs to
know which is first and which is second. therefore, in
LIB_SELL you'll see:


mixed direct_sell_obj_to_liv()

where the direct object is obj and the indirect object
is liv, and:

mixed indirect_sell_liv_obj()

where the direct object is liv and the indirect object is obj.
Again, this is not English grammar, it's parser grammar.



References

Though sparse, there are other sources of information
on verbs and the parser. Some of it is quite thorough but
incomprehensible. Some of it is crystal clear but not applicable
to the current version of MudOS and/or Dead Souls.

You're encouraged to visit the following sites
to gain more insight into the parser, but be warned that I
cannot vouch for the intelligibility or applicability of
their information.

Please let me know if you find others.


http://www.dnd.utwente.nl/~krimud/Docs/NMAdmin/Parser/


http://www.islandsofmyth.org/wiz/parser_guide.html



Within the mud, you should read and understand the
parser related man page, specifically:

man parse_command



Dead Souls Homepage

+ +