inherit COMMAND_BASE;
string *normal_types, *cre_types, player_format, cre_format;
void create() {
    ::create();
    normal_types = ({ "shout", "newbie", "remote-soul", "multiple-soul",
        "multiple-tell",  "teach", "tell", "remote", "multiple-remote" });
    cre_types = ({ "remote-spam" });
    player_format = "{" + implode(normal_types, "|") + "}";
    cre_format = "{" + implode(normal_types + cre_types, "|") + "}";
} /* create() */
int check_earmuffs() {
    string *on, *types;
    if( !on = TP->query_property("earmuffs") )
        on = ({ });
    types = normal_types;
    if( creatorp(TP) )
        types += cre_types;
    write("Your earmuffs are "+( TP->query_earmuffs() ? "on" : "off" )+".\n");
    if( !sizeof(on) ) {
        write("You have nothing set to be earmuffed.\n");
        write("$I$5=Earmuffable events are "+ query_multiple_short(types)+
               ".\n");
    } else {
        write("$I$5=You have "+query_multiple_short(on)+" events earmuffed.\n");
        types -= on;
        if( sizeof(types) ) {
            write("$I$5=You are not currently earmuffing "+
                   query_multiple_short(types)+ " events.\n");
        }
    }
    return 1;
} /* check_earmuffs() */
int do_earmuff_control( string str ) {
    string *types, *on;
    types = normal_types;
    if( creatorp(TP) )
        types += cre_types;
    if( !on = TP->query_property("earmuffs") )
        on = ({ });
    switch( str ) {
      case "on" :
        if( !TP->query_earmuffs() ) {
            TP->toggle_earmuffs();
            write("Earmuffs turned on.\n");
            break;
        }
        write("Your earmuffs are already on.\n");
      break;
      case "off" :
        if( TP->query_earmuffs() ) {
            TP->toggle_earmuffs();
            write("Earmuffs turned off.\n");
            break;
        }
        write("Your earmuffs are already off.\n");
      break;
      case "all" :
        on = types;
        if( sizeof(on) )
            write("$I$5=Your "+query_multiple_short(on)+" events will now be "
                   "earmuffed.\n");
      break;
      case "none" :
        if( !sizeof(on) )
            write("You are not earmuffing anything already.\n");
        else {
            write("Nothing will be earmuffed any more.  "
                  "(No news is good news?)\n");
            on = ({ });
        }
        break;
    }
    if( sizeof(on) )
        TP->add_property("earmuffs", on );
    else
        TP->remove_property("earmuffs");
    return 1;
} /* do_earmuff_control() */
int do_earmuff( string str, string onOff ) {
    string *types, *on, *off;
    types = normal_types;
    if( creatorp(TP) )
        types += cre_types;
    if( !on = (string *)TP->query_property("earmuffs") )
        on = ({ });
    off = ({ });
    switch ( onOff ) {
      case "on" :
        if( member_array( str, on ) == -1 ) {
            on += ({ str });
            write("You are now earmuffing " + str + " events.\n");
            break;
        }
        write("You are already earmuffing " + str + " events.\n");
      break;
      case "off" :
        if( member_array( str, on ) != -1 ) {
            off += ({ str });
            write("You are not earmuffing " + str + " events anymore.\n");
            break;
        }
        write("You are not earmuffing " + str + " events already.\n");
      break;
      default :
        if( member_array( str, on ) == -1 ) {
            on += ({ str });
            write("You are now earmuffing " + str + " events.\n");
        } else {
            off += ({ str });
            write("You are not earmuffing " + str + " events anymore.\n");
        }
      break;
    }
    on -= off;
    if( sizeof(on) )
        TP->add_property("earmuffs", on );
    else
        TP->remove_property("earmuffs");
    return 1;
} /* do_earmuff() */
mixed query_patterns() {
   if( creatorp(TP) ) {
       return ({ "", (: check_earmuffs() :),
                 "{on|off|all|none}", (: do_earmuff_control($4[0]) :),
                 cre_format, (: do_earmuff($4[0], "") :),
                 cre_format + " {on|off}", (: do_earmuff($4[0], $4[1]) :) });
   } else {
       return ({ "", (: check_earmuffs() :),
                 "{on|off|all|none}", (: do_earmuff_control($4[0]) :),
                 player_format, (: do_earmuff($4[0], "") :) ,
                 player_format + " {on|off}", (: do_earmuff($4[0], $4[1]) :) });
   }
} /* query_patterns() */