/** * This class keepos track of all the aliases, names and adjectives * which are used to match the object. * @see /global/player->add_command() * @see /std/basic/desc.c */ #include <parse_command.h> inherit "/std/basic/id_match"; private nosave string _name; private nosave string *_alias; private nosave string *_adjectives; private nosave string *_plurals; /* name handleing stuff */ /** * This method sets the name of the object. The name is the basic handle * used to reference the object. It should not have any spaces * in it. * @example * set_name("rabbit"); * @param str the name * @see query_name() * @see add_alias() * @see add_adjective() */ void set_name(string str) { _name = str; } /** * This method returns the name of the object. * @return the name of the object * @see set_name() * @see add_alias() * @see add_adjective() */ string query_name() { return _name; } /** * This method returns the capitalized name. It calls the function * capitalize() on the name * @see query_name() * @see set_name() * @see efun::capitalize() */ string query_cap_name() { return ( !_name ? "Someone" : CAP(_name) ); } /* query_cap_name() */ void create() { _alias = ({ }); _plurals = ({ }); _adjectives = ({ }); _name = "object"; } /* create() */ /* alias stuff */ /** * This method sets the entire alias array. It overrides any current alias * definitions and sets the alias arry. This should be used carefully * if at all. Use add_alias instead. * @param str the new alias array */ void set_aliases(string *str) { _alias = str; } /* set_aliases() */ /** * This method adds an alias to the object. An alias for the object is the * part used as the main noun for the object. ie in the case of a "green * bath tub", "bathtub" might be an alias for the object. and "green" * and "bath" would be adjectives. The value set with add_alias is also * used with present. This means you can make up an alias for an object * that players cannot normaly access but you can * get a handle on with present. For an exmple of this look at the money * object. * <p> * The function takes an array or a string as an argument. If an array * is passed in each element of the array is added to the alias * array, if it is a string then the string elemnt is added to the * array. * @param str the alias(s) to add * @see set_name() * @see remove_alias() * @see set_aliases() * @see query_alias() * @example * set_name("tub"); * set_short("green bath tub"); * add_alias("bathtub"); * add_adjective("green"); * add_adjective("bath"); */ void add_alias( mixed str ) { string tmp; if( pointerp( str ) ) { foreach( tmp in str ) add_alias( tmp ); } else if( member_array( str, _alias ) == -1 ) _alias += ({ str }); } /* add_alias() */ /** * This method removes an alias from the object. * @see add_alias() * @see query_alias() * @param str the alias to remove * @return 1 if the alias is found, 0 if not */ int remove_alias(string str) { int i; if( ( i = member_array(str, _alias) ) == -1 ) return 0; _alias = delete( _alias, i, 1 ); return 1; } /* remove_alias() */ /** * This method returns the current list of aliases. * @see add_alias() * @see remove_alias() * @return the array of aliases (array of strings) */ string *query_alias() { return _alias; } /** * This method is used by the present efun. It determines if the * passed in string is an alias or the name of the object. * @param str the value to check * @return 1 if the name matches */ int id( string str ) { if( !pointerp(_alias) ) _alias = ({ }); return ( str == _name ) || ( member_array( str, _alias ) != -1 ); } /* id() */ /** * This method sets the compete array of plurals. This shod * not be used, use add_plural and remove_plural instead. * @see add_plural() * @see remove_plural() * @see query_plurals() */ void set_plurals(string *str) { _plurals = str; } /* set_plurals() */ /** * This method adds a plural onto the object. The plurals will be * used in plural name matching by thje find_match simul_efun * @see /secure/simul_efun->find_match() * @see set_plurals() * @see remove_plural() * @see query_plurals() * @see add_plurals() */ void add_plural( mixed str ) { string tmp; if( pointerp( str ) ) { foreach( tmp in str ) add_plural( tmp ); } else if( member_array( str, _plurals ) == -1 ) _plurals += ({ str }); } /* add_plural() */ /** * This method removes a plural from the object. * @param str the plural to remove * @see add_plural() * @see query_plurals() * @see set_plurals() */ void remove_plural(string str) { int i; if( ( i = member_array( str, _plurals ) ) != -1 ) _plurals = delete( _plurals, i, 1 ); } /* remove_plurals() */ /** * This method adds multiple plurals to the object. * @param str the array of plurals to add * @see add_plural() * @see remove_plural() * @see query_plurals() */ void add_plurals( string *str ) { string tmp; foreach( tmp in str ) add_plural( tmp ); } /* add_plurals() */ /** * This method returns the complete list of plurals for the * object. * @return the complete array of plurals */ string *query_plurals() { return _plurals; } /** * This method is similar to the id function, except this will check the * plural names instead of the aliases and the name. * @param str the name to check * @return 1 if the name matches one of the plurals, 0 otherwise * @see id() * @see id_adjective() */ int id_plural(string str) { return ( member_array( str, _plurals ) != -1 ); } /* id_plural() */ /** * This method sets all the adjectives for the object. This method * should not be used, please use add_adjective instead. * @see add_adjective() * @see remove_adjective() * @see query_adjectives() * @param str the array of adjectives */ void set_adjectives(string *str) { _adjectives = str; } /* set_adjectives() */ /** * This method adds an adjective to the object. The adjectives are used for the * object matching routines. Fort example, if you have a "green * bath tun" then "green" and "bath" are adjectives. * @see add_alias() * @see remove_adjective() * @see query_adjectives() * @see set_adjectives() */ void add_adjective( mixed str ) { string tmp; if( pointerp(str) ) { foreach( tmp in str ) add_adjective( tmp ); return; } if( stringp(str) ) str = explode( str, " " ); foreach( tmp in str ) if( member_array( tmp, _adjectives ) == -1 ) _adjectives += ({ tmp }); } /* add_adjective() */ /** * This method will remove an adjective from the object. * @see add_alias() * @see add_adjective() * @see query_adjectives() * @param str the adective(s) to remove */ void remove_adjective(mixed str) { string tmp; int i; if( pointerp(str) ) { foreach( tmp in str ) remove_adjective( tmp ); } else if( ( i = member_array( str, _adjectives ) ) != -1 ) { _adjectives = delete( _adjectives, i, 1 ); } } /* remove_adjective() */ /** * This method returns the current list of adjectives associated with * this object. * @return the complete list of adjectives */ string *query_adjectives() { return _adjectives; } /** * This method is similar to the id function, except this will check the * adjectives instead of the aliases and the name. * @param word the word to check * @return 1 if the word matches one of the adjectives, 0 otherwise * @see id() * @see id_plural() */ int id_adjective( string word ) { return ( member_array( word, _adjectives ) != -1 ); } /* id_adjective() */ /** @ignore yes */ string *parse_command_id_list() { return ({ _name, file_name(TO) }) + query_alias(); } /* parse_command_id_list() */ /** @ignore yes */ string *parse_command_plural_id_list() { return query_plurals(); } /** @ignore yes */ string *parse_command_adjectiv_id_list() { return query_adjectives(); } /** @ignore yes */ object query_parse_id( mixed *arr ) { if( arr[P_THING] == 0 ) return TO; if( arr[P_THING] < 0 ) { /* specific object case */ arr[P_THING]++; if( arr[P_THING] != 0 ) return 0; arr[P_THING] = -10321; return TO; } arr[P_THING]--; /* lots of objects case */ if( arr[P_THING] != 0 ) return TO; arr[P_THING] = -10101; return TO; } /* query_parse_id() */ /** @ignore yes */ object query_frac_parse_id( mixed *arr ) { if( arr[P_THING] < 0 ) { arr[P_THING]++; if( arr[P_THING] != 0 ) return 0; arr[P_THING] = -10235; return 0; /* it refered to me and I am pretty depressed about it. * I want to break free! */ } if( arr[P_THING] == 0 ) { if( ( arr[P_MAX_NUM]*arr[P_TOP])/arr[P_BOT] > arr[P_CUR_NUM]++ ) return TO; else return 0; } if( ( arr[P_THING]*arr[P_TOP])/arr[P_BOT] > arr[P_CUR_NUM]++ ) return TO; return 0; } /* query_frac_parse_id() */