/* Time Elemental Phylateracy, (c)Angel, March 1994. * v1.02 Angel, April 1994. * This object is designed to be the sole transport between * not only remote parts of the mud, but also to domains of * variant themes. This should handle all of the destructing * of different objects of different themes between those * domains. */ #include <mudlib.h> inherit ROOM; static int counter; /* How many gems I've just put here */ static int counter_d; /* Element of the array that contains the domain */ static int counter_m; /* Counter for the message array */ static string place; /* The domain room to visit */ static mixed *domains; /* Array info of domain room, gem types */ static string *gems; /* Want to take the gems out we know what they were */ void trans_all_to_domain(); void messages(); void reset(status arg) { if(arg) return; gems = ({}); domains = ({ ({ ({"room/void",}), ({"amethist",}),}), ({ ({"d/oplanes/astral/astral1",}), ({"ruby","diamond","saphire",}),}), }); set_weather(5,1,0); custom_exits = ""; set_items(({ "dust", "There is a fair amount of dust and dirt on the pannel.\n"+ "The dust on the runes, however, has been removed, as if\n"+ "they have been regularly cleaned by tracing their patterns", "chair", "The chair is molded into the small chamber here inside the "+ "the large elipsoid gem", "gems#gem", "The gems are in rows from the left to the right hand \n"+ "side of the front of the inside of this small chamber.\n"+ "In the centre of the pannel there are holes where you \n"+ "assume three gems should go, but must be missing", "portal", "There is an openning in the side of the gem, large enough for \n"+ "one person to fit inside. Perhaps you could enter the gem?", "hole#holes#pannel", "The holes in the pannel are big enough to place a regular sized "+ "gem inside", "rune#runes", "The runes are no doubt runes of great power, containing the \n"+ "life force of what ever creature is inside this large gem. \n"+ "There is a fair amount of dust and dirt on the pannel, but \n"+ "the runes themselves have been recently traced to remove it", })); set_listen("The rythmic sounds of the gem resemble a heart beating...\n"); set_smell("There is a strange smell in the air here. Perhaps it is magic?\n"); set_name("phylateracy"); enable_commands(); } /* The array of message1 and message 2 should be equal in their size */ void messages() { string *message1, *message2; string tmp; message1 = ({ "The gems in the pannel glow..and then vanish!\n", "The whole phylateracy begins to emit a soft glow.\n", "The phylateracy glows more brightly...\n", "There is a tremendous flash of light...\n", "The suroundings outside the phylateracy appear to have changed.\n", }); message2 = ({ "The phylateracy begins to emit a soft glow.\n", "The phylateracy hums a low static hum...\n", "The phylateracy glows more brightly...\n", "There is a tremendous flash of light, and the phylateracy vanishes!\n", "The phylateracy appears again with a flash of light.\n", }); tell_room(this_object(), message1[counter_m]); tell_room(environment(), message2[counter_m]); counter_m ++; if(counter_m >= sizeof(message1)) { trans_all_to_domain(); remove_call_out("messages"); return; } call_out("messages", 2); } void long(status wiz) { if(present(this_player(), this_object())) { write( "Inside this small chamber is a molded chair sitting before an \n"+ "array of gems of varied colours, and runes of great power. Inside \n"+ "the lights pulsate, as if the very chamber is alive with some \n"+ "driving force of energy. Perhaps you might be able to leave the gem?\n"); } else { write( "The huge elipsoid gem is a strange deep blue in colour, and contains \n"+ "several powerful runes of magic along its side. Perhaps you could \n"+ "enter the huge gem?\n"); } } void extra_long(status wiz) { string tmp1, tmp2; sscanf(lower_case((string)environment()->short()),"%sa%s",tmp1,tmp2); sscanf(lower_case((string)environment()->short()), "%sthe%s",tmp1,tmp2); if(!tmp2) tmp2 = lower_case((string)environment()->short()); write( "In the centre of the \n"+ "\b"+tmp2+" is a smooth elipsoid\n"+ "gem of incredible dimensions. Along each side is a portal, large \n"+ "enough for a single person to fit inside the bulk of the gem. \n"); } void init() { ::init(); add_action("read_it", "read" ); add_action("put_gem", "put" ); add_action("put_gem", "place" ); add_action("get_gem", "get" ); add_action("get_gem", "take" ); add_action("trace_runes", "trace" ); add_action("enter", "enter" ); add_action("leave", "leave" ); add_action("look_here", "look" ); add_action("look_here", "exa" ); add_action("look_here", "examine"); add_action("look_here", "l" ); } status read_it(string str) { if(str == "runes" && present(this_player(), this_object())) { if(this_player()->query_class("mage")) { write( "The runes seem to be similar to those found in the writings of a \n"+ "time-reaver spell, but amoung them are also runes of teleportation.\n"+ "Other runes about the interior and exterior of the gem indicate some\n"+ "sort of life trapping spell has been cast upon it. Perhaps you are \n"+ "actually inside some sort of soul-object or phylateracy?\n"); say((string)this_player()->query_name()+" reads the runes around "+ "the gem.\n"); return 1; } else if(this_player()->query_class("cleric")) { write( "The runes on the pannel about them gems are unfamiliar to you, but those \n"+ "around the sides and interior are reminiscent of a life trapping spell of\n"+ "some sort. Perhaps you are actually inside some sort of soul-object or \n"+ "perhaps a large phylateracy?\n"); say((string)this_player()->query_name()+" reads the runes around the "+ "inside of the gem.\n"); return 1; } else { write("The runes don't make any sense to you at all.\n"); say((string)this_player()->query_name()+" looks confused as "+ this_player()->query_pronoun()+" reads the runes in the gem.\n"); return 1; } } return 0; } status look_here(string str) { string tmp1, tmp2; string *words; words = ({ "gems", "pannel", "holes", "hole", }); if(!str) return 0; sscanf(str, "at %s", tmp1); if((member_array(tmp1, words) != -1 || member_array(str, words) != -1) && counter) { if(counter == 1) write("There is 1 gem already placed in the first of the three holes.\n"); else write("There are "+counter+" gems already placed in the holes.\n"+ "You think that perhaps a "+domains[counter_d][1][counter]+ " might go in the next hole.\n"); return 1; } if(str == "runes" && !present(this_player(),this_object())) { write("The runes appear to be magical. You would have to \n"+ "enter the gem in order to read them more easily \n"); return 1; } if(str == "portal" && !present(this_player(),this_object())) { write("The portal is an openning in the side of the gem, large \n"+ "for a single person to fit through, and enter the gem. \n"); return 1; } return 0; } /*************************************************************************** * Incase the player puts in the wrong gem, then he is able to get them all * out and start again. Or, if he is just experimenting, then he is able to * remove the gems when he has finished. */ status get(string what) { return 0; } /* can't get this ! */ status get_gem(string str) { string what, where; object obj; int i; sscanf(str, "%s from %s", what, where); if(where != "hole") { notify_fail("Get what from where?\n"); return 0; } if((str == "gem" || str == "gems" || member_array(str, gems) != -1) && !present(this_player(),this_object())) return 0; if(!sizeof(gems)) { notify_fail("There are no gems in the holes!\n"); return 0; } write("You manage to pry the gems from their holes.\n"); say((string)this_player()->query_name()+" prys the gems from their "+ "holes.\n",this_player()); for(i=0; i<sizeof(gems); i++) { obj = clone_object("inherit/treasure"); obj -> set_name(gems[i]); obj -> set_alias(gems[i]); obj -> set_short("A "+gems[i]); obj -> set_long("The "+gems[i]+" seems to have lost its shine.\n"); obj -> set_value(10 + random(20)); if(!this_player()->add_weight()) { write("You can't seem to carry the "+gems[i]+".\n"+ "It falls from your hands to the ground.\n"); move_object(obj, environment(this_player())); } else { write("You take the "+gems[i]+" from the hole in the pannel.\n"); move_object(obj, this_player()); say((string)this_player()->query_name()+" gets a "+gems[i]+" from "+ "the front pannel.\n",this_player()); } } gems = ({}); counter_d = 0; counter = 0; return 1; } /**************************************************************************** * This enables the player to adventure for gems, insert them to activate * (or bribe) the phylateracy to taking him somewhere. The destination * matches the array of gems in the *domains array. The domains array must * each be unique with its #1 element so there is no confusion with the * destination the player wishes to go. Note that the phylateracy is still * unique to magic, while not being obviously modern of scientific. Players * are encouraged to venture into the library to find out why/how this thing * works. */ status put_gem(string str) { string what, where; string temp; status flag; object obj; int i; if(counter >= 3) { notify_fail("There are no more holes to place the gems in.\n"+ "Your attention turns to the runes beside them.\n"); return 0; } sscanf(str, "%s in %s", what, where); if(where != "hole") { notify_fail("Put where in where?\n"); return 0; } if(!what) return 0; obj = present(what, this_player()); if(!obj) { notify_fail("But you don't have a "+what+"!\n"); return 0; } write("You try to put the gem in the hole in the pannel.\n"); say((string)this_player()->query_name()+" tries to put a gem in "+ "the pannel.\n", this_player()); /* Match str with first element of each array to find domain sequence */ if(!counter) { for(i=0; i<sizeof(domains); i++) { if((string)obj->query_name() == domains[i][1][counter]) { flag = 1; counter_d = i; /* the element which contains the current domain */ place = domains[counter_d][0][0]; counter ++; } } } else { if((string)obj->query_name() == domains[counter_d][1][counter]) { flag = 1; counter ++; } } if(flag) { gems += ({ (string)obj->query_name(), }); temp = implode(gems, ","); write("The gem seems to fit perfectly, and becomes wedged inside"+ " the hole.\n"); if(counter < sizeof(domains[counter_d][1])) write("It looks like a "+domains[counter_d][1][counter]+" might "+ "fit in the next hole.\n"); else write("All the holes are now full. Your attention turns to the runes.\n"); destruct(obj); flag = 0; return 1; } else { write("The gem does not seem to fit into the hole.\n"+ "It looks like a "+domains[counter_d][1][counter]+" might "+ "fit in the hole.\n"); say((string)this_player()->query_name()+"'s gem does not seem to fit "+ "into the pannel.\n",this_player()); return 1; } return 0; } /* Take us to the domain, now that all the gems have been put inside */ status trace_runes(string str) { int i; string place; if(str != "runes" && str != "patterns") { notify_fail("Trace what?\n"); return 0; } write("You trace the runes on the pannel.\n"); say((string)this_player()->query_name()+" traces the runes on "+ "the pannel.\n",this_player()); if(counter < sizeof(domains[counter_d][1])) { notify_fail("Nothing happens. Perhaps you require more gems?