/** * Player-run shop employee badge. * This object is the badge claimable by employees of player-run shops. * It allows employees of a particular shop to chat to each other on a * deidcated channel. It also sets a player-title, and shows which employees * are currently logged on. * This object should not be inherited by anything, but should be created * by the player_shop office. * @author Ringo * @started 1st August 1999 */ #include <player_shop.h> inherit "/obj/armour"; private int do_badge(string); private int do_chat(string); private int get_properties(); private string cap_name(string); private string _office, _title, _channel, _owner; private int _echo; void setup() { set_name("badge"); set_short("employee badge"); add_adjective("employee"); add_adjective("tin"); add_adjective("small"); set_main_plural("employee badges"); set_weight(1); set_value(0); set_type("badge"); setup_armour(640); set_damage_chance(5); set_wear_remove_func(file_name(this_object()), "wear_remove_badge"); add_property("no recycling", 1); add_extra_look(this_object()); if (!query_property("office") || !query_property("owner")) { return; } _office = query_property("office"); _owner = query_property("owner"); _echo = query_property("echo"); _title = _office->shop_very_short(); _channel = _office->query_channel(); set_long( "This is a small tin badge which marks " + cap_name(_owner) + " as an employee of "+ _office->query_shop_name()+ ", "+ _office->query_place()+ ".\n"); add_adjective(_channel); } /* setup() */ /** @ignore yes */ private string cap_name(string name) { if (test_player(name)) return PLAYER_HANDLER->query_cap_name(name); else return capitalize(name); } /** @ignore yes */ void init() { object tp; if (!_office || !_owner) { if (!get_properties()) return; set_long("This is a small tin badge which marks "+ cap_name(_owner) + " as an employee of "+ _office->query_shop_name()+ ", "+ _office->query_place()+ ".\n"); add_adjective(_channel); } tp = this_player(); if (!_office->query_employee(tp->query_name()) && !_office->query_retired(tp->query_name()) && !tp->query_creator()) { return; } add_command("badge", ({ "help", "echo" }), (: do_badge($5) :)); add_command("h"+ _channel, "", (: do_badge("hist") :)); add_command(_channel+"?", "", (: do_badge("who") :)); add_command(_channel, "<string'text'>", (: do_chat($4[0]) :)); add_command(_channel+"@", "<string'text'>", (: do_chat("@"+$4[0]) :)); } /* init() */ /** @ignore yes */ private int do_badge(string args) { if (!_office || !_owner) { if (!get_properties()) return 1; } add_succeeded_mess(""); if (args == "who") { tell_object(this_player(), "The following employees from "+ _office->query_shop_name()+ " are logged on: \n" + _office->badge_list()); return 1; } else if (args == "hist") { string result = "$P$"+ _channel+ " channel$P$\n"; mixed *hist = HISTORY_HANDLER->query_chat_history(lower_case(_channel)); tell_object(this_player(), "You ask the badge for the last few chats on the "+ _channel+ " channel\n"); if (!arrayp(hist) || !sizeof(hist)) { tell_object(this_player(), "The badge mutters that nothing has been said on this channel, " "or it is not being remembered.\n"); return 1; } result += implode(map(hist, (: "$I$5=$C$" + $1[0] + $1[1] + "%^RESET%^" :)), "\n" ); tell_object(this_player(), result); } else if (args == "echo") { if (_echo) { tell_object(this_player(), "Local echo now off.\n"); _echo = 0; } else { tell_object(this_player(), "Local echo now on.\n"); _echo = 1; } add_property("echo", _echo); } else { string result = sprintf("Commands for this badge:\n\n" " %-13s - chat a message to the other employees\n" " %-13s - emote a message to the other employees\n" " %-13s - list employees logged on\n" " h%-12s - show recent chat history\n" " badge echo - Turn local echo on/off\n\n" "You can also set your preferred chat colour using the \"colour " "shopchat <colour>\" command.\n", _channel, _channel + "@", _channel + "?", _channel, _channel); tell_object(this_player(), result); } return 1; } /* do_badge() */ /** @ignore yes */ private int do_chat(string wisp) { string sender; object *things, tp; add_succeeded_mess(""); if (!_office || !_owner) { if (!get_properties()) return 1; } tp = this_player(); if (!tp->query_property(_channel+ "_on")) { return notify_fail("You are not wearing the " + _channel+ " badge!\n"); } if (tp->query_property("gagged")) { return notify_fail("You have been gagged! You cannot chat until " "your gag is removed. Perhaps you should talk to a creator about " "this.\n"); } if (!tp->query_creator()) { wisp = replace_string(wisp, "%^", ""); } if (!wisp || ( wisp == "" ) || wisp == "@") { return notify_fail("Chat what?\n"); } if (environment(this_object()) != tp) { return notify_fail("You're too far from the badge to whisper into " "it.\n"); } tell_object(tp, "You whisper into the badge.\n"); sender = tp->query_cap_name(); if (tp->query_name() == CREATOR && tp->query_invis()) { sender = tp->query_short(); } wisp = replace(wisp, sprintf("%c", 7), "!"); things = children(BADGE); if (_echo) { things -= ({find_object(BADGE)}); } else { things -= ({this_object(), find_object(BADGE)}); } things->receive(_channel ,sender, wisp); if (wisp[0] == '@') { if (wisp[1] == ''') { HISTORY_HANDLER->add_chat_history(_channel, sender, wisp[1..1000]); } else { HISTORY_HANDLER->add_chat_history(_channel, sender+ " ", wisp[1..1000]); } } else { HISTORY_HANDLER->add_chat_history(_channel, sender +": ", wisp); } return 1; } /* do_chat() */ /** @ignore yes */ string extra_look(object thing) { object tp; tp = this_player(); if (!_office || !_owner) { if (!get_properties()) return ""; } if (!_office->query_employee(tp->query_name()) && !_office->query_retired(tp->query_name()) && !tp->query_creator()) { return ""; } return "You can get a list of commands by typing \"badge help\"\n"; } /* extra_look() */ /** @ignore yes */ private int get_properties() { if (!query_property("office") || !query_property("owner")) { tell_object(environment(), "This badge is broken. " "Please claim another.\n"); move("/room/rubbish"); return 0; } _office = query_property("office"); _owner = query_property("owner"); _echo = query_property("echo"); _title = _office->shop_very_short(); _channel = _office->query_channel(); return 1; } /* get_properties() */ /** @ignore yes */ string query_channel() { return copy(_channel); } /** @ignore yes */ void receive(string channel, string sender, string text) { object owner = environment(); string *ignoring, prev_ob; if (!_office || !_owner) { if (!get_properties()) return; } prev_ob = base_name(previous_object()); if (prev_ob != BADGE && prev_ob != _office->query_shop_front() /* Remove this condition once Tarnach's changed over */ && prev_ob != "/d/am/square/emporium/TARNACH/consumables") { LOG_ERROR("shop_badge.c", "receive("+channel+","+sender+","+text+")"); return; } if (!owner || (!living(owner))) { return; } if (!_office->query_employee(owner->query_name()) && !_office->query_retired(owner->query_name()) && !owner->query_creator()) { return; } ignoring = owner->query_property("ignoring"); if (ignoring && member_array(lower_case(sender), ignoring) != -1) { return; } if (channel != _channel || !owner->query_property(_channel+ "_on")) { return; } if (text[0] == '@') { if (text[1] == ''') { text = "["+ lower_case( _channel )+ "] "+ sender + text[1..1000]; } else { text = "["+ lower_case( _channel )+ "] "+ sender +" "+ text[1..1000]; } } else { text = "["+ lower_case( _channel )+ "] "+ sender +": "+ text; } tell_object(owner, owner->colour_event("shopchat", "%^CYAN%^") + "$I$5=$C$"+ text + "%^RESET%^\n"); return; } /* receive() */ /** @ignore yes */ void set_props(string path, string owner) { if (!path || path == "") { return; } if (previous_object() && previous_object() != find_object(path)) { LOG_ERROR("shop_badge.c", "set_props("+path+","+owner+")"); return; } set_long("This is a small tin badge which marks " + cap_name( owner ) + " as an employee of "+ path->query_shop_name()+ ", "+ path->query_place()+ ".\n"); add_property("office", path); add_property("owner", owner); _office = path; _owner = owner; _title = _office->shop_very_short(); _channel = _office->query_channel(); add_adjective( _channel ); } /* set_props() */ /** @ignore yes */ void wear_remove_badge(object thing) { if (!_office || !_owner) { if (!get_properties()) return; } if (thing) { int level; string start; if (!living(thing)) { return; } if (thing->query_creator()) { thing->add_property(_channel+ "_on", 1); return; } level = _office->query_employee(thing->query_name()); /* Once Tarnach's transferred over replace following line with * if ( !level ) */ if (!level || level == -1) { if (_office->query_retired(thing->query_name())) { start = "Retired manager of "; } else return; } else if (level & MANAGER) { start = "Manager of "; } else if (level & SUPERVISOR) { start = "Supervisor of "; } else { start = "Employee of "; } thing->add_property(_channel+ "_on", 1); thing->set_title(_title, start + _office->query_shop_name()); return; } thing = previous_object()->query_worn_by(); if (thing) { thing->remove_property(_channel+ "_on"); thing->remove_title(_title); } } /* wear_remove_badge() */