inherit "/obj/clothing"; //defines various locations taliswoman will go to #include "/d/guilds/witches/include/taliswoman.h" /* start of function prototypes */ void setup(); void init(); void high_level(); void set_destination(string city); int go_granny( string *args ); /* end of function prototypes */ //Global Variables nosave mapping _city_destinations = ([ "default" : AM, "klk" : KLK, "stolat" : STO_LAT, // "stohelit" : STO_HELIT // "genua" : GENUA ]); nosave private string set_destination; string _city; void setup() { set_name( "taliswoman" ); add_alias( ({ "stone", "ass", "thong" }) ); set_short( "taliswoman" ); add_adjective( ({ "small", "surly", "ass", "smooth", "leather", "thin", "witches'", "witches", "guild", "stone" }) ); add_property( "talisman", "no one" ); add_property( "no recycling", 1 ); set_main_plural( "taliswomen" ); set_long( "This small stone shaped like a small and surly ass has been " "worn smooth by frequent handling. A thin, leather thong has been " "threaded through its hole. " ); add_extra_look( this_object() ); set_value(1); set_weight(2); set_type( "necklace" ); set_max_cond( 70 ); set_cond( 70 ); init_dynamic_arg(query_dynamic_auto_load()); } /* setup() */ string extra_look() { if( this_player()->query_name() != query_property( "talisman" ) ) { return "\n"; } return "This taliswoman will get you to the Witches Guild to see Granny " "Weatherwax if you rub the tail of the ass, and back to " "Ankh-Morpork if you rub its head. You can only use it once in " "each direction, but you can get a new one from Gennie if you " "haven't outgrown them.\n"; } /* extra_look() */ void init() { add_command( "rub" , "{head|tail} of <direct:object'ass'>", (: go_granny( $4[0] ) :) ); } /* init() */ void high_level() { string gender; switch( this_player()->query_gender() ) { case 0: gender = "thing"; break; case 1: gender = "boy"; break; case 2: gender = "girl"; break; } add_failed_mess( "$D says \"You are a big " + gender + " now, so you'll " "have to manage without me. Good luck on your adventures!\"\n", ); set_worn_by(0); this_player()->remove_property( "given taliswoman" ); move( "/room/rubbish", "", "$N vanishes in a puff of smoke." ); } /* high_level() */ void set_destination( string city ) { _city = "city"; } /* set_destination() */ mapping query_dynamic_auto_load() { return ([ "::" : ::query_dynamic_auto_load(), "new_destination" : _city, ]); } /* int_query_static_auto_load() */ void init_dynamic_arg( mapping map, object ) { if (map["::"]) ::init_dynamic_arg(map["::"]); if (map[ "city" ] ]) _city = map["city"]; else { _city = "default"; } } /* init_dynamic_arg() */ int go_granny( string where ) { mixed destination; destination = _city; if( !query_property( "talisman" ) ) { add_failed_mess( "$D blinks rapidly and vanishes in a sudden fit " "of quantum insecurity.\n" ); set_worn_by(0); move( "/room/rubbish" ); return -1; } if( query_property( "talisman" ) != this_player()->query_name() ) { this_player()->add_failed_mess( this_object(), "$D isn't yours!\n" "It thumbs its metaphorical nose at you and refuses to do " "anything.\n" ); return -1; } if( where == "tail" ) { /* Gennie won't give you a taliswoman if you're above level 20, so if you've been sneaky and kept one, it shouldn't work. */ if( this_player()->query_level() > 20 ) { high_level(); return -1; } if( query_property( "been to bad ass" ) ) { add_failed_mess( "You have already used $D to travel to the " "witches once.\n" ); return -1; } if( file_name( environment( this_player() ) ) == destination ) { add_failed_mess( "But you are already here!\n" ); return -1; } add_succeeded_mess( ({ "$D starts to glow. The bright glow makes " "you blink and when you open your eyes, you're in a new place.\n", "$N $V $D.\n" }) ); if( this_player()->query_guild_ob() != "/std/guilds/witch" ) { call_out( (: tell_object( $(this_player()), "The taliswoman " "says: To the northwest, then north of here is the home of " "Granny Weatherwax. You need to speak with her about " "becoming a witch. To get into the cottage you will need " "the key to the back door; it's hidden in the privy. To get " "back to Ankh-Morpork, you can rub my head or catch the " "carriage in Bad Ass to the southeast of here. " "Good luck!\n" ) :), 2 ); add_property( "been to bad ass", 1 ); } } else { /* Gennie won't give you a taliswoman if you're above level 20, so if you've been sneaky and kept one, it shouldn't work. */ if( this_player()->query_level() > 20 ) { high_level(); return -1; } if( query_property( "been to city" ) ) { add_failed_mess( "You have already used $D to travel to the " "city once.\n" ); return -1; } if( file_name( environment( this_player() ) ) == destination ) { add_failed_mess( "But you are already here!\n" ); return -1; } add_succeeded_mess( ({ "$D starts to glow. The bright glow makes " "you blink and when you open your eyes, you're in a new place.\n", "$N $V $D.\n" }) ); add_property( "been to city", 1 ); } call_out( (: $(this_player())->move_with_look( $(destination), "You notice a glimmering light to the side of the road. As you " "watch, the light begins to take the shape of $N as she " "arrives from somewhere else.", "A bright light surrounds $N. It dims suddenly, then " "vanishes. It seems to have taken $N with it." ) :), 0 ); if( query_property( "been to bad ass" ) && query_property( "been to city" ) ) { call_out( (: tell_object( $(this_player()), the_short() + " says: You have now used me to travel once in each direction, " "so our ways part here. If you need me again, just go see " "Gennie.\n" ) :), 1 ); // so she can get another without waiting 30 minutes... this_player()->remove_property( "given taliswoman" ); call_out( (: set_worn_by(0), move( "/room/rubbish", "", "$N vanishes in a puff of smoke." ) :), 1 ); } return 1; } /* go_granny() */ varargs int add_property( string var, mixed val, int tim ) { if( var == "talisman" ) { if( query_property( "talisman" ) && query_property( "talisman" ) != "no one" ) { call_out( (: tell_object( $(environment()), "The taliswoman " "blinks rapidly and vanishes in a sudden fit of quantum " "insecurity.\n" ) :), 1 ); call_out( (: set_worn_by(0), move( "/room/rubbish" ) :), 1 ); } } return ::add_property( var, val, tim ); } /* add_property() */ string query_destination() { return _city; } /* query_destination() */