#define MAX_OBJECTS_AT_ONCE 5 string weight_string( int number ); int cmd( object *things ); string weight_string( int number ) { number = ( number + 4 ) / 9; switch ( number ) { case 0 : return "uh oh"; case 1 : return "half a pound"; case 2 : return "a pound"; case 3 : return "a pound and a half"; case 4 .. 14 : return query_num( ( number + 1 ) / 2 ) +" pounds"; case 15 .. 24 : return "ten pounds"; case 25 .. 34 : return "fifteen pounds"; case 35 .. 149 : return query_num( ( ( number + 10 ) / 20 ) * 10 ) +" pounds"; case 150 .. 249 : return "a hundred pounds"; case 250 .. 349 : return "a hundred and fifty pounds"; case 350 .. 1499 : return query_num( ( ( number + 100 ) / 200 ) * 100 ) +" pounds"; case 1500 .. 2499 : return "a thousand pounds"; case 2500 .. 2499 : return "fifteen hundred pounds"; case 3500 .. 14999 : return query_num( ( ( number + 1000 ) / 2000 ) * 1000 ) +" pounds"; case 15000 .. 24999 : return "ten thousand pounds"; case 25000 .. 34999 : return "fifteen thousand pounds"; default : /* Detritus... */ return query_num( ( ( number + 10000 ) / 20000 ) * 10000 ) +" pounds"; } } /* weight_string() */ int cmd( object *things ) { int accuracy, weight; string results; object thing, *failed; failed = filter( things, (: ENV($1) != TP :) ); things -= failed; if( !sizeof(things) ) { add_failed_mess("$I "+({"is","are"})[query_group(failed)]+" not in " "your inventory, so you cannot weigh "+({"it","them"}) [query_group(failed)]+".\n", failed ); return 0; } if( sizeof( things ) > MAX_OBJECTS_AT_ONCE ) { add_failed_mess( "You cannot weigh that many things at once.\n" ); return 0; } accuracy = 9 + 89 / ( 1 + ( int )TP->query_dex() ); results = ""; foreach( thing in things ) { if( !objectp( ( object )thing->query_worn_by() ) ) { results += "You heft "+(string)thing->the_short()+" and guess " "that "+(string)thing->query_pronoun()+" weighs "; weight = ( int )thing->query_complete_weight(); if( 4 * weight > accuracy ) { weight = ( 4 * weight + accuracy ) / ( 2 * accuracy ); results += "about "+ weight_string( weight * accuracy ) + ".\n"; } else { results += "less than "+ weight_string( accuracy ); results += ".\n"; } } else { results += "You are wearing " + ( string )thing->the_short() + ".\n"; things -= ({ thing }); continue; } } tell_object( TP, results ); if( sizeof( things ) ) { tell_room( ENV( TP ), (string)TP->one_short()+" hefts "+ query_multiple_short( things ) + ( sizeof( things ) > 1 ? " one at a time to see how much they weigh" : " to see how much it weighs" ) + ".\n", ({ TP }) ); } return 1; } /* cmd() */ mixed *query_patterns() { return ({ "<indirect:object:me'item(s)'>", (: cmd( $1 ) :) }); } /* query_patterns() */