diff -c -r --new-file ds2.0r22/lib/cmds/admins/gate.c ds2.0r29/lib/cmds/admins/gate.c *** ds2.0r22/lib/cmds/admins/gate.c Thu Apr 13 21:14:09 2006 --- ds2.0r29/lib/cmds/admins/gate.c Wed Dec 31 19:00:00 1969 *************** *** 1,52 **** - /** - * modification of code contributed by daelas - * started 2006-04-04 - */ - #include - #include - #include - - // inherit LIB_DAEMON; - inherit LIB_STARGATE; - - mixed cmd(string str) - { - mapping network; - - if (!archp(previous_object())) return 0; - - network = STARGATE_D->getStargates(); - if (str) - { - if (network[lower_case(str)]) - { - write(str+" is part of the Stargate Network.\n"); - } - else - { - write(str+" is not currently part of the Stargate Network.\n"); - } - - } - else - { - write("These are the current Stargate locations in the Network:\n"); - if (!sizeof(network)) - { - message("info", "No locations found.", this_player()); - } - else - { - string buf = ""; - string name; - class stargate info; - - foreach (name, info in network) - { - buf += sprintf("%:-15s %:-10s %s\n", name, info->status, info->destination); - } - write(buf); - } - } - return 1; - } --- 0 ---- diff -c -r --new-file ds2.0r22/lib/cmds/admins/mfinger.c ds2.0r29/lib/cmds/admins/mfinger.c *** ds2.0r22/lib/cmds/admins/mfinger.c Mon Nov 7 13:28:38 2005 --- ds2.0r29/lib/cmds/admins/mfinger.c Sat Jul 8 23:30:54 2006 *************** *** 53,58 **** void help() { message("help", "Syntax: \n\n" ! "Allows you to get finger information from a player's site.", this_player()); } --- 53,63 ---- void help() { message("help", "Syntax: \n\n" ! "Allows you to get finger information from a player's site.\n\n" ! "Note: In 1995, you could reliably expect a UNIX machine to cheerfully " ! "respond to a finger request. Now, more than 10 years later, everything " ! "is blocked, firewalled, and hardened. This command is all but useless, " ! "and is kept as a historical curiosity. Any \"bugs\" it contains will " ! "not be fixed.", this_player()); } diff -c -r --new-file ds2.0r22/lib/cmds/common/help.c ds2.0r29/lib/cmds/common/help.c *** ds2.0r22/lib/cmds/common/help.c Sat Mar 11 11:13:28 2006 --- ds2.0r29/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.0r22/lib/cmds/creators/colors.c ds2.0r29/lib/cmds/creators/colors.c *** ds2.0r22/lib/cmds/creators/colors.c Thu Apr 13 21:03:19 2006 --- ds2.0r29/lib/cmds/creators/colors.c Sat Jul 8 23:30:54 2006 *************** *** 6,29 **** int cmd() { write( ! "%^RED%^RED\n" ! "%^GREEN%^GREEN\n" ! "%^ORANGE%^ORANGE\n" ! "%^YELLOW%^YELLOW\n" ! "%^BLUE%^BLUE\n" ! "%^CYAN%^CYAN\n" ! "%^MAGENTA%^MAGENTA\n" ! "%^BLACK%^BLACK\n" ! "%^WHITE%^WHITE\n" ! "%^B_RED%^B_RED\n" ! "%^B_GREEN%^B_GREEN\n" ! "%^B_ORANGE%^B_ORANGE\n" ! "%^B_YELLOW%^B_YELLOW\n" ! "%^B_BLUE%^B_BLUE\n" ! "%^B_CYAN%^B_CYAN\n" ! "%^B_BLACK%^B_BLACK\n" ! "%^B_WHITE%^B_WHITE%^RESET%^\n" ! "%^B_MAGENTA%^B_MAGENTA%^RESET%^\n" ); return 1; } --- 6,33 ---- int cmd() { write( ! "%^RED%^RED\t%%^^RED%%^^\n" ! "%^GREEN%^GREEN\t%%^^GREEN%%^^\n" ! "%^ORANGE%^ORANGE\t%%^^ORANGE%%^^\n" ! "%^YELLOW%^YELLOW\t%%^^YELLOW%%^^\n" ! "%^BLUE%^BLUE\t%%^^BLUE%%^^\n" ! "%^CYAN%^CYAN\t%%^^CYAN%%^^\n" ! "%^MAGENTA%^MAGENTA\t%%^^MAGENTA%%^^\n" ! "%^BLACK%^BLACK\t%%^^BLACK%%^^\n" ! "%^WHITE%^WHITE\t%%^^WHITE%%^^\n" ! "%^B_RED%^B_RED\t%%^^B_RED%%^^\n" ! "%^B_GREEN%^B_GREEN\t%%^^B_GREEN%%^^\n" ! "%^B_ORANGE%^B_ORANGE\t%%^^B_ORANGE%%^^\n" ! "%^B_YELLOW%^B_YELLOW\t%%^^B_YELLOW%%^^\n" ! "%^B_BLUE%^B_BLUE\t%%^^B_BLUE%%^^\n" ! "%^B_CYAN%^B_CYAN\t%%^^B_CYAN%%^^\n" ! "%^B_BLACK%^B_BLACK\t%%^^B_BLACK%%^^\n" ! "%^B_WHITE%^B_WHITE\t%%^^B_WHITE%%^^\n" ! "%^B_MAGENTA%^B_MAGENTA%^RESET%^\n\n" ! "Special tags: %%^^BOLD%%^^ and %%^^FLASH%%^^ and %%^^RESET%%^^\n\n" ! "You can mix and match, for example: \n" ! "%%^^B_RED%%^^%%^^CYAN%%^^%%^^BOLD%%^^%%^^FLASH%%^^Foo!%%^^RESET%%^^:" ! "%^B_RED%^%^CYAN%^%^BOLD%^%^FLASH%^Foo!%^RESET%^" ); return 1; } diff -c -r --new-file ds2.0r22/lib/cmds/creators/i3who.c ds2.0r29/lib/cmds/creators/i3who.c *** ds2.0r22/lib/cmds/creators/i3who.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/cmds/creators/margins.c ds2.0r29/lib/cmds/creators/margins.c *** ds2.0r22/lib/cmds/creators/margins.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/cmds/creators/move.c ds2.0r29/lib/cmds/creators/move.c *** ds2.0r22/lib/cmds/creators/move.c Wed Apr 5 19:33:16 2006 --- ds2.0r29/lib/cmds/creators/move.c Wed Dec 31 19:00:00 1969 *************** *** 1,55 **** - /* /cmds/creators/move.c - * From the Dead Souls V Object Library - * Moves object from one place to another - * created by Descartes of Borg 961008 - * Version: @(#) move.c 1.2@(#) - * Last modified: 96/10/08 - */ - - #include - #include - - inherit LIB_DAEMON; - - mixed cmd(string args) { - object what, destination; - string a, b; - mixed res; - - if( sscanf(args, "%s into %s", a, b) != 2 && - sscanf(args, "%s to %s", a, b) != 2 ) { - return "Syntax: \n\n"; - } - what = to_object(a); - destination = to_object(b); - if( !what ) { - return "Unable to find " + a + "."; - } - if( !destination ) { - return "Unable to find " + b + "."; - } - if( living(what) && living(destination) ) { - return "None of that nonsense."; - } - res = what->eventMove(destination); - if( !res ) { - return "Failed to move " + identify(what) + " into " + - identify(destination) + "."; - } - else if( res != 1 ) { - return res; - } - previous_object()->eventPrint("Moved " + identify(what) + " into " + - identify(destination) + ".", MSG_SYSTEM); - if( living(what) ) { - what->eventDescribeEnvironment(); - } - return 1; - } - - string GetHelp() { - return ("Syntax: \n\n" - "Allows you to move the object you name into the container " - "you name.\n\n" - "See also: trans, expel, goto, return"); - } --- 0 ---- diff -c -r --new-file ds2.0r22/lib/cmds/creators/polyglottize.c ds2.0r29/lib/cmds/creators/polyglottize.c *** ds2.0r22/lib/cmds/creators/polyglottize.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/cmds/creators/stargate.c ds2.0r29/lib/cmds/creators/stargate.c *** ds2.0r22/lib/cmds/creators/stargate.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/cmds/creators/transfer.c ds2.0r29/lib/cmds/creators/transfer.c *** ds2.0r22/lib/cmds/creators/transfer.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/cmds/players/biography.c ds2.0r29/lib/cmds/players/biography.c *** ds2.0r22/lib/cmds/players/biography.c Mon Nov 7 13:28:39 2005 --- ds2.0r29/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.0r22/lib/cmds/players/env.c ds2.0r29/lib/cmds/players/env.c *** ds2.0r22/lib/cmds/players/env.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/cmds/players/language.c ds2.0r29/lib/cmds/players/language.c *** ds2.0r22/lib/cmds/players/language.c Wed Apr 5 19:33:16 2006 --- ds2.0r29/lib/cmds/players/language.c Wed Jul 5 00:01:03 2006 *************** *** 11,18 **** } write("You speak:"); ! foreach(string key, int val in FluencyMap){ ! write(capitalize(key)+" with "+val+"% proficiency."); } return 1; --- 11,25 ---- } write("You speak:"); ! ! if(this_player()->GetPolyglot()){ ! write("All languages with 100% proficiency."); ! } ! ! else { ! foreach(string key, int val in FluencyMap){ ! write(capitalize(key)+" with "+val+"% proficiency."); ! } } return 1; diff -c -r --new-file ds2.0r22/lib/cmds/players/mudlist.c ds2.0r29/lib/cmds/players/mudlist.c *** ds2.0r22/lib/cmds/players/mudlist.c Tue Mar 28 23:23:40 2006 --- ds2.0r29/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.0r22/lib/cmds/players/screen.c ds2.0r29/lib/cmds/players/screen.c *** ds2.0r22/lib/cmds/players/screen.c Mon Nov 7 13:28:39 2005 --- ds2.0r29/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.0r22/lib/cmds/players/stat.c ds2.0r29/lib/cmds/players/stat.c *** ds2.0r22/lib/cmds/players/stat.c Tue Mar 28 23:23:40 2006 --- ds2.0r29/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.0r22/lib/cmds/players/who.c ds2.0r29/lib/cmds/players/who.c *** ds2.0r22/lib/cmds/players/who.c Wed Feb 22 15:29:49 2006 --- ds2.0r29/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.0r22/lib/daemon/banish.c ds2.0r29/lib/daemon/banish.c *** ds2.0r22/lib/daemon/banish.c Wed Apr 12 23:47:49 2006 --- ds2.0r29/lib/daemon/banish.c Wed Jul 5 00:00:58 2006 *************** *** 156,161 **** --- 156,162 ---- } void banish_name(string str) { + if(!valid_access(previous_object())) return; unguarded( (: log_file, "banish", (string)this_player()->GetName() + " banished " + str + "." :) ); __Names = distinct_array(__Names + ({ lower_case(str) })); diff -c -r --new-file ds2.0r22/lib/daemon/help.c ds2.0r29/lib/daemon/help.c *** ds2.0r22/lib/daemon/help.c Mon Jan 23 09:03:35 2006 --- ds2.0r29/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.0r22/lib/daemon/intermud.c ds2.0r29/lib/daemon/intermud.c *** ds2.0r22/lib/daemon/intermud.c Wed Apr 12 23:47:49 2006 --- ds2.0r29/lib/daemon/intermud.c Wed Jul 5 00:00:58 2006 *************** *** 11,16 **** --- 11,17 ---- #else #include + #include #include #include #include *************** *** 31,37 **** Password = 0; Tries = 0; Banned = ([]); - Nameservers = ({ ({ "*yatmim", "149.152.218.102 23" }) }); MudList = new(class list); ChannelList = new(class list); MudList->ID = -1; --- 32,37 ---- *************** *** 40,45 **** --- 40,46 ---- ChannelList->List = ([]); if( file_size( SAVE_INTERMUD __SAVE_EXTENSION__ ) > 0 ) unguarded( (: restore_object, SAVE_INTERMUD, 1 :) ); + Nameservers = ({ ({ "*yatmim", "149.152.218.102 23" }) }); SetNoClean(1); tn("INTERMUD_D reloaded."); SetDestructOnClose(1); *************** *** 73,78 **** --- 74,93 ---- (mapping)SERVICES_D->GetServices(), ([]) }) ), "red");; } + void eventClearVars(){ + if( !((int)master()->valid_apply(({ PRIV_ASSIST, INTERMUD_D }))) ) + error("Illegal attempt to reset intermud: "+get_stack()+" "+identify(previous_object(-1))); + Connected = 0; + Tries = 0; + MudList = new(class list); + ChannelList = new(class list); + MudList->ID = -1; + MudList->List = ([]); + ChannelList->ID = -1; + ChannelList->List = ([]); + save_object(SAVE_INTERMUD); + } + static void eventRead(mixed *packet) { mixed val; string cle; *************** *** 164,169 **** --- 179,185 ---- break; case "chanlist-reply": // if( packet[6] == ChannelList->ID ) return; + tn("chanlist reply: "+identify(packet), "blue"); if( packet[2] != Nameservers[0][0] ) return; ChannelList->ID = packet[6]; foreach(cle, val in packet[7]) { diff -c -r --new-file ds2.0r22/lib/daemon/races.c ds2.0r29/lib/daemon/races.c *** ds2.0r22/lib/daemon/races.c Mon May 15 01:14:02 2006 --- ds2.0r29/lib/daemon/races.c Wed Jul 5 00:00:58 2006 *************** *** 220,226 **** case "RACE": race = replace_string(line, "RACE ", ""); ! if( Races[race] ) error("Race already exists"); break; case "SENSITIVITY": --- 220,226 ---- case "RACE": race = replace_string(line, "RACE ", ""); ! if( Races[race] ) error(race+": Race already exists"); break; case "SENSITIVITY": diff -c -r --new-file ds2.0r22/lib/daemon/services/auth.c ds2.0r29/lib/daemon/services/auth.c *** ds2.0r22/lib/daemon/services/auth.c Fri May 12 21:13:05 2006 --- ds2.0r29/lib/daemon/services/auth.c Wed Jul 5 00:01:03 2006 *************** *** 35,41 **** if(!grepp(mudlist,packet[2]) || packet[2] == "DeadSoulsNew" || packet[2] == "DeadSoulsWin"){ write_file("/tmp/muds.txt",packet[2]+"\n"); ! //tc("We have a new mud! "+packet[2]+" has joined intermud.","red"); tn("We have a new mud! "+packet[2]+" has joined intermud.","red"); } --- 35,41 ---- if(!grepp(mudlist,packet[2]) || packet[2] == "DeadSoulsNew" || packet[2] == "DeadSoulsWin"){ write_file("/tmp/muds.txt",packet[2]+"\n"); ! tc("We have a new mud! "+packet[2]+" has joined intermud.","red"); tn("We have a new mud! "+packet[2]+" has joined intermud.","red"); } diff -c -r --new-file ds2.0r22/lib/daemon/services/channel.c ds2.0r29/lib/daemon/services/channel.c *** ds2.0r22/lib/daemon/services/channel.c Sun Apr 9 23:49:20 2006 --- ds2.0r29/lib/daemon/services/channel.c Wed Jul 5 00:01:03 2006 *************** *** 12,17 **** --- 12,21 ---- #include #include + static private string *local_chans = ({"newbie","cre","gossip","admin","error", + "priest", "mage", "explorer", "thief", "fighter", "death" }); + + void eventReceiveChannelWhoReply(mixed array packet) { object ob; tn("eventReceiveChannelWhoReply: "+identify(packet),"green"); *************** *** 136,143 **** } else packet = ({ "channel-m", 5, mud_name(), convert_name(who), 0, 0, ch, who, msg }); ! INTERMUD_D->eventWrite(packet); ! tn("eventSendChannel processed: "+identify(packet),"green"); } void eventSendChannelWhoRequest(string channel, string mud) { --- 140,149 ---- } else packet = ({ "channel-m", 5, mud_name(), convert_name(who), 0, 0, ch, who, msg }); ! if(member_array(ch, local_chans) == -1){ ! INTERMUD_D->eventWrite(packet); ! tn("eventSendChannel processed: "+identify(packet),"green"); ! } } void eventSendChannelWhoRequest(string channel, string mud) { diff -c -r --new-file ds2.0r22/lib/daemon/services/who.c ds2.0r29/lib/daemon/services/who.c *** ds2.0r22/lib/daemon/services/who.c Sun Apr 9 23:49:20 2006 --- ds2.0r29/lib/daemon/services/who.c Wed Jul 5 00:01:03 2006 *************** *** 10,24 **** #include void eventReceiveWhoReply(mixed *packet) { ! string *list, *who; object ob; if( file_name(previous_object()) != INTERMUD_D ) return; if( !packet[5] || !(ob = find_player(convert_name(packet[5]))) ) return; ! list = ({ "Remote who information from " + packet[2] + ":" }); foreach(who in packet[6]) ! list += ({ who[0] + " (" + who[1] + " idle): " + who[2] }); ! ob->eventPage(list); tn("eventReceiveWhoReply: "+identify(packet),"blue"); } --- 10,27 ---- #include void eventReceiveWhoReply(mixed *packet) { ! string list, *who; object ob; + //tc("who packet: "+identify(packet)); if( file_name(previous_object()) != INTERMUD_D ) return; if( !packet[5] || !(ob = find_player(convert_name(packet[5]))) ) return; ! list = "%^MAGENTA%^Remote who information from " + packet[2] + ":%^RESET%^\n"; foreach(who in packet[6]) ! list += who[0] + " (" + who[1] + " idle): " + who[2] +"\n"; ! //tc("list: "+list,"blue"); ! //ob->eventPage(({list})); ! ob->eventPrint(list); tn("eventReceiveWhoReply: "+identify(packet),"blue"); } *************** *** 42,48 **** void eventSendWhoRequest(string mud) { string who; ! who = (string)this_player(1)->GetName(); INTERMUD_D->eventWrite(({ "who-req", 5, mud_name(), who, mud, 0 })); tn("eventSendWhoRequest: "+identify( ({ "who-req", 5, mud_name(), who, mud, 0 })), "blue"); } --- 45,51 ---- void eventSendWhoRequest(string mud) { string who; ! who = (string)this_player(1)->GetKeyName(); INTERMUD_D->eventWrite(({ "who-req", 5, mud_name(), who, mud, 0 })); tn("eventSendWhoRequest: "+identify( ({ "who-req", 5, mud_name(), who, mud, 0 })), "blue"); } diff -c -r --new-file ds2.0r22/lib/daemon/stargate.c ds2.0r29/lib/daemon/stargate.c *** ds2.0r22/lib/daemon/stargate.c Fri May 12 21:13:10 2006 --- ds2.0r29/lib/daemon/stargate.c Wed Jul 5 00:00:58 2006 *************** *** 85,92 **** } string GetDestination(string address){ //tc("Stargates: "+identify(Stargates),"white"); ! return Stargates[address]["destination"]; } string GetEndpoint(string address){ --- 85,95 ---- } 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){ *************** *** 129,134 **** --- 132,138 ---- int eventDisconnect(string from){ string endpoint; + if(!from || from == "") return 0; //tc("Stargates: "+identify(Stargates),"blue"); if (!Stargates[from] || !sizeof(Stargates[from])) return 0; *************** *** 136,146 **** endpoint = Stargates[from]["endpoint"]; if (!endpoint) return 0; ! Stargates[endpoint]["endpoint"] = ""; ! Stargates[endpoint]["status"] = "idle"; Stargates[from]["endpoint"] = ""; Stargates[from]["status"] = "idle"; eventSave(); return 1; } --- 140,153 ---- 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.0r22/lib/daemon/verbs.c ds2.0r29/lib/daemon/verbs.c *** ds2.0r22/lib/daemon/verbs.c Wed Feb 22 15:29:50 2006 --- ds2.0r29/lib/daemon/verbs.c Sun Jul 9 19:04:26 2006 *************** *** 23,29 **** string verb; int i; - //tc("/daemon/verbs: eventReloadVerbs"); if( arrayp(val) ) verbs = filter(val, (: GetValidVerb($1) :)); else if( stringp(val) ) { if( strlen(val) > 2 && val[<2..] == ".c" ) val = val[0..<3]; --- 23,28 ---- *************** *** 51,56 **** --- 50,63 ---- break; } } + foreach(dir in get_dir(DIR_SECURE_VERBS + "/")) { + dir = DIR_SECURE_VERBS + "/" + dir; + if( file_size(dir) != -2 ) continue; + if( file_exists( dir + "/" + val + ".c") ) { + verbs = ({ dir + "/" + val }); + break; + } + } if( !verbs ) return; } } *************** *** 64,69 **** --- 71,81 ---- if( file_size(dir) == -2 ) verbs += map(get_dir(dir + "/*.c"), (: $(dir) + "/" + $1 :)); } + foreach(dir in get_dir(DIR_SECURE_VERBS + "/")) { + dir = DIR_SECURE_VERBS + "/" + dir; + if( file_size(dir) == -2 ) + verbs += map(get_dir(dir + "/*.c"), (: $(dir) + "/" + $1 :)); + } } i = 0; foreach(verb in verbs) { *************** *** 87,101 **** } string GetErrorMessage(string verb) { - //tc("/daemon/verbs: GetErrorMessage"); if( !Verbs[verb] ) return 0; else return (string)Verbs[verb]->GetErrorMessage(); } int GetValidVerb(string verb) { ! //tc("/daemon/verbs: GetValidVerb: verb: "+verb); ! return !strsrch(verb, DIR_VERBS); ! //key_arr = keys(GetVerbs()); } mapping GetVerbs() { return copy(Verbs); } --- 99,111 ---- } string GetErrorMessage(string verb) { if( !Verbs[verb] ) return 0; else return (string)Verbs[verb]->GetErrorMessage(); } int GetValidVerb(string verb) { ! if(!strsrch(verb, DIR_VERBS) || !strsrch(verb, DIR_VERBS)) return 1; ! else return 0; } mapping GetVerbs() { return copy(Verbs); } diff -c -r --new-file ds2.0r22/lib/doc/CREDITS ds2.0r29/lib/doc/CREDITS *** ds2.0r22/lib/doc/CREDITS Mon May 15 11:27:29 2006 --- ds2.0r29/lib/doc/CREDITS Sat Jul 8 23:30:54 2006 *************** *** 3,22 **** Sine qua non: Descartes, the legion of MudOS developers, and all those coders who toiled at Nightmare, and Lars Pensjö. Direct conributors: Haderach and his clever code and inspiration, Duuk and his willingness to let me poke through his lib and filch code. Great thanks to Marajin for his direct and substantial contribution to the Windows port. Thanks also to the following for code donation, support, and/or contribution: Tim@TimMUD, Manchi, ! Brodbane, Ashon, Shadyman, Jonez, Cecil. Appreciation of: Jayren, Kaylus, Arianrhod, Nosmo, Pyro, Abby, Balmung, Aten, Metiscus, Garfield, Javelin, Alensin, Daelas, ! and Detah for their thoughtful comments and suggestions. Also: Xyzzy He Is Cool --- 3,27 ---- 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. + Much gratitude to playtesters: Karri, Aten, Tacitus. + Also: Xyzzy He Is Cool diff -c -r --new-file ds2.0r22/lib/doc/README ds2.0r29/lib/doc/README *** ds2.0r22/lib/doc/README Mon Jan 23 09:17:12 2006 --- ds2.0r29/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.0r22/lib/doc/RELEASE_NOTES ds2.0r29/lib/doc/RELEASE_NOTES *** ds2.0r22/lib/doc/RELEASE_NOTES Mon May 15 11:33:57 2006 --- ds2.0r29/lib/doc/RELEASE_NOTES Sun Jul 9 19:04:27 2006 *************** *** 1,3 **** --- 1,143 ---- + ---- 2.0r29 --- + - Fixed finger daemon to not display ip addresses to players. + - The verb copy now handles relative paths more gracefully. + - LIB_TEACHER can now know all languages with SetAllLanguages(1) + - Standard chairs and beds can no longer be taken when someone is using them. + - Fixed church elevator buttons. + - Fixed problem with "look at pile". + - Fixed problem with examining objects on surfaces. + - It is now also possible to look at things carried by others, + e.g. "look at shirt on fighter". + - Remote finger no longer betrays invisible people. + - Added sefun: alpha_strip + - Room descriptions now indicate which piece of furniture a creature + is resting on, if applicable. + - Objects on surfaces than can be sat or lain in are not visible + or accessible if someone is lying or sitting on that surface. e.g., + you can't examine or get the glasses under your butt on the chair. + - SetMaxHealthPoints now works as one would expect. The kitchen rat + is invincible no more. + - Look at problem fixed. + - Bank tellers (Zoe) now do a better job of retaining the correct + surcharge on currency withdrawals. + - Added /secure/obj/glasses.c as a creation object. Since you wear them, + it's hard to lose them accidentally. Since few things are called "glasses", + they won't get in the way of creating objects. New creators will have them + automatically added to the table in their sample room. + - One may now have a smiley in front of a channel message without + it turning into an emote. + - Fixed a conflict in the parsing system. + - Verbified "force". + - Fixed vendor bugs: appraising at zero, confusion with similar items. + - Beefed up the answers_to sefun, to handle adjectives. + - Fixed a couple of bugs in the lead/follow system. + - Fixed null error when selling to non-vendors. + - Fixed a channel log bug that logged to one of two files for + some channels, depending on whether someone was logged on (!!). + - Fixed bug in meals that prevented empty bottles replacing + full ones. + - Fixed a bug in the MudOS parser that screwed up things with apostrophes. + + ---- 2.0r28 --- + - Fixed minor bug in body.c that interfered with collapsing. + - Fixed message boards. + - Added command: snoopreport + - Fixed bug that caused players to be essentially immortal. + - Player death history is now accurately recorded. + - The command mudlist now ignores colors. + + ---- 2.0r27 --- + - Fixed currency problem in dying NPC's. + - Added commands: env, polyglottize + - Fixed "about" verb. + - Tweaked snoop daemon and snoop objects. + - Added pay-for-lessons feature in language teachers. + - Fixed bug in LIB_EXITS that hosed various things, + including wandering NPC's. + - mv command no longer overwrites an existing destination file. + - Fixed campus rooms with hosed CanReceive()'s that horked logins. + - Turned "move" command into "transfer", to address a conflict with + the "move" verb. - Fixed bug in admintool that prevented assistant admins from + using it. + - Fixed bug in eval that prevented assistant admins from using it. + - i3router: dynamic channel data is now persistent (newly created + channels won't disappear when the router resets). + - i3router: fixed a bug in chanlist-reply that stopped the + channel list being sent to LPUni lib muds. + - Modified install process to handle compiling on Wolfpaw servers. + - Added code example domain that was donated by Daelas @ Moraelinost. + - Added new podium, conference room, and margins command that were + donated by Daelas @ Moraelinost. + - i3router: correct password is now honored. + - Fixed help daemon bug that displayed race help twice. + - QCS: creating an enter no longer wipes exits from an existing + target room. + - Fixed bug in rescue login (Thanks, Nulvect). + - Fixed bug in tell command that mishandled mud name ambiguity. + - Fixed bug in CHAT_D that failed to return remote channel listeners. + - i3router: fixed bug that incorrectly rejected targeted emotes. + - Killing a creature super-ultra-extremely fast no longer + generates multiple corpses. + - QCS: Fixed some money problems with both how much things cost and + how much money they have. + - Modified encumbrance to be rather less cumbersome. + - Mailer default behavior now is to notify you when you receive new + mail. Already created characters do not have this default. + - Fixed opacity problem in worn storage. + - Fixed message board in arch room. + + ---- 2.0r26 --- + - Plugged some serious security holes ( http://dead-souls.net/news.html#16jun06 ) + - Cleaned up some unnecessary call_outs in lib objects. + - Added LIB_PULL. + - Added Virtual Campus domain. + - Fixed qcs problem that screwed LIB_DUMMY. + - Fixed local channel emote problem in RESTRICTED_INTERMUD mode. + - Added sefun: alpha_crypt. + - Added conference room east of the Adventurer's Hall. + - admintool no longer lets you remove the last + currency. + - COMPAT BUSTER: UNIX version now uses MD5 crypt, like the Windows + version. Character files created prior to using this driver + will not work with this driver. + - rwho no longer cares if the issuer of the + command is invisible. + + ---- 2.0r25 --- + - r24 had some unfortunate licensing problems attached. + r25 includes a Win32 native binary that does not depend + on any GPL code to run. + - This release is hereby dedicated to Saquivor, who was + instrumental in getting this binary compiled. + - r25 lib does not differ from r24 or r23. Unless you + need the native Win32 binary, you should skip this + release if you have r23 or r24. + + ---- 2.0r24 --- + - Ran into some trouble when releasing r23. For + technical reasons, it's being re-released as r24. + + ---- 2.0r23 --- + - Fixed a bug that sent local channel data to the i3 + router. Sorry about this, guys. As soon as I found + this, I killed it. It appears to have affected r22 only. + - 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. *************** *** 10,17 **** - 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 items must be removed before they can be dropped. ! - Worn items must be removed before they can be sold. - Consolidated Windows and UNIX distributions into a single download file. - Converted class variables in STARGATE_D to mappings, --- 150,157 ---- - 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, diff -c -r --new-file ds2.0r22/lib/doc/SUPPORT ds2.0r29/lib/doc/SUPPORT *** ds2.0r22/lib/doc/SUPPORT Mon Jan 23 09:17:12 2006 --- ds2.0r29/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.0r22/lib/doc/faq/admin ds2.0r29/lib/doc/faq/admin *** ds2.0r22/lib/doc/faq/admin Sat Mar 11 11:22:47 2006 --- ds2.0r29/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.0r22/lib/doc/faq/general ds2.0r29/lib/doc/faq/general *** ds2.0r22/lib/doc/faq/general Sat Mar 11 11:22:47 2006 --- ds2.0r29/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.0r22/lib/doc/guide/chapter01 ds2.0r29/lib/doc/guide/chapter01 *** ds2.0r22/lib/doc/guide/chapter01 Sat Mar 11 11:14:53 2006 --- ds2.0r29/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.0r22/lib/doc/guide/chapter02 ds2.0r29/lib/doc/guide/chapter02 *** ds2.0r22/lib/doc/guide/chapter02 Mon Jan 23 09:17:12 2006 --- ds2.0r29/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.0r22/lib/doc/guide/chapter03 ds2.0r29/lib/doc/guide/chapter03 *** ds2.0r22/lib/doc/guide/chapter03 Sat Mar 11 11:14:53 2006 --- ds2.0r29/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.0r22/lib/doc/guide/chapter04 ds2.0r29/lib/doc/guide/chapter04 *** ds2.0r22/lib/doc/guide/chapter04 Sat Mar 11 11:14:53 2006 --- ds2.0r29/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.0r22/lib/doc/guide/chapter05 ds2.0r29/lib/doc/guide/chapter05 *** ds2.0r22/lib/doc/guide/chapter05 Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/doc/guide/chapter06 ds2.0r29/lib/doc/guide/chapter06 *** ds2.0r22/lib/doc/guide/chapter06 Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/doc/guide/chapter07 ds2.0r29/lib/doc/guide/chapter07 *** ds2.0r22/lib/doc/guide/chapter07 Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/doc/guide/chapter08 ds2.0r29/lib/doc/guide/chapter08 *** ds2.0r22/lib/doc/guide/chapter08 Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/doc/guide/chapter09 ds2.0r29/lib/doc/guide/chapter09 *** ds2.0r22/lib/doc/guide/chapter09 Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/doc/hbook/chapter02 ds2.0r29/lib/doc/hbook/chapter02 *** ds2.0r22/lib/doc/hbook/chapter02 Sat Mar 11 11:14:53 2006 --- ds2.0r29/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.0r22/lib/doc/hbook/chapter03 ds2.0r29/lib/doc/hbook/chapter03 *** ds2.0r22/lib/doc/hbook/chapter03 Sat Mar 11 11:14:53 2006 --- ds2.0r29/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.0r22/lib/doc/hbook/chapter04 ds2.0r29/lib/doc/hbook/chapter04 *** ds2.0r22/lib/doc/hbook/chapter04 Sat Mar 11 11:14:53 2006 --- ds2.0r29/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.0r22/lib/doc/hbook/chapter07 ds2.0r29/lib/doc/hbook/chapter07 *** ds2.0r22/lib/doc/hbook/chapter07 Mon Jan 23 09:17:12 2006 --- ds2.0r29/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.0r22/lib/doc/help/creators/admin ds2.0r29/lib/doc/help/creators/admin *** ds2.0r22/lib/doc/help/creators/admin Fri May 12 21:13:22 2006 --- ds2.0r29/lib/doc/help/creators/admin Wed Jul 5 00:01:10 2006 *************** *** 10,18 **** Your most valuable tools will be the Dead Souls FAQs: ! http://dead-souls.sourceforge.net/ds-admin-faq.html ! http://dead-souls.sourceforge.net/ds-creator-faq.html Almost everything else will flow from your familiarity and understanding of the information there. --- 10,18 ---- Your most valuable tools will be the Dead Souls FAQs: ! http://dead-souls.net/ds-admin-faq.html ! http://dead-souls.net/ds-creator-faq.html Almost everything else will flow from your familiarity and understanding of the information there. diff -c -r --new-file ds2.0r22/lib/doc/help/creators/creation ds2.0r29/lib/doc/help/creators/creation *** ds2.0r22/lib/doc/help/creators/creation Mon Jan 23 09:17:12 2006 --- ds2.0r29/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.0r22/lib/doc/help/creators/creator_general ds2.0r29/lib/doc/help/creators/creator_general *** ds2.0r22/lib/doc/help/creators/creator_general Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/doc/help/creators/plan ds2.0r29/lib/doc/help/creators/plan *** ds2.0r22/lib/doc/help/creators/plan Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/doc/help/creators/plan Fri Jul 7 19:41:41 2006 *************** *** 0 **** --- 1,7 ---- + Your plan file is the extra information others see when + they finger you, usually listing what your projects are + and what you've been up to. To modify your plan, + edit the .plan file in your home directory. For example, + + cd + ed .plan diff -c -r --new-file ds2.0r22/lib/doc/help/creators/profile ds2.0r29/lib/doc/help/creators/profile *** ds2.0r22/lib/doc/help/creators/profile Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/doc/help/creators/profile Fri Jul 7 19:41:41 2006 *************** *** 0 **** --- 1,11 ---- + Your profile is a file that contains a list of + instructions. When you log in, the mud will force + you to execute those commands. To modify what those + "startup commands" are, edit the .profile file in + your home directory. For example: + + cd + ed .profile + + Note that the mud cannot force you to do + certain things as a security measure. diff -c -r --new-file ds2.0r22/lib/doc/help/players/alias ds2.0r29/lib/doc/help/players/alias *** ds2.0r22/lib/doc/help/players/alias Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/doc/help/players/channels ds2.0r29/lib/doc/help/players/channels *** ds2.0r22/lib/doc/help/players/channels Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/doc/help/players/player_general ds2.0r29/lib/doc/help/players/player_general *** ds2.0r22/lib/doc/help/players/player_general Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/Ylsrim/room/armory.c ds2.0r29/lib/domains/Ylsrim/room/armory.c *** ds2.0r22/lib/domains/Ylsrim/room/armory.c Mon Nov 7 13:29:44 2005 --- ds2.0r29/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.0r22/lib/domains/Ylsrim/room/bazaar.c ds2.0r29/lib/domains/Ylsrim/room/bazaar.c *** ds2.0r22/lib/domains/Ylsrim/room/bazaar.c Wed Dec 7 13:59:22 2005 --- ds2.0r29/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.0r22/lib/domains/Ylsrim/room/kaliid4.c ds2.0r29/lib/domains/Ylsrim/room/kaliid4.c *** ds2.0r22/lib/domains/Ylsrim/room/kaliid4.c Wed Dec 7 13:59:22 2005 --- ds2.0r29/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.0r22/lib/domains/Ylsrim/room/vote_hall.c ds2.0r29/lib/domains/Ylsrim/room/vote_hall.c *** ds2.0r22/lib/domains/Ylsrim/room/vote_hall.c Mon Nov 7 13:29:44 2005 --- ds2.0r29/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.0r22/lib/domains/Ylsrim/room/weaponry.c ds2.0r29/lib/domains/Ylsrim/room/weaponry.c *** ds2.0r22/lib/domains/Ylsrim/room/weaponry.c Mon Nov 7 13:29:44 2005 --- ds2.0r29/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.0r22/lib/domains/campus/adm/README ds2.0r29/lib/domains/campus/adm/README *** ds2.0r22/lib/domains/campus/adm/README Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/adm/access.c ds2.0r29/lib/domains/campus/adm/access.c *** ds2.0r22/lib/domains/campus/adm/access.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/adm/cache.c ds2.0r29/lib/domains/campus/adm/cache.c *** ds2.0r22/lib/domains/campus/adm/cache.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/adm/death.txt ds2.0r29/lib/domains/campus/adm/death.txt *** ds2.0r22/lib/domains/campus/adm/death.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/adm/freezer.c ds2.0r29/lib/domains/campus/adm/freezer.c *** ds2.0r22/lib/domains/campus/adm/freezer.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/adm/furnace.c ds2.0r29/lib/domains/campus/adm/furnace.c *** ds2.0r22/lib/domains/campus/adm/furnace.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/adm/pod.c ds2.0r29/lib/domains/campus/adm/pod.c *** ds2.0r22/lib/domains/campus/adm/pod.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/adm/void.c ds2.0r29/lib/domains/campus/adm/void.c *** ds2.0r22/lib/domains/campus/adm/void.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/badge.c ds2.0r29/lib/domains/campus/armor/badge.c *** ds2.0r22/lib/domains/campus/armor/badge.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/bdu.c ds2.0r29/lib/domains/campus/armor/bdu.c *** ds2.0r22/lib/domains/campus/armor/bdu.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/bluedress.c ds2.0r29/lib/domains/campus/armor/bluedress.c *** ds2.0r22/lib/domains/campus/armor/bluedress.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/chainmail.c ds2.0r29/lib/domains/campus/armor/chainmail.c *** ds2.0r22/lib/domains/campus/armor/chainmail.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/collar.c ds2.0r29/lib/domains/campus/armor/collar.c *** ds2.0r22/lib/domains/campus/armor/collar.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/dress.c ds2.0r29/lib/domains/campus/armor/dress.c *** ds2.0r22/lib/domains/campus/armor/dress.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/foodsmock.c ds2.0r29/lib/domains/campus/armor/foodsmock.c *** ds2.0r22/lib/domains/campus/armor/foodsmock.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/domains/campus/armor/foodsmock.c Sun Jul 9 22:06:36 2006 *************** *** 0 **** --- 1,18 ---- + #include + #include + #include + inherit LIB_ARMOR; + + static void create(){ + armor::create(); + SetKeyName("uniform"); + SetAdjectives( ({"food workers","food worker's"}) ); + 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.0r22/lib/domains/campus/armor/glove.c ds2.0r29/lib/domains/campus/armor/glove.c *** ds2.0r22/lib/domains/campus/armor/glove.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/handbag.c ds2.0r29/lib/domains/campus/armor/handbag.c *** ds2.0r22/lib/domains/campus/armor/handbag.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/helmet.c ds2.0r29/lib/domains/campus/armor/helmet.c *** ds2.0r22/lib/domains/campus/armor/helmet.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/jeans.c ds2.0r29/lib/domains/campus/armor/jeans.c *** ds2.0r22/lib/domains/campus/armor/jeans.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/necklace.c ds2.0r29/lib/domains/campus/armor/necklace.c *** ds2.0r22/lib/domains/campus/armor/necklace.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/newbie_cap.c ds2.0r29/lib/domains/campus/armor/newbie_cap.c *** ds2.0r22/lib/domains/campus/armor/newbie_cap.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/pillbox_hat.c ds2.0r29/lib/domains/campus/armor/pillbox_hat.c *** ds2.0r22/lib/domains/campus/armor/pillbox_hat.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/ring.c ds2.0r29/lib/domains/campus/armor/ring.c *** ds2.0r22/lib/domains/campus/armor/ring.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/ring1.c ds2.0r29/lib/domains/campus/armor/ring1.c *** ds2.0r22/lib/domains/campus/armor/ring1.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/robe.c ds2.0r29/lib/domains/campus/armor/robe.c *** ds2.0r22/lib/domains/campus/armor/robe.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/shield.c ds2.0r29/lib/domains/campus/armor/shield.c *** ds2.0r22/lib/domains/campus/armor/shield.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/shirt.c ds2.0r29/lib/domains/campus/armor/shirt.c *** ds2.0r22/lib/domains/campus/armor/shirt.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/silverring.c ds2.0r29/lib/domains/campus/armor/silverring.c *** ds2.0r22/lib/domains/campus/armor/silverring.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/tshirt.c ds2.0r29/lib/domains/campus/armor/tshirt.c *** ds2.0r22/lib/domains/campus/armor/tshirt.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/vest.c ds2.0r29/lib/domains/campus/armor/vest.c *** ds2.0r22/lib/domains/campus/armor/vest.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/wglove_l.c ds2.0r29/lib/domains/campus/armor/wglove_l.c *** ds2.0r22/lib/domains/campus/armor/wglove_l.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/wglove_r.c ds2.0r29/lib/domains/campus/armor/wglove_r.c *** ds2.0r22/lib/domains/campus/armor/wglove_r.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/armor/wizard_hat.c ds2.0r29/lib/domains/campus/armor/wizard_hat.c *** ds2.0r22/lib/domains/campus/armor/wizard_hat.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/domains/campus/armor/wizard_hat.c Sun Jul 9 22:06:36 2006 *************** *** 0 **** --- 1,28 ---- + #include + #include + #include + inherit LIB_ARMOR; + + static void create(){ + armor::create(); + SetKeyName("wizard's hat"); + SetAdjectives( ({"wizard","wizards", "floppy", "large", "conical", "blue"}) ); + SetId( ({"hat"}) ); + 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."); + SetProperties(([ + "beta" : 2, + ])); + SetMass(50); + SetBaseCost("silver",500); + SetDamagePoints(100); + SetArmorType(A_HELMET); + SetProtection(BLUNT, 20); + SetProtection(BLADE, 20); + SetProtection(KNIFE, 20); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r22/lib/domains/campus/doors/blue_door.c ds2.0r29/lib/domains/campus/doors/blue_door.c *** ds2.0r22/lib/domains/campus/doors/blue_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/blue_door2.c ds2.0r29/lib/domains/campus/doors/blue_door2.c *** ds2.0r22/lib/domains/campus/doors/blue_door2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/blue_door3.c ds2.0r29/lib/domains/campus/doors/blue_door3.c *** ds2.0r22/lib/domains/campus/doors/blue_door3.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/grate.c ds2.0r29/lib/domains/campus/doors/grate.c *** ds2.0r22/lib/domains/campus/doors/grate.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/green_door.c ds2.0r29/lib/domains/campus/doors/green_door.c *** ds2.0r22/lib/domains/campus/doors/green_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/green_door2.c ds2.0r29/lib/domains/campus/doors/green_door2.c *** ds2.0r22/lib/domains/campus/doors/green_door2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/green_door3.c ds2.0r29/lib/domains/campus/doors/green_door3.c *** ds2.0r22/lib/domains/campus/doors/green_door3.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/plain_door.c ds2.0r29/lib/domains/campus/doors/plain_door.c *** ds2.0r22/lib/domains/campus/doors/plain_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/plain_door.test ds2.0r29/lib/domains/campus/doors/plain_door.test *** ds2.0r22/lib/domains/campus/doors/plain_door.test Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/prob_door.c ds2.0r29/lib/domains/campus/doors/prob_door.c *** ds2.0r22/lib/domains/campus/doors/prob_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/red_door.c ds2.0r29/lib/domains/campus/doors/red_door.c *** ds2.0r22/lib/domains/campus/doors/red_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/red_door2.c ds2.0r29/lib/domains/campus/doors/red_door2.c *** ds2.0r22/lib/domains/campus/doors/red_door2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/red_door3.c ds2.0r29/lib/domains/campus/doors/red_door3.c *** ds2.0r22/lib/domains/campus/doors/red_door3.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/steel_door.c ds2.0r29/lib/domains/campus/doors/steel_door.c *** ds2.0r22/lib/domains/campus/doors/steel_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/steel_door2.c ds2.0r29/lib/domains/campus/doors/steel_door2.c *** ds2.0r22/lib/domains/campus/doors/steel_door2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/top_stairs.c ds2.0r29/lib/domains/campus/doors/top_stairs.c *** ds2.0r22/lib/domains/campus/doors/top_stairs.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/doors/u_door.c ds2.0r29/lib/domains/campus/doors/u_door.c *** ds2.0r22/lib/domains/campus/doors/u_door.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/etc/permit.cfg ds2.0r29/lib/domains/campus/etc/permit.cfg *** ds2.0r22/lib/domains/campus/etc/permit.cfg Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/meals/ale.c ds2.0r29/lib/domains/campus/meals/ale.c *** ds2.0r22/lib/domains/campus/meals/ale.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/meals/apple.c ds2.0r29/lib/domains/campus/meals/apple.c *** ds2.0r22/lib/domains/campus/meals/apple.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/meals/badapple.c ds2.0r29/lib/domains/campus/meals/badapple.c *** ds2.0r22/lib/domains/campus/meals/badapple.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/meals/bourbon.c ds2.0r29/lib/domains/campus/meals/bourbon.c *** ds2.0r22/lib/domains/campus/meals/bourbon.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/meals/burger.c ds2.0r29/lib/domains/campus/meals/burger.c *** ds2.0r22/lib/domains/campus/meals/burger.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/meals/gator.c ds2.0r29/lib/domains/campus/meals/gator.c *** ds2.0r22/lib/domains/campus/meals/gator.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/meals/ham_sand.c ds2.0r29/lib/domains/campus/meals/ham_sand.c *** ds2.0r22/lib/domains/campus/meals/ham_sand.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/meals/milk.c ds2.0r29/lib/domains/campus/meals/milk.c *** ds2.0r22/lib/domains/campus/meals/milk.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/meals/salad.c ds2.0r29/lib/domains/campus/meals/salad.c *** ds2.0r22/lib/domains/campus/meals/salad.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/meals/water.c ds2.0r29/lib/domains/campus/meals/water.c *** ds2.0r22/lib/domains/campus/meals/water.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/meals/wimp_ale.c ds2.0r29/lib/domains/campus/meals/wimp_ale.c *** ds2.0r22/lib/domains/campus/meals/wimp_ale.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/npc/charles.c ds2.0r29/lib/domains/campus/npc/charles.c *** ds2.0r22/lib/domains/campus/npc/charles.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/npc/charly.c ds2.0r29/lib/domains/campus/npc/charly.c *** ds2.0r22/lib/domains/campus/npc/charly.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/npc/dummy.c ds2.0r29/lib/domains/campus/npc/dummy.c *** ds2.0r22/lib/domains/campus/npc/dummy.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/npc/gloria.c ds2.0r29/lib/domains/campus/npc/gloria.c *** ds2.0r22/lib/domains/campus/npc/gloria.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/npc/hans.c ds2.0r29/lib/domains/campus/npc/hans.c *** ds2.0r22/lib/domains/campus/npc/hans.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/npc/jennybot.c ds2.0r29/lib/domains/campus/npc/jennybot.c *** ds2.0r22/lib/domains/campus/npc/jennybot.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/npc/kim.c ds2.0r29/lib/domains/campus/npc/kim.c *** ds2.0r22/lib/domains/campus/npc/kim.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/npc/rat.c ds2.0r29/lib/domains/campus/npc/rat.c *** ds2.0r22/lib/domains/campus/npc/rat.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/npc/seth.c ds2.0r29/lib/domains/campus/npc/seth.c *** ds2.0r22/lib/domains/campus/npc/seth.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/npc/tim.c ds2.0r29/lib/domains/campus/npc/tim.c *** ds2.0r22/lib/domains/campus/npc/tim.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/npc/wim.c ds2.0r29/lib/domains/campus/npc/wim.c *** ds2.0r22/lib/domains/campus/npc/wim.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/npc/yulia.c ds2.0r29/lib/domains/campus/npc/yulia.c *** ds2.0r22/lib/domains/campus/npc/yulia.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/223clip.c ds2.0r29/lib/domains/campus/obj/223clip.c *** ds2.0r22/lib/domains/campus/obj/223clip.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/223round.c ds2.0r29/lib/domains/campus/obj/223round.c *** ds2.0r22/lib/domains/campus/obj/223round.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/357case.c ds2.0r29/lib/domains/campus/obj/357case.c *** ds2.0r22/lib/domains/campus/obj/357case.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/357round.c ds2.0r29/lib/domains/campus/obj/357round.c *** ds2.0r22/lib/domains/campus/obj/357round.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/357shell.c ds2.0r29/lib/domains/campus/obj/357shell.c *** ds2.0r22/lib/domains/campus/obj/357shell.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/50round.c ds2.0r29/lib/domains/campus/obj/50round.c *** ds2.0r22/lib/domains/campus/obj/50round.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/9mmclip.c ds2.0r29/lib/domains/campus/obj/9mmclip.c *** ds2.0r22/lib/domains/campus/obj/9mmclip.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/9mmround.c ds2.0r29/lib/domains/campus/obj/9mmround.c *** ds2.0r22/lib/domains/campus/obj/9mmround.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/abox.c ds2.0r29/lib/domains/campus/obj/abox.c *** ds2.0r22/lib/domains/campus/obj/abox.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/apple.c ds2.0r29/lib/domains/campus/obj/apple.c *** ds2.0r22/lib/domains/campus/obj/apple.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/backpack.c ds2.0r29/lib/domains/campus/obj/backpack.c *** ds2.0r22/lib/domains/campus/obj/backpack.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/backpack_civilian.c ds2.0r29/lib/domains/campus/obj/backpack_civilian.c *** ds2.0r22/lib/domains/campus/obj/backpack_civilian.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/backpack_empty.c ds2.0r29/lib/domains/campus/obj/backpack_empty.c *** ds2.0r22/lib/domains/campus/obj/backpack_empty.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/bag.c ds2.0r29/lib/domains/campus/obj/bag.c *** ds2.0r22/lib/domains/campus/obj/bag.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/bbucket.c ds2.0r29/lib/domains/campus/obj/bbucket.c *** ds2.0r22/lib/domains/campus/obj/bbucket.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/bench.c ds2.0r29/lib/domains/campus/obj/bench.c *** ds2.0r22/lib/domains/campus/obj/bench.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/bluebox.c ds2.0r29/lib/domains/campus/obj/bluebox.c *** ds2.0r22/lib/domains/campus/obj/bluebox.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/box.c ds2.0r29/lib/domains/campus/obj/box.c *** ds2.0r22/lib/domains/campus/obj/box.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/chair.c ds2.0r29/lib/domains/campus/obj/chair.c *** ds2.0r22/lib/domains/campus/obj/chair.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/clip.c ds2.0r29/lib/domains/campus/obj/clip.c *** ds2.0r22/lib/domains/campus/obj/clip.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/dcell.c ds2.0r29/lib/domains/campus/obj/dcell.c *** ds2.0r22/lib/domains/campus/obj/dcell.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/dcell_crappy.c ds2.0r29/lib/domains/campus/obj/dcell_crappy.c *** ds2.0r22/lib/domains/campus/obj/dcell_crappy.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/dcell_good.c ds2.0r29/lib/domains/campus/obj/dcell_good.c *** ds2.0r22/lib/domains/campus/obj/dcell_good.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/dcell_std.c ds2.0r29/lib/domains/campus/obj/dcell_std.c *** ds2.0r22/lib/domains/campus/obj/dcell_std.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/debris.c ds2.0r29/lib/domains/campus/obj/debris.c *** ds2.0r22/lib/domains/campus/obj/debris.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/flashlight.c ds2.0r29/lib/domains/campus/obj/flashlight.c *** ds2.0r22/lib/domains/campus/obj/flashlight.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/greenbox.c ds2.0r29/lib/domains/campus/obj/greenbox.c *** ds2.0r22/lib/domains/campus/obj/greenbox.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/key.c ds2.0r29/lib/domains/campus/obj/key.c *** ds2.0r22/lib/domains/campus/obj/key.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/key1.c ds2.0r29/lib/domains/campus/obj/key1.c *** ds2.0r22/lib/domains/campus/obj/key1.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/labkey.c ds2.0r29/lib/domains/campus/obj/labkey.c *** ds2.0r22/lib/domains/campus/obj/labkey.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/lever.c ds2.0r29/lib/domains/campus/obj/lever.c *** ds2.0r22/lib/domains/campus/obj/lever.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/list.c ds2.0r29/lib/domains/campus/obj/list.c *** ds2.0r22/lib/domains/campus/obj/list.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/locker.c ds2.0r29/lib/domains/campus/obj/locker.c *** ds2.0r22/lib/domains/campus/obj/locker.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/magbox.c ds2.0r29/lib/domains/campus/obj/magbox.c *** ds2.0r22/lib/domains/campus/obj/magbox.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/maglite.c ds2.0r29/lib/domains/campus/obj/maglite.c *** ds2.0r22/lib/domains/campus/obj/maglite.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/map.c ds2.0r29/lib/domains/campus/obj/map.c *** ds2.0r22/lib/domains/campus/obj/map.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/match.c ds2.0r29/lib/domains/campus/obj/match.c *** ds2.0r22/lib/domains/campus/obj/match.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/medbag.c ds2.0r29/lib/domains/campus/obj/medbag.c *** ds2.0r22/lib/domains/campus/obj/medbag.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/omni.c ds2.0r29/lib/domains/campus/obj/omni.c *** ds2.0r22/lib/domains/campus/obj/omni.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/pack.c ds2.0r29/lib/domains/campus/obj/pack.c *** ds2.0r22/lib/domains/campus/obj/pack.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/ped_button.c ds2.0r29/lib/domains/campus/obj/ped_button.c *** ds2.0r22/lib/domains/campus/obj/ped_button.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/pedestal.c ds2.0r29/lib/domains/campus/obj/pedestal.c *** ds2.0r22/lib/domains/campus/obj/pedestal.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/pedestal2.c ds2.0r29/lib/domains/campus/obj/pedestal2.c *** ds2.0r22/lib/domains/campus/obj/pedestal2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/pedestal3.c ds2.0r29/lib/domains/campus/obj/pedestal3.c *** ds2.0r22/lib/domains/campus/obj/pedestal3.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/pin.c ds2.0r29/lib/domains/campus/obj/pin.c *** ds2.0r22/lib/domains/campus/obj/pin.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/podium.c ds2.0r29/lib/domains/campus/obj/podium.c *** ds2.0r22/lib/domains/campus/obj/podium.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/pwatch.c ds2.0r29/lib/domains/campus/obj/pwatch.c *** ds2.0r22/lib/domains/campus/obj/pwatch.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/rayovac.c ds2.0r29/lib/domains/campus/obj/rayovac.c *** ds2.0r22/lib/domains/campus/obj/rayovac.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/redbox.c ds2.0r29/lib/domains/campus/obj/redbox.c *** ds2.0r22/lib/domains/campus/obj/redbox.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/round.c ds2.0r29/lib/domains/campus/obj/round.c *** ds2.0r22/lib/domains/campus/obj/round.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/round2.c ds2.0r29/lib/domains/campus/obj/round2.c *** ds2.0r22/lib/domains/campus/obj/round2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/sofa.c ds2.0r29/lib/domains/campus/obj/sofa.c *** ds2.0r22/lib/domains/campus/obj/sofa.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/spam.c ds2.0r29/lib/domains/campus/obj/spam.c *** ds2.0r22/lib/domains/campus/obj/spam.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/spent.c ds2.0r29/lib/domains/campus/obj/spent.c *** ds2.0r22/lib/domains/campus/obj/spent.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/squirtbag.c ds2.0r29/lib/domains/campus/obj/squirtbag.c *** ds2.0r22/lib/domains/campus/obj/squirtbag.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/stargate.c ds2.0r29/lib/domains/campus/obj/stargate.c *** ds2.0r22/lib/domains/campus/obj/stargate.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/thing.c ds2.0r29/lib/domains/campus/obj/thing.c *** ds2.0r22/lib/domains/campus/obj/thing.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/tlocker.c ds2.0r29/lib/domains/campus/obj/tlocker.c *** ds2.0r22/lib/domains/campus/obj/tlocker.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/torch.c ds2.0r29/lib/domains/campus/obj/torch.c *** ds2.0r22/lib/domains/campus/obj/torch.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/tree.c ds2.0r29/lib/domains/campus/obj/tree.c *** ds2.0r22/lib/domains/campus/obj/tree.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/watch.c ds2.0r29/lib/domains/campus/obj/watch.c *** ds2.0r22/lib/domains/campus/obj/watch.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/wlocker.c ds2.0r29/lib/domains/campus/obj/wlocker.c *** ds2.0r22/lib/domains/campus/obj/wlocker.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/wound.c ds2.0r29/lib/domains/campus/obj/wound.c *** ds2.0r22/lib/domains/campus/obj/wound.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/wrack.c ds2.0r29/lib/domains/campus/obj/wrack.c *** ds2.0r22/lib/domains/campus/obj/wrack.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/obj/yellowbox.c ds2.0r29/lib/domains/campus/obj/yellowbox.c *** ds2.0r22/lib/domains/campus/obj/yellowbox.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/access0.c ds2.0r29/lib/domains/campus/room/access0.c *** ds2.0r22/lib/domains/campus/room/access0.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/access1.c ds2.0r29/lib/domains/campus/room/access1.c *** ds2.0r22/lib/domains/campus/room/access1.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/access2.c ds2.0r29/lib/domains/campus/room/access2.c *** ds2.0r22/lib/domains/campus/room/access2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/access3.c ds2.0r29/lib/domains/campus/room/access3.c *** ds2.0r22/lib/domains/campus/room/access3.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/access4.c ds2.0r29/lib/domains/campus/room/access4.c *** ds2.0r22/lib/domains/campus/room/access4.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/access5.c ds2.0r29/lib/domains/campus/room/access5.c *** ds2.0r22/lib/domains/campus/room/access5.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/access6.c ds2.0r29/lib/domains/campus/room/access6.c *** ds2.0r22/lib/domains/campus/room/access6.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/access7.c ds2.0r29/lib/domains/campus/room/access7.c *** ds2.0r22/lib/domains/campus/room/access7.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/access9.c ds2.0r29/lib/domains/campus/room/access9.c *** ds2.0r22/lib/domains/campus/room/access9.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/basement.c ds2.0r29/lib/domains/campus/room/basement.c *** ds2.0r22/lib/domains/campus/room/basement.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/basement2.c ds2.0r29/lib/domains/campus/room/basement2.c *** ds2.0r22/lib/domains/campus/room/basement2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/blue_room.c ds2.0r29/lib/domains/campus/room/blue_room.c *** ds2.0r22/lib/domains/campus/room/blue_room.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/blue_room2.c ds2.0r29/lib/domains/campus/room/blue_room2.c *** ds2.0r22/lib/domains/campus/room/blue_room2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/blue_room3.c ds2.0r29/lib/domains/campus/room/blue_room3.c *** ds2.0r22/lib/domains/campus/room/blue_room3.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/bookstore.c ds2.0r29/lib/domains/campus/room/bookstore.c *** ds2.0r22/lib/domains/campus/room/bookstore.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/bookstore2.c ds2.0r29/lib/domains/campus/room/bookstore2.c *** ds2.0r22/lib/domains/campus/room/bookstore2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/conf.c ds2.0r29/lib/domains/campus/room/conf.c *** ds2.0r22/lib/domains/campus/room/conf.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/conf2.c ds2.0r29/lib/domains/campus/room/conf2.c *** ds2.0r22/lib/domains/campus/room/conf2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/corridor.c ds2.0r29/lib/domains/campus/room/corridor.c *** ds2.0r22/lib/domains/campus/room/corridor.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/corridor2.c ds2.0r29/lib/domains/campus/room/corridor2.c *** ds2.0r22/lib/domains/campus/room/corridor2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/corridor3.c ds2.0r29/lib/domains/campus/room/corridor3.c *** ds2.0r22/lib/domains/campus/room/corridor3.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/corridor4.c ds2.0r29/lib/domains/campus/room/corridor4.c *** ds2.0r22/lib/domains/campus/room/corridor4.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/crawlspace.c ds2.0r29/lib/domains/campus/room/crawlspace.c *** ds2.0r22/lib/domains/campus/room/crawlspace.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/death.c ds2.0r29/lib/domains/campus/room/death.c *** ds2.0r22/lib/domains/campus/room/death.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/foyer.c ds2.0r29/lib/domains/campus/room/foyer.c *** ds2.0r22/lib/domains/campus/room/foyer.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/freezer.c ds2.0r29/lib/domains/campus/room/freezer.c *** ds2.0r22/lib/domains/campus/room/freezer.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/furnace.c ds2.0r29/lib/domains/campus/room/furnace.c *** ds2.0r22/lib/domains/campus/room/furnace.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/green_room.c ds2.0r29/lib/domains/campus/room/green_room.c *** ds2.0r22/lib/domains/campus/room/green_room.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/green_room2.c ds2.0r29/lib/domains/campus/room/green_room2.c *** ds2.0r22/lib/domains/campus/room/green_room2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/green_room3.c ds2.0r29/lib/domains/campus/room/green_room3.c *** ds2.0r22/lib/domains/campus/room/green_room3.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/lounge.c ds2.0r29/lib/domains/campus/room/lounge.c *** ds2.0r22/lib/domains/campus/room/lounge.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/mailroom.c ds2.0r29/lib/domains/campus/room/mailroom.c *** ds2.0r22/lib/domains/campus/room/mailroom.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/monty.c ds2.0r29/lib/domains/campus/room/monty.c *** ds2.0r22/lib/domains/campus/room/monty.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/npath.c ds2.0r29/lib/domains/campus/room/npath.c *** ds2.0r22/lib/domains/campus/room/npath.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/npath2.c ds2.0r29/lib/domains/campus/room/npath2.c *** ds2.0r22/lib/domains/campus/room/npath2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/plab.c ds2.0r29/lib/domains/campus/room/plab.c *** ds2.0r22/lib/domains/campus/room/plab.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/plab2.c ds2.0r29/lib/domains/campus/room/plab2.c *** ds2.0r22/lib/domains/campus/room/plab2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/red_room.c ds2.0r29/lib/domains/campus/room/red_room.c *** ds2.0r22/lib/domains/campus/room/red_room.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/red_room2.c ds2.0r29/lib/domains/campus/room/red_room2.c *** ds2.0r22/lib/domains/campus/room/red_room2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/red_room3.c ds2.0r29/lib/domains/campus/room/red_room3.c *** ds2.0r22/lib/domains/campus/room/red_room3.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/science.c ds2.0r29/lib/domains/campus/room/science.c *** ds2.0r22/lib/domains/campus/room/science.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/science1.c ds2.0r29/lib/domains/campus/room/science1.c *** ds2.0r22/lib/domains/campus/room/science1.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/science2.c ds2.0r29/lib/domains/campus/room/science2.c *** ds2.0r22/lib/domains/campus/room/science2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/sewer.c ds2.0r29/lib/domains/campus/room/sewer.c *** ds2.0r22/lib/domains/campus/room/sewer.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/sewer.proto.c ds2.0r29/lib/domains/campus/room/sewer.proto.c *** ds2.0r22/lib/domains/campus/room/sewer.proto.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/sewer1.c ds2.0r29/lib/domains/campus/room/sewer1.c *** ds2.0r22/lib/domains/campus/room/sewer1.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/sewer2.c ds2.0r29/lib/domains/campus/room/sewer2.c *** ds2.0r22/lib/domains/campus/room/sewer2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/slab.c ds2.0r29/lib/domains/campus/room/slab.c *** ds2.0r22/lib/domains/campus/room/slab.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/snack.c ds2.0r29/lib/domains/campus/room/snack.c *** ds2.0r22/lib/domains/campus/room/snack.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/spath.c ds2.0r29/lib/domains/campus/room/spath.c *** ds2.0r22/lib/domains/campus/room/spath.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/square.c ds2.0r29/lib/domains/campus/room/square.c *** ds2.0r22/lib/domains/campus/room/square.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/stairwell.c ds2.0r29/lib/domains/campus/room/stairwell.c *** ds2.0r22/lib/domains/campus/room/stairwell.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/start.c ds2.0r29/lib/domains/campus/room/start.c *** ds2.0r22/lib/domains/campus/room/start.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/store.c ds2.0r29/lib/domains/campus/room/store.c *** ds2.0r22/lib/domains/campus/room/store.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/store2.c ds2.0r29/lib/domains/campus/room/store2.c *** ds2.0r22/lib/domains/campus/room/store2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/tunnel.c ds2.0r29/lib/domains/campus/room/tunnel.c *** ds2.0r22/lib/domains/campus/room/tunnel.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/tunnel2.c ds2.0r29/lib/domains/campus/room/tunnel2.c *** ds2.0r22/lib/domains/campus/room/tunnel2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/tunnel3.c ds2.0r29/lib/domains/campus/room/tunnel3.c *** ds2.0r22/lib/domains/campus/room/tunnel3.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/u_lab.c ds2.0r29/lib/domains/campus/room/u_lab.c *** ds2.0r22/lib/domains/campus/room/u_lab.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/uptree.c ds2.0r29/lib/domains/campus/room/uptree.c *** ds2.0r22/lib/domains/campus/room/uptree.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/usquare.c ds2.0r29/lib/domains/campus/room/usquare.c *** ds2.0r22/lib/domains/campus/room/usquare.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/void.c ds2.0r29/lib/domains/campus/room/void.c *** ds2.0r22/lib/domains/campus/room/void.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/room/wiz_lab.c ds2.0r29/lib/domains/campus/room/wiz_lab.c *** ds2.0r22/lib/domains/campus/room/wiz_lab.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/blue_wins ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/bak1/blue_wins *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/blue_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/fblue ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/bak1/fblue *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/fblue Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/fgreen ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/bak1/fgreen *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/fgreen Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/fred ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/bak1/fred *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/fred Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/green_wins ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/bak1/green_wins *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/green_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/percent ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/bak1/percent *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/percent Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/red_wins ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/bak1/red_wins *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/red_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/runs ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/bak1/runs *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/runs Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/stays ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/bak1/stays *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/stays Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/switches ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/bak1/switches *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/switches Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/wins ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/bak1/wins *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/bak1/wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/blue_wins ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/blue_wins *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/blue_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/fblue ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/fblue *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/fblue Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/fgreen ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/fgreen *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/fgreen Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/fred ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/fred *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/fred Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/green_wins ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/green_wins *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/green_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/percent ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/percent *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/percent Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/red_wins ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/red_wins *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/red_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/runs ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/runs *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/runs Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/stays ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/stays *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/stays Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/switches ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/switches *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/switches Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/bak2/wins ds2.0r29/lib/domains/campus/txt/ai/charles/bak2/wins *** ds2.0r22/lib/domains/campus/txt/ai/charles/bak2/wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/blue_wins ds2.0r29/lib/domains/campus/txt/ai/charles/blue_wins *** ds2.0r22/lib/domains/campus/txt/ai/charles/blue_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/fblue ds2.0r29/lib/domains/campus/txt/ai/charles/fblue *** ds2.0r22/lib/domains/campus/txt/ai/charles/fblue Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/fgreen ds2.0r29/lib/domains/campus/txt/ai/charles/fgreen *** ds2.0r22/lib/domains/campus/txt/ai/charles/fgreen Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/fred ds2.0r29/lib/domains/campus/txt/ai/charles/fred *** ds2.0r22/lib/domains/campus/txt/ai/charles/fred Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/green_wins ds2.0r29/lib/domains/campus/txt/ai/charles/green_wins *** ds2.0r22/lib/domains/campus/txt/ai/charles/green_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/percent ds2.0r29/lib/domains/campus/txt/ai/charles/percent *** ds2.0r22/lib/domains/campus/txt/ai/charles/percent Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/red_wins ds2.0r29/lib/domains/campus/txt/ai/charles/red_wins *** ds2.0r22/lib/domains/campus/txt/ai/charles/red_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/runs ds2.0r29/lib/domains/campus/txt/ai/charles/runs *** ds2.0r22/lib/domains/campus/txt/ai/charles/runs Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/stays ds2.0r29/lib/domains/campus/txt/ai/charles/stays *** ds2.0r22/lib/domains/campus/txt/ai/charles/stays Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/switches ds2.0r29/lib/domains/campus/txt/ai/charles/switches *** ds2.0r22/lib/domains/campus/txt/ai/charles/switches Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charles/wins ds2.0r29/lib/domains/campus/txt/ai/charles/wins *** ds2.0r22/lib/domains/campus/txt/ai/charles/wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/bak/blue_wins ds2.0r29/lib/domains/campus/txt/ai/charly/bak/blue_wins *** ds2.0r22/lib/domains/campus/txt/ai/charly/bak/blue_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/bak/fblue ds2.0r29/lib/domains/campus/txt/ai/charly/bak/fblue *** ds2.0r22/lib/domains/campus/txt/ai/charly/bak/fblue Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/bak/fgreen ds2.0r29/lib/domains/campus/txt/ai/charly/bak/fgreen *** ds2.0r22/lib/domains/campus/txt/ai/charly/bak/fgreen Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/bak/fred ds2.0r29/lib/domains/campus/txt/ai/charly/bak/fred *** ds2.0r22/lib/domains/campus/txt/ai/charly/bak/fred Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/bak/green_wins ds2.0r29/lib/domains/campus/txt/ai/charly/bak/green_wins *** ds2.0r22/lib/domains/campus/txt/ai/charly/bak/green_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/bak/percent ds2.0r29/lib/domains/campus/txt/ai/charly/bak/percent *** ds2.0r22/lib/domains/campus/txt/ai/charly/bak/percent Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/bak/red_wins ds2.0r29/lib/domains/campus/txt/ai/charly/bak/red_wins *** ds2.0r22/lib/domains/campus/txt/ai/charly/bak/red_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/bak/runs ds2.0r29/lib/domains/campus/txt/ai/charly/bak/runs *** ds2.0r22/lib/domains/campus/txt/ai/charly/bak/runs Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/bak/stays ds2.0r29/lib/domains/campus/txt/ai/charly/bak/stays *** ds2.0r22/lib/domains/campus/txt/ai/charly/bak/stays Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/bak/switches ds2.0r29/lib/domains/campus/txt/ai/charly/bak/switches *** ds2.0r22/lib/domains/campus/txt/ai/charly/bak/switches Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/bak/wins ds2.0r29/lib/domains/campus/txt/ai/charly/bak/wins *** ds2.0r22/lib/domains/campus/txt/ai/charly/bak/wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/blue_wins ds2.0r29/lib/domains/campus/txt/ai/charly/blue_wins *** ds2.0r22/lib/domains/campus/txt/ai/charly/blue_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/fblue ds2.0r29/lib/domains/campus/txt/ai/charly/fblue *** ds2.0r22/lib/domains/campus/txt/ai/charly/fblue Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/fgreen ds2.0r29/lib/domains/campus/txt/ai/charly/fgreen *** ds2.0r22/lib/domains/campus/txt/ai/charly/fgreen Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/fred ds2.0r29/lib/domains/campus/txt/ai/charly/fred *** ds2.0r22/lib/domains/campus/txt/ai/charly/fred Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/green_wins ds2.0r29/lib/domains/campus/txt/ai/charly/green_wins *** ds2.0r22/lib/domains/campus/txt/ai/charly/green_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/percent ds2.0r29/lib/domains/campus/txt/ai/charly/percent *** ds2.0r22/lib/domains/campus/txt/ai/charly/percent Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/red_wins ds2.0r29/lib/domains/campus/txt/ai/charly/red_wins *** ds2.0r22/lib/domains/campus/txt/ai/charly/red_wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/runs ds2.0r29/lib/domains/campus/txt/ai/charly/runs *** ds2.0r22/lib/domains/campus/txt/ai/charly/runs Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/stays ds2.0r29/lib/domains/campus/txt/ai/charly/stays *** ds2.0r22/lib/domains/campus/txt/ai/charly/stays Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/switches ds2.0r29/lib/domains/campus/txt/ai/charly/switches *** ds2.0r22/lib/domains/campus/txt/ai/charly/switches Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/ai/charly/wins ds2.0r29/lib/domains/campus/txt/ai/charly/wins *** ds2.0r22/lib/domains/campus/txt/ai/charly/wins Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/bye.txt ds2.0r29/lib/domains/campus/txt/bye.txt *** ds2.0r22/lib/domains/campus/txt/bye.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/domains/campus/txt/bye.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,12 ---- + __________ __ __ ___________ __ + / /\ / /\ / / / /| / / + / / \ / / \ / / / // / /| + ********** / ** \ ** ***********/ ** | + ** |____** / ** / ** ** |______ ** | + ** / ** **/ **/ ** / /| ** | + **/ **/ \ **** | ** / // ** | + **********/ / ** | *********/ ** / + ** |____** // ** | ** |_________ **/ + ** / **/ ** | ** / /| / /| + **/ **/ ** / **/ // ** / + **********/ **/ ***********/ **/ diff -c -r --new-file ds2.0r22/lib/domains/campus/txt/dali.txt ds2.0r29/lib/domains/campus/txt/dali.txt *** ds2.0r22/lib/domains/campus/txt/dali.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/doh.txt ds2.0r29/lib/domains/campus/txt/doh.txt *** ds2.0r22/lib/domains/campus/txt/doh.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/dork.txt ds2.0r29/lib/domains/campus/txt/dork.txt *** ds2.0r22/lib/domains/campus/txt/dork.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/duh.txt ds2.0r29/lib/domains/campus/txt/duh.txt *** ds2.0r22/lib/domains/campus/txt/duh.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/finger.txt ds2.0r29/lib/domains/campus/txt/finger.txt *** ds2.0r22/lib/domains/campus/txt/finger.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/hi.txt ds2.0r29/lib/domains/campus/txt/hi.txt *** ds2.0r22/lib/domains/campus/txt/hi.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/domains/campus/txt/hi.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,17 ---- + ******** ******** ********************* + * ** * ** * ** + * * * * * * * * * + * * * * * * * * * + ******** * ******** * ********************* * + ******** * ******** * ********************** + ******** * ******** * ********************* + ******** * ******** * ******** * + *********************** * ******** * + *********************** * ********** ******** + *********************** * * ******** * ** + ******** * ******** * * ******** * * * + ******** * ******** * * ******** * * + ******** * ******** * ********************* * + ********* ********* ********************** + ******** ******** ********************* + diff -c -r --new-file ds2.0r22/lib/domains/campus/txt/hug.txt ds2.0r29/lib/domains/campus/txt/hug.txt *** ds2.0r22/lib/domains/campus/txt/hug.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/huh.txt ds2.0r29/lib/domains/campus/txt/huh.txt *** ds2.0r22/lib/domains/campus/txt/huh.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/1.txt ds2.0r29/lib/domains/campus/txt/jenny/1.txt *** ds2.0r22/lib/domains/campus/txt/jenny/1.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/10.txt ds2.0r29/lib/domains/campus/txt/jenny/10.txt *** ds2.0r22/lib/domains/campus/txt/jenny/10.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/11.txt ds2.0r29/lib/domains/campus/txt/jenny/11.txt *** ds2.0r22/lib/domains/campus/txt/jenny/11.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/12.txt ds2.0r29/lib/domains/campus/txt/jenny/12.txt *** ds2.0r22/lib/domains/campus/txt/jenny/12.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/13.txt ds2.0r29/lib/domains/campus/txt/jenny/13.txt *** ds2.0r22/lib/domains/campus/txt/jenny/13.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/14.txt ds2.0r29/lib/domains/campus/txt/jenny/14.txt *** ds2.0r22/lib/domains/campus/txt/jenny/14.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/15.txt ds2.0r29/lib/domains/campus/txt/jenny/15.txt *** ds2.0r22/lib/domains/campus/txt/jenny/15.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/2.txt ds2.0r29/lib/domains/campus/txt/jenny/2.txt *** ds2.0r22/lib/domains/campus/txt/jenny/2.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/3.txt ds2.0r29/lib/domains/campus/txt/jenny/3.txt *** ds2.0r22/lib/domains/campus/txt/jenny/3.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/4.txt ds2.0r29/lib/domains/campus/txt/jenny/4.txt *** ds2.0r22/lib/domains/campus/txt/jenny/4.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/5.txt ds2.0r29/lib/domains/campus/txt/jenny/5.txt *** ds2.0r22/lib/domains/campus/txt/jenny/5.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/6.txt ds2.0r29/lib/domains/campus/txt/jenny/6.txt *** ds2.0r22/lib/domains/campus/txt/jenny/6.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/7.txt ds2.0r29/lib/domains/campus/txt/jenny/7.txt *** ds2.0r22/lib/domains/campus/txt/jenny/7.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/8.txt ds2.0r29/lib/domains/campus/txt/jenny/8.txt *** ds2.0r22/lib/domains/campus/txt/jenny/8.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/9.txt ds2.0r29/lib/domains/campus/txt/jenny/9.txt *** ds2.0r22/lib/domains/campus/txt/jenny/9.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/jenny/spiel.txt ds2.0r29/lib/domains/campus/txt/jenny/spiel.txt *** ds2.0r22/lib/domains/campus/txt/jenny/spiel.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/lisa.txt ds2.0r29/lib/domains/campus/txt/lisa.txt *** ds2.0r22/lib/domains/campus/txt/lisa.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/list.txt ds2.0r29/lib/domains/campus/txt/list.txt *** ds2.0r22/lib/domains/campus/txt/list.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/map.txt ds2.0r29/lib/domains/campus/txt/map.txt *** ds2.0r22/lib/domains/campus/txt/map.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/moochers.txt ds2.0r29/lib/domains/campus/txt/moochers.txt *** ds2.0r22/lib/domains/campus/txt/moochers.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/domains/campus/txt/moochers.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1 ---- + Testylus:EOF diff -c -r --new-file ds2.0r22/lib/domains/campus/txt/rose.txt ds2.0r29/lib/domains/campus/txt/rose.txt *** ds2.0r22/lib/domains/campus/txt/rose.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/skulls.txt ds2.0r29/lib/domains/campus/txt/skulls.txt *** ds2.0r22/lib/domains/campus/txt/skulls.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/domains/campus/txt/skulls.txt Wed Jul 5 00:01:11 2006 *************** *** 0 **** --- 1,23 ---- + + + * * + * * + ** ** + * ** ** * + ** ** * * ** ** + *** * ** ** * *** + **** ********************************* **** + ******* *** ******* *** ******* + ************ ***** ************ + ********** **** * ** ** ******* ********** + ********** ** ** ** **************** + *************** ** ** *** ** ***************** + ****** ********************* ****** ****** + ********************** *** + ************************ ** + **** ** ** **** ** ** ** + *** * * ** * * *** + ** ** + * * + + diff -c -r --new-file ds2.0r22/lib/domains/campus/txt/spam.txt ds2.0r29/lib/domains/campus/txt/spam.txt *** ds2.0r22/lib/domains/campus/txt/spam.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/txt/warning.txt ds2.0r29/lib/domains/campus/txt/warning.txt *** ds2.0r22/lib/domains/campus/txt/warning.txt Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/weap/357pistol.c ds2.0r29/lib/domains/campus/weap/357pistol.c *** ds2.0r22/lib/domains/campus/weap/357pistol.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/weap/9mil.c ds2.0r29/lib/domains/campus/weap/9mil.c *** ds2.0r22/lib/domains/campus/weap/9mil.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/weap/9mmpistol.c ds2.0r29/lib/domains/campus/weap/9mmpistol.c *** ds2.0r22/lib/domains/campus/weap/9mmpistol.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/weap/9mmpistol_loaded.c ds2.0r29/lib/domains/campus/weap/9mmpistol_loaded.c *** ds2.0r22/lib/domains/campus/weap/9mmpistol_loaded.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/weap/9mmpistol_mp.c ds2.0r29/lib/domains/campus/weap/9mmpistol_mp.c *** ds2.0r22/lib/domains/campus/weap/9mmpistol_mp.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/weap/board.c ds2.0r29/lib/domains/campus/weap/board.c *** ds2.0r22/lib/domains/campus/weap/board.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/weap/dagger.c ds2.0r29/lib/domains/campus/weap/dagger.c *** ds2.0r22/lib/domains/campus/weap/dagger.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/weap/grenade.c ds2.0r29/lib/domains/campus/weap/grenade.c *** ds2.0r22/lib/domains/campus/weap/grenade.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/weap/sharpsword.c ds2.0r29/lib/domains/campus/weap/sharpsword.c *** ds2.0r22/lib/domains/campus/weap/sharpsword.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/weap/staff.c ds2.0r29/lib/domains/campus/weap/staff.c *** ds2.0r22/lib/domains/campus/weap/staff.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/weap/sword.c ds2.0r29/lib/domains/campus/weap/sword.c *** ds2.0r22/lib/domains/campus/weap/sword.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/campus/weap/waterpistol.c ds2.0r29/lib/domains/campus/weap/waterpistol.c *** ds2.0r22/lib/domains/campus/weap/waterpistol.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/default/armor/badge.c ds2.0r29/lib/domains/default/armor/badge.c *** ds2.0r22/lib/domains/default/armor/badge.c Mon Jan 23 08:51:04 2006 --- ds2.0r29/lib/domains/default/armor/badge.c Sun Jul 9 22:06:36 2006 *************** *** 7,13 **** static void create(){ armor::create(); SetKeyName("visitor pass"); ! SetId(({"testchar badge","badge","pass","visitor 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 "+ --- 7,13 ---- static void create(){ armor::create(); SetKeyName("visitor 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 "+ diff -c -r --new-file ds2.0r22/lib/domains/default/armor/chainmail.c ds2.0r29/lib/domains/default/armor/chainmail.c *** ds2.0r22/lib/domains/default/armor/chainmail.c Wed Jan 4 20:42:51 2006 --- ds2.0r29/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.0r22/lib/domains/default/armor/combat_pack.c ds2.0r29/lib/domains/default/armor/combat_pack.c *** ds2.0r22/lib/domains/default/armor/combat_pack.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/default/armor/glove_l.c ds2.0r29/lib/domains/default/armor/glove_l.c *** ds2.0r22/lib/domains/default/armor/glove_l.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/default/armor/glove_r.c ds2.0r29/lib/domains/default/armor/glove_r.c *** ds2.0r22/lib/domains/default/armor/glove_r.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/default/armor/helmet.c ds2.0r29/lib/domains/default/armor/helmet.c *** ds2.0r22/lib/domains/default/armor/helmet.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/default/armor/long_boot_l.c ds2.0r29/lib/domains/default/armor/long_boot_l.c *** ds2.0r22/lib/domains/default/armor/long_boot_l.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/default/armor/long_boot_r.c ds2.0r29/lib/domains/default/armor/long_boot_r.c *** ds2.0r22/lib/domains/default/armor/long_boot_r.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/default/armor/pants.c ds2.0r29/lib/domains/default/armor/pants.c *** ds2.0r22/lib/domains/default/armor/pants.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/default/armor/wizard_hat.c ds2.0r29/lib/domains/default/armor/wizard_hat.c *** ds2.0r22/lib/domains/default/armor/wizard_hat.c Wed Apr 5 19:33:16 2006 --- ds2.0r29/lib/domains/default/armor/wizard_hat.c Sun Jul 9 22:06:36 2006 *************** *** 5,12 **** static void create(){ armor::create(); ! SetKeyName("wizards hat"); ! SetAdjectives( ({"wizards", "floppy", "large", "conical", "blue"}) ); SetId( ({"hat"}) ); SetShort("a wizard's hat"); SetLong("This is a large, floppy hat with a wide brim all "+ --- 5,12 ---- static void create(){ armor::create(); ! SetKeyName("wizard's hat"); ! SetAdjectives( ({"wizard","wizards", "floppy", "large", "conical", "blue"}) ); SetId( ({"hat"}) ); SetShort("a wizard's hat"); SetLong("This is a large, floppy hat with a wide brim all "+ diff -c -r --new-file ds2.0r22/lib/domains/default/npc/dummy.c ds2.0r29/lib/domains/default/npc/dummy.c *** ds2.0r22/lib/domains/default/npc/dummy.c Sun Jan 29 11:17:15 2006 --- ds2.0r29/lib/domains/default/npc/dummy.c Sun Jul 9 19:04:27 2006 *************** *** 17,22 **** --- 17,23 ---- ])); SetLevel(10); SetRace("golem"); + SetNativeLanguage("english"); SetClass("fighter"); SetGender("neuter"); SetMaxHealthPoints(9000); *************** *** 28,47 **** 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; --- 29,58 ---- evidence = ""; if(agent) evidence += "I receive damage from "+agent->GetKeyName(); if(type) { ! switch(type){ ! case BLUNT : evidence += ", damage type is BLUNT";break; ! case BLADE : evidence += ", damage type is BLADE";break; ! case KNIFE : evidence += ", damage type is KNIFE";break; ! case WATER : evidence += ", damage type is WATER";break; ! case SHOCK : evidence += ", damage type is SHOCK";break; ! case COLD : evidence += ", damage type is COLD";break; ! case HEAT : evidence += ", damage type is HEAT";break; ! case GAS : evidence += ", damage type is GAS";break; ! case ACID : evidence += ", damage type is ACID";break; ! case MAGIC : evidence += ", damage type is MAGIC";break; ! case POISON : evidence += ", damage type is POISON";break; ! case DISEASE : evidence += ", damage type is DISEASE";break; ! case TRAUMA : evidence += ", damage type is TRAUMA";break; ! case PIERCE : evidence += ", damage type is PIERCE";break; ! case PSIONIC : evidence += ", damage type is PSIONIC";break; ! case ANOXIA : evidence += ", damage type is ANOXIA";break; ! case DEATHRAY : evidence += ", damage type is DEATHRAY";break; ! case EMOTIONAL : evidence += ", damage type is EMOTIONAL";break; ! case SONIC : evidence += ", damage type is SONIC";break; ! case BITE : evidence += ", damage type is BITE";break; ! case OTHER : evidence += ", damage type is OTHER";break; ! default : evidence += ", damage type is UNKNOWN";break; ! } } if(x) evidence += ", raw damage is "+x; if(internal) evidence += ", internal variable is "+internal; diff -c -r --new-file ds2.0r22/lib/domains/default/npc/fighter.c ds2.0r29/lib/domains/default/npc/fighter.c *** ds2.0r22/lib/domains/default/npc/fighter.c Fri Mar 24 14:36:36 2006 --- ds2.0r29/lib/domains/default/npc/fighter.c Sat Jul 8 23:30:54 2006 *************** *** 9,23 **** SetLong("This is a large human warrior. His pectoral muscles "+ "are clearly visible even through his armor. His face is covered in "+ "bold blue tattoos."); ! SetCustomXP(350); SetLevel(10); SetRace("human"); - SetClass("fighter"); SetGender("male"); SetInventory(([ "/domains/default/armor/chainmail.c" : "wear chainmail", "/domains/default/weap/sharpsword.c" : "wield sword" ])); SetMaxHealthPoints(550); } void init(){ --- 9,27 ---- SetLong("This is a large human warrior. His pectoral muscles "+ "are clearly visible even through his armor. His face is covered in "+ "bold blue tattoos."); ! SetClass("fighter"); SetLevel(10); + SetCustomXP(350); SetRace("human"); SetGender("male"); SetInventory(([ "/domains/default/armor/chainmail.c" : "wear chainmail", "/domains/default/weap/sharpsword.c" : "wield sword" ])); + SetCurrency( ([ + "silver" : 100, + ]) ); + SetHealthPoints(549); SetMaxHealthPoints(550); } void init(){ diff -c -r --new-file ds2.0r22/lib/domains/default/npc/lemur.c ds2.0r29/lib/domains/default/npc/lemur.c *** ds2.0r22/lib/domains/default/npc/lemur.c Tue Mar 28 23:23:40 2006 --- ds2.0r29/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.0r22/lib/domains/default/npc/nymph.c ds2.0r29/lib/domains/default/npc/nymph.c *** ds2.0r22/lib/domains/default/npc/nymph.c Mon Jan 23 09:15:40 2006 --- ds2.0r29/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.0r22/lib/domains/default/npc/tree.c ds2.0r29/lib/domains/default/npc/tree.c *** ds2.0r22/lib/domains/default/npc/tree.c Thu Feb 23 15:40:40 2006 --- ds2.0r29/lib/domains/default/npc/tree.c Sat Jul 8 23:30:54 2006 *************** *** 11,19 **** --- 11,21 ---- "pods are full to bursting with coins of all kinds. It would be no "+ "trouble at all to get from tree...looks like "+ "you've hit the jackpot!"); + SetPacifist(1); SetCanBite(0); SetLevel(99); SetRace("tree"); + SetHealthPoints(99999); SetMaxHealthPoints(99999); } void init(){ diff -c -r --new-file ds2.0r22/lib/domains/default/obj/chest.c ds2.0r29/lib/domains/default/obj/chest.c *** ds2.0r22/lib/domains/default/obj/chest.c Sat Apr 22 15:14:20 2006 --- ds2.0r29/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(([ - "/domains/default/obj/pinger" : 1, - "/domains/default/armor/robe" : 1, - "/secure/obj/medtric" : 1, - "/secure/obj/memo" : 1, - "/domains/default/obj/manual" : 1, - "/secure/obj/machine" : 1, - "/secure/obj/staff" : 1, - "/domains/default/armor/badge" : 1, "/domains/town/armor/collar" : 1, "/domains/default/armor/wizard_hat" : 1, "/domains/default/obj/meter" : 1, "/secure/obj/control" : 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.0r22/lib/domains/default/obj/guide.c ds2.0r29/lib/domains/default/obj/guide.c *** ds2.0r22/lib/domains/default/obj/guide.c Sat Mar 11 11:14:54 2006 --- ds2.0r29/lib/domains/default/obj/guide.c Sun Jul 9 22:06:36 2006 *************** *** 4,12 **** 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."); SetNoCondition(1); --- 4,12 ---- void create(){ ::create(); ! SetKeyName("administrator's guidebook"); ! SetId( ({"book", "guide", "administrators guide", "administrators guidebook"}) ); ! SetAdjectives( ({"admin's", "admin", "admins", "administrator", "administrators", "reference"}) ); SetShort("an Administrator's Guidebook"); SetLong("This is a reference text for Dead Souls administrators."); SetNoCondition(1); diff -c -r --new-file ds2.0r22/lib/domains/default/obj/handbook.c ds2.0r29/lib/domains/default/obj/handbook.c *** ds2.0r22/lib/domains/default/obj/handbook.c Wed Feb 22 15:29:51 2006 --- ds2.0r29/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.0r22/lib/domains/default/obj/manual.c ds2.0r29/lib/domains/default/obj/manual.c *** ds2.0r22/lib/domains/default/obj/manual.c Wed Feb 22 15:29:51 2006 --- ds2.0r29/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.0r22/lib/domains/default/obj/pinger.c ds2.0r29/lib/domains/default/obj/pinger.c *** ds2.0r22/lib/domains/default/obj/pinger.c Thu Apr 6 22:53:15 2006 --- ds2.0r29/lib/domains/default/obj/pinger.c Wed Jul 5 00:01:11 2006 *************** *** 52,58 **** count++; if(interval > 0 && count > interval){ count = 0; ! if(living(environment(this_object()))){ tell_object(environment(this_object()),keepalive); } } --- 52,59 ---- 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.0r22/lib/domains/default/room/arena.c ds2.0r29/lib/domains/default/room/arena.c *** ds2.0r22/lib/domains/default/room/arena.c Mon Jan 23 08:51:42 2006 --- ds2.0r29/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.0r22/lib/domains/default/room/domains_room.c ds2.0r29/lib/domains/default/room/domains_room.c *** ds2.0r22/lib/domains/default/room/domains_room.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/default/room/menagerie_south.c ds2.0r29/lib/domains/default/room/menagerie_south.c *** ds2.0r22/lib/domains/default/room/menagerie_south.c Sun Jan 29 11:19:06 2006 --- ds2.0r29/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.0r22/lib/domains/default/room/telnet_room.c ds2.0r29/lib/domains/default/room/telnet_room.c *** ds2.0r22/lib/domains/default/room/telnet_room.c Tue Mar 28 23:23:40 2006 --- ds2.0r29/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.0r22/lib/domains/default/room/wiz_hall.c ds2.0r29/lib/domains/default/room/wiz_hall.c *** ds2.0r22/lib/domains/default/room/wiz_hall.c Fri Mar 24 14:36:36 2006 --- ds2.0r29/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.0r22/lib/domains/default/room/wiz_hall2.c ds2.0r29/lib/domains/default/room/wiz_hall2.c *** ds2.0r22/lib/domains/default/room/wiz_hall2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/default/weap/carving_knife.c ds2.0r29/lib/domains/default/weap/carving_knife.c *** ds2.0r22/lib/domains/default/weap/carving_knife.c Mon Nov 7 13:30:26 2005 --- ds2.0r29/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.0r22/lib/domains/examples/room/README ds2.0r29/lib/domains/examples/room/README *** ds2.0r22/lib/domains/examples/room/README Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/examples/room/entrance.c ds2.0r29/lib/domains/examples/room/entrance.c *** ds2.0r22/lib/domains/examples/room/entrance.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/examples/room/ex.h ds2.0r29/lib/domains/examples/room/ex.h *** ds2.0r22/lib/domains/examples/room/ex.h Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/examples/room/exroom1.c ds2.0r29/lib/domains/examples/room/exroom1.c *** ds2.0r22/lib/domains/examples/room/exroom1.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/examples/room/exroom2.c ds2.0r29/lib/domains/examples/room/exroom2.c *** ds2.0r22/lib/domains/examples/room/exroom2.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/examples/room/exroom2a.c ds2.0r29/lib/domains/examples/room/exroom2a.c *** ds2.0r22/lib/domains/examples/room/exroom2a.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/examples/room/exroom2b.c ds2.0r29/lib/domains/examples/room/exroom2b.c *** ds2.0r22/lib/domains/examples/room/exroom2b.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/examples/room/exroom3.c ds2.0r29/lib/domains/examples/room/exroom3.c *** ds2.0r22/lib/domains/examples/room/exroom3.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/examples/room/exroom4.c ds2.0r29/lib/domains/examples/room/exroom4.c *** ds2.0r22/lib/domains/examples/room/exroom4.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/examples/room/exroom5.c ds2.0r29/lib/domains/examples/room/exroom5.c *** ds2.0r22/lib/domains/examples/room/exroom5.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/examples/room/exroom6.c ds2.0r29/lib/domains/examples/room/exroom6.c *** ds2.0r22/lib/domains/examples/room/exroom6.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/examples/room/exroom7.c ds2.0r29/lib/domains/examples/room/exroom7.c *** ds2.0r22/lib/domains/examples/room/exroom7.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/examples/room/start.c ds2.0r29/lib/domains/examples/room/start.c *** ds2.0r22/lib/domains/examples/room/start.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/town/armor/badge.c ds2.0r29/lib/domains/town/armor/badge.c *** ds2.0r22/lib/domains/town/armor/badge.c Mon Nov 7 13:30:37 2005 --- ds2.0r29/lib/domains/town/armor/badge.c Sun Jul 9 22:06:36 2006 *************** *** 1,23 **** #include #include #include inherit LIB_ARMOR; static void create(){ armor::create(); SetKeyName("visitor pass"); ! SetId(({"testchar badge","badge","pass","visitor 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); ! SetBaseCost("silver",5000); SetDamagePoints(100); SetArmorType(A_AMULET); SetRetainOnDeath(1); } void init(){ add_action("nplh","click"); } int nplh(string str){ --- 1,30 ---- #include + #include #include #include inherit LIB_ARMOR; + static void create(){ armor::create(); SetKeyName("visitor 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"); + SetProperties(([ + "no steal" : 1, + ])); SetMass(10); ! SetBaseCost(5000); SetDamagePoints(100); SetArmorType(A_AMULET); SetRetainOnDeath(1); + SetRestrictLimbs( ({ "torso" }) ); } void init(){ + ::init(); add_action("nplh","click"); } int nplh(string str){ *************** *** 26,32 **** write("There's no place like home!\n"+ "You are transported by an awesome whirlwind somewhere "+ "else...\n"); ! this_player()->eventMoveLiving("/domains/town/room/road"); return 1; } write("You click your heels together...but feel "+ --- 33,39 ---- write("There's no place like home!\n"+ "You are transported by an awesome whirlwind somewhere "+ "else...\n"); ! this_player()->eventMoveLiving(ROOM_START); return 1; } write("You click your heels together...but feel "+ *************** *** 34,40 **** return 1; } } - string GetAffectLong(object ob) { if(!ob || !living(ob)) return 0; return ob->GetName() + " is an authorized Test Character."; --- 41,46 ---- diff -c -r --new-file ds2.0r22/lib/domains/town/meals/ale.c ds2.0r29/lib/domains/town/meals/ale.c *** ds2.0r22/lib/domains/town/meals/ale.c Mon Jan 16 23:02:33 2006 --- ds2.0r29/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.0r22/lib/domains/town/meals/herring.c ds2.0r29/lib/domains/town/meals/herring.c *** ds2.0r22/lib/domains/town/meals/herring.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/town/meals/poison.c ds2.0r29/lib/domains/town/meals/poison.c *** ds2.0r22/lib/domains/town/meals/poison.c Mon Jan 16 23:02:33 2006 --- ds2.0r29/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.0r22/lib/domains/town/meals/shark.c ds2.0r29/lib/domains/town/meals/shark.c *** ds2.0r22/lib/domains/town/meals/shark.c Fri May 12 21:14:12 2006 --- ds2.0r29/lib/domains/town/meals/shark.c Wed Jul 5 00:01:11 2006 *************** *** 20,25 **** --- 20,26 ---- "appetite."); SetMealType(MEAL_FOOD); SetMass(100); + SetStrength(50); SetBaseCost("silver", 10); SetFight(40); SetFood("/domains/town/meals/shark"); *************** *** 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.0r22/lib/domains/town/npc/beggar.c ds2.0r29/lib/domains/town/npc/beggar.c *** ds2.0r22/lib/domains/town/npc/beggar.c Tue Mar 28 23:23:40 2006 --- ds2.0r29/lib/domains/town/npc/beggar.c Sun Jul 9 19:04:27 2006 *************** *** 1,4 **** --- 1,5 ---- #include + #include #include inherit LIB_SENTIENT; *************** *** 36,41 **** --- 37,44 ---- object map; if(present(ob->GetKeyName(),environment(this_object())) && !this_object()->GetInCombat() && + member_array(ob->GetRace(),RACES_D->GetRaces(1)) != -1 && + !creatorp(ob) && !stringp(ob->CanManipulate()) ){ eventForce("say here, you might need this"); eventForce("give my first map to "+ob->GetKeyName()); *************** *** 49,55 **** int SayHi(object ob){ if(present(ob->GetKeyName(),environment(this_object())) ! && !this_object()->GetInCombat()) eventForce("say Hi, "+this_player()->GetName()); return 1; } --- 52,59 ---- int SayHi(object ob){ if(present(ob->GetKeyName(),environment(this_object())) ! && !this_object()->GetInCombat() && ! member_array(ob->GetRace(),RACES_D->GetRaces(1)) != -1) eventForce("say Hi, "+this_player()->GetName()); return 1; } diff -c -r --new-file ds2.0r22/lib/domains/town/npc/bubb.c ds2.0r29/lib/domains/town/npc/bubb.c *** ds2.0r22/lib/domains/town/npc/bubb.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/town/npc/bugg.c ds2.0r29/lib/domains/town/npc/bugg.c *** ds2.0r22/lib/domains/town/npc/bugg.c Wed Apr 5 19:44:08 2006 --- ds2.0r29/lib/domains/town/npc/bugg.c Wed Jul 5 00:01:11 2006 *************** *** 1,8 **** #include inherit LIB_TEACHER; void create(){ ! teacher::create(); SetKeyName("bugg"); SetId( ({"teacher","dwarf","schoolteacher","bugg the schoolteacher"}) ); SetGender("male"); --- 1,9 ---- #include inherit LIB_TEACHER; + void create(){ ! ::create(); SetKeyName("bugg"); SetId( ({"teacher","dwarf","schoolteacher","bugg the schoolteacher"}) ); SetGender("male"); diff -c -r --new-file ds2.0r22/lib/domains/town/npc/herkimer.c ds2.0r29/lib/domains/town/npc/herkimer.c *** ds2.0r22/lib/domains/town/npc/herkimer.c Sat Apr 22 15:14:41 2006 --- ds2.0r29/lib/domains/town/npc/herkimer.c Sat Jul 8 23:30:54 2006 *************** *** 34,40 **** "see right through you, but the smile from beneath "+ "his white beard is reassuring."); SetLevel(300); ! SetUnique(1); SetRace("human"); SetGender("male"); SetClass("mage"); --- 34,40 ---- "see right through you, but the smile from beneath "+ "his white beard is reassuring."); SetLevel(300); ! SetUnique(0); SetRace("human"); SetGender("male"); SetClass("mage"); diff -c -r --new-file ds2.0r22/lib/domains/town/npc/human_champion.c ds2.0r29/lib/domains/town/npc/human_champion.c *** ds2.0r22/lib/domains/town/npc/human_champion.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/town/npc/human_champion_f.c ds2.0r29/lib/domains/town/npc/human_champion_f.c *** ds2.0r22/lib/domains/town/npc/human_champion_f.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/town/npc/orc2.c ds2.0r29/lib/domains/town/npc/orc2.c *** ds2.0r22/lib/domains/town/npc/orc2.c Mon Nov 7 13:30:38 2005 --- ds2.0r29/lib/domains/town/npc/orc2.c Sun Jul 9 19:04:27 2006 *************** *** 2,7 **** --- 2,8 ---- inherit LIB_NPC; + int CheckOrc(mixed val){ if(!val) return 0; if(!objectp(val)) return 0; *************** *** 9,15 **** else eventForce("growl at "+val->GetKeyName()); return 1; } - static void create() { npc::create(); SetKeyName("orc"); --- 10,15 ---- *************** *** 30,32 **** --- 30,35 ---- ]) ); } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r22/lib/domains/town/npc/otik.c ds2.0r29/lib/domains/town/npc/otik.c *** ds2.0r22/lib/domains/town/npc/otik.c Mon Nov 7 13:30:38 2005 --- ds2.0r29/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.0r22/lib/domains/town/npc/rat.c ds2.0r29/lib/domains/town/npc/rat.c *** ds2.0r22/lib/domains/town/npc/rat.c Mon Jan 16 23:02:33 2006 --- ds2.0r29/lib/domains/town/npc/rat.c Sat Jul 8 23:30:55 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,18 ---- SetId( ({"rat"}) ); SetShort("a rat"); SetLong("A scruffy little dirty rat."); SetRace("rodent"); + SetHealthPoints(3); + SetMaxHealthPoints(3); SetGender("male"); SetEncounter(100); SetMessage("come","$N scurries in."); SetMessage("leave","$N scurries $D."); diff -c -r --new-file ds2.0r22/lib/domains/town/npc/thief.c ds2.0r29/lib/domains/town/npc/thief.c *** ds2.0r22/lib/domains/town/npc/thief.c Fri Mar 24 14:36:37 2006 --- ds2.0r29/lib/domains/town/npc/thief.c Sat Jul 8 23:30:55 2006 *************** *** 2,8 **** inherit LIB_NPC; - static void create() { npc::create(); SetKeyName("thief"); --- 2,7 ---- *************** *** 13,29 **** "is obviously a thief who has snuck into the "+ "mansion and taken up residence. You seem "+ "to have caught him just after his shower."); ! SetLevel(3); SetRace("human"); ! SetClass("fighter"); SetGender("male"); SetEncounter(100); ! SetMaxHealthPoints(100); SetInventory(([ "/domains/town/armor/towel":"wear towel", "/domains/town/weap/brush":"wield brush", "/domains/town/obj/safe_key":1, ]) ); } void init(){ ::init(); --- 12,29 ---- "is obviously a thief who has snuck into the "+ "mansion and taken up residence. You seem "+ "to have caught him just after his shower."); ! SetLevel(1); SetRace("human"); ! SetClass("thief"); SetGender("male"); SetEncounter(100); ! SetMaxHealthPoints(50); SetInventory(([ "/domains/town/armor/towel":"wear towel", "/domains/town/weap/brush":"wield brush", "/domains/town/obj/safe_key":1, ]) ); + SetHealthPoints(50); } void init(){ ::init(); diff -c -r --new-file ds2.0r22/lib/domains/town/npc/zoe.c ds2.0r29/lib/domains/town/npc/zoe.c *** ds2.0r22/lib/domains/town/npc/zoe.c Mon Nov 7 13:30:38 2005 --- ds2.0r29/lib/domains/town/npc/zoe.c Sat Jul 8 23:30:55 2006 *************** *** 3,8 **** --- 3,9 ---- inherit LIB_TELLER; + static void create() { ::create(); SetKeyName("zoe"); *************** *** 27,31 **** SetExchangeFee(2); SetCurrencies( ({ "dollars", "copper", "silver", "electrum", "gold", "platinum" }) ); ! } --- 28,34 ---- SetExchangeFee(2); SetCurrencies( ({ "dollars", "copper", "silver", "electrum", "gold", "platinum" }) ); ! } ! void init(){ ! ::init(); } diff -c -r --new-file ds2.0r22/lib/domains/town/obj/donation_box.c ds2.0r29/lib/domains/town/obj/donation_box.c *** ds2.0r22/lib/domains/town/obj/donation_box.c Thu Jan 5 00:16:26 2006 --- ds2.0r29/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.0r22/lib/domains/town/obj/ebutton1.c ds2.0r29/lib/domains/town/obj/ebutton1.c *** ds2.0r22/lib/domains/town/obj/ebutton1.c Mon Nov 7 13:30:38 2005 --- ds2.0r29/lib/domains/town/obj/ebutton1.c Fri Jul 7 19:41:41 2006 *************** *** 15,23 **** 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."); --- 15,23 ---- static void create() { dummy::create(); ! SetKeyName("button 1"); ! 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."); diff -c -r --new-file ds2.0r22/lib/domains/town/obj/ebutton2.c ds2.0r29/lib/domains/town/obj/ebutton2.c *** ds2.0r22/lib/domains/town/obj/ebutton2.c Mon Nov 7 13:30:38 2005 --- ds2.0r29/lib/domains/town/obj/ebutton2.c Sat Jul 8 23:30:55 2006 *************** *** 15,23 **** 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."); --- 15,23 ---- static void create() { dummy::create(); ! SetKeyName("button b"); ! SetId("b","button","two","B", "button 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."); diff -c -r --new-file ds2.0r22/lib/domains/town/obj/map.c ds2.0r29/lib/domains/town/obj/map.c *** ds2.0r22/lib/domains/town/obj/map.c Mon Nov 7 13:30:38 2005 --- ds2.0r29/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.0r22/lib/domains/town/obj/pack.c ds2.0r29/lib/domains/town/obj/pack.c *** ds2.0r22/lib/domains/town/obj/pack.c Sat Apr 22 15:14:46 2006 --- ds2.0r29/lib/domains/town/obj/pack.c Sun Jul 9 19:04:27 2006 *************** *** 10,16 **** 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."); --- 10,16 ---- 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."); diff -c -r --new-file ds2.0r22/lib/domains/town/obj/rage.c ds2.0r29/lib/domains/town/obj/rage.c *** ds2.0r22/lib/domains/town/obj/rage.c Tue Mar 28 23:23:40 2006 --- ds2.0r29/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.0r22/lib/domains/town/obj/rayovac.c ds2.0r29/lib/domains/town/obj/rayovac.c *** ds2.0r22/lib/domains/town/obj/rayovac.c Fri Mar 24 14:36:38 2006 --- ds2.0r29/lib/domains/town/obj/rayovac.c Sun Jul 9 19:04:28 2006 *************** *** 2,14 **** #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); SetBaseCost("silver",10); --- 2,13 ---- #include inherit "/lib/flashlight"; void create(){ ::create(); SetKeyName("flashlight"); ! SetId( ({"fl","flashlight","light","torch","flashlite", "rayovac"}) ); SetAdjectives( ({"plastic","small","cheap","rayovac","Rayovac"}) ); ! SetShort("a small plastic flashlight"); SetLong("This is a cheap Rayovac brand flashlight."); SetMass(20); SetBaseCost("silver",10); diff -c -r --new-file ds2.0r22/lib/domains/town/obj/shamelog.c ds2.0r29/lib/domains/town/obj/shamelog.c *** ds2.0r22/lib/domains/town/obj/shamelog.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/town/obj/simple_chair.c ds2.0r29/lib/domains/town/obj/simple_chair.c *** ds2.0r22/lib/domains/town/obj/simple_chair.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/domains/town/obj/simple_chair.c Sun Jul 9 22:06:36 2006 *************** *** 0 **** --- 1,18 ---- + #include + + inherit LIB_CHAIR; + + static void create() { + chair::create(); + SetKeyName("chair"); + SetAdjectives( ({"simple", "wooden"}) ); + SetId("chair"); + SetShort("a wooden chair"); + SetLong("A simple chair, made of wood, for sitting on."); + SetMass(150); + SetDollarCost(15); + SetMaxSitters(1); + } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r22/lib/domains/town/obj/sofa.c ds2.0r29/lib/domains/town/obj/sofa.c *** ds2.0r22/lib/domains/town/obj/sofa.c Mon Nov 7 13:30:38 2005 --- ds2.0r29/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.0r22/lib/domains/town/obj/table.c ds2.0r29/lib/domains/town/obj/table.c *** ds2.0r22/lib/domains/town/obj/table.c Thu Jan 5 00:16:26 2006 --- ds2.0r29/lib/domains/town/obj/table.c Sun Jul 9 22:06:36 2006 *************** *** 1,11 **** #include - inherit LIB_STORAGE; inherit LIB_CHAIR; ! inherit "/lib/comp/surface"; void create() { ! ::create(); SetKeyName("wooden table"); SetId( ({ "table" }) ); SetAdjectives( ({ "wood","wooden", "simple", "medium-sized" "medium sized" }) ); --- 1,11 ---- #include inherit LIB_CHAIR; ! inherit LIB_SURFACE; void create() { ! surface::create(); ! chair::create(); SetKeyName("wooden table"); SetId( ({ "table" }) ); SetAdjectives( ({ "wood","wooden", "simple", "medium-sized" "medium sized" }) ); diff -c -r --new-file ds2.0r22/lib/domains/town/obj/torch.c ds2.0r29/lib/domains/town/obj/torch.c *** ds2.0r22/lib/domains/town/obj/torch.c Mon Nov 7 13:30:38 2005 --- ds2.0r29/lib/domains/town/obj/torch.c Sun Jul 9 19:04:28 2006 *************** *** 7,13 **** 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); --- 7,13 ---- 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); *************** *** 20,22 **** --- 20,25 ---- SetBurntValue(10); SetClass(10); } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r22/lib/domains/town/room/adv_guild.c ds2.0r29/lib/domains/town/room/adv_guild.c *** ds2.0r22/lib/domains/town/room/adv_guild.c Thu Jan 5 00:16:26 2006 --- ds2.0r29/lib/domains/town/room/adv_guild.c Sat Jul 8 23:30:55 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,61 **** ({"building","small building","here"}) : "You are in the " "Adventurers' Guild.", ]) ); SetInventory(([ "/domains/town/obj/bin" : 1, "/domains/town/obj/table" : 1, ])); SetRead( ([ ({"list","scroll"}) : (: ReadScroll :), ({"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); } --- 21,49 ---- ({"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, + "/domains/town/npc/dirk" : 1 ])); SetRead( ([ ({"list","scroll"}) : (: ReadScroll :), ({"instructions","sign"}) : (: ReadSign :) ]) ); 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.0r22/lib/domains/town/room/confroom.c ds2.0r29/lib/domains/town/room/confroom.c *** ds2.0r22/lib/domains/town/room/confroom.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/town/room/elevator.c ds2.0r29/lib/domains/town/room/elevator.c *** ds2.0r22/lib/domains/town/room/elevator.c Sun Dec 18 01:56:22 2005 --- ds2.0r29/lib/domains/town/room/elevator.c Sun Jul 9 22:06:36 2006 *************** *** 8,16 **** SetClimate("indoors"); SetAmbientLight(30); SetShort("Church Elevator"); ! SetLong("This is the elevator in the village church. The " ! "elevator door is on the east wall. Two buttons are " ! "set into the wall next to the door."); floor=1; moving = 0; closed=1; --- 8,14 ---- SetClimate("indoors"); SetAmbientLight(30); SetShort("Church Elevator"); ! SetLong("This is the elevator in the village church. The elevator door is on the east wall. Two buttons are set into the wall next to the door, labeled '1' and 'b'."); floor=1; moving = 0; closed=1; *************** *** 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." ]) ); --- 19,25 ---- 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; } --- 69,88 ---- 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(archp(ob)) { ! tell_object(ob,"%^RED%^As archwizard, you are permitted to " ! "exit the elevator at any time. Normal creators and " ! "players cannot do this.%^RESET%^\n"); ! } ! if(closed > 0 && query_verb() == "go" ){ message("info","The elevator door is closed.", ob); return 0; } diff -c -r --new-file ds2.0r22/lib/domains/town/room/gate.c ds2.0r29/lib/domains/town/room/gate.c *** ds2.0r22/lib/domains/town/room/gate.c Wed Jan 4 20:42:53 2006 --- ds2.0r29/lib/domains/town/room/gate.c Sat Jul 8 23:30:56 2006 *************** *** 17,25 **** } return 1; } - - - static void create() { room::create(); SetClimate("outdoors"); --- 17,22 ---- *************** *** 51,63 **** "casual entry. They are made of brick and appear old " "and strong.", ]) ); SetExits( ([ "north" : "/domains/town/room/road1", ]) ); AddExit("south", "/domains/town/room/mansion_ext", (: PreExit :)); - AddStuff( ({ - "/domains/town/npc/mp" - }) ); SetProperty("no attack", 1); } --- 48,63 ---- "casual entry. They are made of brick and appear old " "and strong.", ]) ); + SetInventory(([ + "/domains/town/npc/mp" : 1, + ])); SetExits( ([ "north" : "/domains/town/room/road1", ]) ); AddExit("south", "/domains/town/room/mansion_ext", (: PreExit :)); SetProperty("no attack", 1); } + void init(){ + ::init(); + } diff -c -r --new-file ds2.0r22/lib/domains/town/room/magic_guild.c ds2.0r29/lib/domains/town/room/magic_guild.c *** ds2.0r22/lib/domains/town/room/magic_guild.c Thu Jan 5 00:17:16 2006 --- ds2.0r29/lib/domains/town/room/magic_guild.c Sat Jul 8 23:30:56 2006 *************** *** 32,43 **** SetItems( ([ ({"list","list on the wall"}) : "A list of available spells", ]) ); SetRead(({"list","list on wall"}) , (: ReadList :) ); SetExits( ([ "north" : "/domains/town/room/magic_shop" ]) ); SetObviousExits("n"); - AddStuff( ({ "/domains/town/npc/herkimer" }) ); } void init(){ --- 32,45 ---- SetItems( ([ ({"list","list on the wall"}) : "A list of available spells", ]) ); + SetInventory(([ + "/domains/town/npc/herkimer" : 1, + ])); SetRead(({"list","list on wall"}) , (: ReadList :) ); SetExits( ([ "north" : "/domains/town/room/magic_shop" ]) ); SetObviousExits("n"); } void init(){ diff -c -r --new-file ds2.0r22/lib/domains/town/room/magic_shop2.c ds2.0r29/lib/domains/town/room/magic_shop2.c *** ds2.0r22/lib/domains/town/room/magic_shop2.c Wed Dec 7 14:01:00 2005 --- ds2.0r29/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.0r22/lib/domains/town/room/mountain_road.c ds2.0r29/lib/domains/town/room/mountain_road.c *** ds2.0r22/lib/domains/town/room/mountain_road.c Mon Nov 7 13:30:39 2005 --- ds2.0r29/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.0r22/lib/domains/town/room/riverbank.c ds2.0r29/lib/domains/town/room/riverbank.c *** ds2.0r22/lib/domains/town/room/riverbank.c Fri May 12 21:14:30 2006 --- ds2.0r29/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, *************** *** 30,36 **** void init() { ::init(); SetSmell(([])); - SetListen(([ "default" : "You can hear the roar of the river rushing by."])); } int CanReceive(object ob){ --- 34,39 ---- diff -c -r --new-file ds2.0r22/lib/domains/town/room/road.c ds2.0r29/lib/domains/town/room/road.c *** ds2.0r22/lib/domains/town/room/road.c Thu Jan 5 00:17:17 2006 --- ds2.0r29/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.0r22/lib/domains/town/room/road2.c ds2.0r29/lib/domains/town/room/road2.c *** ds2.0r22/lib/domains/town/room/road2.c Fri May 12 21:14:35 2006 --- ds2.0r29/lib/domains/town/room/road2.c Sat Jul 8 23:30:56 2006 *************** *** 1,12 **** #include inherit LIB_ROOM; static void create() { room::create(); SetClimate("outdoors"); SetAmbientLight(30); SetShort("West Village road"); ! SetLong("This is a well-traveled road, leading east into town and west away from it. An old, humpbacked bridge is west of here. A road leads north, to a fortress far up on a high plateau."); SetItems(([ ({ "fort", "fortress", "fortress in the distance" }) : "It can't be seen well from here, but far north is what appears to be a large fortress built on a high plateau.", ({ "road", "roads" }) : "This is a simple east-west road that goes east into town and west away from it. Another road, paved with cobblestones, intersects here to the north and leads high toward a fortress in the distance.", --- 1,19 ---- #include inherit LIB_ROOM; + string LongDesc(){ + string desc = "This is a well-traveled road, leading east into town and west away from it. An old, humpbacked bridge is west of here."; + if(this_object()->GetExit("north")) + desc += " A road north leads up to a plateau where a fortress stands in the distance."; + return desc; + } + static void create() { room::create(); SetClimate("outdoors"); SetAmbientLight(30); SetShort("West Village road"); ! SetLong((: LongDesc :)); SetItems(([ ({ "fort", "fortress", "fortress in the distance" }) : "It can't be seen well from here, but far north is what appears to be a large fortress built on a high plateau.", ({ "road", "roads" }) : "This is a simple east-west road that goes east into town and west away from it. Another road, paved with cobblestones, intersects here to the north and leads high toward a fortress in the distance.", *************** *** 15,22 **** SetExits( ([ "west" : "/domains/town/room/bridge", "east" : "/domains/town/room/road1", - "north" : "/domains/Fortress/room/f_road4.c", ]) ); } void init(){ --- 22,29 ---- SetExits( ([ "west" : "/domains/town/room/bridge", "east" : "/domains/town/room/road1", ]) ); + if(mud_name() == "Dead Souls") AddExit("north","/domains/fort/room/f_road4.c"); } void init(){ diff -c -r --new-file ds2.0r22/lib/domains/town/room/shore.c ds2.0r29/lib/domains/town/room/shore.c *** ds2.0r22/lib/domains/town/room/shore.c Mon May 15 01:14:02 2006 --- ds2.0r29/lib/domains/town/room/shore.c Wed Jul 5 00:01:12 2006 *************** *** 1,24 **** #include ! inherit LIB_ROOM; int ActionFunction(){ //The next line identifies creators in the room ! object cres = filter(get_livings(this_object()), (: creatorp($1) :) ); //The next line picks a living being here at random ! object dude = get_random_living(this_object()); //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. cres->eventPrint("%^YELLOW%^The ActionFunction activates. Dude is: "+ identify(dude)+".%^RESET%^"); return 1; } static void create() { ! room::create(); SetClimate("outdoors"); SetAmbientLight(30); SetShort("Shore Edge"); --- 1,28 ---- #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"); *************** *** 42,47 **** --- 46,57 ---- 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.0r22/lib/domains/town/room/south_road1.c ds2.0r29/lib/domains/town/room/south_road1.c *** ds2.0r22/lib/domains/town/room/south_road1.c Thu Jan 5 00:17:17 2006 --- ds2.0r29/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.0r22/lib/domains/town/room/south_road2.c ds2.0r29/lib/domains/town/room/south_road2.c *** ds2.0r22/lib/domains/town/room/south_road2.c Thu Jan 5 00:17:31 2006 --- ds2.0r29/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.0r22/lib/domains/town/room/vill_road1.c ds2.0r29/lib/domains/town/room/vill_road1.c *** ds2.0r22/lib/domains/town/room/vill_road1.c Fri May 12 21:14:35 2006 --- ds2.0r29/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,25 **** --- 20,26 ---- SetItems( ([ "sign":"A large sign on the road. To read it, 'read sign'.", ]) ); + SetNoModify(0); SetInventory(([ "/domains/town/obj/clocktower" : 1, ])); diff -c -r --new-file ds2.0r22/lib/domains/town/txt/hints_sign.txt ds2.0r29/lib/domains/town/txt/hints_sign.txt *** ds2.0r22/lib/domains/town/txt/hints_sign.txt Wed Jan 11 23:09:41 2006 --- ds2.0r29/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.0r22/lib/domains/town/txt/shame/chapter01 ds2.0r29/lib/domains/town/txt/shame/chapter01 *** ds2.0r22/lib/domains/town/txt/shame/chapter01 Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/town/txt/shame/chapter02 ds2.0r29/lib/domains/town/txt/shame/chapter02 *** ds2.0r22/lib/domains/town/txt/shame/chapter02 Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/town/txt/shame/chapter03 ds2.0r29/lib/domains/town/txt/shame/chapter03 *** ds2.0r22/lib/domains/town/txt/shame/chapter03 Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/town/txt/shame/chapter04 ds2.0r29/lib/domains/town/txt/shame/chapter04 *** ds2.0r22/lib/domains/town/txt/shame/chapter04 Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/town/txt/shame/chapter05 ds2.0r29/lib/domains/town/txt/shame/chapter05 *** ds2.0r22/lib/domains/town/txt/shame/chapter05 Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/domains/town/txt/warning_sign.txt ds2.0r29/lib/domains/town/txt/warning_sign.txt *** ds2.0r22/lib/domains/town/txt/warning_sign.txt Mon May 15 01:14:02 2006 --- ds2.0r29/lib/domains/town/txt/warning_sign.txt Wed Jul 5 00:01:12 2006 *************** *** 1,12 **** WARNING! ! This area 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 main sample town. Remember, neither ! Kaliid 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. --- 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.0r22/lib/domains/town/virtual/forest.c ds2.0r29/lib/domains/town/virtual/forest.c *** ds2.0r22/lib/domains/town/virtual/forest.c Mon Jan 23 08:52:03 2006 --- ds2.0r29/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.0r22/lib/domains/town/weap/carving_knife.c ds2.0r29/lib/domains/town/weap/carving_knife.c *** ds2.0r22/lib/domains/town/weap/carving_knife.c Wed Jan 11 23:09:54 2006 --- ds2.0r29/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.0r22/lib/domains/town/weap/shotput.c ds2.0r29/lib/domains/town/weap/shotput.c *** ds2.0r22/lib/domains/town/weap/shotput.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/include/damage_types.h ds2.0r29/lib/include/damage_types.h *** ds2.0r22/lib/include/damage_types.h Tue Mar 28 23:23:41 2006 --- ds2.0r29/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.0r22/lib/lib/blank_pile.c ds2.0r29/lib/lib/blank_pile.c *** ds2.0r22/lib/lib/blank_pile.c Sat Apr 22 15:14:57 2006 --- ds2.0r29/lib/lib/blank_pile.c Fri Jul 7 19:41:41 2006 *************** *** 1,23 **** #include ! inherit LIB_ITEM; ! ! private string PileType = 0; ! int PileAmount = 0; static void create() { ! string *saveds; ! item::create(); ! saveds = item::GetSave(); ! saveds += ({ "PileType", "PileAmount" }); ! AddSave( saveds ); SetKeyName("money"); } string array GetId() { string array id; ! id = item::GetId(); if( PileType ) { if(PileType != "dollars") { id += ({ PileType, PileAmount + " " + PileType +" coins"}); --- 1,16 ---- #include ! inherit LIB_PILE; static void create() { ! pile::create(); SetKeyName("money"); } string array GetId() { string array id; ! id = pile::GetId(); if( PileType ) { if(PileType != "dollars") { id += ({ PileType, PileAmount + " " + PileType +" coins"}); *************** *** 30,59 **** } } - varargs string GetLong(string str) { - if( !PileAmount ) { - return 0; - } - if(PileType != "dollars") { - return PileAmount + " " + PileType + " coins."; - } - else return PileAmount + " " + PileType + "."; - } - - int GetMass() { - return currency_mass(PileAmount, PileType); - } - - void SetPile(string str, int amt) { - PileType = str; - PileAmount = amt; - parse_refresh(); - } - - string GetPileType() { return PileType; } - - int GetPileAmount() { return PileAmount; } - string GetShort() { string sum; if(!PileAmount) sum = "some"; --- 23,28 ---- *************** *** 64,130 **** else return sum + " " + PileType ; } - mixed eventGetCurrency(object who, int amount, string curr) { - string sum; - if(!amount) amount = PileAmount; - if( who->AddCurrency(curr, amount) == -1 ) { - who->eventPrint("You had a problem getting the money."); - return 1; - } - if(!amount) sum = "some"; - else sum = cardinal(amount); - send_messages("get", "$agent_name $agent_verb " + sum + " " + - curr + " " + GetShort() + ".", who, 0, environment(who)); - PileAmount -= amount; - if( PileAmount < 1 ) { - call_out((: Destruct :), 0); - return 1; - } - SetPile(PileType, PileAmount); /* This refreshes the parser */ - return 1; - } - - int eventMove(mixed dest) { - int x; - - x = item::eventMove(dest); - if( !environment() || !living(environment()) ) { - return x; - } - if(environment() && living(environment()) ) { - environment()->AddCurrency(PileType, PileAmount); - environment()->AddCarriedMass(-this_object()->GetMass()); - SetShort(PileAmount + " " + PileType); - //PileAmount = 0; - call_out((: Destruct :), 0); - return x; - } - } - - mixed direct_get_wrd_wrd_out_of_obj(string num, string curr) { - int amt; - - if( environment() != environment(this_player()) ) { - return "#You cannot reach the money!"; - } - if( num[0] < '0' || num[0] > '9' ) { - return 0; - } - if( (amt = to_int(num)) < 1 ) { - return "That's a totally bogus amount."; - } - if( curr != PileType ) { - return "#There are no " + curr + " there, only " + PileType + "."; - } - if( amt > PileAmount ) { - return "#There is not that much there."; - } - if( !this_player()->CanCarry(currency_mass(amt, curr)) ) { - return "It is too heavy for you!"; - } - return 1; - } - - mixed direct_get_wrd_wrd_from_obj(string amt, string curr) { - return direct_get_wrd_wrd_out_of_obj(amt, curr); - } --- 33,35 ---- diff -c -r --new-file ds2.0r22/lib/lib/body.c ds2.0r29/lib/lib/body.c *** ds2.0r22/lib/lib/body.c Sat Apr 22 15:15:02 2006 --- ds2.0r29/lib/lib/body.c Sun Jul 9 19:04:28 2006 *************** *** 9,14 **** --- 9,15 ---- #include #include + #include #include #include #include *************** *** 28,34 **** 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; --- 29,35 ---- 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; *************** *** 41,46 **** --- 42,48 ---- 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", *************** *** 50,56 **** PoliticalParty = "UNDECIDED"; rifleshot_wounds = 0; gunshot_wounds = 0; ! NewBody(0); Protect = 0; WornItems = ([]); --- 52,58 ---- PoliticalParty = "UNDECIDED"; rifleshot_wounds = 0; gunshot_wounds = 0; ! DeathEvents = 0; NewBody(0); Protect = 0; WornItems = ([]); *************** *** 67,82 **** ExtraChannels = ({}); } int GetEncumbrance(){ int encumbrance = 0; object *stuff = filter(all_inventory(this_object()), (: !($1->GetWorn()) :) ); - //tc("ENABLE_ENCUMBRANCE: "+ENABLE_ENCUMBRANCE,"cyan"); if(!(ENABLE_ENCUMBRANCE) || inherits(LIB_NPC,this_object()) ) return encumbrance; - //tc("bad encumbrance","red"); if(sizeof(stuff)) foreach(object item in stuff) ! encumbrance += item->GetMass(); ! if(sizeof(stuff)) encumbrance *= sizeof(stuff); return encumbrance; } --- 69,88 ---- ExtraChannels = ({}); } + varargs mixed eventBuy(mixed arg1, mixed arg2, mixed arg3){ + //This function will hopefully get overridden where appropriate. + write(capitalize(this_object()->GetShort())+" isn't buying anything from you."); + return 1; + } + 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; } *************** *** 199,205 **** 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()); } --- 205,213 ---- int eventCollapse() { int position = GetPosition(); ! if(!this_object() || !environment()) return 0; ! ! foreach(object ob in all_inventory(environment())){ if(inherits(LIB_CHAIR,ob) || inherits(LIB_BED,ob) ){ ob->eventReleaseStand(this_object()); } *************** *** 211,216 **** --- 219,225 ---- } send_messages("collapse", "$agent_name $agent_verb to the ground.", this_object(), 0, environment()); + //this_object()->eventCollapse(); SetPosition(POSITION_LYING); return 1; } *************** *** 306,313 **** 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; --- 315,323 ---- 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; *************** *** 318,324 **** eventMove(dest); environment()->eventPrint(GetName() + " comes falling in from above.", this_object()); ! SetPosition(POSITION_LYING); foreach(string limb in GetLimbs()) { int hp = GetHealthPoints(limb); --- 328,335 ---- 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); *************** *** 412,417 **** --- 423,430 ---- string tmp = GetResistance(type); int fp; + //tc("agent: "+identify(agent),"yellow"); + if( tmp == "immune") { return 0; } *************** *** 490,495 **** --- 503,509 ---- } AddHealthPoints(-x, 0, agent); AddStaminaPoints(-x/2); + if(HealthPoints < 1) eventDie(agent); return x; } *************** *** 549,556 **** 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; --- 563,570 ---- 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; *************** *** 596,607 **** * * 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()+"."; --- 610,633 ---- * * returns true if the thing is dying */ ! varargs int eventDie(mixed agent) { int x; string killer, death_annc; + object crime_scene; + //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()+"."; *************** *** 613,625 **** if( x ) agent->eventDestroyEnemy(this_object()); else agent->eventKillEnemy(this_object()); } ! if( environment() ) { object *obs; string *currs; object ob; string curr; int i; if(GetRace() == "golem") { ob = new(LIB_CLAY); if(GetBodyComposition()) ob->SetComposition(GetBodyComposition()); --- 639,655 ---- if( x ) agent->eventDestroyEnemy(this_object()); else agent->eventKillEnemy(this_object()); } ! crime_scene = environment(); ! if( crime_scene ) { object *obs; string *currs; object ob; string curr; int i; + //I'd like to move the living body out first, but for now this + //misfeature stays. + //this_object()->eventMove(ROOM_VOID); if(GetRace() == "golem") { ob = new(LIB_CLAY); if(GetBodyComposition()) ob->SetComposition(GetBodyComposition()); *************** *** 629,638 **** else ob = new(LIB_CORPSE); ob->SetCorpse(this_object()); } ! 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; --- 659,668 ---- else ob = new(LIB_CORPSE); ob->SetCorpse(this_object()); } ! ob->eventMove(crime_scene); obs = filter(all_inventory(), (: !((int)$1->GetRetainOnDeath()) :)); i = sizeof(obs); ! obs->eventMove(ob); currs = (string *)this_object()->GetCurrencies() || ({}); foreach(curr in currs) { object pile; *************** *** 649,1682 **** 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; - } ! 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") 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"]; } ! //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; ! 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; ! } --- 679,1731 ---- 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.0r22/lib/lib/combat.c ds2.0r29/lib/lib/combat.c *** ds2.0r22/lib/lib/combat.c Wed Apr 12 23:48:35 2006 --- ds2.0r29/lib/lib/combat.c Sat Jul 8 23:30:57 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,76 ---- } /* ***************** /lib/combat.c data functions ***************** */ + varargs int GetMaxHealthPoints(string limb){ + return race::GetMaxHealthPoints(limb); + } + + int GetDead(){ + return Dead; + } + + int SetDead(int i){ + if(!i) Dead = 0; + else Dead = 1; + return Dead; + } + object array GetEnemies() { return Enemies; } *************** *** 247,253 **** 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; } --- 262,268 ---- 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; } *************** *** 469,478 **** /* ***************** /lib/combat.c events ***************** */ ! varargs int eventDie(object agent) { object ob; int x; x = race::eventDie(agent); if( x != 1 ) { return x; --- 484,496 ---- /* ***************** /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; *************** *** 484,489 **** --- 502,508 ---- } environment()->eventLivingDied(this_object(), agent); Enemies = ({}); + flush_messages(); return 1; } *************** *** 493,498 **** --- 512,520 ---- 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 && *************** *** 568,573 **** --- 590,598 ---- object array weapons = 0; function f = 0; + if(Dead) return 1; + if(target->GetDead()) return 1; + if( arrayp(val) ) { weapons = val; } *************** *** 600,605 **** --- 625,633 ---- int bonus = GetCombatBonus(level); int power, pro, con; + if(Dead) return; + if(target->GetDead()) return; + if( target->GetDying() ) { return; } *************** *** 632,640 **** int damage_type, damage, weapon_damage, actual_damage, encumbrance; encumbrance = this_object()->GetEncumbrance(); //tc("encumbrance: "+encumbrance,"white"); ! if(encumbrance > 30){ //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(); --- 660,668 ---- int damage_type, damage, weapon_damage, actual_damage, encumbrance; encumbrance = this_object()->GetEncumbrance(); //tc("encumbrance: "+encumbrance,"white"); ! if(encumbrance > 20){ //tc("feep","yellow"); ! tell_object(this_object(),"You struggle to fight while carrying stuff."); } eventTrainSkill(weapon_type + " attack", pro*2, con, 1, bonus); damage_type = weapon->GetDamageType(); *************** *** 672,677 **** --- 700,708 ---- 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(); *************** *** 698,704 **** int pro, con; int chance; ! if( target->GetDying() ) { return; } --- 729,735 ---- int pro, con; int chance; ! if( target->GetDead() || Dead || target->GetDying() ) { return; } *************** *** 725,733 **** int x, encumbrance; encumbrance = this_object()->GetEncumbrance(); //tc("encumbrance: "+encumbrance,"white"); ! if(encumbrance > 30){ //tc("feep","blue"); ! tell_object(this_object(),"You struggle to fight while heavily encumbered."); } // I hit, how hard? eventTrainSkill("melee attack", pro, con, 1, --- 756,764 ---- int x, encumbrance; encumbrance = this_object()->GetEncumbrance(); //tc("encumbrance: "+encumbrance,"white"); ! if(encumbrance > 20){ //tc("feep","blue"); ! tell_object(this_object(),"You struggle to fight while carrying stuff."); } // I hit, how hard? eventTrainSkill("melee attack", pro, con, 1, *************** *** 754,759 **** --- 785,791 ---- } int eventMagicRound(mixed target, function f) { + if(target->GetDead()) return 1; evaluate(f, target); return target->GetDying(); } *************** *** 763,768 **** --- 795,802 ---- 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; *************** *** 770,776 **** 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 " --- 804,810 ---- 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 " *************** *** 824,830 **** if( GetDying() ) { return 0; } ! if( playerp(this_object()) && playerp(agent) ) { // No PK if( !environment()->CanAttack( agent, this_object() ) ) { return 0; } --- 858,864 ---- if( GetDying() ) { return 0; } ! if( playerp(this_object()) && playerp(agent) && !PLAYER_KILL) { if( !environment()->CanAttack( agent, this_object() ) ) { return 0; } *************** *** 838,843 **** --- 872,879 ---- varargs int eventReceiveAttack(int speed, string def, object agent) { int x, pro, level, bonus; + if(Dead) return 0; + if( !agent ) { agent = previous_object(); } *************** *** 918,927 **** mixed limbs) { int hp,encumbrance; encumbrance = this_object()->GetEncumbrance(); //tc("encumbrance: "+encumbrance,"white"); ! if(encumbrance > 30){ //tc("feep","green"); ! tell_object(this_object(),"You try to dodge while weighed down."); } x = race::eventReceiveDamage(agent, type, x, internal, limbs); if( !Wimpy ) return x; --- 954,965 ---- 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; diff -c -r --new-file ds2.0r22/lib/lib/combatmsg.c ds2.0r29/lib/lib/combatmsg.c *** ds2.0r22/lib/lib/combatmsg.c Mon Jan 16 23:03:04 2006 --- ds2.0r29/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.0r22/lib/lib/command.c ds2.0r29/lib/lib/command.c *** ds2.0r22/lib/lib/command.c Wed Apr 12 23:48:35 2006 --- ds2.0r29/lib/lib/command.c Sun Jul 9 19:04:28 2006 *************** *** 18,23 **** --- 18,27 ---- private static string *SearchPath; private static string *apostrophe_exceptions; + int direct_force_liv_str() { return 1; } + int direct_force_liv_to_str() { return 1; } + + /* *************** /lib/command.c driver applies *************** */ static void create() { *************** *** 31,37 **** } static string process_input(string cmd) { - //tc(this_object()->GetName()+": "+identify(parse_command(cmd))); return cmd; } --- 35,40 ---- *************** *** 42,59 **** mixed err; string verb, file; - //if(ParseMe(args) == 1) return 1; - //tc(this_object()->GetName()+" parse_command_id_list(): "+identify(parse_command_id_list())); - //tc(this_object()->GetName()+" parse_command_plural_id_list(): "+identify(parse_command_plural_id_list())); - //tc(this_object()->GetName()+" parse_command_adjectiv_id_list(): "+identify(parse_command_adjectiv_id_list())); - //tc(this_object()->GetName()+" parse_command_prepos_list(): "+identify(parse_command_prepos_list())); - - if(sizeof(args) && member_array(query_verb(), apostrophe_exceptions) == -1) - args = replace_string(args,"'",""); - old_agent = this_agent(this_object()); verb = query_verb(); - //write("verb: "+verb); if(this_player()->GetSleeping() > 0) { if(verb != "wake") { --- 45,52 ---- *************** *** 76,129 **** if( (int)this_object()->GetProperty("parse debug") ) dbg = 1; if( (int)this_object()->GetProperty("debug") ) dbg = 1; else dbg = 0; - //tc("command: checkpoint 1","green"); if( (err = parse_sentence(cmd, dbg)) == 1 ) { this_agent(old_agent || 1); return 1; } - //tc("command: checkpoint 2","green"); if( err ) { - //tc("command: checkpoint 3. err: "+err,"green"); if( err == -1 ) { - //tc("command: checkpoint 4","green"); if( !(err = (string)VERBS_D->GetErrorMessage(verb)) && !(err = (string)SOUL_D->GetErrorMessage(verb)) ) { err = "Such a command exists, but no default " "syntax is known."; } } - //tc("command: checkpoint 5","green"); if( intp(err) ) /* MudOS bug */ err = "What?"; SetCommandFail(err); } - //tc("command: checkpoint 6","green"); message("error", GetCommandFail(), this_object()); this_agent(old_agent || 1); return 1; } - //tc("command: checkpoint 7","green"); } - //tc("command: checkpoint 8","green"); if( (err = (mixed)call_other(file, "cmd", args)) != 1 ) { string cmd; - //tc("command: checkpoint 9","green"); if( err ) SetCommandFail(err); if( !args || args == "" ) cmd = verb; else cmd = verb + " " + args; if( (err = parse_sentence(cmd)) == 1 ) { - //tc("command: checkpoint 10","green"); this_agent(old_agent || 1); return 1; } - //tc("command: checkpoint 11","green"); if( !err ) err = GetCommandFail(); message("error", err, this_object()); this_agent(old_agent || 1); return 1; } - //tc("command: checkpoint 12","green"); this_agent(old_agent || 1); return 1; } --- 69,110 ---- *************** *** 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)); } --- 171,187 ---- /* ********** /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.0r22/lib/lib/events/close.c ds2.0r29/lib/lib/events/close.c *** ds2.0r22/lib/lib/events/close.c Mon Nov 7 13:31:06 2005 --- ds2.0r29/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.0r22/lib/lib/events/get_from.c ds2.0r29/lib/lib/events/get_from.c *** ds2.0r22/lib/lib/events/get_from.c Wed Feb 22 15:32:57 2006 --- ds2.0r29/lib/lib/events/get_from.c Sun Jul 9 19:04:28 2006 *************** *** 6,39 **** * Last modified: 96/12/22 */ // abstract methods int AddCarriedMass(int amount); string GetShort(); // end abstract methods mixed CanGetFrom(object who, object item) { - //tc("hit CanGetFrom"); - //tc("who: "+identify(who)); - //tc("item: "+identify(item)); - //tc("this_object: "+this_object()->GetName()); if( !item ) { - //tc("no item. about to return 0"); return 0; } if( environment(item) != this_object() ) { - //tc("this item isnt in my inventory. returning 0"); return 0; } - // if( environment(item) != this_object() ) { - ////tc("stack: "+get_stack()); - //tc("previous: "+identify(previous_object(-1))); - // - // return "#You can't do that."; - // } - //tc("survicved test"); if( environment(item) != this_object() ) { - //tc("oddness"); item = present(item->GetKeyName(),this_object()); if(!item) return 0; } --- 6,27 ---- * Last modified: 96/12/22 */ + #include + // abstract methods int AddCarriedMass(int amount); string GetShort(); // end abstract methods mixed CanGetFrom(object who, object item) { if( !item ) { return 0; } if( environment(item) != this_object() ) { return 0; } if( environment(item) != this_object() ) { item = present(item->GetKeyName(),this_object()); if(!item) return 0; } *************** *** 48,53 **** --- 36,47 ---- mixed CanPutInto(object who, object item) { object env; + if((inherits(LIB_SIT,item) && sizeof(item->GetSitters())) || + (inherits(LIB_LIE,item) && sizeof(item->GetLiers()))){ + write("There appears to be someone in your way."); + return 0; + } + if( item == this_object() ) { return "#You cannot change the laws of physics."; } *************** *** 65,71 **** mixed CanPutOnto(object who, object item) { object env; ! if(!inherits( "/lib/comp/surface", item ) ){ return "#That isn't a load-bearing surface."; } if( item == this_object() ) { --- 59,71 ---- mixed CanPutOnto(object who, object item) { object env; ! if((inherits(LIB_SIT,item) && sizeof(item->GetSitters())) || ! (inherits(LIB_LIE,item) && sizeof(item->GetLiers()))){ ! write("There appears to be someone preventing your access."); ! return 0; ! } ! ! if(!inherits( LIB_SURFACE, item ) ){ return "#That isn't a load-bearing surface."; } if( item == this_object() ) { *************** *** 86,92 **** string msg; int i, maxi; ! //tc("hit eventGetFrom. item is: " +identify(what),"red"); foreach(object ob in what ) { if( environment(ob) != this_object() ) { continue; --- 86,97 ---- string msg; int i, maxi; ! if((inherits(LIB_SIT,this_object()) && sizeof(this_object()->GetSitters())) || ! (inherits(LIB_LIE,this_object()) && sizeof(this_object()->GetLiers()))){ ! write("There appears to be someone on there."); ! return 0; ! } ! foreach(object ob in what ) { if( environment(ob) != this_object() ) { continue; *************** *** 138,143 **** --- 143,153 ---- } mixed eventPutOnto(object who, object what) { + if((inherits(LIB_SIT,this_object()) && sizeof(this_object()->GetSitters())) || + (inherits(LIB_LIE,this_object()) && sizeof(this_object()->GetLiers()))){ + write("There appears to be someone in the way of that."); + return 0; + } return what->eventPut(who, this_object()," onto "); } *************** *** 151,174 **** } mixed indirect_get_obj_from_obj(object item, object container) { - //tc("stack: "+get_stack()); - //tc("item is: " +identify(item)); - //tc("container is: " +identify(container)); - //tc("this object is: "+identify(this_object())); - //if(item) tc("item's environment is: "+identify(environment(item))); if(!item){ - //write("That's not there."); return 0; } if(environment(item) != this_object()) return 0; - // if(!(environment(item) == this_object())){ - // item = present(item->GetKeyName(),this_object()); - //tc("item is now: " +identify(item)); - //return 0; - // } - //tc("about to return CanGetFrom"); return CanGetFrom(this_player(), item); } --- 161,172 ---- diff -c -r --new-file ds2.0r22/lib/lib/events/lie.c ds2.0r29/lib/lib/events/lie.c *** ds2.0r22/lib/lib/events/lie.c Sun Dec 11 21:15:29 2005 --- ds2.0r29/lib/lib/events/lie.c Sun Jul 9 22:06:37 2006 *************** *** 1,4 **** --- 1,6 ---- #include + #include + inherit LIB_SIT; private int MaxLiers = 1; private object array Liers = ({}); *************** *** 12,27 **** } object array GetLiers() { ! return Liers; } mixed eventReceiveLay(object who) { Liers = ({ Liers..., who }); return 1; } mixed eventReleaseStand(object who) { Liers -= ({ who }); return 1; } --- 14,37 ---- } object array GetLiers() { ! return copy(Liers); } mixed eventReceiveLay(object who) { + if(who->GetProperty("furniture")){ + write("You are already using a piece of furniture."); + return 1; + } Liers = ({ Liers..., who }); + who->SetProperty("furniture", " on "+this_object()->GetShort()); + who->SetProperty("furniture_object", this_object()); return 1; } mixed eventReleaseStand(object who) { Liers -= ({ who }); + Liers = filter(Liers, (: objectp($1) :) ); + sit::eventReleaseStand(who); return 1; } *************** *** 39,41 **** --- 49,65 ---- mixed direct_lie_down_word_obj() { return direct_lie_word_obj(); } + + int CanGet(object who){ + object *liers = this_object()->GetLiers(); if(sizeof(liers)){ + foreach(object wer in liers){ if(!wer || environment(wer) != environment()) this_object()->eventReleaseStand(wer); + } + if(sizeof(this_object()->GetLiers())){ + write(this_object()->GetLiers()[0]->GetName()+" is using it right now."); + return 0; + } + else return sit::CanGet(who); + } + else return sit::CanGet(who); + } + diff -c -r --new-file ds2.0r22/lib/lib/events/look.c ds2.0r29/lib/lib/events/look.c *** ds2.0r22/lib/lib/events/look.c Fri May 12 21:15:17 2006 --- ds2.0r29/lib/lib/events/look.c Sun Jul 9 20:32:28 2006 *************** *** 8,13 **** --- 8,14 ---- #include #include + #include private mixed ExternalDesc = 0; private int Invisible = 0; *************** *** 173,188 **** 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); - } ! else { ! who->eventPrint(desc); } return 1; } --- 174,190 ---- GetShort() + ".", ({ who, this_object() })); } ! if((!inherits(LIB_SIT,this_object()) && !inherits(LIB_LIE,this_object())) || ! (!sizeof(this_object()->GetLiers()) && !sizeof(this_object()->GetSitters()))){ ! if(inherits(LIB_SURFACE,this_object()) || ! this_object()->GetOpacity() < 33){ ! who->eventPrint(desc); ! this_object()->eventShowInterior(who); ! } ! else who->eventPrint(desc); } + else who->eventPrint(desc); return 1; } *************** *** 204,210 **** --- 206,226 ---- } mixed direct_look_at_str_on_obj(string str, object target) { + object dingus; str = remove_article(lower_case(str)); + + if((inherits(LIB_SIT,target) && sizeof(target->GetSitters())) || + (inherits(LIB_LIE,target) && sizeof(target->GetLiers()))){ + write("There appears to be someone blocking your view."); + return 0; + } + + if((inherits(LIB_SURFACE,target) || living(target)) && dingus = present(str, target)){ + if(this_player()->GetEffectiveVision() == VISION_CLEAR){ + return dingus->GetExternalDesc(); + } + else return "#You can't quite make out its details."; + } if( !Items[str] ) { return "#There is no " + str + " on " + GetShort() + "."; } diff -c -r --new-file ds2.0r22/lib/lib/events/pull.c ds2.0r29/lib/lib/events/pull.c *** ds2.0r22/lib/lib/events/pull.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/lib/events/put.c ds2.0r29/lib/lib/events/put.c *** ds2.0r22/lib/lib/events/put.c Thu Apr 13 21:03:52 2006 --- ds2.0r29/lib/lib/events/put.c Sun Jul 9 19:04:28 2006 *************** *** 4,9 **** --- 4,11 ---- * created by Descartes of Borg 960114 */ + #include + private mixed PreventPut; // abstract methods *************** *** 51,68 **** varargs mixed eventPut(object who, object storage, string prep) { int depth; - if(!prep || prep == "") prep = " into "; ! if(prep == " onto " && !inherits( "/lib/comp/surface", previous_object() ) ) { who->eventPrint("That isn't a load-bearing surface."); return 0; } ! if(prep == " into " && inherits( "/lib/comp/surface", previous_object() ) ) { who->eventPrint("That's a surface. Try \"put on\""); return 0; } if( !eventMove(storage) ) { who->eventPrint("There is not enough room in there!"); return 0; --- 53,76 ---- varargs mixed eventPut(object who, object storage, string prep) { int depth; if(!prep || prep == "") prep = " into "; ! if(prep == " onto " && !inherits( LIB_SURFACE, previous_object() ) ) { who->eventPrint("That isn't a load-bearing surface."); return 0; } ! if(prep == " into " && inherits( LIB_SURFACE, previous_object() ) ) { who->eventPrint("That's a surface. Try \"put on\""); return 0; } + if((inherits(LIB_SIT,storage) && sizeof(storage->GetSitters())) || + (inherits(LIB_LIE,storage) && sizeof(storage->GetLiers()))){ + write("There appears to be someone blocking your access."); + return 0; + } + + if( !eventMove(storage) ) { who->eventPrint("There is not enough room in there!"); return 0; diff -c -r --new-file ds2.0r22/lib/lib/events/read.c ds2.0r29/lib/lib/events/read.c *** ds2.0r22/lib/lib/events/read.c Sat Mar 11 11:16:11 2006 --- ds2.0r29/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.0r22/lib/lib/events/sit.c ds2.0r29/lib/lib/events/sit.c *** ds2.0r22/lib/lib/events/sit.c Sun Dec 11 21:15:29 2005 --- ds2.0r29/lib/lib/events/sit.c Sun Jul 9 22:06:37 2006 *************** *** 20,35 **** } object array GetSitters() { ! return Sitters; } mixed eventReceiveSit(object who) { Sitters = ({ Sitters..., who }); return 1; } mixed eventReleaseStand(object who) { Sitters -= ({ who }); return 1; } --- 20,44 ---- } object array GetSitters() { ! return copy(Sitters); } mixed eventReceiveSit(object who) { + if(who->GetProperty("furniture")){ + write("You are already using a piece of furniture."); + return 1; + } Sitters = ({ Sitters..., who }); + who->SetProperty("furniture", " on "+this_object()->GetShort()); + who->SetProperty("furniture_object", this_object()); return 1; } mixed eventReleaseStand(object who) { Sitters -= ({ who }); + Sitters = filter(Sitters, (: objectp($1) :) ); + if(who) who->RemoveProperty("furniture"); + if(who) who->RemoveProperty("furniture_object"); return 1; } *************** *** 47,49 **** --- 56,73 ---- mixed direct_sit_down_word_obj() { return direct_sit_word_obj(); } + + int CanGet(object who){ + object *sitters = this_object()->GetSitters(); + if(sizeof(sitters)){ + foreach(object wer in sitters){ + if(!wer || environment(wer) != environment()) this_object()->eventReleaseStand(wer); + } if(sizeof(this_object()->GetSitters())){ + write(this_object()->GetSitters()[0]->GetName()+" is using it right now."); + return 0; + } + else return 1; + } + else return 1; + } + diff -c -r --new-file ds2.0r22/lib/lib/exits.c ds2.0r29/lib/lib/exits.c *** ds2.0r22/lib/lib/exits.c Sat Apr 22 15:15:02 2006 --- ds2.0r29/lib/lib/exits.c Fri Jul 7 19:41:42 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() { *************** *** 81,86 **** --- 82,91 ---- if( ob ) { ob->SetDoor(file); } + + if(!file_exists(file) && !file_exists(file+".c")){ + return "Door not found."; + } file->eventRegisterSide(dir); return (Doors[dir] = file); } diff -c -r --new-file ds2.0r22/lib/lib/fishing.c ds2.0r29/lib/lib/fishing.c *** ds2.0r22/lib/lib/fishing.c Fri May 12 21:15:17 2006 --- ds2.0r29/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" }), *************** *** 181,187 **** 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; } *************** *** 192,198 **** 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.0r22/lib/lib/include/body.h ds2.0r29/lib/lib/include/body.h *** ds2.0r22/lib/lib/include/body.h Sat Apr 22 15:15:02 2006 --- ds2.0r29/lib/lib/include/body.h Wed Jul 5 00:01:05 2006 *************** *** 15,21 **** 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); --- 15,21 ---- 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); diff -c -r --new-file ds2.0r22/lib/lib/include/exits.h ds2.0r29/lib/lib/include/exits.h *** ds2.0r22/lib/lib/include/exits.h Wed Sep 28 19:34:11 2005 --- ds2.0r29/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.0r22/lib/lib/include/npc.h ds2.0r29/lib/lib/include/npc.h *** ds2.0r22/lib/lib/include/npc.h Wed Sep 28 19:34:11 2005 --- ds2.0r29/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.0r22/lib/lib/include/player.h ds2.0r29/lib/lib/include/player.h *** ds2.0r22/lib/lib/include/player.h Wed Apr 12 23:48:52 2006 --- ds2.0r29/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); diff -c -r --new-file ds2.0r22/lib/lib/interactive.c ds2.0r29/lib/lib/interactive.c *** ds2.0r22/lib/lib/interactive.c Fri May 12 21:15:17 2006 --- ds2.0r29/lib/lib/interactive.c Sat Jul 8 23:30:58 2006 *************** *** 29,36 **** 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; private static int LastAge, Setup; --- 29,37 ---- inherit LIB_MESSAGES; inherit LIB_INTERFACE; ! private int Age, WhereBlock, Brief, LoginTime, BirthTime, RescueBit; private string Password, Email, RealName, Rank, LoginSite, HostSite, WebPage; + private string globaltmp; private mapping News; private class marriage *Marriages; private static int LastAge, Setup; *************** *** 54,63 **** --- 55,70 ---- 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()); --- 123,133 ---- 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()); *************** *** 254,260 **** lying[s]++; } } - //tc(identify(shorts)); for(i=0, desc = 0, maxi = sizeof(shorts = keys(lying)); i 1 || val >1 ) desc += " are here.%^RESET%^\n"; *************** *** 290,295 **** --- 301,307 ---- i = GetEffectiveVision(); if( i == VISION_CLEAR || i == VISION_LIGHT || i == VISION_DIM ) { mapping lying = ([]), sitting = ([]), standing = ([]), flying = ([]); + mapping furniture = ([]); object *obs; string key; int val; *************** *** 304,311 **** foreach(object liv in obs) { string s = (string)liv->GetHealthShort(); int pos = (int)liv->GetPosition(); - if( !s ) continue; if( pos == POSITION_STANDING) standing[s]++; else if( pos == POSITION_LYING || (int)liv->isFreshCorpse() ) lying[s]++; --- 316,330 ---- foreach(object liv in obs) { string s = (string)liv->GetHealthShort(); int pos = (int)liv->GetPosition(); if( !s ) continue; + if(liv->GetProperty("furniture")) { + s += "BEGIN"+random(999999)+"END"; + } + if(liv->GetProperty("furniture")){ + furniture[s] = liv->GetProperty("furniture"); + } + else if(!furniture[s]) furniture[s] = 0; + if( pos == POSITION_STANDING) standing[s]++; else if( pos == POSITION_LYING || (int)liv->isFreshCorpse() ) lying[s]++; *************** *** 321,339 **** } desc = ""; foreach(key, val in lying) { ! if( val<2 ) desc += capitalize(key) + "%^RESET%^ is lying down."; ! else desc += capitalize(consolidate(val, key)) + "%^RESET%^ are lying down."; desc += "\n"; } foreach(key, val in sitting) { ! if( val<2 ) ! desc += capitalize(key) + "%^RESET%^ is sitting down."; ! else desc += capitalize(consolidate(val, key)) + "%^RESET%^ are sitting down."; desc += "\n"; } foreach(key, val in standing) { if( val<2 ) desc += capitalize(key) + "%^RESET%^ is standing here."; else desc += capitalize(consolidate(val, key)) + --- 340,407 ---- } desc = ""; foreach(key, val in lying) { ! globaltmp = key; ! if(grepp(key,"BEGIN")) { ! sscanf(key,"%sBEGIN%*s",key); ! } ! ! if(lying[globaltmp]>1 && !furniture[globaltmp]){ ! desc += capitalize(consolidate(val, globaltmp)) + "%^RESET%^ are lying down."; + } + else if(lying[globaltmp]<2 && !furniture[globaltmp]){ + desc += capitalize(key) + "%^RESET%^ is lying down."; + } + else if(furniture[globaltmp]) { + desc += capitalize(key) + "%^RESET%^ is lying down"+ + ((furniture[globaltmp]) ? furniture[globaltmp] : "") +"."; + } + else if(furniture[key]) { + desc += capitalize(key) + "%^RESET%^ is lying down"+ + ((furniture[key]) ? furniture[key] : "") +"."; + } + + + else { + desc += "wtf. i am "+key+", furniture["+globaltmp+"] is: "+furniture[globaltmp]+"\n"+ + " furniture["+key+"] is: "+furniture[key]+", and val is: "+val; + } + desc += "\n"; } foreach(key, val in sitting) { ! globaltmp = key; ! if(grepp(key,"BEGIN")) { ! sscanf(key,"%sBEGIN%*s",key); ! } ! ! if(sitting[globaltmp]>1 && !furniture[globaltmp]){ ! desc += capitalize(consolidate(val, globaltmp)) + "%^RESET%^ are sitting down."; + } + else if(sitting[globaltmp]<2 && !furniture[globaltmp]){ + desc += capitalize(key) + "%^RESET%^ is sitting down."; + } + else if(furniture[globaltmp]) { + desc += capitalize(key) + "%^RESET%^ is sitting down"+ + ((furniture[globaltmp]) ? furniture[globaltmp] : "") +"."; + } + else if(furniture[key]) { + desc += capitalize(key) + "%^RESET%^ is sitting down"+ + ((furniture[key]) ? furniture[key] : "") +"."; + } + + + else { + desc += "wtf. i am "+key+", furniture["+globaltmp+"] is: "+furniture[globaltmp]+"\n"+ + " furniture["+key+"] is: "+furniture[key]+", and val is: "+val; + } desc += "\n"; } foreach(key, val in standing) { + if(grepp(key,"BEGIN")) { + sscanf(key,"%sBEGIN%*s",key); + } if( val<2 ) desc += capitalize(key) + "%^RESET%^ is standing here."; else desc += capitalize(consolidate(val, key)) + diff -c -r --new-file ds2.0r22/lib/lib/language.c ds2.0r29/lib/lib/language.c *** ds2.0r22/lib/lib/language.c Wed Apr 5 19:33:18 2006 --- ds2.0r29/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; *************** *** 123,128 **** --- 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.0r22/lib/lib/living.c ds2.0r29/lib/lib/living.c *** ds2.0r22/lib/lib/living.c Tue Mar 28 23:23:41 2006 --- ds2.0r29/lib/lib/living.c Sat Jul 8 23:30:58 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; } *************** *** 598,603 **** --- 613,622 ---- return (carry::GetCarriedMass()); } + varargs int GetMaxHealthPoints(string limb){ + return combat::GetMaxHealthPoints(limb); + } + int GetMaxCarry() { return combat::GetMaxCarry(); } int SetPK(int x) { return (isPK = x); } diff -c -r --new-file ds2.0r22/lib/lib/meal.c ds2.0r29/lib/lib/meal.c *** ds2.0r22/lib/lib/meal.c Mon Nov 7 13:29:00 2005 --- ds2.0r29/lib/lib/meal.c Sun Jul 9 19:04:29 2006 *************** *** 60,65 **** --- 60,66 ---- mixed eventDrink(object who) { mixed tmp; int x; + object ob; if( (tmp = (mixed)who->eventDrink(this_object())) != 1 ) return tmp; if( (x = functionp(MyMessage)) && !(x & FP_OWNER_DESTED) ) { *************** *** 75,100 **** who->eventPrint( capitalize(mymsg) ); environment(who)->eventPrint( capitalize(othermsg), who ); } - if( GetEmptyItem() ) { - object ob; ! ob = new(GetEmptyItem() || LIB_ITEM); ! if( base_name(ob) == LIB_ITEM ) { ! ob->SetKeyName(GetEmptyName()); ! ob->SetId( ({ GetEmptyName(), "container", "empty container" }) ); ! ob->SetShort(GetEmptyShort()); ! ob->SetLong(GetEmptyLong()); ! ob->SetValue(10); ! ob->SetMass(100); ! ob->SetDestroyOnSell(); ! } ! if( !((int)ob->eventMove(who)) ) { ! who->eventPrint("You drop " + (string)ob->GetShort() + "."); ! environment(who)->eventPrint((string)who->GetName() + ! " drops " + (string)ob->GetShort() + ".", who); ! ob->eventMove(environment(who)); ! } } if( x = GetPoison() ) { if( random((int)who->GetStatLevel("luck")) > 35 ) who->eventPrint("That didn't seem to taste quite right."); --- 76,99 ---- who->eventPrint( capitalize(mymsg) ); environment(who)->eventPrint( capitalize(othermsg), who ); } ! ob = new(GetEmptyItem() || LIB_ITEM); ! if( base_name(ob) == LIB_ITEM ) { ! ob->SetKeyName(GetEmptyName()); ! ob->SetId( ({ GetEmptyName(), "container", "empty container" }) ); ! ob->SetShort(GetEmptyShort()); ! ob->SetLong(GetEmptyLong()); ! ob->SetBaseCost(1); ! ob->SetMass(10); ! ob->SetDestroyOnSell(); ! } ! if( !((int)ob->eventMove(who)) ) { ! who->eventPrint("You drop " + (string)ob->GetShort() + "."); ! environment(who)->eventPrint((string)who->GetName() + ! " drops " + (string)ob->GetShort() + ".", who); ! ob->eventMove(environment(who)); } + if( x = GetPoison() ) { if( random((int)who->GetStatLevel("luck")) > 35 ) who->eventPrint("That didn't seem to taste quite right."); diff -c -r --new-file ds2.0r22/lib/lib/nmsh.c ds2.0r29/lib/lib/nmsh.c *** ds2.0r22/lib/lib/nmsh.c Wed Apr 5 19:33:18 2006 --- ds2.0r29/lib/lib/nmsh.c Wed Jul 5 00:00:58 2006 *************** *** 36,42 **** "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" ]); Xverbs = (["'":"say $*",":":"emote $*","\"":"say $*",]); } --- 36,43 ---- "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.0r22/lib/lib/npc.c ds2.0r29/lib/lib/npc.c *** ds2.0r22/lib/lib/npc.c Fri Mar 24 14:36:39 2006 --- ds2.0r29/lib/lib/npc.c Sat Jul 8 23:30:58 2006 *************** *** 25,30 **** --- 25,31 ---- inherit LIB_SAVE; private int CustomXP, ActionChance, CombatActionChance, AutoStand, Mount; + private int MaximumHealth = 0; private mixed Encounter; private string *EnemyNames; private static int Level, Unique; *************** *** 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() })); --- 390,400 ---- 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 **** --- 409,415 ---- } set_heart_beat(0); call_out( (: Destruct :), 0); + flush_messages(); return 1; } *************** *** 603,610 **** return GetHealthPoints(); } int SetMaxHealthPoints(int x) { ! SetStat("durability", to_int((x-50)/10), GetStatClass("durability")); return GetMaxHealthPoints(); } --- 607,620 ---- return GetHealthPoints(); } + varargs int GetMaxHealthPoints(string limb){ + if(MaximumHealth) return MaximumHealth; + else return living::GetMaxHealthPoints(limb); + } + int SetMaxHealthPoints(int x) { ! if(x) MaximumHealth = x; ! else SetStat("durability", to_int((x-50)/10), GetStatClass("durability")); return GetMaxHealthPoints(); } *************** *** 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; --- 643,669 ---- } 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.0r22/lib/lib/pile.c ds2.0r29/lib/lib/pile.c *** ds2.0r22/lib/lib/pile.c Sat Apr 22 15:15:26 2006 --- ds2.0r29/lib/lib/pile.c Sat Jul 8 23:30:58 2006 *************** *** 10,21 **** inherit LIB_ITEM; ! private string PileType = 0; ! private int PileAmount = 0; static void create() { string *saveds; item::create(); saveds = item::GetSave(); saveds += ({ "PileType", "PileAmount" }); AddSave( saveds ); --- 10,22 ---- inherit LIB_ITEM; ! string PileType = 0; ! int PileAmount = 0; static void create() { string *saveds; item::create(); + SetNoCondition(1); saveds = item::GetSave(); saveds += ({ "PileType", "PileAmount" }); AddSave( saveds ); *************** *** 27,42 **** id = item::GetId(); if( PileType ) { ! id += ({ PileType, PileAmount + " " + PileType }); } ! return ({ id..., "money", "pile" }); ! } ! ! varargs string GetLong(string str) { ! if( !PileAmount ) { ! return 0; ! } ! return "It is a pile of " + PileAmount + " " + PileType + "."; } int GetMass() { --- 28,36 ---- id = item::GetId(); if( PileType ) { ! id += ({ PileType, PileAmount + " " + PileType, "pile of "+PileType }); } ! return ({ id..., "money", "pile", "pile of "+ PileAmount + " " + PileType }); } int GetMass() { *************** *** 46,51 **** --- 40,50 ---- void SetPile(string str, int amt) { PileType = str; PileAmount = amt; + if(!PileAmount || PileAmount < 1 ){ + SetLong("a pile of money"); + call_out( (: eventDestruct :), 1); + } + else SetLong("It is a pile of " + PileAmount + " " + PileType + "."); parse_refresh(); } *************** *** 56,61 **** --- 55,64 ---- string GetShort() { string str = item::GetShort(); + if(!PileAmount || PileAmount < 1 ){ + call_out( (: eventDestruct :), 1); + return "a pile of money"; + } if( str ) { return str; } *************** *** 84,98 **** int x; x = item::eventMove(dest); ! if( !living(environment()) ) { return x; } - environment()->AddCurrency(PileType, PileAmount); - environment()->AddCarriedMass(-this_object()->GetMass()); - SetShort("a pile of " + PileAmount + " " + PileType); - PileAmount = 0; - call_out((: Destruct :), 0); - return x; } mixed direct_get_wrd_wrd_out_of_obj(string num, string curr) { --- 87,104 ---- int x; x = item::eventMove(dest); ! if( environment() && !living(environment()) ) { ! return x; ! } ! ! if(environment() && living(environment())){ ! environment()->AddCurrency(PileType, PileAmount); ! environment()->AddCarriedMass(-this_object()->GetMass()); ! SetShort("a pile of " + PileAmount + " " + PileType); ! PileAmount = 0; ! call_out((: Destruct :), 0); return x; } } mixed direct_get_wrd_wrd_out_of_obj(string num, string curr) { *************** *** 122,124 **** --- 128,138 ---- mixed direct_get_wrd_wrd_from_obj(string amt, string curr) { return direct_get_wrd_wrd_out_of_obj(amt, curr); } + + void init(){ + ::init(); + if(!PileAmount || PileAmount < 1 ){ + SetLong("some money"); + call_out( (: eventDestruct :), 1); + } + } diff -c -r --new-file ds2.0r22/lib/lib/player.c ds2.0r29/lib/lib/player.c *** ds2.0r22/lib/lib/player.c Wed Apr 12 23:48:53 2006 --- ds2.0r29/lib/lib/player.c Wed Jul 5 19:58:20 2006 *************** *** 22,28 **** private string *Titles; string *Muffed = ({}); private class quest *Quests; ! private class death *Deaths; private int TrainingPoints, TitleLength; /* ***************** /lib/player.c driver applies ***************** */ --- 22,28 ---- private string *Titles; string *Muffed = ({}); private class quest *Quests; ! private mapping *Deaths; private int TrainingPoints, TitleLength; /* ***************** /lib/player.c driver applies ***************** */ *************** *** 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){ *************** *** 463,469 **** 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()); *************** *** 527,533 **** return Muffed; } - string *SetTitles(string *titles) { if( sizeof(distinct_array(titles)) != sizeof(titles) ) return Titles; Titles = titles; --- 536,541 ---- *************** *** 782,829 **** 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.0r22/lib/lib/props/clean.c ds2.0r29/lib/lib/props/clean.c *** ds2.0r22/lib/lib/props/clean.c Mon Jan 16 23:03:15 2006 --- ds2.0r29/lib/lib/props/clean.c Sat Jul 8 23:30:59 2006 *************** *** 29,35 **** * another object, call ob->eventDestruct(). */ static int Destruct() { ! object env; if( !this_object() ) { return 1; --- 29,35 ---- * another object, call ob->eventDestruct(). */ static int Destruct() { ! object env, furn; if( !this_object() ) { return 1; *************** *** 42,47 **** --- 42,51 ---- } } } + + if(living(this_object()) && furn = this_object()->GetProperty("furniture_object")) + if(objectp(furn)) furn->eventReleaseStand(this_object()); + remove_call_out(); destruct(this_object()); return !(this_object()); diff -c -r --new-file ds2.0r22/lib/lib/props/move.c ds2.0r29/lib/lib/props/move.c *** ds2.0r22/lib/lib/props/move.c Mon Jan 23 15:46:02 2006 --- ds2.0r29/lib/lib/props/move.c Sat Jul 8 23:30:59 2006 *************** *** 9,15 **** } int eventMove(mixed dest) { ! object ob,to; int depth; to=this_object(); --- 9,15 ---- } int eventMove(mixed dest) { ! object ob,to,furn; int depth; to=this_object(); *************** *** 77,81 **** --- 77,85 ---- } } } + + if(living(this_object()) && furn = this_object()->GetProperty("furniture_object")) + if(objectp(furn)) furn->eventReleaseStand(this_object()); + return (LastEnvironment != environment()); } diff -c -r --new-file ds2.0r22/lib/lib/props/properties.c ds2.0r29/lib/lib/props/properties.c *** ds2.0r22/lib/lib/props/properties.c Wed Apr 5 19:33:18 2006 --- ds2.0r29/lib/lib/props/properties.c Wed Jul 5 00:01:05 2006 *************** *** 21,26 **** --- 21,27 ---- mixed GetProperty(string prop) { return Properties[prop]; + //else return 0; } mapping GetProperties() { *************** *** 42,46 **** } 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.0r22/lib/lib/sentient.c ds2.0r29/lib/lib/sentient.c *** ds2.0r22/lib/lib/sentient.c Wed Apr 5 19:33:18 2006 --- ds2.0r29/lib/lib/sentient.c Wed Jul 5 00:00:58 2006 *************** *** 265,281 **** 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 }); } *************** *** 284,290 **** 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 }); } *************** *** 327,338 **** --- 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.0r22/lib/lib/spell.c ds2.0r29/lib/lib/spell.c *** ds2.0r22/lib/lib/spell.c Mon Jan 16 23:03:16 2006 --- ds2.0r29/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.0r22/lib/lib/stargate.c ds2.0r29/lib/lib/stargate.c *** ds2.0r22/lib/lib/stargate.c Fri May 12 21:15:17 2006 --- ds2.0r29/lib/lib/stargate.c Wed Jul 5 00:00:58 2006 *************** *** 140,145 **** --- 140,147 ---- 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); } *************** *** 150,164 **** } mixed cmdDial(string s){ string flipside; if (s) { //tc("s: "+s); ! flipside = STARGATE_D->GetDestination(s); //tc("flipside: "+flipside); eventConnect(s); ! if(flipside) load_object(flipside); ! if(!flipside || !find_object(flipside) ){ write("The Stargate abruptly begins to shuts down."); eventDisconnect(); } --- 152,169 ---- } 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(); } *************** *** 220,226 **** "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 circumfrence."; stat = status(); --- 225,231 ---- "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(); diff -c -r --new-file ds2.0r22/lib/lib/std/bed.c ds2.0r29/lib/lib/std/bed.c *** ds2.0r22/lib/lib/std/bed.c Sun Dec 11 21:15:29 2005 --- ds2.0r29/lib/lib/std/bed.c Sun Jul 9 22:06:37 2006 *************** *** 1,17 **** #include inherit LIB_ITEM; - inherit LIB_SIT; inherit LIB_LIE; inherit LIB_SURFACE; void create(){ ! ::create(); ! SetMaxSitters(4); SetMaxLiers(2); SetMaxCarry(300); SetMass(1700); } --- 1,23 ---- #include inherit LIB_ITEM; inherit LIB_LIE; inherit LIB_SURFACE; void create(){ ! item::create(); ! surface::create(); ! ! SetMaxLiers(4); SetMaxLiers(2); SetMaxCarry(300); SetMass(1700); } + int CanGet(object who){ + if(lie::CanGet(who)) + return item::CanGet(who); + else return 0; + } diff -c -r --new-file ds2.0r22/lib/lib/std/chair.c ds2.0r29/lib/lib/std/chair.c *** ds2.0r22/lib/lib/std/chair.c Sun Dec 11 21:15:30 2005 --- ds2.0r29/lib/lib/std/chair.c Sun Jul 9 22:06:37 2006 *************** *** 19,22 **** --- 19,28 ---- SetMass(500); } + int CanGet(object who){ + if(sit::CanGet(who)) + return item::CanGet(who); + else return 0; + } + /* Nothing else needs to happen here */ diff -c -r --new-file ds2.0r22/lib/lib/std/corpse.c ds2.0r29/lib/lib/std/corpse.c *** ds2.0r22/lib/lib/std/corpse.c Sat Mar 11 11:16:12 2006 --- ds2.0r29/lib/lib/std/corpse.c Fri Jul 7 19:41:43 2006 *************** *** 74,80 **** Race = who->GetRace(); Count = 1; Fresh = 1; ! SetShort((string)who->GetShort()); SetLong("As you look closely at " + who->GetCapName() + ", you notice that " + nominative(who) + " does not appear to be moving."); --- 74,80 ---- Race = who->GetRace(); Count = 1; Fresh = 1; ! SetShort("the corpse of "+(string)who->GetShort()); SetLong("As you look closely at " + who->GetCapName() + ", you notice that " + nominative(who) + " does not appear to be moving."); diff -c -r --new-file ds2.0r22/lib/lib/std/dummy.c ds2.0r29/lib/lib/std/dummy.c *** ds2.0r22/lib/lib/std/dummy.c Mon Jan 23 08:52:49 2006 --- ds2.0r29/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.0r22/lib/lib/std/germ.c ds2.0r29/lib/lib/std/germ.c *** ds2.0r22/lib/lib/std/germ.c Fri May 12 21:15:17 2006 --- ds2.0r29/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))]; 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.0r22/lib/lib/std/item.c ds2.0r29/lib/lib/std/item.c *** ds2.0r22/lib/lib/std/item.c Wed Apr 5 19:33:18 2006 --- ds2.0r29/lib/lib/std/item.c Wed Jul 5 00:01:05 2006 *************** *** 187,198 **** 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") * *************** *** 206,213 **** 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; *************** *** 217,223 **** 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.0r22/lib/lib/std/room.c ds2.0r29/lib/lib/std/room.c *** ds2.0r22/lib/lib/std/room.c Mon May 15 01:14:02 2006 --- ds2.0r29/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"; *************** *** 76,82 **** /*********** /lib/room.c data manipulation functions **********/ ! void heart_beat(){ if( ActionChance > random(100) ) { int x; --- 77,83 ---- /*********** /lib/room.c data manipulation functions **********/ ! void CheckActions(){ if( ActionChance > random(100) ) { int x; *************** *** 94,99 **** --- 95,104 ---- } } + void heart_beat(){ + CheckActions(); + } + void SetAction(int chance, mixed val) { ActionChance = chance; if( stringp(val) ) val = ({ val }); *************** *** 276,282 **** } 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()); *************** *** 694,700 **** 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); *************** *** 940,946 **** 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); diff -c -r --new-file ds2.0r22/lib/lib/std/table.c ds2.0r29/lib/lib/std/table.c *** ds2.0r22/lib/lib/std/table.c Sun Dec 11 21:20:49 2005 --- ds2.0r29/lib/lib/std/table.c Sun Jul 9 22:06:38 2006 *************** *** 1,14 **** #include ! inherit LIB_ITEM; ! inherit LIB_SIT; ! inherit LIB_LIE; ! ! inherit LIB_STORAGE; ! inherit LIB_SURFACE; void create(){ ! storage::create(); SetMaxSitters(2); SetMaxLiers(1); SetMaxCarry(500); --- 1,11 ---- #include ! inherit LIB_BED; void create(){ ! bed::create(); ! SetShort("A table"); ! SetLong("A table"); SetMaxSitters(2); SetMaxLiers(1); SetMaxCarry(500); *************** *** 17,20 **** --- 14,24 ---- inventory_accessible(); } + void init(){ + ::init(); + } + + int CanGet(object who){ + return bed::CanGet(who); + } diff -c -r --new-file ds2.0r22/lib/lib/std/vendor.c ds2.0r29/lib/lib/std/vendor.c *** ds2.0r22/lib/lib/std/vendor.c Sat Apr 22 15:15:31 2006 --- ds2.0r29/lib/lib/std/vendor.c Sun Jul 9 19:04:29 2006 *************** *** 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", (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(); *************** *** 115,126 **** 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() ) *************** *** 170,176 **** 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; *************** *** 200,209 **** list2 += ({ ( obs[counter]->GetKeyName()) }); } } ! obs2 = ({ present(list2[0],sroom) }); ! maxi = sizeof(list2); ! for(int counter = 1;counter < maxi;++counter) { ! obs2 += ({ present(list2[counter],sroom) }); } maxi = sizeof(obs2); i = (int)this_player()->GetScreen()[0]; --- 200,218 ---- list2 += ({ ( obs[counter]->GetKeyName()) }); } } ! //obs2 = ({ present(list2[0],sroom) }); ! //maxi = sizeof(list2); ! //for(int counter = 1;counter < maxi;++counter) { ! // obs2 += ({ present(list2[counter],sroom) }); ! // } ! obs2 = ({}); ! foreach(object tempob in obs){ ! string *base_names = ({}); ! foreach( object tempob2 in obs2 ) base_names += ({ base_name(tempob2) }); ! if(!sizeof(obs2)) { ! obs2 = ({tempob}); ! } ! else if(member_array(base_name(tempob), base_names) == -1) obs2 += ({ tempob }); } maxi = sizeof(obs2); i = (int)this_player()->GetScreen()[0]; *************** *** 318,326 **** cost=to_int(ob->GetBaseCost() / ECONOMY_D->__Query(LocalCurrency,"rate")); } 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; --- 327,339 ---- cost=to_int(ob->GetBaseCost() / ECONOMY_D->__Query(LocalCurrency,"rate")); } else cost=to_int(floor(ob->GetBaseCost())); ! if(!cost || cost < 1){ ! eventForce("say " + capitalize((string)who->GetKeyName()) + ", I will not buy " ! "that worthless thing from you."); ! return 1; ! } ! else x=cost; ! eventForce("say " + capitalize((string)who->GetKeyName()) + ", I will offer " "you " + x + " " + GetLocalCurrency() + " for " + (string)ob->GetShort()); return 1; *************** *** 343,367 **** return 0; } obs = all_inventory(sroom); ! maxi = sizeof(obs); if( x = to_int(args) ) { ! list2 = ({(obs[0]->GetKeyName())}); for(int counter = 1;counter < maxi;++counter) { ! if(member_array((obs[counter]->GetKeyName()),list2) < 0) { ! list2 += ({ ( obs[counter]->GetKeyName()) }); } } - obs2 = ({ present(list2[0],sroom) }); maxi = sizeof(list2); ! for(int counter = 1;counter < maxi;++counter) { ! obs2 += ({ present(list2[counter],sroom) }); ! } ! if((x <= 0) || (x > sizeof(obs2))) ob = 0; ! else ! ob = obs2[x-1]; ! } else ob = present(args = lower_case(args), sroom); if( !ob ) { eventForce("say I have no such thing!"); return 1; --- 356,384 ---- return 0; } obs = all_inventory(sroom); ! obs2 = ({}); ! foreach(object tempob in obs){ ! string *base_names = ({}); ! foreach( object tempob2 in obs2 ) base_names += ({ base_name(tempob2) }); ! if(!sizeof(obs2)) { ! obs2 = ({tempob}); ! } ! else if(member_array(base_name(tempob), base_names) == -1) obs2 += ({ tempob }); ! } ! maxi = sizeof(obs2); if( x = to_int(args) ) { ! list2 = ({(obs2[0]->GetKeyName())}); for(int counter = 1;counter < maxi;++counter) { ! if(member_array((obs2[counter]->GetKeyName()),list2) < 0) { ! list2 += ({ ( obs2[counter]->GetKeyName()) }); } } maxi = sizeof(list2); ! ob = obs2[x-1]; } else ob = present(args = lower_case(args), sroom); + if(!ob) foreach(object tempob in obs2) + if(answers_to(args,tempob)) ob = tempob; if( !ob ) { eventForce("say I have no such thing!"); return 1; *************** *** 370,376 **** 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; --- 387,393 ---- 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; *************** *** 436,455 **** sroom = load_object(StorageRoom); obs = all_inventory(sroom); ! maxi = sizeof(obs); if(number = to_int(what)) { number = number - 1; ! list2 = ({(obs[0]->GetKeyName())}); for(int counter = 1;counter < maxi;++counter) { ! if(member_array((obs[counter]->GetKeyName()),list2) < 0) { ! list2 += ({ ( obs[counter]->GetKeyName()) }); } } - obs2 = ({ present(list2[0],sroom) }); maxi = sizeof(list2); - for(int counter = 1;counter < maxi;++counter) { - obs2 += ({ present(list2[counter],sroom) }); - } if((number >= 0) && (number < sizeof(obs2))) { ob = obs2[number]; } else { --- 453,477 ---- sroom = load_object(StorageRoom); obs = all_inventory(sroom); ! obs2 = ({}); ! foreach(object tempob in obs){ ! string *base_names = ({}); ! foreach( object tempob2 in obs2 ) base_names += ({ base_name(tempob2) }); ! if(!sizeof(obs2)) { ! obs2 = ({tempob}); ! } ! else if(member_array(base_name(tempob), base_names) == -1) obs2 += ({ tempob }); ! } ! maxi = sizeof(obs2); if(number = to_int(what)) { number = number - 1; ! list2 = ({(obs2[0]->GetKeyName())}); for(int counter = 1;counter < maxi;++counter) { ! if(member_array((obs2[counter]->GetKeyName()),list2) < 0) { ! list2 += ({ ( obs2[counter]->GetKeyName()) }); } } maxi = sizeof(list2); if((number >= 0) && (number < sizeof(obs2))) { ob = obs2[number]; } else { *************** *** 457,463 **** return 1; } } else { ! if( !(ob = present(what, sroom)) ) { eventForce("say I have nothing like that to sell"); return 1; } --- 479,488 ---- return 1; } } else { ! if( !(ob = present(what, sroom))) ! foreach(object tempob in obs2) ! if(answers_to(what,tempob)) ob = tempob; ! if(!ob){ eventForce("say I have nothing like that to sell"); return 1; } diff -c -r --new-file ds2.0r22/lib/lib/std/worn_storage.c ds2.0r29/lib/lib/std/worn_storage.c *** ds2.0r22/lib/lib/std/worn_storage.c Mon May 15 01:14:02 2006 --- ds2.0r29/lib/lib/std/worn_storage.c Wed Jul 5 00:01:05 2006 *************** *** 456,462 **** object::create(); holder::create(); seal::create(); - PutCheck(); SetVendorType(VT_ARMOR); } --- 456,461 ---- *************** *** 520,529 **** } 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) { diff -c -r --new-file ds2.0r22/lib/lib/talk.c ds2.0r29/lib/lib/talk.c *** ds2.0r22/lib/lib/talk.c Wed Apr 5 19:33:18 2006 --- ds2.0r29/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; *************** *** 126,132 **** string verb, tmp; int cols; ! if( lang ) { msg = translate(msg, GetLanguageLevel(lang)); lang = GetLanguageName(lang); } --- 128,134 ---- string verb, tmp; int cols; ! if( lang && !GetPolyglot() ) { msg = translate(msg, GetLanguageLevel(lang)); lang = GetLanguageName(lang); } diff -c -r --new-file ds2.0r22/lib/lib/teacher.c ds2.0r29/lib/lib/teacher.c *** ds2.0r22/lib/lib/teacher.c Fri May 12 21:15:18 2006 --- ds2.0r29/lib/lib/teacher.c Fri Jul 7 19:41:43 2006 *************** *** 13,19 **** --- 13,70 ---- private string array TeachingLanguages; private mapping Students; + private int commercial = 0; + private int AllLangs = 0; + private int teaching_fee = 50; + private string local_currency = "silver"; + int SetAllLanguages(int i){ + if(!i) AllLangs = 0; + else AllLangs = 1; + return AllLangs; + } + + int GetAllLanguages(){ + return AllLangs; + } + + 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 ****/ *************** *** 113,126 **** 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( (int)this_player()->GetTrainingPoints() < 1 ) { eventForce("speak You need more training points."); return 0; } Students[ (string)who->GetKeyName() ] = language; eventStart(who, language); call_out((: ContinueTeaching, who, language, 0 :), TEACHING_WAIT); --- 164,183 ---- eventForce("speak I am already teaching you!"); return 0; } ! if( !GetAllLanguages() && ! 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); *************** *** 137,143 **** map_delete(Students, (string)who->GetKeyName()); eventComplete(who, language); who->AddLanguagePoints(language,5+((who->GetStatLevel("intelligence")/10)*2)+random(10)); ! who->AddTrainingPoints(-1); return 1; } else { eventContinue(who, language, ++x); --- 194,201 ---- 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); diff -c -r --new-file ds2.0r22/lib/lib/teller.c ds2.0r29/lib/lib/teller.c *** ds2.0r22/lib/lib/teller.c Wed Dec 7 14:03:46 2005 --- ds2.0r29/lib/lib/teller.c Sat Jul 8 23:30:59 2006 *************** *** 22,27 **** --- 22,29 ---- sentient::create(); BankName = "Town Trust"; LocalCurrency = "silver"; + LocalFee = 1; + NonLocalFee = 5; OpenFee = 5; Currencies = ({ "copper", "silver", "electrum", "gold", "platinum" }); SetCommandResponses( ([ *************** *** 91,102 **** "surcharge of %d %s.", type, charge, currency)); return amount; } ! else if( (amount + charge) <= (int)who->GetCurrency(currency) ) { ! who->eventPrint(sprintf("The bank charges you a %s %d %s " ! "surcharge.", type, charge, currency)); ! who->AddCurrency(currency, -charge); ! return amount; ! } else { who->eventPrint(sprintf("You are unable to afford the " "%s surcharge of %d %s.", type, charge, currency)); return 0; --- 93,105 ---- "surcharge of %d %s.", type, charge, currency)); return amount; } ! //else if( (amount + charge) <= (int)who->GetCurrency(currency) ) { ! // who->eventPrint(sprintf("The bank charges you a %s %d %s " ! // "surcharge.", type, charge, currency)); ! //who->AddCurrency(currency, -charge); ! // return amount; ! // } ! else { who->eventPrint(sprintf("You are unable to afford the " "%s surcharge of %d %s.", type, charge, currency)); return 0; *************** *** 167,173 **** } int eventWithdraw(object who, string currency, int amount) { ! int i, x; x = amount; if( amount < 1 ) { --- 170,176 ---- } int eventWithdraw(object who, string currency, int amount) { ! int i, x, charge; x = amount; if( amount < 1 ) { *************** *** 186,201 **** return 1; } if( !(amount = AddSurcharge(who, currency, amount)) ) return 1; ! if( (int)who->AddCurrency(currency, amount) < 0 ) { eventForce("speak You are unable to carry that " "much "+currency+"!"); ! if( x > amount ) { ! who->eventPrint("The bank returns the fee."); ! who->AddCurrency(currency, (amount - x)); ! } return 1; } ! who->AddBank(GetBankName(), currency, -amount); who->eventPrint(sprintf("You withdraw %d %s from your account.", amount, currency)); environment()->eventPrint(sprintf("%s withdraws some %s.", --- 189,206 ---- return 1; } if( !(amount = AddSurcharge(who, currency, amount)) ) return 1; ! charge = x - amount; ! if( (int)who->AddCurrency(currency, x) < 0 ) { eventForce("speak You are unable to carry that " "much "+currency+"!"); ! //if( x > amount ) { ! who->eventPrint("The bank credits your account with the fee."); ! //who->AddCurrency(currency, (amount - x)); ! //} return 1; } ! who->AddCurrency(currency, -charge); ! who->AddBank(GetBankName(), currency, -x); who->eventPrint(sprintf("You withdraw %d %s from your account.", amount, currency)); environment()->eventPrint(sprintf("%s withdraws some %s.", diff -c -r --new-file ds2.0r22/lib/news/creator ds2.0r29/lib/news/creator *** ds2.0r22/lib/news/creator Mon May 15 11:29:43 2006 --- ds2.0r29/lib/news/creator Wed Jul 5 00:00:58 2006 *************** *** 2,12 **** /news/creator ! Dead Souls Admin FAQ: http://dead-souls.sourceforge.net/ds-admin-faq.html ! Dead Souls Creator FAQ: http://dead-souls.sourceforge.net/ds-creator-faq.html ! Editor tutorial: http://dead-souls.sourceforge.net/editor.html The Creators Manual has been updated and revised! --- 2,12 ---- /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.0r22/lib/news/deadsouls ds2.0r29/lib/news/deadsouls *** ds2.0r22/lib/news/deadsouls Fri Mar 24 14:36:39 2006 --- ds2.0r29/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.0r22/lib/news/hints.txt ds2.0r29/lib/news/hints.txt *** ds2.0r22/lib/news/hints.txt Sun Dec 18 12:51:00 2005 --- ds2.0r29/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.0r22/lib/news/reminders.txt ds2.0r29/lib/news/reminders.txt *** ds2.0r22/lib/news/reminders.txt Sun Dec 18 12:51:03 2005 --- ds2.0r29/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.0r22/lib/news/welcome ds2.0r29/lib/news/welcome *** ds2.0r22/lib/news/welcome Wed Jan 11 23:10:27 2006 --- ds2.0r29/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.0r22/lib/obj/README ds2.0r29/lib/obj/README *** ds2.0r22/lib/obj/README Wed Dec 7 14:22:44 2005 --- ds2.0r29/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.0r22/lib/obj/stargate.c ds2.0r29/lib/obj/stargate.c *** ds2.0r22/lib/obj/stargate.c Thu Apr 13 21:14:11 2006 --- ds2.0r29/lib/obj/stargate.c Sun Jul 9 19:04:29 2006 *************** *** 57,72 **** 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() --- 57,78 ---- seems, and i need to test some ideas before i can say "do it this way" */ + + #include + #include + #include + #include "/lib/include/stargate.h" + inherit LIB_STARGATE; ! int ReadScreen(); void create() { ::create(); ! SetOrigin("ORIGIN_NAME", "/ORIGIN/GOES/HERE"); ! SetRead(([ ({ "screen" }) : (: ReadScreen :) ]) ); ! SetItems(([ ({ "screen" }) : "a computer screen which shows the status of the gate network" ]) ); } void init() *************** *** 74,80 **** ::init(); } ! int readScreen() { write("stargate network status\n"); write("-----------------------\n"); --- 80,86 ---- ::init(); } ! int ReadScreen() { write("stargate network status\n"); write("-----------------------\n"); diff -c -r --new-file ds2.0r22/lib/obj/stargate.example ds2.0r29/lib/obj/stargate.example *** ds2.0r22/lib/obj/stargate.example Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/obj/stargate.example Sat Jul 8 23:30:59 2006 *************** *** 0 **** --- 1,89 ---- + #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" + + */ + + #include + #include + #include + #include "/lib/include/stargate.h" + + inherit LIB_STARGATE; + + int ReadScreen(); + + void create() + { + ::create(); + SetOrigin("ORIGIN_NAME", "/ORIGIN/GOES/HERE"); + 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.0r22/lib/realms/template/area/obj/table.c ds2.0r29/lib/realms/template/area/obj/table.c *** ds2.0r22/lib/realms/template/area/obj/table.c Wed Apr 5 19:50:53 2006 --- ds2.0r29/lib/realms/template/area/obj/table.c Sat Jul 8 23:30:59 2006 *************** *** 15,22 **** SetMaxCarry(5000); SetInventory( ([ MY_OBJ "/key" : 1, ]) ); } void init(){ ::init(); ! } \ No newline at end of file --- 15,23 ---- SetMaxCarry(5000); SetInventory( ([ MY_OBJ "/key" : 1, + "/secure/obj/glasses" :1, ]) ); } void init(){ ::init(); ! } diff -c -r --new-file ds2.0r22/lib/realms/template/workroom.c ds2.0r29/lib/realms/template/workroom.c *** ds2.0r22/lib/realms/template/workroom.c Sun Dec 18 01:57:11 2005 --- ds2.0r29/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.0r22/lib/save/economy.o ds2.0r29/lib/save/economy.o *** ds2.0r22/lib/save/economy.o Wed Feb 22 15:32:58 2006 --- ds2.0r29/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.0r22/lib/save/events.o ds2.0r29/lib/save/events.o *** ds2.0r22/lib/save/events.o Fri Mar 24 14:37:42 2006 --- ds2.0r29/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.0r22/lib/save/races.o ds2.0r29/lib/save/races.o *** ds2.0r22/lib/save/races.o Sat Apr 22 15:15:43 2006 --- ds2.0r29/lib/save/races.o Wed Jul 5 00:00:58 2006 *************** *** 1,7 **** #/daemon/races.c ! Races (["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",]),(["intelligence":(/4,10,/),"luck":(/3,21,/),"strength":(/1,43,/),"speed":(/4,10,/),"durability":(/1,43,/),"agility":(/5,1,/),"wisdom":(/1,43,/),"charisma":(/4,10,/),"coordination":(/3,21,/),]),([]),({20,80,}),1,0,"Elephantish",([]),/),"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",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/4,10,/),"luck":(/1,43,/),"strength":(/3,21,/),"speed":(/3,21,/),"durability":(/3,21,/),"agility":(/2,31,/),"wisdom":(/2,31,/),"charisma":(/5,1,/),"coordination":(/2,31,/),]),([]),({20,80,}),1,0,"Unicornish",([]),/),"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",]),(["intelligence":(/5,1,/),"luck":(/5,1,/),"strength":(/1,43,/),"speed":(/2,31,/),"durability":(/2,31,/),"agility":(/2,31,/),"wisdom":(/5,1,/),"charisma":(/5,1,/),"coordination":(/4,10,/),]),([]),({20,80,}),1,0,"Horseish",([]),/),"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",]),(["intelligence":(/4,10,/),"luck":(/2,31,/),"strength":(/4,10,/),"speed":(/2,31,/),"durability":(/5,1,/),"agility":(/2,31,/),"wisdom":(/2,31,/),"charisma":(/1,43,/),"coordination":(/3,21,/),]),(["right hand":5,"left hand":5,]),({20,80,}),1,0,"Dryadish",([]),/),"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",]),(["intelligence":(/4,10,/),"luck":(/5,1,/),"strength":(/1,43,/),"speed":(/3,21,/),"durability":(/2,31,/),"agility":(/3,21,/),"wisdom":(/2,31,/),"charisma":(/5,1,/),"coordination":(/3,21,/),]),([]),({20,80,}),1,0,"Golemish",([]),/),"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,}),}),}),([]),(["intelligence":(/3,33,/),"luck":(/4,2,/),"strength":(/3,15,/),"speed":(/1,60,/),"durability":(/5,5,/),"agility":(/2,10,/),"wisdom":(/2,33,/),"charisma":(/3,3,/),"coordination":(/1,50,/),]),(["right hand":4,"left hand":4,]),({12,62,}),1,1,"Edhellen",([]),/),"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",]),(["intelligence":(/4,10,/),"luck":(/4,10,/),"strength":(/3,21,/),"speed":(/3,21,/),"durability":(/3,21,/),"agility":(/3,21,/),"wisdom":(/5,1,/),"charisma":(/2,31,/),"coordination":(/4,10,/),]),([]),({20,80,}),1,0,"Dogish",([]),/),"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",]),(["intelligence":(/3,10,/),"luck":(/4,5,/),"strength":(/1,80,/),"speed":(/5,1,/),"durability":(/1,70,/),"agility":(/5,2,/),"wisdom":(/5,1,/),"charisma":(/4,10,/),"coordination":(/3,10,/),]),(["right hand":6,"left hand":6,]),({27,65,}),1,0,"Loyavenku",([]),/),"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",]),(["intelligence":(/5,10,/),"luck":(/1,80,/),"strength":(/4,10,/),"speed":(/2,30,/),"durability":(/2,20,/),"agility":(/1,20,/),"wisdom":(/3,20,/),"charisma":(/3,33,/),"coordination":(/3,60,/),]),(["right hand":4,"left hand":4,]),({20,70,}),1,0,"Terrakarn",([]),/),"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,}),}),}),([]),(["intelligence":(/5,1,/),"luck":(/2,80,/),"strength":(/3,20,/),"speed":(/1,30,/),"durability":(/3,10,/),"agility":(/2,40,/),"wisdom":(/4,10,/),"charisma":(/2,20,/),"coordination":(/3,33,/),]),(["right hand":5,"left hand":5,]),({15,65,}),1,1,"Ersi",([]),/),"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,}),}),}),([]),(["intelligence":(/2,15,/),"luck":(/5,1,/),"strength":(/2,20,/),"speed":(/1,70,/),"durability":(/2,40,/),"agility":(/4,2,/),"wisdom":(/5,10,/),"charisma":(/5,4,/),"coordination":(/3,20,/),]),(["right hand":4,"left hand":4,]),({12,62,}),1,1,"Tangetto",([]),/),"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",]),(["intelligence":(/5,1,/),"luck":(/5,1,/),"strength":(/2,31,/),"speed":(/5,1,/),"durability":(/1,43,/),"agility":(/5,1,/),"wisdom":(/5,1,/),"charisma":(/4,10,/),"coordination":(/3,21,/),]),([]),({20,80,}),1,0,"Cowish",([]),/),"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",]),(["intelligence":(/2,31,/),"luck":(/1,43,/),"strength":(/2,31,/),"speed":(/2,31,/),"durability":(/2,31,/),"agility":(/2,31,/),"wisdom":(/4,10,/),"charisma":(/2,31,/),"coordination":(/2,31,/),]),([]),({20,80,}),1,0,"Demonish",([]),/),"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",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/3,21,/),"luck":(/1,43,/),"strength":(/2,31,/),"speed":(/2,31,/),"durability":(/2,31,/),"agility":(/1,43,/),"wisdom":(/2,31,/),"charisma":(/5,1,/),"coordination":(/2,31,/),]),([]),({20,80,}),1,0,"Pegasusish",([]),/),"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,}),}),}),([]),(["intelligence":(/1,40,/),"luck":(/1,50,/),"strength":(/5,15,/),"speed":(/3,4,/),"durability":(/4,20,/),"agility":(/3,40,/),"wisdom":(/1,30,/),"charisma":(/1,40,/),"coordination":(/2,10,/),]),(["right hand":5,"left hand":5,]),({17,73,}),1,1,"Edhellen",([]),/),"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,}),}),}),([]),(["intelligence":(/3,33,/),"luck":(/1,10,/),"strength":(/4,2,/),"speed":(/2,5,/),"durability":(/2,25,/),"agility":(/2,50,/),"wisdom":(/1,80,/),"charisma":(/5,3,/),"coordination":(/1,60,/),]),(["right hand":4,"left hand":4,]),({27,77,}),1,0,"Wulinaxian",([]),/),"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,({}),}),}),([]),(["intelligence":(/3,21,/),"luck":(/3,21,/),"strength":(/5,1,/),"speed":(/5,1,/),"durability":(/3,21,/),"agility":(/4,10,/),"wisdom":(/1,43,/),"charisma":(/4,10,/),"coordination":(/2,31,/),]),([]),({20,80,}),1,0,"Amphibianish",([]),/),"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,}),}),}),([]),(["intelligence":(/5,3,/),"luck":(/4,3,/),"strength":(/2,35,/),"speed":(/2,40,/),"durability":(/2,30,/),"agility":(/4,10,/),"wisdom":(/5,3,/),"charisma":(/5,1,/),"coordination":(/3,33,/),]),(["right hand":6,"left hand":6,]),({21,71,}),1,1,"Tangetto",([]),/),"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,}),}),}),([4:"low",2:"low",8:"low",]),(["intelligence":(/4,10,/),"luck":(/5,1,/),"strength":(/1,50,/),"speed":(/4,7,/),"durability":(/1,68,/),"agility":(/5,1,/),"wisdom":(/5,1,/),"charisma":(/5,1,/),"coordination":(/5,2,/),]),(["right hand":6,"left hand":6,]),({25,70,}),1,0,"Shangtai",([]),/),"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,}),}),}),([]),(["intelligence":(/1,50,/),"luck":(/2,40,/),"strength":(/3,30,/),"speed":(/2,20,/),"durability":(/4,10,/),"agility":(/3,20,/),"wisdom":(/1,40,/),"charisma":(/5,1,/),"coordination":(/3,35,/),]),(["right hand":4,"left hand":4,]),({8,61,}),1,0,"Nibelungen",([]),/),"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,}),}),}),([]),(["intelligence":(/3,21,/),"luck":(/3,21,/),"strength":(/4,10,/),"speed":(/2,31,/),"durability":(/5,1,/),"agility":(/1,43,/),"wisdom":(/5,1,/),"charisma":(/5,1,/),"coordination":(/1,43,/),]),([]),({20,80,}),1,0,"Arachnidish",([]),/),"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",]),(["intelligence":(/2,30,/),"luck":(/3,20,/),"strength":(/3,30,/),"speed":(/2,30,/),"durability":(/1,40,/),"agility":(/1,40,/),"wisdom":(/3,10,/),"charisma":(/5,1,/),"coordination":(/3,30,/),]),(["right hand":6,"left hand":6,]),({10,67,}),1,0,"Balrog",([]),/),"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",4:"medium",2:"medium",128:"medium",8:"medium",]),(["intelligence":(/4,5,/),"luck":(/4,1,/),"strength":(/1,60,/),"speed":(/3,30,/),"durability":(/1,60,/),"agility":(/2,30,/),"wisdom":(/5,1,/),"charisma":(/5,10,/),"coordination":(/2,10,/),]),(["right hand":5,"left hand":5,]),({19,65,}),1,0,"T'linghan",([]),/),"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",]),(["intelligence":(/3,11,/),"luck":(/4,15,/),"strength":(/1,50,/),"speed":(/3,20,/),"durability":(/1,65,/),"agility":(/2,10,/),"wisdom":(/5,5,/),"charisma":(/3,11,/),"coordination":(/2,10,/),]),(["right hand":4,"left hand":4,]),({15,65,}),1,0,"Trollish",(["poison bite":({"1","3","2","4",}),]),/),"viper":(/({({"torso",0,1,({16384,}),}),({"torso",0,1,({16384,}),}),({"head","torso",1,({256,}),}),({"head","torso",1,({256,}),}),}),([64:"medium",32:"high",16:"low",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/4,10,/),"luck":(/1,43,/),"strength":(/5,1,/),"speed":(/4,10,/),"durability":(/4,10,/),"agility":(/4,10,/),"wisdom":(/2,31,/),"charisma":(/5,1,/),"coordination":(/5,1,/),]),([]),({20,80,}),1,0,"Aspish",([]),/),"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",]),(["intelligence":(/4,10,/),"luck":(/3,33,/),"strength":(/3,10,/),"speed":(/2,40,/),"durability":(/3,10,/),"agility":(/1,50,/),"wisdom":(/5,5,/),"charisma":(/4,0,/),"coordination":(/3,40,/),]),(["first hand":2,"fourth hand":2,"second hand":2,"third hand":2,]),({7,61,}),1,0,"Artrexcian",([]),/),"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",]),(["intelligence":(/3,11,/),"luck":(/1,60,/),"strength":(/1,40,/),"speed":(/3,20,/),"durability":(/1,60,/),"agility":(/2,10,/),"wisdom":(/3,20,/),"charisma":(/3,11,/),"coordination":(/2,10,/),]),(["right hand":4,"left hand":4,]),({15,65,}),1,1,"Malkierien",([]),/),"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",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/3,21,/),"luck":(/3,21,/),"strength":(/5,1,/),"speed":(/5,1,/),"durability":(/1,43,/),"agility":(/4,10,/),"wisdom":(/1,43,/),"charisma":(/5,1,/),"coordination":(/2,31,/),]),([]),({20,80,}),1,0,"Tortoiseish",([]),/),"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,}),}),}),([]),(["intelligence":(/4,25,/),"luck":(/2,50,/),"strength":(/5,3,/),"speed":(/2,60,/),"durability":(/5,7,/),"agility":(/1,50,/),"wisdom":(/4,20,/),"charisma":(/1,80,/),"coordination":(/2,20,/),]),(["right hand":5,"left hand":5,]),({26,76,}),1,0,"Nymal",([]),/),"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",]),(["intelligence":(/2,10,/),"luck":(/2,30,/),"strength":(/5,5,/),"speed":(/2,40,/),"durability":(/5,10,/),"agility":(/1,60,/),"wisdom":(/2,15,/),"charisma":(/3,30,/),"coordination":(/1,40,/),]),(["right hand":5,"left hand":5,]),({30,80,}),1,0,"Elcharean",([]),/),"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",]),(["intelligence":(/5,1,/),"luck":(/3,21,/),"strength":(/4,10,/),"speed":(/1,43,/),"durability":(/5,1,/),"agility":(/1,43,/),"wisdom":(/4,10,/),"charisma":(/2,31,/),"coordination":(/4,10,/),]),([]),({20,80,}),1,0,"Birdish",([]),/),"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",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/5,1,/),"luck":(/5,1,/),"strength":(/3,21,/),"speed":(/4,10,/),"durability":(/1,43,/),"agility":(/5,1,/),"wisdom":(/2,31,/),"charisma":(/5,1,/),"coordination":(/3,21,/),]),([]),({20,80,}),1,0,"Pigish",([]),/),"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",]),(["intelligence":(/3,21,/),"luck":(/1,43,/),"strength":(/2,31,/),"speed":(/2,31,/),"durability":(/1,43,/),"agility":(/3,21,/),"wisdom":(/2,31,/),"charisma":(/3,21,/),"coordination":(/4,10,/),]),(["right hand":5,"left hand":5,]),({20,80,}),1,0,"Centaurish",([]),/),"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,}),}),}),([]),(["intelligence":(/2,20,/),"luck":(/3,33,/),"strength":(/5,3,/),"speed":(/1,50,/),"durability":(/1,20,/),"agility":(/3,40,/),"wisdom":(/4,7,/),"charisma":(/2,40,/),"coordination":(/2,50,/),]),(["right hand":5,"left hand":5,]),({23,78,}),1,0,"Kendrall",(["stealing":({"1","5","5","5",}),]),/),"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,}),}),}),([]),(["intelligence":(/1,50,/),"luck":(/3,10,/),"strength":(/4,10,/),"speed":(/3,20,/),"durability":(/4,30,/),"agility":(/3,33,/),"wisdom":(/3,50,/),"charisma":(/2,33,/),"coordination":(/2,33,/),]),(["right hand":5,"left hand":5,]),({25,75,}),1,1,"English",(["psionic defense":({"2","3","4","5",}),]),/),"snake":(/({({"torso",0,1,({16384,}),}),({"torso",0,1,({16384,}),}),({"head","torso",1,({256,}),}),({"head","torso",1,({256,}),}),}),([64:"medium",32:"high",16:"low",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/4,10,/),"luck":(/1,43,/),"strength":(/5,1,/),"speed":(/4,10,/),"durability":(/4,10,/),"agility":(/4,10,/),"wisdom":(/2,31,/),"charisma":(/5,1,/),"coordination":(/5,1,/),]),([]),({20,80,}),1,0,"Snakeish",([]),/),"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",]),(["intelligence":(/5,1,/),"luck":(/1,43,/),"strength":(/5,1,/),"speed":(/1,43,/),"durability":(/5,1,/),"agility":(/2,31,/),"wisdom":(/5,1,/),"charisma":(/5,1,/),"coordination":(/3,21,/),]),([]),({20,80,}),1,0,"Insectish",([]),/),"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",]),(["intelligence":(/3,21,/),"luck":(/4,10,/),"strength":(/1,43,/),"speed":(/5,1,/),"durability":(/1,43,/),"wisdom":(/2,31,/),"agility":(/5,1,/),"ugliness":(/3,91,/),"charisma":(/3,21,/),"coordination":(/5,1,/),]),([]),({20,80,}),1,1,"Bugbearish",([]),/),"plant":(/({({"trunk",0,1,({}),}),({"trunk",0,1,({}),}),({"1st branch","trunk",3,({}),}),({"1st branch","trunk",3,({}),}),}),([64:"medium",32:"high",16:"low",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/5,1,/),"luck":(/3,21,/),"strength":(/3,21,/),"speed":(/5,1,/),"durability":(/3,21,/),"agility":(/5,1,/),"wisdom":(/5,1,/),"charisma":(/5,1,/),"coordination":(/5,1,/),]),([]),({20,80,}),1,0,"Plantish",([]),/),"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",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/3,21,/),"luck":(/3,21,/),"strength":(/4,10,/),"speed":(/3,21,/),"durability":(/4,10,/),"agility":(/3,21,/),"wisdom":(/4,10,/),"charisma":(/5,1,/),"coordination":(/3,21,/),]),([]),({20,80,}),1,0,"Primateish",([]),/),"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,({}),}),}),([]),(["intelligence":(/4,15,/),"luck":(/5,2,/),"strength":(/2,40,/),"speed":(/3,20,/),"durability":(/2,20,/),"agility":(/1,50,/),"wisdom":(/5,10,/),"charisma":(/3,20,/),"coordination":(/1,30,/),]),(["right hand":5,"left hand":5,]),({15,85,}),1,0,"Avidryl",([]),/),"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",]),(["intelligence":(/5,1,/),"luck":(/1,43,/),"strength":(/1,43,/),"speed":(/2,31,/),"durability":(/1,43,/),"agility":(/2,31,/),"wisdom":(/4,10,/),"charisma":(/5,1,/),"coordination":(/2,31,/),]),([]),({20,80,}),1,0,"Griffinish",([]),/),"tree":(/({({"trunk",0,1,({}),}),({"trunk",0,1,({}),}),({"1st branch","trunk",3,({}),}),({"1st branch","trunk",3,({}),}),}),([64:"medium",32:"high",16:"low",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/5,1,/),"luck":(/1,43,/),"strength":(/3,21,/),"speed":(/5,1,/),"durability":(/1,43,/),"agility":(/5,1,/),"wisdom":(/4,10,/),"charisma":(/5,1,/),"coordination":(/5,1,/),]),([]),({20,80,}),1,0,"Treeish",([]),/),"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",]),(["intelligence":(/3,21,/),"luck":(/4,10,/),"strength":(/1,43,/),"speed":(/5,1,/),"durability":(/1,43,/),"agility":(/5,1,/),"wisdom":(/2,31,/),"charisma":(/3,21,/),"coordination":(/5,1,/),]),([]),({20,80,}),1,0,"Bearish",([]),/),"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",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/4,10,/),"luck":(/1,43,/),"strength":(/3,21,/),"speed":(/3,21,/),"durability":(/3,21,/),"agility":(/2,31,/),"wisdom":(/2,31,/),"charisma":(/5,1,/),"coordination":(/2,31,/),]),([]),({20,80,}),1,0,"Wraithish",([]),/),"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",]),(["intelligence":(/4,10,/),"luck":(/4,10,/),"strength":(/3,21,/),"speed":(/2,31,/),"durability":(/1,43,/),"agility":(/1,43,/),"wisdom":(/3,21,/),"charisma":(/5,1,/),"coordination":(/3,21,/),]),([]),({20,80,}),1,0,"Goblinish",([]),/),"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",]),(["intelligence":(/3,21,/),"luck":(/4,10,/),"strength":(/3,21,/),"speed":(/1,43,/),"durability":(/2,31,/),"agility":(/2,31,/),"wisdom":(/3,21,/),"charisma":(/5,1,/),"coordination":(/4,10,/),]),([]),({20,80,}),1,0,"Chimeraish",([]),/),"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,({}),}),}),([]),(["intelligence":(/5,1,/),"luck":(/1,43,/),"strength":(/4,10,/),"speed":(/2,31,/),"durability":(/4,10,/),"agility":(/1,43,/),"wisdom":(/4,10,/),"charisma":(/1,43,/),"coordination":(/3,21,/),]),([]),({20,80,}),1,0,"Feline",(["stealth":({"1","5","4","6",}),]),/),"slug":(/({({"torso",0,1,({16384,}),}),({"torso",0,1,({16384,}),}),({"head","torso",1,({256,}),}),({"head","torso",1,({256,}),}),}),([64:"medium",32:"high",16:"low",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/5,1,/),"luck":(/5,1,/),"strength":(/4,10,/),"speed":(/5,1,/),"durability":(/5,1,/),"agility":(/5,1,/),"wisdom":(/4,10,/),"charisma":(/5,1,/),"coordination":(/5,1,/),]),([]),({20,80,}),1,0,"Slugish",([]),/),"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",]),(["intelligence":(/4,10,/),"luck":(/2,31,/),"strength":(/3,21,/),"speed":(/3,21,/),"durability":(/3,21,/),"agility":(/2,31,/),"wisdom":(/4,10,/),"charisma":(/5,1,/),"coordination":(/2,31,/),]),([]),({20,80,}),1,0,"Gnollish",([]),/),"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",]),(["intelligence":(/5,1,/),"luck":(/4,10,/),"strength":(/1,43,/),"speed":(/2,31,/),"durability":(/2,31,/),"agility":(/3,21,/),"wisdom":(/5,1,/),"charisma":(/3,21,/),"coordination":(/4,10,/),]),([]),({20,80,}),1,0,"Deerish",([]),/),"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",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/5,1,/),"luck":(/5,1,/),"strength":(/3,21,/),"speed":(/4,10,/),"durability":(/3,21,/),"agility":(/3,21,/),"wisdom":(/5,1,/),"charisma":(/5,1,/),"coordination":(/4,10,/),]),([]),({20,80,}),1,0,"Sheepish",([]),/),"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,}),}),}),([]),(["intelligence":(/3,2,/),"luck":(/3,24,/),"strength":(/4,13,/),"speed":(/3,52,/),"durability":(/1,65,/),"agility":(/2,10,/),"wisdom":(/5,10,/),"charisma":(/3,11,/),"coordination":(/2,10,/),]),([]),({15,65,}),1,0,"Battish",([]),/),"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",]),(["intelligence":(/4,10,/),"luck":(/4,10,/),"strength":(/1,43,/),"speed":(/4,10,/),"durability":(/1,43,/),"agility":(/5,1,/),"wisdom":(/2,31,/),"charisma":(/5,1,/),"coordination":(/2,31,/),]),([]),({20,80,}),1,0,"Gargoyleish",([]),/),"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",]),(["intelligence":(/1,43,/),"luck":(/1,43,/),"strength":(/1,43,/),"speed":(/1,43,/),"durability":(/1,43,/),"agility":(/1,43,/),"wisdom":(/1,43,/),"charisma":(/1,43,/),"coordination":(/1,43,/),]),([]),({20,80,}),1,0,"Godish",([]),/),"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",128:"medium",4:"low",2:"low",8:"low",]),(["intelligence":(/5,1,/),"luck":(/5,1,/),"strength":(/5,1,/),"speed":(/2,31,/),"durability":(/4,10,/),"agility":(/3,21,/),"wisdom":(/4,10,/),"charisma":(/5,1,/),"coordination":(/4,10,/),]),([]),({20,80,}),1,0,"Rodentish",([]),/),"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",]),(["intelligence":(/2,31,/),"luck":(/1,43,/),"strength":(/1,43,/),"speed":(/3,21,/),"durability":(/1,43,/),"agility":(/1,43,/),"wisdom":(/1,43,/),"charisma":(/2,31,/),"coordination":(/3,21,/),]),([]),({20,80,}),1,0,"Dragonish",([]),/),"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",]),(["intelligence":(/5,1,/),"luck":(/5,1,/),"strength":(/4,10,/),"speed":(/3,21,/),"durability":(/4,10,/),"agility":(/2,31,/),"wisdom":(/3,21,/),"charisma":(/5,1,/),"coordination":(/2,31,/),]),([]),({20,80,}),1,0,"Fishish",([]),/),"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",]),(["intelligence":(/2,31,/),"luck":(/1,43,/),"strength":(/2,31,/),"speed":(/1,43,/),"durability":(/2,31,/),"agility":(/2,31,/),"wisdom":(/2,31,/),"charisma":(/2,31,/),"coordination":(/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",4:"medium",2:"medium",8:"medium",128:"medium",]),(["intelligence":(/5,1,/),"luck":(/4,10,/),"strength":(/3,21,/),"speed":(/3,21,/),"durability":(/3,21,/),"agility":(/3,21,/),"wisdom":(/5,1,/),"charisma":(/5,1,/),"coordination":(/3,21,/),]),([]),({20,80,}),1,0,"Lizardish",([]),/),"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,}),}),}),([]),(["intelligence":(/1,50,/),"luck":(/3,10,/),"strength":(/4,50,/),"speed":(/3,50,/),"durability":(/4,50,/),"agility":(/3,50,/),"wisdom":(/3,50,/),"charisma":(/2,50,/),"coordination":(/2,50,/),]),(["right hand":5,"left hand":5,]),({25,75,}),1,0,"English",([]),/),"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",4:"medium",2:"medium",8:"medium",128:"medium",]),(["intelligence":(/4,10,/),"luck":(/3,21,/),"strength":(/1,43,/),"speed":(/3,21,/),"durability":(/1,43,/),"agility":(/3,21,/),"wisdom":(/4,10,/),"charisma":(/5,1,/),"coordination":(/2,31,/),]),(["right hand":5,"left hand":5,]),({20,80,}),1,0,"Koboldish",([]),/),"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",]),(["intelligence":(/3,21,/),"luck":(/3,21,/),"strength":(/3,21,/),"speed":(/3,21,/),"durability":(/3,21,/),"agility":(/3,21,/),"wisdom":(/3,21,/),"charisma":(/3,21,/),"coordination":(/3,21,/),]),([]),({20,80,}),1,0,"Elementalish",([]),/),]) ! 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",}) 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",}) ! 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 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\",]),([\"intelligence\":(/3,21,/),\"luck\":(/4,10,/),\"strength\":(/1,43,/),\"speed\":(/5,1,/),\"durability\":(/1,43,/),\"wisdom\":(/2,31,/),\"agility\":(/5,1,/),\"ugliness\":(/3,91,/),\"charisma\":(/3,21,/),\"coordination\":(/5,1,/),]),([]),({20,80,}),1,1,\"Bugbearish\",([]),/)" --- 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.0r22/lib/save/stargate.o ds2.0r29/lib/save/stargate.o *** ds2.0r22/lib/save/stargate.o Mon May 15 01:14:02 2006 --- ds2.0r29/lib/save/stargate.o Wed Jul 5 00:00:59 2006 *************** *** 1,2 **** #/daemon/stargate.c ! Stargates (["tower":(["status":"idle","destination":"/domains/Ylsrim/room/tower","endpoint":"",]),"stargate lab":(["status":"idle","destination":"/domains/default/room/stargate_lab","endpoint":"",]),]) --- 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.0r22/lib/secure/cfg/races/bugbear ds2.0r29/lib/secure/cfg/races/bugbear *** ds2.0r22/lib/secure/cfg/races/bugbear Sat Apr 22 15:16:06 2006 --- ds2.0r29/lib/secure/cfg/races/bugbear Wed Jul 5 00:01:12 2006 *************** *** 1,5 **** RACE bugbear ! PLAYER_RACE 1 SENSITIVITY 20:80 LANGUAGE Bugbearish RESISTANCE SHOCK:high --- 1,5 ---- RACE bugbear ! PLAYER_RACE 0 SENSITIVITY 20:80 LANGUAGE Bugbearish RESISTANCE SHOCK:high diff -c -r --new-file ds2.0r22/lib/secure/cmds/admins/addguest.c ds2.0r29/lib/secure/cmds/admins/addguest.c *** ds2.0r22/lib/secure/cmds/admins/addguest.c Mon Nov 7 13:32:16 2005 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/addrace.c ds2.0r29/lib/secure/cmds/admins/addrace.c *** ds2.0r22/lib/secure/cmds/admins/addrace.c Mon Nov 7 13:32:16 2005 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/admintool.c ds2.0r29/lib/secure/cmds/admins/admintool.c *** ds2.0r22/lib/secure/cmds/admins/admintool.c Fri Mar 24 14:37:46 2006 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/chanban.c ds2.0r29/lib/secure/cmds/admins/chanban.c *** ds2.0r22/lib/secure/cmds/admins/chanban.c Wed Feb 22 15:33:33 2006 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/chanunban.c ds2.0r29/lib/secure/cmds/admins/chanunban.c *** ds2.0r22/lib/secure/cmds/admins/chanunban.c Wed Feb 22 15:33:33 2006 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/decre.c ds2.0r29/lib/secure/cmds/admins/decre.c *** ds2.0r22/lib/secure/cmds/admins/decre.c Fri May 12 21:15:18 2006 --- ds2.0r29/lib/secure/cmds/admins/decre.c Wed Jul 5 00:01:12 2006 *************** *** 5,10 **** --- 5,11 ---- */ #include + #include #include #include *************** *** 17,22 **** --- 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); *************** *** 32,37 **** --- 36,45 ---- 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__)) diff -c -r --new-file ds2.0r22/lib/secure/cmds/admins/domainadmin.c ds2.0r29/lib/secure/cmds/admins/domainadmin.c *** ds2.0r22/lib/secure/cmds/admins/domainadmin.c Sat Apr 22 15:16:06 2006 --- ds2.0r29/lib/secure/cmds/admins/domainadmin.c Wed Jul 5 00:01:12 2006 *************** *** 11,17 **** mapping DomainsMap = ([]); ! if(!archp(this_player()) || this_player()->GetForced()){ return "No."; } --- 11,17 ---- mapping DomainsMap = ([]); ! if(!archp(previous_object()) || this_player()->GetForced()){ return "No."; } *************** *** 108,113 **** --- 108,114 ---- //tc("write_perms: "+write_perms,"green"); write_file("/secure/cfg/write.cfg", write_perms, 1); update("/secure/daemon/master"); + write("Ok."); return 1; } diff -c -r --new-file ds2.0r22/lib/secure/cmds/admins/domaincreate.c ds2.0r29/lib/secure/cmds/admins/domaincreate.c *** ds2.0r22/lib/secure/cmds/admins/domaincreate.c Sat Apr 22 15:16:14 2006 --- ds2.0r29/lib/secure/cmds/admins/domaincreate.c Wed Jul 5 00:01:12 2006 *************** *** 11,17 **** alphabet += ({ "@", "!", "$", "%", "=", "{", "}", "[", "]", ":", "<", ">", "\*" }); alphabet += ({ "\\", "\/", "\|" }); ! if(!archp(this_player()) || this_player()->GetForced()){ return "No."; } --- 11,17 ---- alphabet += ({ "@", "!", "$", "%", "=", "{", "}", "[", "]", ":", "<", ">", "\*" }); alphabet += ({ "\\", "\/", "\|" }); ! if(!archp(previous_object()) || this_player()->GetForced()){ return "No."; } diff -c -r --new-file ds2.0r22/lib/secure/cmds/admins/encre.c ds2.0r29/lib/secure/cmds/admins/encre.c *** ds2.0r22/lib/secure/cmds/admins/encre.c Fri May 12 21:15:18 2006 --- ds2.0r29/lib/secure/cmds/admins/encre.c Wed Jul 5 00:01:12 2006 *************** *** 4,9 **** --- 4,10 ---- */ #include + #include #include #include *************** *** 15,20 **** --- 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); diff -c -r --new-file ds2.0r22/lib/secure/cmds/admins/end.c ds2.0r29/lib/secure/cmds/admins/end.c *** ds2.0r22/lib/secure/cmds/admins/end.c Mon Nov 7 13:32:16 2005 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/notify.c ds2.0r29/lib/secure/cmds/admins/notify.c *** ds2.0r22/lib/secure/cmds/admins/notify.c Mon Nov 7 13:32:16 2005 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/register.c ds2.0r29/lib/secure/cmds/admins/register.c *** ds2.0r22/lib/secure/cmds/admins/register.c Mon Nov 7 13:32:16 2005 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/resetall.c ds2.0r29/lib/secure/cmds/admins/resetall.c *** ds2.0r22/lib/secure/cmds/admins/resetall.c Fri Mar 24 14:37:46 2006 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/resetpasswd.c ds2.0r29/lib/secure/cmds/admins/resetpasswd.c *** ds2.0r22/lib/secure/cmds/admins/resetpasswd.c Thu Apr 6 22:54:01 2006 --- ds2.0r29/lib/secure/cmds/admins/resetpasswd.c Wed Jul 5 00:01:12 2006 *************** *** 12,18 **** mixed cmd(string args) { ! if(!archp(this_player())) { write("No."); return 1; } --- 12,18 ---- mixed cmd(string args) { ! if(!archp(previous_object())) { write("No."); return 1; } diff -c -r --new-file ds2.0r22/lib/secure/cmds/admins/rid.c ds2.0r29/lib/secure/cmds/admins/rid.c *** ds2.0r22/lib/secure/cmds/admins/rid.c Sat Apr 22 15:16:30 2006 --- ds2.0r29/lib/secure/cmds/admins/rid.c Wed Jul 5 00:01:12 2006 *************** *** 17,22 **** --- 17,23 ---- object ob; string str, file; + if(!archp(previous_object())) return 0; if( !who || who == "" ) { write("Rid whom?"); return 1; diff -c -r --new-file ds2.0r22/lib/secure/cmds/admins/router.c ds2.0r29/lib/secure/cmds/admins/router.c *** ds2.0r22/lib/secure/cmds/admins/router.c Wed Apr 5 19:46:45 2006 --- ds2.0r29/lib/secure/cmds/admins/router.c Wed Jul 5 00:01:12 2006 *************** *** 6,11 **** --- 6,12 ---- 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 { diff -c -r --new-file ds2.0r22/lib/secure/cmds/admins/sconvert.c ds2.0r29/lib/secure/cmds/admins/sconvert.c *** ds2.0r22/lib/secure/cmds/admins/sconvert.c Mon Jan 16 23:03:39 2006 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/setreboot.c ds2.0r29/lib/secure/cmds/admins/setreboot.c *** ds2.0r22/lib/secure/cmds/admins/setreboot.c Mon Nov 7 13:32:16 2005 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/snoopreport.c ds2.0r29/lib/secure/cmds/admins/snoopreport.c *** ds2.0r22/lib/secure/cmds/admins/snoopreport.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/switchrouter.c ds2.0r29/lib/secure/cmds/admins/switchrouter.c *** ds2.0r22/lib/secure/cmds/admins/switchrouter.c Fri May 12 21:15:18 2006 --- ds2.0r29/lib/secure/cmds/admins/switchrouter.c Wed Jul 5 00:01:12 2006 *************** *** 9,21 **** string ip, name; int port, octet1, octet2, octet3, octet4; ! if(!archp(this_player())) return "No."; if(find_object(INTERMUD_D))find_object(INTERMUD_D)->eventDestruct(); ! rm("/save/intermud.o"); if(!args || args == ""){ ! write("No argument provided. Reloading intermud daemon."); if( load_object(INTERMUD_D) ) write("Intermud daemon reloaded."); else write("Failed to reload intermud daemon."); return 1; --- 9,22 ---- 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; diff -c -r --new-file ds2.0r22/lib/secure/cmds/admins/tempban.c ds2.0r29/lib/secure/cmds/admins/tempban.c *** ds2.0r22/lib/secure/cmds/admins/tempban.c Mon Nov 7 13:32:16 2005 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/ticktock.c ds2.0r29/lib/secure/cmds/admins/ticktock.c *** ds2.0r22/lib/secure/cmds/admins/ticktock.c Wed Jan 11 23:16:35 2006 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/unmonitor.c ds2.0r29/lib/secure/cmds/admins/unmonitor.c *** ds2.0r22/lib/secure/cmds/admins/unmonitor.c Mon May 15 01:14:02 2006 --- ds2.0r29/lib/secure/cmds/admins/unmonitor.c Wed Jul 5 00:01:12 2006 *************** *** 6,12 **** int cmd(string str) { object ob; ! if(!archp(this_player())) { write("Only an arch may halt a monitoring process."); return 0; } --- 6,12 ---- int cmd(string str) { object ob; ! if(!archp(previous_object())) { write("Only an arch may halt a monitoring process."); return 0; } diff -c -r --new-file ds2.0r22/lib/secure/cmds/admins/unrid.c ds2.0r29/lib/secure/cmds/admins/unrid.c *** ds2.0r22/lib/secure/cmds/admins/unrid.c Fri May 12 21:15:18 2006 --- ds2.0r29/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,30 **** return 1; } this_player()->eventPrint("Unrid successful."); ! PLAYERS_D->AddPlayerInfo(str); return 1; } --- 25,31 ---- return 1; } this_player()->eventPrint("Unrid successful."); ! PLAYER_D->AddPlayerInfo(str); return 1; } diff -c -r --new-file ds2.0r22/lib/secure/cmds/admins/unwatch.c ds2.0r29/lib/secure/cmds/admins/unwatch.c *** ds2.0r22/lib/secure/cmds/admins/unwatch.c Mon Nov 7 13:32:16 2005 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/usage.c ds2.0r29/lib/secure/cmds/admins/usage.c *** ds2.0r22/lib/secure/cmds/admins/usage.c Fri Nov 11 12:31:31 2005 --- ds2.0r29/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.0r22/lib/secure/cmds/admins/watch.c ds2.0r29/lib/secure/cmds/admins/watch.c *** ds2.0r22/lib/secure/cmds/admins/watch.c Mon Nov 7 13:32:16 2005 --- ds2.0r29/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.0r22/lib/secure/cmds/creators/about.c ds2.0r29/lib/secure/cmds/creators/about.c *** ds2.0r22/lib/secure/cmds/creators/about.c Wed Jan 4 20:42:56 2006 --- ds2.0r29/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.0r22/lib/secure/cmds/creators/ed.c ds2.0r29/lib/secure/cmds/creators/ed.c *** ds2.0r22/lib/secure/cmds/creators/ed.c Sat Mar 11 11:16:59 2006 --- ds2.0r29/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.0r22/lib/secure/cmds/creators/eval.c ds2.0r29/lib/secure/cmds/creators/eval.c *** ds2.0r22/lib/secure/cmds/creators/eval.c Wed Apr 12 23:49:46 2006 --- ds2.0r29/lib/secure/cmds/creators/eval.c Wed Jul 5 00:01:12 2006 *************** *** 49,64 **** } 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.0r22/lib/secure/cmds/creators/force.c ds2.0r29/lib/secure/cmds/creators/force.c *** ds2.0r22/lib/secure/cmds/creators/force.c Mon Jan 23 08:56:34 2006 --- ds2.0r29/lib/secure/cmds/creators/force.c Wed Dec 31 19:00:00 1969 *************** *** 1,53 **** - /* /cmds/creators/force.c - * From the Dead Souls V Object Library - * Created by Descartes of Borg 961018 - * Version: %A% - * Last modified: %D% - */ - - #include - - inherit LIB_DAEMON; - - mixed cmd(string args) { - object who = previous_object(); - object target; - string name, cmd; - - if(!args || args==""){ - who->eventPrint("Force whom to do what?"); - return 1; - } - if( sscanf(args, "%s to %s", name, cmd) < 1 ) { - if(sscanf(args, "%s %s", name,cmd) < 1) { - who->eventPrint("Force whom to do what?"); - return 1; - } - } - target = present(lower_case(name),environment(who)); - if( !target ) { - who->eventPrint("Cannot find any living thing called: " + name); - return 1; - } - if(archp(target) && !archp(who)){ - who->eventPrint(target->GetName()+" shakes "+possessive(target)+ - " head and forces you to dest yourself."); - tell_room(environment(who), who->GetName()+" dests "+objective(who)+ - "self while trying to pull a foolish joke on "+target->GetName()+".", who); - who->eventDestruct(); - return 1; - } - target->eventPrint(who->GetName() + " forces you to: " + cmd); - who->eventPrint("You force " + target->GetShort() + " to: " + cmd); - target->eventForce(cmd); - return 1; - } - - string GetErorMessage() { - return "Force whom to do what?"; - } - - string GetHelp() { - return ("Syntax: \n\n" - "Allows you to force a living object to take a certain action."); - } --- 0 ---- diff -c -r --new-file ds2.0r22/lib/secure/cmds/creators/mv.c ds2.0r29/lib/secure/cmds/creators/mv.c *** ds2.0r22/lib/secure/cmds/creators/mv.c Mon Nov 7 13:32:17 2005 --- ds2.0r29/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.0r22/lib/secure/cmds/players/tell.c ds2.0r29/lib/secure/cmds/players/tell.c *** ds2.0r22/lib/secure/cmds/players/tell.c Sat Mar 11 11:16:59 2006 --- ds2.0r29/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.0r22/lib/secure/daemon/autoexec.c ds2.0r29/lib/secure/daemon/autoexec.c *** ds2.0r22/lib/secure/daemon/autoexec.c Wed Apr 5 19:44:20 2006 --- ds2.0r29/lib/secure/daemon/autoexec.c Wed Jul 5 00:01:05 2006 *************** *** 17,23 **** static void create() { daemon::create(); if(hasrun) return; ! call_out((: eventRun :), 60); hasrun = 1; } --- 17,23 ---- static void create() { daemon::create(); if(hasrun) return; ! call_out((: eventRun :), 10); hasrun = 1; } diff -c -r --new-file ds2.0r22/lib/secure/daemon/bboard.c ds2.0r29/lib/secure/daemon/bboard.c *** ds2.0r22/lib/secure/daemon/bboard.c Mon Jan 16 23:03:39 2006 --- ds2.0r29/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.0r22/lib/secure/daemon/chat.c ds2.0r29/lib/secure/daemon/chat.c *** ds2.0r22/lib/secure/daemon/chat.c Fri May 12 21:15:18 2006 --- ds2.0r29/lib/secure/daemon/chat.c Sun Jul 9 19:04:29 2006 *************** *** 18,29 **** 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 = ([]); --- 18,30 ---- 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){ *************** *** 125,130 **** --- 131,137 ---- if(pmsg) plainmsg += pmsg; if(pwho && pwho !="") plainmsg = pwho+" "+plainmsg; if(pchan && pchan != "admin"){ + chan = GetLocalChannel(chan); 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() ) :) ); *************** *** 144,150 **** object ob = 0; int emote; ! if(first(str,1) == ":" && sizeof(str) > 3){ if(!grepp(verb,"emote")) verb += "emote"; str = trim(replace_string(str,":","",1)); } --- 151,159 ---- object ob = 0; int emote; ! if(first(str,1) == ":" && ! (member_array(str[1..1], ({ "Q", "O", "P", "D", "I", "X" })) == -1 && ! alphap(str[1..1]) && sizeof(str) > 3)){ if(!grepp(verb,"emote")) verb += "emote"; str = trim(replace_string(str,":","",1)); } *************** *** 164,176 **** 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); --- 173,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)) ) { ! 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); *************** *** 186,193 **** 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"); --- 206,217 ---- 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"); *************** *** 421,426 **** --- 445,453 ---- case "intercre": this_msg = "%^YELLOW%^"; break; + case "ds": + this_msg = "%^YELLOW%^"; + break; case "newbie": this_msg = "%^B_YELLOW%^"; break; *************** *** 501,506 **** --- 528,536 ---- case "intercre": tmsg += "%^YELLOW%^"; break; + case "ds": + tmsg += "%^YELLOW%^"; + break; case "newbie": tmsg += "%^B_YELLOW%^"; break; diff -c -r --new-file ds2.0r22/lib/secure/daemon/finger.c ds2.0r29/lib/secure/daemon/finger.c *** ds2.0r22/lib/secure/daemon/finger.c Wed Apr 12 23:50:02 2006 --- ds2.0r29/lib/secure/daemon/finger.c Fri Jul 7 19:41:43 2006 *************** *** 128,134 **** else ret += "On since " + ctime(LoginTime); } else ret += "Last on " + ctime(LoginTime); ! if( !WhereBlock || (this_player(1) && archp(this_player(1))) ) ret += " from " + HostSite + "%^BR%^\n"; else ret += "%^BR%^\n"; mail_stat = (mapping)FOLDERS_D->mail_status(who); --- 128,134 ---- else ret += "On since " + ctime(LoginTime); } else ret += "Last on " + ctime(LoginTime); ! if( this_player(1) && creatorp(this_player(1)) ) ret += " from " + HostSite + "%^BR%^\n"; else ret += "%^BR%^\n"; mail_stat = (mapping)FOLDERS_D->mail_status(who); *************** *** 173,179 **** } if( !Email ) Email = "#CHANGE"; tmp = ({ CapName, GetTitle(), RealName, (Email[0] != '#' ? Email : 0), ! ctime(LoginTime), (ob && interactive(ob) ? query_idle(ob) : -1), 0, (creator ? "Creator" : "" + Level), plan }); return tmp; } --- 173,179 ---- } if( !Email ) Email = "#CHANGE"; tmp = ({ CapName, GetTitle(), RealName, (Email[0] != '#' ? Email : 0), ! ctime(LoginTime), ((ob && interactive(ob) && !(ob->GetInvis())) ? query_idle(ob) : -1), 0, (creator ? "Creator" : "" + Level), plan }); return tmp; } diff -c -r --new-file ds2.0r22/lib/secure/daemon/folders.c ds2.0r29/lib/secure/daemon/folders.c *** ds2.0r22/lib/secure/daemon/folders.c Mon Nov 7 13:32:07 2005 --- ds2.0r29/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.0r22/lib/secure/daemon/i3router/core_stuff.h ds2.0r29/lib/secure/daemon/i3router/core_stuff.h *** ds2.0r22/lib/secure/daemon/i3router/core_stuff.h Sun Apr 9 23:51:25 2006 --- ds2.0r29/lib/secure/daemon/i3router/core_stuff.h Wed Jul 5 00:01:12 2006 *************** *** 1,9 **** // This file written completely by Tim Johnson (Tim@TimMUD) #include static void create(){ SetNoClean(1); - //save::create(); sockets = ([]); connected_muds = ([]); if(!mudinfo) mudinfo = ([]); --- 1,9 ---- // This file written completely by Tim Johnson (Tim@TimMUD) #include + #include static void create(){ SetNoClean(1); sockets = ([]); connected_muds = ([]); if(!mudinfo) mudinfo = ([]); *************** *** 13,24 **** if(!channels) channels = ([]); if(!channel_updates) channel_updates = ([]); if(!channel_update_counter) channel_update_counter = 1; ! if(!router_name) router_name = "*test"; ! //if(!router_list) router_list = ({ ({"*yatmim", "149.152.218.102 23"}) }); ! if(!router_list) router_list = ({ ({"*test", "192.168.0.201 9000"}) }); log_file("server", "Created when uptime = " + uptime() + "\n"); trr("server got created"); call_out("setup", 5); set_heart_beat(10); } --- 13,25 ---- 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); } *************** *** 30,35 **** --- 31,38 ---- 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"); *************** *** 52,58 **** void remove(){ string mudname; log_file("server", "Being removed by: "+identify(previous_object())+"\n"); ! trr("Being removed by: "+identify(previous_object())+"\n"); log_file("server", "sockets:"+identify(sockets)+"\n"); trr("sockets:"+identify(sockets)+"\n"); log_file("server", "Starting to destruct at uptime = " + uptime() + "\n"); --- 55,61 ---- 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"); diff -c -r --new-file ds2.0r22/lib/secure/daemon/i3router/hosted_channels.h ds2.0r29/lib/secure/daemon/i3router/hosted_channels.h *** ds2.0r22/lib/secure/daemon/i3router/hosted_channels.h Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/secure/daemon/i3router/process_channel.h ds2.0r29/lib/secure/daemon/i3router/process_channel.h *** ds2.0r22/lib/secure/daemon/i3router/process_channel.h Sun Apr 9 23:51:25 2006 --- ds2.0r29/lib/secure/daemon/i3router/process_channel.h Wed Jul 5 00:01:12 2006 *************** *** 1,4 **** --- 1,5 ---- // This file written completely by Tim Johnson (Tim@TimMUD) + #include static void process_channel(int fd, mixed *info){ string mudname; *************** *** 14,20 **** // ignore the target and save some CPU. // Check if string parts are strings... if(info[0][8..]=="t"){ ! if(sizeof(info)!=12 || !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; --- 15,21 ---- // 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; *************** *** 107,113 **** 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]); // 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]); --- 108,114 ---- 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]); *************** *** 123,128 **** --- 124,130 ---- // 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! *************** *** 139,146 **** 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]); // broadcast an update saying that this channel is gone now return; case "admin": // add/delete muds from the 2 lists... --- 141,149 ---- 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... *************** *** 159,164 **** --- 162,168 ---- // 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! *************** *** 184,189 **** --- 188,194 ---- // 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 *************** *** 191,196 **** --- 196,202 ---- 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 && *************** *** 205,210 **** --- 211,217 ---- 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 && *************** *** 220,231 **** listening[info[6]] += ({ info[2] }); else listening[info[6]] -= ({ info[2] }); 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.", DEB_INVALID); return; } trr("can't get here?"); --- 227,239 ---- 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.0r22/lib/secure/daemon/i3router/process_startup_req.h ds2.0r29/lib/secure/daemon/i3router/process_startup_req.h *** ds2.0r22/lib/secure/daemon/i3router/process_startup_req.h Sun Apr 9 23:51:25 2006 --- ds2.0r29/lib/secure/daemon/i3router/process_startup_req.h Wed Jul 5 00:01:12 2006 *************** *** 1,5 **** --- 1,7 ---- // 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. *************** *** 10,16 **** // also, should verify that all the fields are the right type trr("info: "+identify(info)); ! trr("process_startup_req: protocol="+protocol+", mud="+info[2]); if(sizeof(info)<18){ // smallest protocol is protocol 1/2 which have size 18 --- 12,20 ---- // 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 *************** *** 28,48 **** })); return; } - //sscanf(socket_address(fd), "%s %s", site_ip,junk); - //socket_bind(fd,random(1000)+10000); - //site_ip = path_prefix(socket_status(fd)[4],"."); - //if(!site_ip || site_ip == "" || site_ip == "*"){ - //if(true()){ - trr("bad ip "+site_ip+" from "+info[2]); - //socket_close(fd); - //return; - //} - //junk = "foo"; trr("fd is:" +fd); site_ip=socket_address(fd); trr("site_ip: "+site_ip); newinfo = ([ "ip":site_ip, "connect_time":time(), "disconnect_time":0, --- 32,43 ---- })); 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, *************** *** 168,177 **** })); return; } ! if(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... write_data(fd,({ "error",5,router_name,0,info[2],0, "warning", // nothing in error summary that seems applicable? --- 163,173 ---- })); 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? *************** *** 180,186 **** })); } else{ ! trr("wrong password, and from a new IP"); write_data(fd,({ "error", 5, --- 176,182 ---- })); } else{ ! trr("wrong password, and from a new IP","red"); write_data(fd,({ "error", 5, *************** *** 195,205 **** return; } } ! if(!mudinfo[info[2]]){ // if new MUD, assign it a password ! newinfo["password"]=random(10000); // Change this maybe... see if the password is supposed to be in a certain range } // MUD should be okay at this point. trr("about to update the mudinfo..."); mudinfo[info[2]]=newinfo; // update the mudinfo --- 191,204 ---- 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 *************** *** 210,215 **** 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"]))) ! send_chanlist_reply(info[2], newinfo["old_chanlist_id"]); } --- 209,221 ---- 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.0r22/lib/secure/daemon/i3router/read_callback.h ds2.0r29/lib/secure/daemon/i3router/read_callback.h *** ds2.0r22/lib/secure/daemon/i3router/read_callback.h Sun Apr 9 23:51:25 2006 --- ds2.0r29/lib/secure/daemon/i3router/read_callback.h Wed Jul 5 00:01:12 2006 *************** *** 23,29 **** string mudname; int i; ! trr("Received from fd("+fd+"), fd("+socket_address(fd)+")\n"+identify(info)); // Base info in a packet is of size 6. if(sizeof(info)<6 || !stringp(info[0]) || --- 23,29 ---- 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]) || *************** *** 129,135 **** 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 command meant for router: "+info[0]); log_file("server","UNHANDLED PACKET:\n"+identify(info)+"\n"); return; } --- 129,135 ---- 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; } diff -c -r --new-file ds2.0r22/lib/secure/daemon/i3router/send_chanlist_reply.h ds2.0r29/lib/secure/daemon/i3router/send_chanlist_reply.h *** ds2.0r22/lib/secure/daemon/i3router/send_chanlist_reply.h Sun Apr 9 23:51:25 2006 --- ds2.0r29/lib/secure/daemon/i3router/send_chanlist_reply.h Wed Jul 5 00:01:12 2006 *************** *** 7,26 **** 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 } write_data(connected_muds[mudname],({ "chanlist-reply", 5, --- 7,27 ---- 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, diff -c -r --new-file ds2.0r22/lib/secure/daemon/i3router/server.c ds2.0r29/lib/secure/daemon/i3router/server.c *** ds2.0r22/lib/secure/daemon/i3router/server.c Sun Apr 9 23:51:26 2006 --- ds2.0r29/lib/secure/daemon/i3router/server.c Wed Jul 5 00:01:12 2006 *************** *** 18,24 **** #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_SAVE; inherit LIB_CLEAN; // Unsaved variables... --- 18,23 ---- *************** *** 98,105 **** #include "./core_stuff.h" #include "./funcs.h" #include "./socket_stuff.h" ! ! // trrging stuff... mapping query_mudinfo(){ return copy(mudinfo); } --- 97,103 ---- #include "./core_stuff.h" #include "./funcs.h" #include "./socket_stuff.h" ! #include "./hosted_channels.h" // trrging stuff... mapping query_mudinfo(){ return copy(mudinfo); } *************** *** 124,129 **** --- 122,142 ---- 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; diff -c -r --new-file ds2.0r22/lib/secure/daemon/imc2.c ds2.0r29/lib/secure/daemon/imc2.c *** ds2.0r22/lib/secure/daemon/imc2.c Mon May 15 11:25:20 2006 --- ds2.0r29/lib/secure/daemon/imc2.c Wed Jul 5 00:01:05 2006 *************** *** 124,130 **** #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) diff -c -r --new-file ds2.0r22/lib/secure/daemon/include/imc2_code.h ds2.0r29/lib/secure/daemon/include/imc2_code.h *** ds2.0r22/lib/secure/daemon/include/imc2_code.h Wed Apr 5 19:33:19 2006 --- ds2.0r29/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) diff -c -r --new-file ds2.0r22/lib/secure/daemon/master.c ds2.0r29/lib/secure/daemon/master.c *** ds2.0r22/lib/secure/daemon/master.c Sun Apr 9 23:51:45 2006 --- ds2.0r29/lib/secure/daemon/master.c Sun Jul 9 19:04:30 2006 *************** *** 27,32 **** --- 27,33 ---- private static string PlayerName, rlog; private static object NewPlayer; private static mapping Groups, ReadAccess, WriteAccess; + private static string *ParserDirs = ({ "secure", "verbs", "daemon", "lib", "spells" }); void create() { Unguarded = 0; *************** *** 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; --- 194,200 ---- 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; *************** *** 220,238 **** } 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; --- 221,253 ---- } 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(stringp(file) && 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; *************** *** 357,368 **** } int valid_object(object ob) { ! string file; file = file_name(ob); if( !strsrch(file, DIR_TMP) ) return 0; else if( !strsrch(file, DIR_FTP) ) return 0; else if( !strsrch(file, DIR_LOGS) ) return 0; else return 1; } --- 372,392 ---- } int valid_object(object ob) { ! string file, contents; file = file_name(ob); + contents = read_file(base_name(ob)+".c"); + if(strsrch(contents,"parse_add_rule") != -1 + || strsrch(contents, "SetRules") != -1) { + string prefix; + if(!sscanf(file,"/%s/%*s",prefix)) return 0; + if(member_array(prefix, ParserDirs) == -1) return 0; + } + 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; } *************** *** 573,579 **** 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"}); } string parse_command_all_word() { return "all"; } --- 597,603 ---- 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.0r22/lib/secure/daemon/options.c ds2.0r29/lib/secure/daemon/options.c *** ds2.0r22/lib/secure/daemon/options.c Mon Jan 16 23:04:14 2006 --- ds2.0r29/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.0r22/lib/secure/daemon/snoop.c ds2.0r29/lib/secure/daemon/snoop.c *** ds2.0r22/lib/secure/daemon/snoop.c Mon May 15 01:14:02 2006 --- ds2.0r29/lib/secure/daemon/snoop.c Wed Jul 5 19:58:20 2006 *************** *** 1,4 **** --- 1,5 ---- #include + #include #include #include #include *************** *** 11,16 **** --- 12,19 ---- object *snoopers = ({}); string *monitored = ({}); mapping Watchers = ([]); + int count = 0; + int just_loaded = 1; object *prevusers; void eventLoadRogues(); *************** *** 22,28 **** unguarded( (: restore_object, SAVE_SNOOP, 1 :) ); SetNoClean(1); SnoopClean(); ! set_heart_beat(60); if(GLOBAL_MONITOR == 0 && sizeof(monitored)){ call_out( (: eventLoadRogues :), 1); } --- 25,31 ---- unguarded( (: restore_object, SAVE_SNOOP, 1 :) ); SetNoClean(1); SnoopClean(); ! set_heart_beat(1); if(GLOBAL_MONITOR == 0 && sizeof(monitored)){ call_out( (: eventLoadRogues :), 1); } *************** *** 45,50 **** --- 48,54 ---- } 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" :) ); } *************** *** 54,139 **** int allset, already_watched = 0; string *immune; string name; if(!str) str = "foo"; str = lower_case(str); - //tc("checkbot str: "+str); - //tc("snoopers: "+identify(snoopers)); foo = find_player(str); if(sizeof(snoopers)){ - //tc("step one","red"); foreach(object snoopbox in snoopers){ ! //tc("step two","red"); ! if(snoopbox && grepp("#",file_name(snoopbox)) ) { ! //tc("snoopbox: "+identify(snoopbox)); ! //tc("wtf: "+identify(snoopbox->GetSnooped()),"green"); } else snoopers -= ({snoopbox}); if(snoopbox && snoopbox->GetSnooped() && snoopbox->GetSnooped() == str) { already_watched = 1; - //tc("foo: "+identify(foo),"white"); } if(snoopbox->GetSnooped() && (!find_player(snoopbox->GetSnooped()) ||!(snoopbox->GetSnooped()))) { - //tc("wtf: "+identify(snoopbox->GetSnooped()),"red"); } } } - //if(foo && environment(foo)) tc("environment("+identify(foo)+"): "+identify(environment(foo))); - //tc("already_watched: "+already_watched,"yellow"); - //tc("foo: "+identify(foo),"yellow"); - //tc("GLOBAL_MONITOR: "+GLOBAL_MONITOR,"yellow"); - //tc("member_array(str, monitored): "+member_array(str, monitored),"yellow"); - //tc("member_array(str, snoopd): "+member_array(str, snooped),"yellow"); 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("cloning: "); cloan=new("/secure/obj/snooper"); ! ////tc("vloan: "+identify(cloan)); cloan->eventStartSnoop(str); - //tc("cloning: "+identify(cloan)+" to snoop "+str); } ! //tc("evidently this is where the error takes place."); unguarded( (: save_object, SAVE_SNOOP, 1 :) ); return 1; } void CheckSnooped(){ object *lusers = users(); ! //tc("lusers: "+identify(lusers),"red"); ! //tc("prevusers: "+identify(prevusers),"green"); ! if(!compare_array(lusers, prevusers)){ ! foreach(object user in lusers){ ! //tc("user: "+identify(user),"blue"); ! //tc("user: "+user->GetKeyName(),"blue"); ! CheckBot(user->GetKeyName()); ! } } ! else CheckBot("tanstaafl"); prevusers = lusers; } int SnoopClean(){ snoopers = filter(objects(), (: base_name($1) == "/secure/obj/snooper" :) ); - //tc("snoopers: "+identify(snoopers),"red"); if(sizeof(snoopers)){ - //tc("1","red"); foreach(object snoopbox in snoopers){ - //tc("2: "+identify(snoopbox)+", snooping: "+identify(query_snoop(snoopbox)),"red"); - //tc("2: "+file_name(snoopbox)+".","red"); if(snoopbox && !clonep(snoopbox) ) { - //tc("2.5","blue"); snoopers -= ({snoopbox}); - //tc("2.6","blue"); } else { string dude = snoopbox->GetSnooped(); ! mixed subject = find_player(dude); ! if(subject) subject = subject->GetKeyName(); ! //tc("3: snoopbox: "+identify(snoopbox),"red"); ! //tc("subject: "+identify(subject),"red"); ! //tc("identify(query_snoop(snoopbox): "+identify(query_snoop(snoopbox)),"red"); ! //tc("member_array(subject,snooped): "+member_array(subject,snooped),"red"); ! //tc("member_array(subject,monitored): "+member_array(subject,monitored),"red"); ! if(!subject || (member_array(subject,snooped) == -1 && member_array(subject,monitored) == -1)){ snoopbox->eventDestruct(); snoopers -= ({snoopbox}); } --- 58,120 ---- 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}); } *************** *** 143,165 **** return 1; } void heart_beat(){ ! foreach(object snoopbox in snoopers){ ! if(!snoopbox) snoopers -= ({ snoopbox }); } ! CheckSnooped(); ! SnoopClean(); } void reset(){ if(query_heart_beat(this_object()) < 1) set_heart_beat(60); CheckSnooped(); } int GetSnoop(string target, string msg){ if(target != "cratylus") { - //tc(target+" "+msg+"\n\n","green"); - //tc("snooper: "+identify(previous_object())); } if(base_name(previous_object()) != "/secure/obj/snooper") return 0; else if(sizeof(Watchers[target])) { --- 124,159 ---- 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])) { *************** *** 173,183 **** int AddWatcher(string watcher, string target){ if(!valid_snoop(find_player(watcher), find_player(target))) { - //tc("invalid snoop"); return 0; } if(Watchers[target] && member_array(watcher,Watchers[target]) != -1){ - //tc("already watching"); return 0; } if(!Watchers[target] || !sizeof(Watchers[target])) { --- 167,175 ---- *************** *** 186,194 **** else { Watchers[target] += ({ watcher }); } - //tc("snooped: "+identify(snooped)); if(member_array(target,snooped) == -1) snooped += ({target}); - //tc("snooped: "+identify(snooped)); CheckBot(target); unguarded( (: save_object, SAVE_SNOOP, 1 :) ); return 1; --- 178,184 ---- *************** *** 266,279 **** } int Report(){ ! if(!archp(previous_object(2))){ return 0; } ! tc("Watchers: "+identify(Watchers)); ! tc("snoopers: "+identify(snoopers)); ! tc("prevusers: "+identify(prevusers)); ! tc("snooped: "+identify(snooped)); ! tc("monitored: "+identify(monitored)); return 1; } --- 256,269 ---- } 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.0r22/lib/secure/daemon/update.blank ds2.0r29/lib/secure/daemon/update.blank *** ds2.0r22/lib/secure/daemon/update.blank Sat Mar 11 11:19:19 2006 --- ds2.0r29/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.0r22/lib/secure/include/bboard.h ds2.0r29/lib/secure/include/bboard.h *** ds2.0r22/lib/secure/include/bboard.h Wed Sep 28 19:34:12 2005 --- ds2.0r29/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.0r22/lib/secure/include/compat.h ds2.0r29/lib/secure/include/compat.h *** ds2.0r22/lib/secure/include/compat.h Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/secure/include/config.h ds2.0r29/lib/secure/include/config.h *** ds2.0r22/lib/secure/include/config.h Wed Apr 12 23:51:01 2006 --- ds2.0r29/lib/secure/include/config.h Wed Jul 5 00:01:05 2006 *************** *** 47,51 **** --- 47,52 ---- #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.0r22/lib/secure/include/daemons.h ds2.0r29/lib/secure/include/daemons.h *** ds2.0r22/lib/secure/include/daemons.h Thu Apr 13 21:05:37 2006 --- ds2.0r29/lib/secure/include/daemons.h Wed Jul 5 00:01:05 2006 *************** *** 4,9 **** --- 4,10 ---- #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" *************** *** 29,36 **** #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" --- 30,38 ---- #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" *************** *** 45,53 **** #define STARGATE_D DIR_DAEMONS "/stargate" #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" --- 47,53 ---- diff -c -r --new-file ds2.0r22/lib/secure/include/dirs.h ds2.0r29/lib/secure/include/dirs.h *** ds2.0r22/lib/secure/include/dirs.h Wed Apr 12 23:51:12 2006 --- ds2.0r29/lib/secure/include/dirs.h Sun Jul 9 19:04:30 2006 *************** *** 16,21 **** --- 16,22 ---- #define DIR_SUICIDE DIR_DATA "/suicide" #define DIR_RID DIR_DATA "/rid" #define DIR_SECURE_DAEMONS_SAVE DIR_DATA "/daemons" + #define DIR_SECURE_VERBS DIR_SECURE "/verbs" #define DIR_VOTES DIR_DATA "/votes" #define DIR_GOSSIP DIR_DATA "/gossip" diff -c -r --new-file ds2.0r22/lib/secure/include/events.h ds2.0r29/lib/secure/include/events.h *** ds2.0r22/lib/secure/include/events.h Mon Jan 23 08:57:36 2006 --- ds2.0r29/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.0r22/lib/secure/include/global.h ds2.0r29/lib/secure/include/global.h *** ds2.0r22/lib/secure/include/global.h Wed Apr 5 19:33:19 2006 --- ds2.0r29/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 diff -c -r --new-file ds2.0r22/lib/secure/include/lib.h ds2.0r29/lib/secure/include/lib.h *** ds2.0r22/lib/secure/include/lib.h Thu Apr 13 21:05:37 2006 --- ds2.0r29/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,19 **** --- 11,23 ---- #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" *************** *** 64,69 **** --- 68,74 ---- #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" *************** *** 73,78 **** --- 78,84 ---- #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" *************** *** 80,85 **** --- 86,92 ---- #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" diff -c -r --new-file ds2.0r22/lib/secure/include/network.h ds2.0r29/lib/secure/include/network.h *** ds2.0r22/lib/secure/include/network.h Wed Apr 5 19:33:20 2006 --- ds2.0r29/lib/secure/include/network.h Wed Jul 5 00:01:05 2006 *************** *** 2,8 **** #define __NETWORK_H #include ! #include #define MUD 0 #define STREAM 1 --- 2,8 ---- #define __NETWORK_H #include ! //#include #define MUD 0 #define STREAM 1 diff -c -r --new-file ds2.0r22/lib/secure/include/rooms.h ds2.0r29/lib/secure/include/rooms.h *** ds2.0r22/lib/secure/include/rooms.h Sun Apr 9 23:52:20 2006 --- ds2.0r29/lib/secure/include/rooms.h Wed Jul 5 00:01:05 2006 *************** *** 6,12 **** #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" --- 6,12 ---- #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" diff -c -r --new-file ds2.0r22/lib/secure/include/save.h ds2.0r29/lib/secure/include/save.h *** ds2.0r22/lib/secure/include/save.h Sat Apr 22 15:20:53 2006 --- ds2.0r29/lib/secure/include/save.h Wed Jul 5 00:01:05 2006 *************** *** 20,25 **** --- 20,26 ---- #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" diff -c -r --new-file ds2.0r22/lib/secure/lib/bboard.c ds2.0r29/lib/secure/lib/bboard.c *** ds2.0r22/lib/secure/lib/bboard.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/secure/lib/include/bboard.h ds2.0r29/lib/secure/lib/include/bboard.h *** ds2.0r22/lib/secure/lib/include/bboard.h Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/secure/modules/create.c ds2.0r29/lib/secure/modules/create.c *** ds2.0r22/lib/secure/modules/create.c Fri May 12 21:15:43 2006 --- ds2.0r29/lib/secure/modules/create.c Sat Jul 8 23:30:59 2006 *************** *** 94,100 **** 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()); } *************** *** 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 = ({"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"}); diff -c -r --new-file ds2.0r22/lib/secure/modules/file.c ds2.0r29/lib/secure/modules/file.c *** ds2.0r22/lib/secure/modules/file.c Mon Jan 23 08:57:55 2006 --- ds2.0r29/lib/secure/modules/file.c Sat Jul 8 23:30:59 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.0r22/lib/secure/modules/money.c ds2.0r29/lib/secure/modules/money.c *** ds2.0r22/lib/secure/modules/money.c Mon Jan 16 23:00:14 2006 --- ds2.0r29/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.0r22/lib/secure/modules/room.c ds2.0r29/lib/secure/modules/room.c *** ds2.0r22/lib/secure/modules/room.c Fri Mar 24 14:41:23 2006 --- ds2.0r29/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.0r22/lib/secure/npc/drone.c ds2.0r29/lib/secure/npc/drone.c *** ds2.0r22/lib/secure/npc/drone.c Mon Nov 7 13:32:08 2005 --- ds2.0r29/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.0r22/lib/secure/obj/arch_board.c ds2.0r29/lib/secure/obj/arch_board.c *** ds2.0r22/lib/secure/obj/arch_board.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/secure/obj/control.c ds2.0r29/lib/secure/obj/control.c *** ds2.0r22/lib/secure/obj/control.c Wed Apr 5 19:33:20 2006 --- ds2.0r29/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; *************** *** 58,64 **** 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; --- 66,72 ---- 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; *************** *** 67,118 **** 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.0r22/lib/secure/obj/glasses.c ds2.0r29/lib/secure/obj/glasses.c *** ds2.0r22/lib/secure/obj/glasses.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/secure/obj/meditate_mojo.c ds2.0r29/lib/secure/obj/meditate_mojo.c *** ds2.0r22/lib/secure/obj/meditate_mojo.c Mon Nov 7 13:32:08 2005 --- ds2.0r29/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.0r22/lib/secure/obj/medtric.c ds2.0r29/lib/secure/obj/medtric.c *** ds2.0r22/lib/secure/obj/medtric.c Wed Apr 5 19:33:20 2006 --- ds2.0r29/lib/secure/obj/medtric.c Wed Jul 5 00:01:06 2006 *************** *** 1111,1116 **** --- 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.0r22/lib/secure/obj/mojo.c ds2.0r29/lib/secure/obj/mojo.c *** ds2.0r22/lib/secure/obj/mojo.c Mon Nov 7 13:32:08 2005 --- ds2.0r29/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.0r22/lib/secure/obj/replacer.c ds2.0r29/lib/secure/obj/replacer.c *** ds2.0r22/lib/secure/obj/replacer.c Mon Nov 7 13:32:08 2005 --- ds2.0r29/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.0r22/lib/secure/obj/snooper.c ds2.0r29/lib/secure/obj/snooper.c *** ds2.0r22/lib/secure/obj/snooper.c Mon May 15 11:24:22 2006 --- ds2.0r29/lib/secure/obj/snooper.c Wed Jul 5 00:01:06 2006 *************** *** 20,26 **** "understand it may constitute a security breach. You'd " "be well advised to leave it alone."); SetInvis(1); ! set_heart_beat(2); SNOOP_D->RegisterSnooper(); } --- 20,27 ---- "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(); } *************** *** 35,45 **** void heart_beat(){ object dude; ! if(!(dude = find_player(guy))) { //tc("I can't find "+guy); eventDestruct(); } ! if(base_name(environment(dude)) == ROOM_FREEZER) eventDestruct(); if(time() - seconds > 600 ) stamp_time(); } --- 36,46 ---- 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(); } *************** *** 61,67 **** guy = str; if(!ob=find_player(str)) { write("Target not found."); return; } ! unguarded((: write_file("/secure/log/adm/s.log",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(); --- 62,68 ---- 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(); *************** *** 78,93 **** int eventDestruct(){ if(base_name(previous_object()) != SNOOP_D && !archp(previous_object(2)) && previous_object() != this_object()) return 0; - //tc("snooper "+identify(this_object())+" self destructing on the orders of "+ - identify(previous_object())+"."); - //tc("stack: "+get_stack()); SNOOP_D->UnregisterSnooper(); return item::eventDestruct(); } string GetSnooped(){ //debug("I am snooping ",guy,"green"); ! if((previous_object() && base_name(previous_object())) != SNOOP_D && ! !archp(this_player())) return ""; else return guy; } --- 79,91 ---- 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.0r22/lib/secure/room/arch.c ds2.0r29/lib/secure/room/arch.c *** ds2.0r22/lib/secure/room/arch.c Wed Apr 12 23:53:45 2006 --- ds2.0r29/lib/secure/room/arch.c Wed Jul 5 00:48:30 2006 *************** *** 155,171 **** 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."); ! 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; --- 155,166 ---- 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.0r22/lib/secure/room/network.c ds2.0r29/lib/secure/room/network.c *** ds2.0r22/lib/secure/room/network.c Sun Apr 9 23:52:20 2006 --- ds2.0r29/lib/secure/room/network.c Wed Jul 5 00:01:06 2006 *************** *** 20,26 **** } int CanReceive(object ob) { ! if( living(ob) && !archp(ob) ){ message("info","The network room is available only to "+ "admins, sorry.",ob); return 0; --- 20,26 ---- } int CanReceive(object ob) { ! if( !archp(ob) ){ message("info","The network room is available only to "+ "admins, sorry.",ob); return 0; diff -c -r --new-file ds2.0r22/lib/secure/room/router.c ds2.0r29/lib/secure/room/router.c *** ds2.0r22/lib/secure/room/router.c Sun Apr 9 23:55:34 2006 --- ds2.0r29/lib/secure/room/router.c Wed Jul 5 00:01:06 2006 *************** *** 19,25 **** } int CanReceive(object ob) { ! if( living(ob) && !archp(ob) ){ message("info","The router room is available only to "+ "admins, sorry.",ob); return 0; --- 19,25 ---- } int CanReceive(object ob) { ! if( !archp(ob) ){ message("info","The router room is available only to "+ "admins, sorry.",ob); return 0; diff -c -r --new-file ds2.0r22/lib/secure/save/boards/immortal_board.o ds2.0r29/lib/secure/save/boards/immortal_board.o *** ds2.0r22/lib/secure/save/boards/immortal_board.o Sun Dec 11 21:37:14 2005 --- ds2.0r29/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.0r22/lib/secure/sefun/groups.c ds2.0r29/lib/secure/sefun/groups.c *** ds2.0r22/lib/secure/sefun/groups.c Sat Mar 11 11:20:56 2006 --- ds2.0r29/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.0r22/lib/secure/sefun/legacy.c ds2.0r29/lib/secure/sefun/legacy.c *** ds2.0r22/lib/secure/sefun/legacy.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/secure/sefun/local_time.c ds2.0r29/lib/secure/sefun/local_time.c *** ds2.0r22/lib/secure/sefun/local_time.c Thu Apr 13 23:44:23 2006 --- ds2.0r29/lib/secure/sefun/local_time.c Wed Jul 5 00:01:06 2006 *************** *** 3,8 **** --- 3,9 ---- */ #include + #include #include #include *************** *** 68,74 **** return "Invalid time zone."; } tz = str; ! 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"); } --- 69,76 ---- 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.0r22/lib/secure/sefun/messaging.c ds2.0r29/lib/secure/sefun/messaging.c *** ds2.0r22/lib/secure/sefun/messaging.c Sat Mar 11 11:20:56 2006 --- ds2.0r29/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.0r22/lib/secure/sefun/mud_info.c ds2.0r29/lib/secure/sefun/mud_info.c *** ds2.0r22/lib/secure/sefun/mud_info.c Mon May 15 11:22:37 2006 --- ds2.0r29/lib/secure/sefun/mud_info.c Sun Jul 9 22:52:34 2006 *************** *** 27,33 **** string mudlib() { return "Dead Souls"; } ! string mudlib_version() { return "2.0r22"; } int query_host_port() { return __PORT__; } --- 27,33 ---- string mudlib() { return "Dead Souls"; } ! string mudlib_version() { return "2.0r29"; } int query_host_port() { return __PORT__; } diff -c -r --new-file ds2.0r22/lib/secure/sefun/pointers.c ds2.0r29/lib/secure/sefun/pointers.c *** ds2.0r22/lib/secure/sefun/pointers.c Wed Dec 7 14:28:42 2005 --- ds2.0r29/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.0r22/lib/secure/sefun/query_names.c ds2.0r29/lib/secure/sefun/query_names.c *** ds2.0r22/lib/secure/sefun/query_names.c Sat Mar 11 11:20:56 2006 --- ds2.0r29/lib/secure/sefun/query_names.c Sun Jul 9 19:04:30 2006 *************** *** 27,32 **** } int answers_to(string name, object what){ if(member_array(lower_case(name),query_names(what)) != -1) return 1; ! else return 0; } --- 27,59 ---- } int answers_to(string name, object what){ + string *adjs = what->GetAdjectives(); + string *preargs = ({}); + string s1,s2,s3,s4; + int hits; if(member_array(lower_case(name),query_names(what)) != -1) return 1; ! if(!sizeof(adjs)) return 0; ! hits = sscanf(name,"%s %s %s %s",s1, s2, s3, s4); ! //tc("hits: "+hits); ! if(hits < 4) hits = sscanf(name,"%s %s %s",s1, s2, s3); ! //tc("hits: "+hits); ! if(hits < 3) hits = sscanf(name,"%s %s",s1, s2); ! //tc("s1: "+s1); ! //tc("s2: "+s2); ! //tc("s3: "+s3); ! //tc("s4: "+s4); ! if(!hits) return 0; ! hits--; ! if(sizeof(s1)) preargs += ({s1}); ! if(sizeof(s2)) preargs += ({s2}); ! if(sizeof(s3)) preargs += ({s3}); ! if(sizeof(s4)) preargs += ({s4}); ! ! if(member_array(preargs[hits],query_names(what)) == -1) return 0; ! preargs -= ({ preargs[hits] }); ! ! foreach(string prearg in preargs){ ! if(member_array(prearg, adjs) == -1) return 0; ! } ! return 1; } diff -c -r --new-file ds2.0r22/lib/secure/sefun/reload.c ds2.0r29/lib/secure/sefun/reload.c *** ds2.0r22/lib/secure/sefun/reload.c Mon Jan 23 08:58:12 2006 --- ds2.0r29/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.0r22/lib/secure/sefun/sefun.c ds2.0r29/lib/secure/sefun/sefun.c *** ds2.0r22/lib/secure/sefun/sefun.c Mon May 15 01:14:02 2006 --- ds2.0r29/lib/secure/sefun/sefun.c Sun Jul 9 19:04:30 2006 *************** *** 75,85 **** #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" #include "/secure/sefun/wild_card.c" #include "/secure/sefun/compare_array.c" object find_object( string str ){ if((int)master()->valid_apply(({ "SECURE", "ASSIST", "SNOOP_D" }))) return efun::find_object(str); --- 75,92 ---- #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" + //void parse_add_rule(string verb, string rule){ + //parse_init(); + //tc("parse_add_rule. verb: "+verb+", rule: "+rule,"white"); + //tell_player("cratylus","parse_add_rule. verb: "+verb+", rule: "+rule); + //tell_player("cratylus","previous_object(): "+identify(previous_object())); + //efun::parse_add_rule(verb, rule); + //} object find_object( string str ){ if((int)master()->valid_apply(({ "SECURE", "ASSIST", "SNOOP_D" }))) return efun::find_object(str); *************** *** 130,136 **** } mixed array users(){ ! return filter(efun::users(), (: environment($1) :) ); } int destruct(object ob) { --- 137,143 ---- } mixed array users(){ ! return filter(efun::users(), (: ($1) && environment($1) :) ); } int destruct(object ob) { diff -c -r --new-file ds2.0r22/lib/secure/sefun/sefun.h ds2.0r29/lib/secure/sefun/sefun.h *** ds2.0r22/lib/secure/sefun/sefun.h Mon May 15 01:14:02 2006 --- ds2.0r29/lib/secure/sefun/sefun.h Fri Jul 7 19:41:43 2006 *************** *** 205,209 **** --- 205,219 ---- 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); + string alpha_strip(mixed arg); #endif /* l_sefun_h */ diff -c -r --new-file ds2.0r22/lib/secure/sefun/strings.c ds2.0r29/lib/secure/sefun/strings.c *** ds2.0r22/lib/secure/sefun/strings.c Mon May 15 01:14:02 2006 --- ds2.0r29/lib/secure/sefun/strings.c Fri Jul 7 19:41:43 2006 *************** *** 490,495 **** --- 490,517 ---- 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"); + } + string last_string_element(string str, string delimiter){ string rev, revd, revret, junk; if(!str || !delimiter) return ""; *************** *** 521,533 **** 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"; *************** *** 548,553 **** --- 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; } *************** *** 561,566 **** --- 608,627 ---- return 0; } + string alpha_strip(mixed arg){ + string raw, ret; + string *blown; + if(!arg || pointerp(arg)) return ""; + if(!sscanf(arg,"%s",raw)) return ""; + if(!sizeof(raw)) return ""; + blown = explode(raw,""); + ret = ""; + foreach(string element in blown){ + if(alphap(element)) ret += element; + } + return ret; + } + int numericp(mixed arg){ string *alphabet = ({"1", "2", "3", "4", "5", "6", "7", "8", "9", "0"}); if(intp(arg)) arg = itoa(arg); diff -c -r --new-file ds2.0r22/lib/secure/verbs/creators/force.c ds2.0r29/lib/secure/verbs/creators/force.c *** ds2.0r22/lib/secure/verbs/creators/force.c Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/secure/verbs/creators/force.c Sun Jul 9 19:04:30 2006 *************** *** 0 **** --- 1,43 ---- + #include + + inherit LIB_VERB; + + static void create() { + verb::create(); + SetVerb("force"); + SetRules("LIV STR", "LIV to STR"); + SetErrorMessage("Force whom to do what?"); + SetHelp("Syntax: \n" + " \n" + "Allows you to command some living things to do " + "your bidding."); + } + + mixed can_force_liv_to_str(string str) { return 1; } + + mixed can_force_liv_str(string str) { + return can_force_liv_to_str(str); + } + + mixed do_force_liv_to_str(object target, string cmd) { + object who = this_player(); + + if(!who) return 0; + if(archp(target) && !securep(who)){ + who->eventPrint(target->GetName()+" shakes "+possessive(target)+ + " head and forces you to dest yourself."); + tell_room(environment(who), who->GetName()+" dests "+objective(who)+ + "self while trying to pull a foolish joke on "+target->GetName()+".", who); + tell_player(target,who->GetName()+" tried to force you to "+cmd); + who->eventDestruct(); + return 1; + } + target->eventPrint(who->GetName() + " forces you to: " + cmd); + who->eventPrint("You force " + target->GetShort() + " to: " + cmd); + target->eventForce(cmd); + return 1; + } + + mixed do_force_liv_str(object ob, string str) { + return do_force_liv_to_str(ob, str); + } diff -c -r --new-file ds2.0r22/lib/verbs/creators/add.c ds2.0r29/lib/verbs/creators/add.c *** ds2.0r22/lib/verbs/creators/add.c Mon Jan 23 08:58:37 2006 --- ds2.0r29/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.0r22/lib/verbs/creators/copy.c ds2.0r29/lib/verbs/creators/copy.c *** ds2.0r22/lib/verbs/creators/copy.c Sun Jan 1 12:37:04 2006 --- ds2.0r29/lib/verbs/creators/copy.c Fri Jul 7 19:41:43 2006 *************** *** 41,53 **** write("in your workroom."); return 1; } ! success = 0; sourcefile = ""; targetfile = ""; if(last(str,2) != ".c") str += ".c"; str = absolute_path((string)this_player()->query_cwd(), str); ! if( !directory_exists(path_prefix(str)) ) return "Directory not found."; sourcefile = base_name(ob)+".c"; targetfile = str; --- 41,63 ---- write("in your workroom."); return 1; } ! //debug("str: ",str); ! //debug("path_prefix(str): ",path_prefix(str)); ! if(userp(ob)){ ! write("No."); ! return 1; ! } success = 0; sourcefile = ""; targetfile = ""; if(last(str,2) != ".c") str += ".c"; str = absolute_path((string)this_player()->query_cwd(), str); ! //debug("str: ",str); ! //debug("path_prefix(str): ",path_prefix(str)); ! if( !directory_exists(path_prefix(str)) ) { ! write("Directory not found."); ! return 1; ! } sourcefile = base_name(ob)+".c"; targetfile = str; *************** *** 70,76 **** } mixed do_copy_str(string str) { ! string tmp, new_room; mixed source_update; object staff; staff = present("tanstaafl",this_player()); --- 80,86 ---- } mixed do_copy_str(string str) { ! string str2, tmp, new_room; mixed source_update; object staff; staff = present("tanstaafl",this_player()); *************** *** 80,89 **** write("in your workroom."); return 1; } if(last(str,2) != ".c") str += ".c"; ! str = absolute_path((string)this_player()->query_cwd(), str); ! if( !file_exists(str) ) return "File " + str + " not found."; else if( !(tmp = read_file(str)) || !tmp || tmp == ""){ write("Unable to read file " + str + "."); return 1; --- 90,115 ---- write("in your workroom."); return 1; } + //debug("str: ",str,"yellow"); + str2 = str; + str = absolute_path((string)this_player()->query_cwd(), str); + //debug("str: ",str,"yellow"); + + //debug("path_prefix(str): ",path_prefix(str),"green"); if(last(str,2) != ".c") str += ".c"; ! //debug("str: ",str,"yellow"); ! ! if( !file_exists(str) ){ ! str = path_prefix(base_name(environment(this_player())))+"/"+str2; ! if(last(str,2) != ".c") str += ".c"; ! } ! ! if( !file_exists(str) ){ ! write("Directory not found."); ! return 1; ! } ! else if( !(tmp = read_file(str)) || !tmp || tmp == ""){ write("Unable to read file " + str + "."); return 1; diff -c -r --new-file ds2.0r22/lib/verbs/creators/delete.c ds2.0r29/lib/verbs/creators/delete.c *** ds2.0r22/lib/verbs/creators/delete.c Tue Mar 28 23:23:42 2006 --- ds2.0r29/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.0r22/lib/verbs/creators/modify.c ds2.0r29/lib/verbs/creators/modify.c *** ds2.0r22/lib/verbs/creators/modify.c Fri Mar 24 14:41:48 2006 --- ds2.0r29/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.0r22/lib/verbs/creators/reload.c ds2.0r29/lib/verbs/creators/reload.c *** ds2.0r22/lib/verbs/creators/reload.c Sun Apr 9 23:52:44 2006 --- ds2.0r29/lib/verbs/creators/reload.c Wed Jul 5 00:01:06 2006 *************** *** 56,61 **** --- 56,65 ---- return can_reload_obj("foo"); } mixed do_reload_obj(object ob) { + if(userp(ob)) { + write("No."); + return 1; + } return reload(ob); } diff -c -r --new-file ds2.0r22/lib/verbs/items/put.c ds2.0r29/lib/verbs/items/put.c *** ds2.0r22/lib/verbs/items/put.c Sat Apr 22 15:21:32 2006 --- ds2.0r29/lib/verbs/items/put.c Sat Jul 8 23:31:00 2006 *************** *** 28,40 **** } ! mixed can_put_obs_word_obj(mixed *res, string wrd, object storage) { ! 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) { --- 28,39 ---- } ! 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) { *************** *** 53,58 **** --- 52,58 ---- object *obs; + //tc("2"); obs = filter(res, (: objectp :)); //tc("a"); *************** *** 134,156 **** 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()); --- 134,157 ---- mixed do_put_wrd_wrd_word_obj(string num, string curr, mixed wort, object ob) { object pile, env; int amt; if(wort == "on") wort = "onto"; if(wort == "in") wort = "into"; if(wort == "onto" && !inherits( LIB_SURFACE, ob ) ) { write("That isn't a load-bearing surface."); return 1; } if(wort == "into" && inherits( LIB_SURFACE, ob ) ) { write("That's a surface. Try \"put on\""); return 1; } + if((inherits(LIB_SIT,ob) && sizeof(ob->GetSitters())) || + (inherits(LIB_LIE,ob) && sizeof(ob->GetLiers()))){ + write("There appears to be someone blocking your access."); + return 0; + } + amt = to_int(num); env = environment(this_player()); diff -c -r --new-file ds2.0r22/lib/verbs/players/follow.c ds2.0r29/lib/verbs/players/follow.c *** ds2.0r22/lib/verbs/players/follow.c Fri May 12 21:15:43 2006 --- ds2.0r29/lib/verbs/players/follow.c Sun Jul 9 19:04:30 2006 *************** *** 13,19 **** ::create(); SetVerb("follow"); SetRules("", "LIV"); ! SetErrorMessage("Who would you like to follow?"); SetHelp("Syntax: follow\n" " follow LIV\n" "\n" --- 13,19 ---- ::create(); SetVerb("follow"); SetRules("", "LIV"); ! SetErrorMessage("Whom would you like to follow?"); SetHelp("Syntax: follow\n" " follow LIV\n" "\n" *************** *** 40,46 **** // Format follow string. if(this_player()->CanLead() && leader = this_player()->GetLeader()) { tmp = "You are "; ! if(leader->GetAllowed(this_player())) tmp += "following"; else tmp += "trailing"; tmp += " " + leader->GetName() + ".\n"; } --- 40,46 ---- // Format follow string. if(this_player()->CanLead() && leader = this_player()->GetLeader()) { tmp = "You are "; ! if(leader->GetFollowed(this_player())) tmp += "following"; else tmp += "trailing"; tmp += " " + leader->GetName() + ".\n"; } *************** *** 53,59 **** // Format lead string. tmp += "You are leading "; obs = map( ! filter(followers, (:this_player()->GetAllowed($1):)), (:$1->GetName():)); size = sizeof(obs); if(size) tmp += conjunction(obs); --- 53,59 ---- // Format lead string. tmp += "You are leading "; obs = map( ! filter(followers, (:this_player()->GetFollowed($1):)), (:$1->GetName():)); size = sizeof(obs); if(size) tmp += conjunction(obs); *************** *** 63,69 **** // Format evasion string. tmp += "You are evading "; obs = map( ! filter(followers, (:!this_player()->GetAllowed($1):)), (:$1->GetName():)); size = sizeof(obs); if(size) tmp += conjunction(obs); --- 63,69 ---- // Format evasion string. tmp += "You are evading "; obs = map( ! filter(followers, (:!this_player()->GetFollowed($1):)), (:$1->GetName():)); size = sizeof(obs); if(size) tmp += conjunction(obs); *************** *** 82,87 **** --- 82,88 ---- if(leader = this_player()->GetLeader()) { leader->RemoveFollower(this_player()); this_player()->eventPrint("You stop trailing " + leader->GetName() + "."); + return 1; } if(member_array(this_player(), ob->AddFollower(this_player())) == -1) diff -c -r --new-file ds2.0r22/lib/verbs/players/lead.c ds2.0r29/lib/verbs/players/lead.c *** ds2.0r22/lib/verbs/players/lead.c Fri May 12 21:15:43 2006 --- ds2.0r29/lib/verbs/players/lead.c Sat Jul 8 23:31:00 2006 *************** *** 13,19 **** verb::create(); SetVerb("lead"); SetRules("LIV"); ! SetErrorMessage("Who would you like to lead?"); SetHelp("Syntax: lead LIVING\n" "\n" "Allows one to assist a living being who is " --- 13,19 ---- verb::create(); SetVerb("lead"); SetRules("LIV"); ! SetErrorMessage("Whom would you like to lead?"); SetHelp("Syntax: lead LIVING\n" "\n" "Allows one to assist a living being who is " diff -c -r --new-file ds2.0r22/lib/www/articles/copyright.html ds2.0r29/lib/www/articles/copyright.html *** ds2.0r22/lib/www/articles/copyright.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/www/articles/favicon.ico and ds2.0r29/lib/www/articles/favicon.ico differ diff -c -r --new-file ds2.0r22/lib/www/articles/forum_chat.html ds2.0r29/lib/www/articles/forum_chat.html *** ds2.0r22/lib/www/articles/forum_chat.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/www/articles/lpu.html ds2.0r29/lib/www/articles/lpu.html *** ds2.0r22/lib/www/articles/lpu.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/www/articles/mudmagic.html ds2.0r29/lib/www/articles/mudmagic.html *** ds2.0r22/lib/www/articles/mudmagic.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/www/articles/olc.html ds2.0r29/lib/www/articles/olc.html *** ds2.0r22/lib/www/articles/olc.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/www/articles/patches.html ds2.0r29/lib/www/articles/patches.html *** ds2.0r22/lib/www/articles/patches.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/www/articles/tacitus.html ds2.0r29/lib/www/articles/tacitus.html *** ds2.0r22/lib/www/articles/tacitus.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/www/articles/why_ds.html ds2.0r29/lib/www/articles/why_ds.html *** ds2.0r22/lib/www/articles/why_ds.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/www/articles.html ds2.0r29/lib/www/articles.html *** ds2.0r22/lib/www/articles.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/www/debugging.html ds2.0r29/lib/www/debugging.html *** ds2.0r22/lib/www/debugging.html Fri May 12 21:15:43 2006 --- ds2.0r29/lib/www/debugging.html Wed Jul 5 00:00:59 2006 *************** *** 4,9 **** --- 4,11 ---- Dead Souls debugging + +

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

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     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 --- 162,168 ----
    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 diff -c -r --new-file ds2.0r22/lib/www/doc/ds-admin-faq.html ds2.0r29/lib/www/doc/ds-admin-faq.html *** ds2.0r22/lib/www/doc/ds-admin-faq.html Fri Jan 27 22:56:29 2006 --- ds2.0r29/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.0r22/lib/www/doc/ds-faq.html ds2.0r29/lib/www/doc/ds-faq.html *** ds2.0r22/lib/www/doc/ds-faq.html Fri Jan 27 22:56:29 2006 --- ds2.0r29/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.0r22/lib/www/doc/editor.html ds2.0r29/lib/www/doc/editor.html *** ds2.0r22/lib/www/doc/editor.html Fri Jan 27 22:56:29 2006 --- ds2.0r29/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.0r22/lib/www/doc/example.html ds2.0r29/lib/www/doc/example.html *** ds2.0r22/lib/www/doc/example.html Fri Jan 27 22:56:29 2006 --- ds2.0r29/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.0r22/lib/www/downloads.html ds2.0r29/lib/www/downloads.html *** ds2.0r22/lib/www/downloads.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/www/ds-admin-faq.html ds2.0r29/lib/www/ds-admin-faq.html *** ds2.0r22/lib/www/ds-admin-faq.html Fri May 12 21:15:43 2006 --- ds2.0r29/lib/www/ds-admin-faq.html Wed Jul 5 00:00:59 2006 *************** *** 4,13 **** Dead Souls Admin FAQ !
Dead Souls Admin FAQ, v2.9

Written by Cratylus @ Frontiers, October 2005
Updated May 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.


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.


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! How can I 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?

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?

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?



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.


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.


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

It's also possible that the Dead Souls I3 router has
changed address or port. Visit this page to get the
latest conenction 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 probably just delete
the file /daemon/services/auth.c and then update
the file /daemon/services.c without causing harm
to your mud.


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

Please see the 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 /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



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:

/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:

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.


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.


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.


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.


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.


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.



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



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


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

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.




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.

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:

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:

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.


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.


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, 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,
I need to know what features to expect in the next release so I don't
waste time duplicating effort

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

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


You need a development roadmap and task tracking

No, I don't. If I had developers and teams and
such things, then I'd use all the fancy project
management stuff available on Sourceforge.
But I don't want to manage developers,
I want to lib code. 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.


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.


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.


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


I've hired an area coder to make a new domain. I want her
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
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


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 councillors.
Because creators have no business meddling in the
affairs of mortals, they cannot vote, regardles 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.


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.


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
!

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.


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.


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.


!
! - ! Cratylus

!
! Dead Souls ! Homepage
--- 556,590 ---- style="text-decoration: underline;">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.0r22/lib/www/ds-creator-faq.html ds2.0r29/lib/www/ds-creator-faq.html *** ds2.0r22/lib/www/ds-creator-faq.html Fri May 12 21:15:43 2006 --- ds2.0r29/lib/www/ds-creator-faq.html Fri Jul 7 19:41:43 2006 *************** *** 4,13 **** Dead Souls Creator FAQ !
Dead Souls Creator FAQ, v2.9

Written by Cratylus @ Frontiers, March 2006
Updated April 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.


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.


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?

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


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?

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?

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.


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?

!
!
Section 1: Getting Started


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


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 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, 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
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
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 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 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:

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:

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


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 /domains/default
is hosed up.


!
Section 2: Code

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

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


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.

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.

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.


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( "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);


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);


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 funcitonality for themselves, so
the debug() sefun now carries this functionality. For
more information, type:

man debug


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


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 onlder lib code. But they
should be avoided because they generate much more
lag than the more efficient foreach() and filter() efuns.


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.


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.


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 discussed in detail in the Creators Manual.

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>
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>
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() everridden 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)
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)
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 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.

!
!
Section 3: Intermud and channel stuff


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 Bozo->SetLanguage("Clownish", 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


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?
!
!     ! 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 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
!
!
!
!
 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:
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 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.
!

! 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
exmaple, 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:
--- 730,962 ---- style="font-weight: bold;">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:
*************** *** 1048,1076 **** 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.
!
!
!
! - Cratylus

! <my name here>@users.sourceforge.net
!

! Dead ! Souls Homepage
--- 996,1059 ---- 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.0r22/lib/www/ds-faq.html ds2.0r29/lib/www/ds-faq.html *** ds2.0r22/lib/www/ds-faq.html Fri May 12 21:15:43 2006 --- ds2.0r29/lib/www/ds-faq.html Wed Jul 5 00:00:59 2006 *************** *** 4,13 **** Dead Souls FAQ
Dead Souls FAQ, v2.3

Written by Cratylus @ Frontiers, October 2005
Updated May 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?

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?

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


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
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 Dead Souls Homepage
+
diff -c -r --new-file ds2.0r22/lib/www/ds-inst-faq.html ds2.0r29/lib/www/ds-inst-faq.html *** ds2.0r22/lib/www/ds-inst-faq.html Fri May 12 21:15:43 2006 --- ds2.0r29/lib/www/ds-inst-faq.html Sun Jul 9 19:04:31 2006 *************** *** 1,713 **** ! ! ! Dead Souls Installation FAQ !
Dead Souls Installation FAQ, v2.9

Written by Cratylus @ Frontiers, February 2006
Updated April 2006

IMPORTANT NOTE: After installation, check the HOTFIX PAGE for late-breaking patches.

1) Is this FAQ really necessary?

2) Where do I get Dead Souls?

3) Where do I get patches?

4) Should I apply the available patches during an install?

5) What's this Cygwin stuff?

6) How do I install the Windows version of Dead Souls?

7) Hold up, these Windows instructions aren't working

8) How do I install the UNIX version of Dead Souls?

9) I'm having trouble getting Dead Souls for UNIX to work

10) Why does compiling MudOS for Dead Souls throw so many warnings?

11) Why is there a windows-format mudos.cfg in /secure/cfg? I'm running unix.

12) How do I enable database support?

13) How do I upgrade from one version of Dead Souls to another?

14) The UNIX patch doesn't work! I'm getting a million errors!

15)Ok, it's running. Now what?


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?

You should only ever download from the sites listed below.
Some other sites tend to mirror these or copy data from
them, then fail to update their data regularly. The following
will always have the most recent version, and they are the
only ones officially authorized to distribute Dead Souls.

Download the latest version from one of the following:

Mudmagic: http://www.mudmagic.com/codes/download/lpc/mudos/dead_souls

Sourceforge: http://sourceforge.net/project/showfiles.php?group_id=148388
!
!
!
!
! Where ! do I get patches?
!
! Mudmagic:
!
!     Windows patches: http://www.mudmagic.com/codes/download/lpc/mudos/dead_souls/windows_patches
!    
!     UNIX patches: http://www.mudmagic.com/codes/download/lpc/mudos/dead_souls/unix_patches
!

! Sourceforge:
!
!      Both: http://sourceforge.net/project/showfiles.php?group_id=148388&package_id=175140
!
!

!
!
!
! 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?
!
NOTE: If you are using Windows, USE THE WINDOWS VERSION. 
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) 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) check the HOTFIX PAGE for late-breaking fixes.
!
! 13) log in, start ! reading the ! handbook and the manual.
!
! * Note: If you use c:\ds\startmud.bat, ! you won't need to manually restart each time.
!
!
!
!
! Hold ! up, these Windows instructions aren't working
!
! 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.
!
!
*  ! 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.

!
!
!
!
! 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 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:
!
!
! 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.
!
!
12) check the HOTFIX PAGE for late-breaking fixes.
!
!
! I'm having ! trouble getting Dead Souls for UNIX to work
!
! * first, stop using Fedora. Ha ha just kidding.
!
!
* 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 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 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 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 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, 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?
!
! Log in and read the in-game Player's Handbook.
!
!
Read the Dead Souls Admin FAQ.

Read the Dead Souls Creator's FAQ.

Read the Quick Creation System Example Page.

Read the Debugging Guide.

Read the Editor Tutorial.
! Read ! the in-game Creator's Manual.
!
!

! Dead ! Souls Homepage
!
--- 1,483 ---- ! ! 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.
  • !
  • If you've tried everything but the compile keeps breaking, try ! compiling as root (obviously a last resort, and just for testing).
  • !
  • If the problem is that it compiles, but when you run the driver ! no sefuns load and the driver segfaults, it is possible that you ! compiled on a 64-bit x86 box. It seems that MudOS compiled on 64-bit ! x86 Linux doesn't work right. A fix is in the works, but until it is ! available, you can do one of two things: boot into 32-bit mode and then ! compile, or compile it on a 32-bit box and move it to the 64-bit box.
    !
  • !
    !
! !

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.0r22/lib/www/ds-lpu-faq.html ds2.0r29/lib/www/ds-lpu-faq.html *** ds2.0r22/lib/www/ds-lpu-faq.html Fri Mar 24 14:34:51 2006 --- ds2.0r29/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.0r22/lib/www/editor.html ds2.0r29/lib/www/editor.html *** ds2.0r22/lib/www/editor.html Fri May 12 21:15:43 2006 --- ds2.0r29/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.0r22/lib/www/example.html ds2.0r29/lib/www/example.html *** ds2.0r22/lib/www/example.html Fri May 12 21:15:43 2006 --- ds2.0r29/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.0r22/lib/www/favicon.ico and ds2.0r29/lib/www/favicon.ico differ diff -c -r --new-file ds2.0r22/lib/www/hotfix.html ds2.0r29/lib/www/hotfix.html *** ds2.0r22/lib/www/hotfix.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/www/hotfix.html Fri Jul 7 19:41:43 2006 *************** *** 0 **** --- 1,67 ---- + + + + 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 r28, you must reboot the mud between the + installation of the two separate patches.
    +
  • +
+
+

For Dead Souls 2.0r28, + the + following fixes are available: +

+
    +
  • Some folks are still having trouble with the church elevator + buttons. If you are one of those people, replace the ones currently in + /domains/town/obj/ with both this and this.
    +
  • +
+
+
+ + + Binary files ds2.0r22/lib/www/images/Thumbs.db and ds2.0r29/lib/www/images/Thumbs.db differ Binary files ds2.0r22/lib/www/images/lpuni_afiliated.png and ds2.0r29/lib/www/images/lpuni_afiliated.png differ diff -c -r --new-file ds2.0r22/lib/www/index.html ds2.0r29/lib/www/index.html *** ds2.0r22/lib/www/index.html Fri May 12 21:15:43 2006 --- ds2.0r29/lib/www/index.html Wed Jul 5 00:49:19 2006 *************** *** 1,139 **** ! 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, a Quick Creation System ! makes world creation an absolute breeze, and a Microsoft Windows ! compatible version of the program is included.
!
! 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         -

-

-
NEW: HOTFIX PAGE
-
-
-
-
-
-
The - Dead Souls project is a proud affiliate of LPUniversity. - Please visit the DS LPU FAQ for more - information.
-
!
!
!

Home ! / LPUniversity / I3 router / RELEASE NOTES / Crat's Plan File / 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
!

! !
! ! ! diff -c -r --new-file ds2.0r22/lib/www/news.html ds2.0r29/lib/www/news.html *** ds2.0r22/lib/www/news.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/www/news.html Fri Jul 7 19:41:45 2006 *************** *** 0 **** --- 1,468 ---- + + + + Dead Souls News Page + + + + + + +
+
+
+
+
+
The + Dead Souls News + Page
+
+
+

+ 07 July 06
+
+     A really surprising thing happened today. I
+ decided to reorganize my .plan file and remove
+ anything that wasn't either an important feature
+ enhancement or a bugfix. I wanted to know *exactly*
+ how close I am to releasing Dead Souls 2.1.
+
+     After slogging through and tearing out pages
+ of wishlists and maybes, this is what was left:
+
+ - fix /obj/stargate
+ - update colors with %%^^ data
+ - verbify force
+ - can't delete glass case?
+ - are people defaulting to the start room?
+ - sell machine to cat
+ - make an npc's living body go away BEFORE the corpse is moved into the + room
+ - make channels understand ) after : can have non emote messages after
+ - SetMaxHealth shouldn't need to be in init()
+ - help area
+ - help newbie
+ - apostrophes
+ - add damage types to dummy
+ - intergossip logging to two files?
+ - review setinventory, is addstuff necessary?
+ - Beggar says in English, "Hi, A mangy little rat."
+ - shop in the town is confusing the maglite with the cheap one.
+ - If a piece of gear is set for a "left foot" attribute, why can I also + wear it on my right foot?
+ - the handbook says that its easier to kill things as a mage,
+ - bug: cp sefun.c  /
+ - delete mfinger
+ - SetEmptyName(), SetEmptyLong() and SetEmptyShort().
+ - install faq: if compile problems, try as root, try non 64bit amd
+ - wipe the unused tc's
+
+     That's it. Now compare the size of this list with
+ the size of stuff in the release + notes. That's how close
+ I am. I was shocked.
+
+     So folks, I need your help. Any bugs that have been
+ bothering you but you haven't gotten around to telling me,
+ this is the time. If you feel like knocking about the code
+ trying to break stuff, please log into the demo mud
+ at rugose.com 6666 and have at + it.
+
+     It's ok that you'll make the list longer. That's
+ what I *want*. I want to get these bufixes as over with
+ as possible.
+
+
+ 06 July 06
+
+ more update news:
+
+     I overlooked a couple of important things when
+ I released 2.0r27. They have been addressed in
+ 2.0r28.
+
+     There may be a compat buster here. One of the
+ things that needed fixing was a peculiar bug that
+ would generate extra corpses under unusual circumstances,
+ during combat. This bug had some relationship to
+ another combat bug that prevented the accurate
+ recording of a player's deaths.
+
+     In the end, the fixes for these two involved the
+ manipulation of persistent player variables. The
+ good news is that things now seem to work just fine,
+ and the bugs are seemingly gone.
+
+     The bad news is that since new player variables
+ are involved, you may find that test chars created
+ before an upgrade to r28 do weird things in combat...
+ like not fight.
+
+     The fix is to create new test chars.
+
+     If Dead Souls was widespread enough that that
+ there were muds out there that were open, with players,
+ I'd look into some sort of system for updating
+ older player files. Since this is not the case,
+ I expect that people will be able to tolerate this
+ minor inconvenience with minimal discomfort.
+
+
+
+ 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.0r22/lib/www/qcs.html ds2.0r29/lib/www/qcs.html *** ds2.0r22/lib/www/qcs.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/www/router.html ds2.0r29/lib/www/router.html *** ds2.0r22/lib/www/router.html Fri May 12 21:15:43 2006 --- ds2.0r29/lib/www/router.html Sun Jul 9 19:04:31 2006 *************** *** 4,9 **** --- 4,11 ---- Dead Souls I3 router + +
*************** *** 11,49 ****
-
-
The Dead Souls Intermud3 Router
!
!
This page is for folks ! already using Dead Souls and modifying
!
!
!
their intermud configuration. If ! this does not apply to you, please
! return to the main site for general ! information:
!

-
- - Or the following FAQs:
-
-
The General FAQ  http://dead-souls.net/ds-faq.html
-
-
The Admin FAQ  http://dead-souls.net/ds-admin-faq.html
-
-
The Creator FAQ: http://dead-souls.net/ds-creator-faq.html
-
-
The Installation FAQ: http://dead-souls.net/ds-inst-faq.html
-

-
What is the Dead Souls router? It's an intermud protocol version 3
--- 13,26 ----

The Dead Souls Intermud3 Router
!

What is the Dead Souls router? It's an intermud protocol version 3
*************** *** 52,57 **** --- 29,41 ---- was written by the legendary Tim@TimMUD.

+
+ What are + the rules?
+
+ Please read the router + rules page.
+

Is it private?
*************** *** 65,83 **** will be posted here when they happen. The current port and address is:

!
IP: 149.152.218.102     port: 23

!
How do I set it up?

!
If you're ! running r18 or higher, you need do nothing.
! If you're running r17 or r16, upgrading to r18 will
! be enough.


It doesn't --- 49,77 ---- will be posted here when they happen. The current port and address is:

!
Name: *yatmim IP: 149.152.218.102     port: 23

!
Is ! is "secure"?
!
!
Nope. Read this: http://dead-souls.net/ds-admin-faq.html#90
!
Bottom line: Don't tell secrets on the router.
!
! 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 *************** *** 89,95 **** 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>@users.sourceforge.net


What's the --- 83,103 ---- 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
!
!     Also note, the name is yatmim, with an M at the end
! and not an N. It stands for ! Yet Another TMI Mud. yatmim.
! Lower case letters. I'll see if I can make the router
! more forgiving of that typo.
!
!     Getting the router name wrong is the number one ! cause of
! errors. Also, once you get it wrong, your own client
! cache might keep the old one, even if you change your
! intermud client code. Make sure you purge the i3 data
! cache before you try again.


What's the *************** *** 126,144 ****     It's not running the way you think.


! Hey, XYZ ! is broken and ABC works only half the time
!
!     For crying out loud, email me and tell me. I need to ! know. I'm still
! in the early stages of customizing and troubleshooting, so I need all ! the
! bug reports I can get. Please email me at <my name ! here>@users.sourceforge.net
!

!
! Is this router actually any more stable? What's the uptime?

    It looks like there's good potential for this
--- 134,142 ----     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
*************** *** 156,165 **** reload channels. On the todo list is a plan to make
channel data persist across server resets.

!     In general, however, about every other day or
!  every third day I notice that *gjs is down or has
! been down for a couple of hours, and our new router
! is still going strong.


You should --- 154,162 ---- 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 *************** *** 218,235 ****
!
More technical docs:
! Creator FAQ             ! Debugging FAQ         ! Editor Tutorial     !   !   The Quick Creation System         !

!


--- 215,229 ----
!
!
Dead Souls Home
!
!


diff -c -r --new-file ds2.0r22/lib/www/router_rules.html ds2.0r29/lib/www/router_rules.html *** ds2.0r22/lib/www/router_rules.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/lib/www/router_rules.html Sat Jul 8 23:31:01 2006 *************** *** 0 **** --- 1,145 ---- + + + + 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 ok, 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.0r22/lib/www/style.css ds2.0r29/lib/www/style.css *** ds2.0r22/lib/www/style.css Wed Dec 31 19:00:00 1969 --- ds2.0r29/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.0r22/lib/www/verbs.html ds2.0r29/lib/www/verbs.html *** ds2.0r22/lib/www/verbs.html Wed Dec 31 19:00:00 1969 --- ds2.0r29/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

+ +