mud/lib/secure/sefun/to_object.c
2020-09-06 05:43:07 -07:00

124 lines
3.9 KiB
C

/* /secure/sefun/to_object.c
* from the Dead Souls.4 Library
* recreated by Blitz@Dead Souls
*
* Purpose: Parse passed string argument and
* return a matching object pointer
* if one is found.
*
* Usage Examples:
* sword (1st sword in inv or env)
* sword@here (find sword in local env)
* sword#4 (find 4th sword)
* sword#2@foo (find 2nd sword on player foo)
* sword@bag#2@foo (find 1st sword in foo's 2nd bag)
* ---------------
* /path/filename (find or load filename)
* /path/file#999 (find unique cloned object)
* %foo (explicitly find player foo)
* $foo (explicitly find npc foo)
* @foo (return foo's environment)
*
* tokens: me, here, sefun
*/
#include <global.h>
object to_object(mixed var) {
object env, ob, *obs;
string tmp, where;
int i, char;
if( objectp(var) ) return var;
else if( !stringp(var) || !sizeof(var) ) return 0;
if( sscanf(var, "%s@%s", tmp, where) == 2 ) {
var = tmp;
if( !env = to_object(where) ) return 0;
if( !sizeof(var) ) return environment(env);
}
switch(var) {
case "here" : return environment(this_player());
case "me" : return this_player();
case "sefun" : return find_object(SEFUN);
}
if( sscanf(var, "%s#%d", tmp, i) == 2 ) {
if( ob = find_object(var) ) return ob;
else var = tmp;
}
else i = 1;
if( i < 1 ) return 0;
if( member_array(var[0], ({ '/', '$', '%', }) ) > -1 ) {
char = var[0];
var = var[1..];
}
switch( char ) {
case '/' :
if( var[<2..] != ".c" ) var += ".c";
if( !file_exists(var) ) return 0;
return load_object(var);
break;
case '%' :
if( !(ob = find_player(var)) ) return 0;
else return ob;
break;
case '$' :
if( env ) {
obs = filter(all_inventory(env),
(: living($1) && !interactive($1) && $1->id($(var)) :));
if( sizeof(obs) < i ) return 0;
else return obs[i - 1];
}
if( (ob = find_living(var)) && !interactive(ob) ) return ob;
else return 0;
break;
default:
if( !env ) {
env = this_player();
}
if( i > 1 ) {
obs = filter(all_inventory(env), (: $1->id($(var)) :));
if( sizeof(obs) < i ) {
if( !env = environment(env) ) {
ob = 0;
}
else {
obs = filter(all_inventory(env), (: $1->id($(var)) :));
if( sizeof(obs) < i ) {
ob = 0;
}
else {
ob = obs[i - 1];
}
}
}
else {
ob = obs[i-1];
}
if( ob ) {
return ob;
}
}
else {
ob = present(var, env);
if( ob ) return ob;
else if( env = environment(env) ) {
ob = present(var, env);
if( ob ) return ob;
}
if( ob = find_player(var) ) return ob;
if( ob = find_living(var) ) return ob;
if( !this_player() ) {
return 0;
}
var = absolute_path(this_player()->query_cwd(), var);
if(!file_exists(var)) var += ".c";
if(!file_exists(var)) var = "";
if( sizeof(var) && ob = load_object(var) ) {
return ob;
}
}
return 0;
}
return 0;
}