/** * This command lets you wear stuff. * Rewritten to allow wear things straight * to lower layers 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 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 *things, object ob, mapping failed, int stage ) { string ret; object *obs, tmp; if( stage++ > 4 ) return failed; if( sizeof( obs = CLOTHING_H->can_wear_or_remove( ob, TP, 1 ) ) ) { if( sizeof( obs = CLOTHING_H->can_wear_or_remove( ob, TP, 1 ) ) ) { obs = sort_clothes( obs ); foreach( tmp in obs ) failed = alt_remove( things, tmp, failed, stage ); stage++; } if( ret = CLOTHING_H->can_wear_or_remove( ob, TP ) ) return add_to_failed( failed, ret, ob ); } if( TP->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 ret, stuff; object *okay, ob, *offenders, offender, *wearing; mapping failed; failed = ([ "OKAY" : ({ }) ]); things = sort_array( things, (: CLOTHING_H->query_clothing_depth( $2->query_type() ) - CLOTHING_H->query_clothing_depth( $1->query_type() ) :) ); wearing = TP->query_wearing(); foreach( ob in things ) { if( member_array( ob, wearing ) != -1 ) { failed = add_to_failed( failed, "already wearing", ob ); continue; } } if( sizeof( failed["already wearing"] ) ) things -= failed["already wearing"]; foreach( ob in things ) { if( !ob->query_wearable() || ob->cannot_be_worn() ) { failed = add_to_failed( failed, "cannot wear", ob ); continue; } if( ENV(ob) != TP ) { failed = add_to_failed( failed, "not in me", ob ); continue; } if( member_array( ob, wearing ) != -1 ) { failed = add_to_failed( failed, "already wearing", ob ); continue; } offenders = CLOTHING_H->can_wear_or_remove( ob, TP, 1 ); if( sizeof( offenders ) ) { offenders = sort_clothes( offenders ); foreach( offender in offenders ) failed = alt_remove( things, offender, failed, 0 ); } if( ret = CLOTHING_H->can_wear_or_remove( ob, TP ) ) { failed = add_to_failed( failed, ret, ob ); continue; } if( ret = TP->wear_armour( ob, 0 ) ) { failed = add_to_failed( failed, ret, ob ); continue; } failed["OKAY"] += ({ ob }); } ret = ""; 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 in me" : if( !sizeof(okay) ) ret += "You cannot wear "+stuff+", because "+ ( !query_group( offenders ) ? "it is" : "they are")+ " not in your inventory.\n"; break; case "cannot wear" : if( !sizeof(okay) ) ret += "$C$"+stuff+" cannot be worn.\n"; break; case "already wearing" : ret += "You are already wearing "+ stuff +".\n"; break; case "already holding" : ret += "You cannot wear "+ stuff +" as you do not " "have enough free limbs.\n"; break; case "oh dear" : ret += "Something has gone wrong and you can't wear "+ stuff + ", please contact a creator immediately.\n"; break; case "temp remove" : foreach( offender in offenders ) TP->wear_armour( offender, 0 ); break; default : ret += "You cannot wear "+ stuff +" "+ key +".\n"; } } } if( !sizeof(okay) ) { add_failed_mess(ret); return 0; } if( sizeof( failed["temp remove"] ) ) { add_succeeded_mess( ({ ret + "You temporarily remove "+ query_multiple_short( failed["temp remove"] )+" to wear $I.\n", "$N wear$s $I.\n"}), okay ); return 1; } add_succeeded_mess( ({ ret+"You wear $I.\n", "$N wear$s $I.\n"}), okay ); return 1; } /* cmd() */ /** @ignore yes */ mixed query_patterns() { return ({ "<indirect:object:me>", (: cmd($1) :) }); }