/* Do not remove the headers from this file! see /USAGE for more info. */ // Modified by Uae. May 23rd 1997. // Functionality added to deal with renewable drink // sources like pools. If the source has "<fluid>_source" // in its id, it will be considered to be a source of // that fluid. Drink_it() here will call drink_from() in the // fluid source. private int drinks_per_unit = 2; private int drinks_current_unit; private int num_drinks = 2; private mixed taste_action = "Your thirst is quenched."; private mixed drink_action = "$N $vdrink some $o."; private mixed last_drink_action = "$N $vfinish off the $o."; object drink_source; // string the_short(); string query_primary_id(); int query_size(); void set_size( int x ); void set_quantity( int x ); void remove(); //:FUNCTION set_taste_action //set_taste_action( mixed x ) //Put this function in the drinkable //fluid. 'x' is evaluated when the //fluid is drunk. By default it is //a my_action, but it could be a //function or an array of mixed. //To have no taste action, pass a //zero. void set_taste_action( mixed x ){ taste_action = x; } mixed get_taste_action(){ return taste_action; } //:FUNCTION set_drink_action //set_drink_action( mixed x ) //Put this function in the drinkable //fluid. 'x' is evaluated when the //fluid is drunk. By default it is //a simple_action, but it could be a //function or an array of mixed. //To have no drink action, pass a //zero. void set_drink_action(mixed action) { drink_action = action; } //:FUNCTION set_last_drink_action //Just like set_drink_action, but only is used for the last drink. void set_last_drink_action(mixed action) { last_drink_action = action; } //:FUNCTION set_num_drinks //set_num_drinks( int x ) //This sets the number of drinks per 1 size-unit. //The default is 3; void set_num_drinks(int x) { drinks_per_unit = x; } //Not necessary, but kept for possible special effects. //Actually, this doesn't appear to be used at all. void set_drink_source( string source ){ drink_source = load_object(source); } int calculate_num_drinks(){ num_drinks = query_size() * drinks_per_unit + drinks_current_unit; return num_drinks; } void reduce_drink_number(){ drinks_current_unit --; if (!drinks_current_unit) { drinks_current_unit = drinks_per_unit; set_size( query_size() - 1 ); set_quantity( query_size() ); }; calculate_num_drinks(); if ( !num_drinks ) remove(); } void drink_it(){// This is called by the verb. mixed action; object source; // Are we in the presence of the source? source = present( query_primary_id() + "_source" ); if ( source ) if ( source -> id( "drink_source" ) ) { source -> drink_from_it() ; return;} if ( num_drinks == 1 && last_drink_action) action = last_drink_action; else action = drink_action; if (arrayp( action ) ) action = choice( action ); if (functionp(action)) evaluate(action); else this_body() -> simple_action(action, this_object() ); if (taste_action && num_drinks != 1) { action = taste_action; if (arrayp( action ) ) action = choice( action ); if (functionp(action) ) evaluate(action); else this_body() -> my_action( action, this_object() ); }; reduce_drink_number(); } //:FUNCTION query_num_drinks // returns the number of drinks left in the drink. int query_num_drinks(){ calculate_num_drinks(); return num_drinks; } mixed direct_drink_obj() { if (environment(this_object()) == environment( this_body() ) ) return 0; if (environment(environment(this_object())) != this_body() ) return 0; calculate_num_drinks(); if (!num_drinks) return capitalize(the_short()) + " is gone.\n"; return 1; } mixed direct_drink_obj_from_obj(){ return direct_drink_obj(); }