/* -*- LPC -*- */
/*
* $locker: shrike $
* $Id: scabbard.c,v 1.19 2003/04/23 10:03:31 runtime Exp $
*/
#include <move_failures.h>
#include <virtual.h>
inherit "/std/container";
inherit "/std/basic/wearable";
string sheath;
string * types;
int _no_types_in_long;
/** @ignore yes */
void create() {
do_setup++;
container::create();
wearable::create();
do_setup--;
sheath = "";
types = ({ });
_no_types_in_long = 0;
add_alias( "scabbard" );
add_plural( "scabbards" );
if ( !query_property( "shop type" ) )
add_property( "shop type", "armoury" );
if ( !do_setup )
this_object()->setup();
} /* create() */
/**
* This method determines if the object is a scabbard or not.
* @return always returns 1 for a scabbard
*/
int query_scabbard() { return 1; }
/**
* This method returns the types of weapons that can be sheathed in the
* scabbard.
* @return the types that can be sheathed
*/
string *query_types() { return types; }
/**
* This method sets the types of weapons that can be sheathed in the
* scabbard.
* @param words the array of types that can be sheathed
*/
void set_types( string *words ) {
types = words;
switch ( sizeof( types ) ) {
case 0 :
sheath = "";
return;
case 1 :
sheath = "It could sheathe "+ add_a( types[ 0 ] ) +".\n";
return;
case 2 :
sheath = "It could sheathe "+ add_a( types[ 0 ] ) +" or "+
types[ 1 ] +".\n";
return;
default :
sheath = "It could sheathe "+ add_a( types[ 0 ] ) +", "+
implode( types[ 2 .. ], ", " ) +" or "+ types[ 1 ] +
".\n";
}
} /* set_types() */
int test_type_ok( object thing, int flag ) {
foreach( string word in types ) {
if( thing->full_id( word ) )
return ::test_add( thing, flag );
}
return 0;
} /* test_type_ok() */
/** @ignore yes */
varargs int test_add( object thing, int flag, int noprint ) {
int foo;
if(flag)
return 0;
if( !environment( thing ) )
return ::test_add( thing, flag );
if( first_inventory( this_object() ) ) {
if( !noprint )
write( the_short() + " already holds " +
first_inventory( this_object() )->a_short() + ".\n" );
return 0;
}
foo = test_type_ok( thing, flag );
if(foo)
return foo;
if( !noprint )
write( thing->the_short() + " doesn't fit very well in "
+ the_short() + ". " + sheath );
return 0;
} /* test_add() */
/** @ignore yes */
string long( string word, int dark ) {
string foo = _no_types_in_long ? "" : sheath;
if ( dark == 2 || dark == -2) {
return container::long( word, dark );
}
return container::long( word, dark ) + foo +
query_contents( "$C$"+ the_short() +" contains: " ) +
wearable::long( word, dark );
} /* long() */
/** @ignore yes */
int query_ac( string type, int amount ) {
do_damage( type, amount );
} /* query_ac() */
/**
* This method sets up the scabbards current condition.
* @param number the current condition fo the scabbard
*/
void setup_scabbard( int number ) {
set_max_cond( number );
set_cond( number );
set_lowest_cond( number );
} /* setup_scabbard() */
/** @ignore yes */
int query_value() {
return modify_value( container::query_value() );
} /* query_value() */
/** @ignore yes */
int query_full_value() { return container::query_value(); }
/** @ignore yes */
int drop(mixed dest) {
if ( worn_by )
if ( living( worn_by ) )
return 1;
return container::drop(dest);
} /* drop() */
/** @ignore yes */
varargs int move( mixed dest, string messin, string messout ) {
int flag;
flag = container::move( dest, messin, messout );
if ( ( flag == MOVE_OK ) && worn_by )
set_worn_by( 0 );
return flag;
} /* move() */
/** @ignore yes */
void dest_me() {
set_worn_by( 0 );
container::dest_me();
} /* dest_me() */
/** @ignore yes */
void break_me() {
if ( worn_by )
all_inventory()->move( environment( worn_by ), "$N fall$s from "+
a_short() +"." );
else
all_inventory()->move( environment(), "$N fall$s out of "+
a_short() +"." );
::break_me();
} /* break_me() */
/** @ignore yes */
mixed *stats() {
return container::stats() + wearable::stats();
} /* stats() */
/** @ignore yes */
mapping query_static_auto_load() {
if ( explode( file_name( this_object() ), "#" )[ 0 ] != "/obj/scabbard" )
return ([ ]);
return ([
"::" : container::int_query_static_auto_load(),
"wear" : wearable::query_static_auto_load(),
"types" : types,
"_no_types_in_long" : _no_types_in_long,
]);
} /* query_static_auto_load() */
/** @ignore yes */
mapping query_dynamic_auto_load() {
return ([
"::" : container::query_dynamic_auto_load(),
"wear" : wearable::query_dynamic_auto_load()
]);
} /* query_dynamic_auto_load() */
/** @ignore yes */
void init_static_arg( mapping map ) {
if ( !mapp( map ) )
return;
if ( map[ "::" ] )
container::init_static_arg( map[ "::" ] );
if ( map[ "wear" ] )
wearable::init_static_arg( map[ "wear" ] );
if ( pointerp( map[ "types" ] ) )
set_types( map[ "types" ] );
if ( map[ "_no_types_in_long" ] )
_no_types_in_long = map[ "_no_types_in_long" ];
} /* init_static_arg() */
/** @ignore yes */
void init_dynamic_arg( mapping map, object ob ) {
mapping stat_temp;
string virt_name, new_name;
if ( map[ "::" ] )
container::init_dynamic_arg( map[ "::" ], ob );
if ( map[ "wear" ] )
wearable::init_dynamic_arg( map[ "wear" ], ob );
if( virt_name = query_property( VIRTUAL_NAME_PROP ) ) {
if( file_size( virt_name ) == -1 ) {
new_name = ( CLONER )->other_file( virt_name );
if( stringp( new_name ) && ( new_name != virt_name ) ) {
add_property( VIRTUAL_NAME_PROP, new_name );
virt_name = new_name;
} else {
if( VIRTUAL_HANDLER->query_forbidden( virt_name ) ) {
call_out( "replace_me", 1 );
} else {
VIRTUAL_HANDLER->add_missing( virt_name );
}
}
}
if( file_size( virt_name ) != -1 &&
query_property( "virtual time" ) < stat( virt_name )[1] ) {
stat_temp = ( VIRTUAL_HANDLER )->new_data( virt_name );
if( mapp( stat_temp ) ) {
init_static_arg( stat_temp );
add_property( "virtual time", time() );
}
}
}
} /* init_dynamic_arg() */
int no_types_in_long() {
return _no_types_in_long;
} /* no_types_in_long() */
int set_no_types_in_long( int val ) {
_no_types_in_long = val ? 1 : 0;
return _no_types_in_long;
} /* set_no_types_in_long() */