/**
* This command makes the player to remove stuff they're wearing.
* Partly rewritten in Dec 2001 by Sandoz.
*/
inherit COMMAND_BASE;
/** @ignore yes */
mapping add_to_failed( mapping failed, string word, object thing ) {
if( !failed[word] )
failed += ([ word : ({ thing }) ]);
else if( member_array( thing, failed[word] ) == -1 )
failed[word] += ({ thing });
return failed;
} /* add_to_failed() */
/** @ignore yes */
object *sort_clothes( object *obs ) {
return sort_array( obs, (:
CLOTHING_H->query_clothing_depth( $1->query_type() ) -
CLOTHING_H->query_clothing_depth( $2->query_type() ) :) );
} /* sort_clothes() */
/** @ignore yes */
mapping alt_remove( object player, object *things, object ob, mapping failed,
int stage ) {
string result;
object *obs, tmp;
if( stage++ > 2 )
return failed;
if( sizeof( obs = CLOTHING_H->can_wear_or_remove( ob, TP, 1 ) ) ) {
if( sizeof( obs = CLOTHING_H->can_wear_or_remove( ob, player, 1 ) ) ) {
obs = sort_clothes( obs );
foreach( tmp in obs )
failed = alt_remove( player, things, tmp, failed, stage );
stage++;
}
if( result = CLOTHING_H->can_wear_or_remove( ob, player ) )
return add_to_failed( failed, result, ob );
}
if( player->remove_armour(ob) )
return failed;
if( member_array( ob, things ) != -1 &&
member_array( ob, failed["OKAY"] ) == -1 )
return add_to_failed( failed, "OKAY", ob );
return add_to_failed( failed, "temp remove", ob );
} /* alt_remove() */
/** @ignore yes */
int cmd( object *things ) {
string result, stuff;
object *okay, ob, *offenders, offender;
mapping failed;
failed = ([ "OKAY" : ({ }) ]);
// Sort the things array in clothing order.
// This should make remove all work.
things = sort_clothes( things );
foreach( ob in things ) {
if( member_array( ob, TP->query_wearing() ) == -1 ) {
failed = add_to_failed( failed, "not wearing", ob );
continue;
}
if( sizeof( offenders = CLOTHING_H->can_wear_or_remove( ob, TP, 1 ) ) ) {
offenders = sort_clothes( offenders );
foreach( offender in offenders )
failed = alt_remove( TP, things, offender, failed, 0 );
}
if( result = CLOTHING_H->can_wear_or_remove( ob, TP ) ) {
failed = add_to_failed( failed, result, ob );
continue;
}
if( TP->remove_armour(ob) ) {
failed = add_to_failed( failed, "cannot remove", ob );
continue;
}
failed["OKAY"] += ({ ob });
}
result = "";
okay = failed["OKAY"];
map_delete( failed, "OKAY");
if( sizeof(failed) ) {
foreach( string key, offenders in failed ) {
stuff = query_multiple_short( offenders, "the" );
switch( key ) {
case "not wearing" :
if( !sizeof(okay) )
result += "You are not wearing "+ stuff +".\n";
break;
case "cannot remove" :
result += "You cannot remove "+ stuff +".\n";
break;
case "temp remove" :
foreach( offender in offenders )
TP->wear_armour( offender, 0 );
break;
default :
result += "You cannot remove "+ stuff +" "+ key +".\n";
}
}
}
if( !sizeof(okay) ) {
add_failed_mess(result);
return 0;
}
if( sizeof( failed["temp remove"] ) ) {
add_succeeded_mess( ({
result+"You temporarily remove "+query_multiple_short(
failed["temp remove"] )+" to remove $I.\n",
"$N remove$s $I.\n"
}), okay );
return 1;
}
add_succeeded_mess( ({
result+"You remove $I.\n", "$N remove$s $I.\n"
}), okay );
return 1;
} /* cmd() */
/** @ignore yes */
mixed query_patterns() {
return ({ "<indirect:object:me>", (: cmd($1) :) });
} /* query_patterns() */