/**
* This is a folder inherit, for putting documents, leaflets, etc. in.
* The two things you need to set when creating a folder, are the the
* maximum weight of a single paper that fits in the folder (so we can't
* put huge papers in small folders that are supposed to only fit heaps
* of small ones), and the total number of sheets of that maximum size
* that should fit in the folder.
*
* NOTE: If the size is more than 1, then the folder will fit double the
* amount of papers that are half or less the maximum sheet size.
*
* @author Mahray 20/04/02
* @changed Changed it to work with other documents as well -
* Sandoz, 10. Sept. 2002.
*
* @example
* setup_folder( 1, 20 ); // Max size 1, total number 20.
*/
inherit BAGGAGE_OBJ;
int sheets, sheet_size;
/** @ignore yes */
void create() {
do_setup++;
baggage::create();
do_setup--;
sheets = 10;
sheet_size = 1;
set_unlockable( 1 );
add_extra_look(TO);
if( !do_setup )
TO->setup();
} /* create() */
/**
* This method sets the number of documents this folder can hold,
* and the maximum sheet size. Be reasonable. The maximum number
* is capped at 100, and the maximum size is capped at 3, no paper
* should weight more than that.
* @param size the maximum size of a sheet the folder can hold
* @param number the amount of documents the folder can hold
* @see query_sheet_size()
* @see query_no_sheets()
*/
void setup_folder( int size, int number ) {
if( number > 100 )
number = 100;
if( size > 3 )
size = 3;
sheets = number;
sheet_size = size;
set_max_weight( number * size );
} /* setup_folder() */
/**
* This method returns the maximum sheet size this folder can hold.
* @return the maximum sheet size we can hold
* @see setup_folder()
* @see query_no_sheets()
*/
int query_sheet_size() { return sheet_size; }
/**
* This method returns the number of sheets this folder can hold.
* @return the number of sheets we can hold
* @see setup_folder()
* @see query_sheet_size()
*/
int query_no_sheets() { return sheets; }
/** @ignore yes */
int test_add( object ob, int i ) {
int ret;
if( i )
return 0;
if( !ENV( ob ) )
return ::test_add( ob, i );
if( !ob->query_paper() && !ob->query_leaflet() ) {
write( ob->the_short()+" "+verbalize("don't", "doesn't")+" appear to "
"be of the right shape to fit in "+the_short()+".\n");
return 0;
}
if( ob->query_weight() > sheet_size || sizeof(INV(TO)) > 2 * sheets ||
!( ret = ::test_add( ob, i ) ) ) {
write( ob->the_short()+" "+verbalize("don't", "doesn't")+" fit very "
"well in "+the_short()+".\n");
return 0;
}
return ret;
} /* test_add() */
/** @ignore yes */
mapping int_query_static_auto_load() {
return ([
"::" : ::int_query_static_auto_load(),
"sheets" : sheets,
"sheet size" : sheet_size,
]);
} /* int_query_static_auto_load() */
/** @ignore yes */
void init_static_arg( mapping m ) {
if( mapp( m ) ) {
if( m["::"] )
::init_static_arg( m["::"] );
if( m["sheets"] )
sheets = m["sheets"];
if( m["sheet size"] )
sheet_size = m["sheet size"];
set_max_weight( sheets * sheet_size );
}
} /* init_static_arg() */
/** @ignore yes */
mapping query_static_auto_load() {
if( query_name() && query_name() != "object" &&
base_name(TO)+".c" == __FILE__ )
return int_query_static_auto_load();
return 0;
} /* query_static_auto_load() */
/** @ignore yes */
string extra_look( object ob ) {
string size;
if( ob != TO || !sheets )
return "";
switch( sheet_size ) {
case 1:
size = "medium-sized";
break;
case 2:
size = "large";
break;
case 3:
size = "huge";
break;
default:
size = "extremely buggy";
}
return "It can hold about "+query_num(sheets)+" "+size+" sheet"+
( sheets > 1 ? "s" : "")+" of paper.\n";
} /* extra_look() */
/** @ignore yes */
mixed stats() {
return ::stats() + ({
({"sheets", sheets }),
({"sheet size", sheet_size }),
});
} /* stats() */