#include <type.h> static object monster; static mapping events; static object compile_object( string path ) { if( strlen(path) > 2 ) { if( path[strlen(path)-2] == '.' && path[strlen(path)-1] == 'c' ) path = path[..strlen(path)-3]; } return ::compile_object( path ); } static object clone_object( string path ) { object ob; if( strlen(path) > 2 ) { if( path[strlen(path)-2] == '.' && path[strlen(path)-1] == 'c' ) path = path[..strlen(path)-3]; } if( ob = find_object( path ) ) return ::clone_object( ob ); else return ::clone_object( compile_object( path ) ); } static set_this_player( object ob ) { monster = ob; } static object this_player( void ) { if( this_user() == 0 ) { if( monster == 0 ) return( previous_object() ); else return( monster ); } if( this_user()->query_player()->is_possessing() ) return( this_user()->query_player()->query_possessing() ); return( this_user()->query_player() ); } static object this_body( void ) { if( this_user() == 0 ) { if( monster == 0 ) return( previous_object() ); else return( monster ); } if( this_user()->query_player()->is_possessing() ) return( this_user()->query_player()->query_possessing() ); return( this_user()->query_player() ); } static object this_race( void ) { if( this_user() == 0 ) { if( monster == 0 ) return( previous_object() ); else return( monster ); } if( this_user()->query_player()->is_possessing() ) return( this_user()->query_player()->query_possessing()->query_race_object() ); return( this_body()->query_race_object() ); } object this_environment( void ) { return( this_player()->query_environment() ); } nomask int file_exists (string str) { mixed *val; int *sizes; val = get_dir( str ); sizes = val[1]; if( !sizes || sizeof( sizes ) == 0 ) return 0; if( sizes[0] == -2 ) return -1; return 1; } int absolute_path( string dir ) { if( dir == "" ) return( 0 ); if( dir[0] == '/' || dir[0] == '~' ) return( 1 ); return( 0 ); } void out_unmod( string str ) { if( this_user() == 0 ) return; this_user()->put_original( str ); if( this_player()->is_snooped() ) this_player()->do_snoop( str ); } void out( string str ) { if( this_user() == 0 ) return; this_player()->message_orig( str ); /* this_user()->put_message( str ); */ if( this_player()->is_snooped() ) this_player()->do_snoop( str ); } void write( string str ) { if( this_user() == 0 ) return; this_player()->message( str ); if( this_player()->is_snooped() ) this_player()->do_snoop( str ); } string capitalize(string str) { if (!str) return str ; if (str[0] >= 'a' && str[0] <= 'z') { str[0] -= 'a' - 'A'; } return str; } string lowercase(string str) { int i ; for (i=0;i<strlen(str);i++) { if (str[i]>='A' && str[i]<='Z') str[i] += 'a' - 'A' ; } return str ; } string uppercase(string str) { int i ; for (i=0;i<strlen(str);i++) { if (str[i]>='a' && str[i]<='z') str[i] -= 'a' - 'A' ; } return str ; } string article( string name ) { if( lowercase( name ) == "hour" ) return( "an" ); switch( name[0] ) { case 'a': case 'e': case 'i': case 'o': case 'u': return( "an" ); default: return( "a" ); } } string format_idle_time( int time ) { int mins; int hrs; int days; string str; mins = time / 60; time = time - (mins * 60); hrs = mins / 60; mins = mins - (hrs * 60); days = hrs / 24; hrs = hrs - ( days * 24 ); str = ""; if( time > 0 ) str = " " + time + "s"; if( mins > 0 ) str = " " + mins + "m"; if( hrs > 0 ) str = " " + hrs + "h"; if( days > 0 ) str = " " + days + "d"; return str; } string format_time( int time ) { int mins; int hrs; int days; string str; mins = time / 60; time = time - (mins * 60); hrs = mins / 60; mins = mins - (hrs * 60); days = hrs / 24; hrs = hrs - ( days * 24 ); str = ""; if( days > 0 ) str += " " + days + "d"; if( hrs > 0 ) str += " " + hrs + "h"; if( mins > 0 ) str += " " + mins + "m"; if( time > 0 ) str += " " + time + "s"; return str; } int member_array( mixed item, mixed *arr ) { int i; for( i=0; i < sizeof( arr ); i++ ) { if( arr[i] == item ) return( i ); } return( -1 ); } int member_map( mixed item, mapping map ) { mixed *arr; arr = map_indices( map ); if( member_array( item, arr ) > -1 ) return( 1 ); arr = map_values( map ); if( member_array( item, arr ) > -1 ) return( 1 ); return( 0 ); } int cat_file( string filename ) { int i; string *lines; i = file_exists( filename ); if( i == 0 ) { write( "No such file.\n" ); return( 0 ); } if( i == -1 ) { write ( "Unable to cat directories.\n" ); return( 0 ); } lines = explode( read_file( filename ), "\n" ); for( i = 0; i < sizeof( lines ); i++ ) { send_message( lines[i] + "\n" ); } return( 1 ); } /* * NAME: dump_value() * DESCRIPTION: return a string describing a value */ static string dump_value(mixed value, mapping seen) { string str; int i, sz; mixed *indices, *values; switch (typeof(value)) { case T_INT: case T_FLOAT: return (string) value; case T_STRING: str = value; if (sscanf(str, "%*s\\") != 0) { str = implode(explode("\\" + str + "\\", "\\"), "\\\\"); } if (sscanf(str, "%*s\"") != 0) { str = implode(explode("\"" + str + "\"", "\""), "\\\""); } if (sscanf(str, "%*s\n") != 0) { str = implode(explode("\n" + str + "\n", "\n"), "\\n"); } if (sscanf(str, "%*s\t") != 0) { str = implode(explode("\t" + str + "\t", "\t"), "\\t"); } return "\"" + str + "\""; case T_OBJECT: return "<" + object_name(value) + ">"; case T_ARRAY: if (seen[value]) { return "#" + (seen[value] - 1); } seen[value] = map_sizeof(seen) + 1; sz = sizeof(value); if (sz == 0) { return "({ })"; } str = "({ "; for (i = 0, --sz; i < sz; i++) { str += dump_value(value[i], seen) + ", "; } return str + dump_value(value[i], seen) + " })"; case T_MAPPING: if (seen[value]) { return "@" + (seen[value] - 1); } seen[value] = map_sizeof(seen) + 1; sz = map_sizeof(value); if (sz == 0) { return "([ ])"; } str = "([ "; indices = map_indices(value); values = map_values(value); for (i = 0, --sz; i < sz; i++) { str += dump_value(indices[i], seen) + ":" + dump_value(values[i], seen) + ", "; } return str + dump_value(indices[i], seen) + ":" + dump_value(values[i], seen) + " ])"; } } string wiz_dir( object ob ) { return( "/wiz/" + ob->query_name() + "/" ); } /* * NAME: normalize_path() * DESCRIPTION: reduce a path to its minimal absolute form */ string normalize_path(string file, string dir) { string *path; int i, j, sz; if (strlen(file) == 0) { file = dir; } switch (file[0]) { case '~': /* ~path */ if(strlen(file) == 1 || file[1] == '/') { file = "/wiz/" + this_user()->query_name() + file[1 ..]; } else { file = "/wiz/" + file[1 ..]; } /* fall through */ case '/': /* absolute path */ path = explode(file, "/"); if( (path[0] == "data" || path[0] == "kernel") && SECURE_D->query_admin( this_user()->query_name() ) == 0 ) return(""); if (sscanf(file, "%*s//") == 0 && sscanf(file, "%*s/.") == 0) { return file; /* no changes */ } break; default: /* relative path */ if (sscanf(file, "%*s//") == 0 && sscanf(file, "%*s/.") == 0 && sscanf(dir, "%*s/..") == 0) { /* * simple relative path */ if( dir[strlen(dir)-1] == '/' ) path = explode( dir + file, "/" ); else path = explode( dir + "/" + file, "/" ); if( (path[0] == "data" || path[0] == "kernel") && SECURE_D->query_admin( this_user()->query_name() ) == 0 ) return(""); if( dir[strlen(dir)-1] == '/' ) return dir + file; else return dir + "/" + file; } /* fall through */ case '.': /* * complex relative path */ path = explode(dir + "/" + file, "/"); break; } for (i = 0, j = -1, sz = sizeof(path); i < sz; i++) { switch (path[i]) { case "..": if (j >= 0) { --j; } /* fall through */ case "": case ".": continue; } path[++j] = path[i]; } if( (path[0] == "data" || path[0] == "kernel") && SECURE_D->query_admin( this_user()->query_name() ) == 0 ) { return ""; } return "/" + implode(path[.. j], "/"); } /* * NAME: dir_size() * DESCRIPTION: get the size of all files in a directory */ private int dir_size(string file) { mixed **info; int *sizes, size, i, sz; info = get_dir(file + "/*"); sizes = info[1]; size = 1; /* 1K for directory itself */ i = sizeof(sizes); while (--i >= 0) { sz = sizes[i]; size += (sz > 0) ? (sz + 1023) >> 10 : (sz == 0) ? 1 : dir_size(file + "/" + info[0][i]); } return size; } /* * NAME: file_size() * DESCRIPTION: get the size of a file in K, or 0 if the file doesn't exist */ varargs int file_size(string file, int dir) { mixed **info; string *files, name; int i, sz; if (file == "/") { file = "."; } info = get_dir(file); files = explode(file, "/"); name = files[sizeof(files) - 1]; files = info[0]; i = 0; sz = sizeof(files); if (sz <= 1) { if (sz == 0 || files[0] != name) { return 0; /* file does not exist */ } } else { /* name is a pattern: find in file list */ while (name != files[i]) { if (++i == sz) { return 0; /* file does not exist */ } } } i = info[1][i]; return (i > 0) ? i : (i == 0) ? 1 : (i == -2 && dir) ? dir_size(file) : 0; } string base_name( void ) { string str,obname; int clone; obname = object_name(this_object()); if( sscanf( obname, "%s#%d", str, clone ) ==2 ) return str; return obname; } string file_name() { return( base_name() + ".c" ); } int clone_num() { string str ; int clone ; if (sscanf(object_name(this_object()),"%s#%d",str,clone)==2) { return clone ; } return 0 ; } void add_event( string name ) { if( events == 0 ) events = ([ ]); events[name] = ({ }); } void remove_event( string name ) { events[name] = 0; } void subscribe_event( string name ) { events[name] += ({ previous_object() }); } void unsubscribe_event( string name ) { events[name] -= ({ previous_object() }); } varargs void event( string name, mixed args... ) { object *obs; int i; obs = events[name]; for( i = 0; i < sizeof( obs ); i++ ) { if( obs[i] != 0 ) call_other( obs[i], "event_" + name, args ); } } int str2val( string str ) { int ten; int val; int i; val = 0; ten = 1; for( i = strlen( str )-1; i >= 0; i-- ) { if( str[i] >= '0' && str[i] <= '9' ) { val += ( str[i] - '0' ) * ten; ten = ten * 10; } else { return( -1 ); } } return( val ); } int intp( mixed val ) { if( typeof( val ) == T_INT ) return( 1 ); return( 0 ); } int floatp( mixed val ) { if( typeof( val ) == T_FLOAT ) return( 1 ); return( 0 ); } int arrayp( mixed val ) { if( typeof( val ) == T_ARRAY ) return( 1 ); return( 0 ); } int mappingp( mixed val ) { if( typeof( val ) == T_MAPPING ) return( 1 ); return( 0 ); } int stringp( mixed val ) { if( typeof( val ) == T_STRING ) return( 1 ); return( 0 ); } int strstr( string search, string what ) { int i; for( i = 0; i < (strlen( search ) - ( strlen( what ) - 1 )); i++ ) { if( search[i..(i+strlen(what)-1)] == what ) return i; } return( -1 ); } string replace_string( string str, string old, string new ) { int i; int olen; int slen; string done; int d; olen = strlen( old ); slen = strlen( str ); d = 0; done = ""; for( i=0; i < slen; i++ ) { if( slen > i + olen -1 ) { /* Still not reached the end of the string */ if( str[i..(i+olen-1)] == old ) { /*Found an occurance of the old string*/ done += new; d += strlen( new ); i += olen-1; } else { done += " "; done[d] = str[i]; d++; } } else { done += str[i..]; return( done ); } } return( done ); } string invert_exit( string exit ) { switch( exit ) { case "north": return( "south" ); case "south": return( "north" ); case "east": return( "west" ); case "west": return( "east" ); case "northeast": return( "southwest" ); case "southeast": return( "northwest" ); case "northwest": return( "southeast" ); case "southwest": return( "northeast" ); } return( "unknown" ); }