/*****************************************************************************
* This file contains some list functions
*****************************************************************************/
/**
* @ignore yes
* A nicely formatted employee list for the employee badge.
*/
string badge_list()
{
string *results = ({}),
*creators = ({});
foreach(object ob in children(BADGE))
{
if (ob == find_object(BADGE)) continue;
if (ob->query_channel() != _channel) continue;
if (environment(ob)->query_creator())
creators += ({ environment(ob)->query_name() });
}
if (member_array(CREATOR, creators) != -1)
{
object ob = find_player(CREATOR);
creators -= ({CREATOR});
if (ob && !ob->query_invis())
{
string temp_result = ob->query_cap_name() +
"%^YELLOW%^ (C)%^RESET%^";
results += ({temp_result});
}
}
if (sizeof(creators))
foreach(string word in sort_array(creators, 1))
{
string temp_result = cap_name(word) +
"%^YELLOW%^ (C)%^RESET%^";
results += ({temp_result});
}
foreach (string word in sort_array(_retired, 1))
{
object ob;
if (ob = find_player(word))
{
string temp_result = "%^CYAN%^"+ ob->query_cap_name() +
"%^RESET%^ (R)";
int idle = 0;
if (interactive(ob))
idle = query_idle(ob);
else temp_result += " [net-dead]";
if (idle > 90)
temp_result += sprintf(" [idle: %d:%02d]",
idle / 60, idle % 60);
results += ({temp_result});
}
}
foreach (string word in get_managers())
{
string temp_result = "";
object ob;
if (ob = find_player(word))
{
int idle = 0;
if (interactive(ob))
idle = query_idle(ob);
else temp_result += " [net-dead]";
if (_employees[word][EMP_POINTS] & CLOCKED_IN)
temp_result = "%^YELLOW%^";
temp_result += ob->query_cap_name()+ "%^RESET%^ (m)";
if (idle > 90)
temp_result += sprintf(" [idle: %d:%02d]",
idle / 60, idle % 60);
results += ({temp_result});
}
}
foreach (string word in get_supervisors())
{
string temp_result = "";
object ob;
if (ob = find_player(word))
{
int idle = 0;
if (interactive(ob))
idle = query_idle(ob);
else temp_result += " [net-dead]";
if (_employees[word][EMP_POINTS] & CLOCKED_IN)
temp_result = "%^YELLOW%^";
temp_result += ob->query_cap_name()+ "%^RESET%^ (s)";
if (idle > 90)
temp_result += sprintf(" [idle: %d:%02d]",
idle / 60, idle % 60);
results += ({temp_result});
}
}
foreach (string word in get_employees())
{
string temp_result = "";
object ob;
if (ob = find_player(word))
{
int idle = 0;
if (interactive(ob))
idle = query_idle(ob);
else temp_result += " [net-dead]";
if (_employees[word][EMP_POINTS] & CLOCKED_IN)
temp_result = "%^YELLOW%^";
temp_result += ob->query_cap_name()+ "%^RESET%^";
if (idle > 90)
temp_result += sprintf(" [idle: %d:%02d]",
idle / 60, idle % 60);
results += ({temp_result});
}
}
if (!sizeof(results))
/* Will only occur if no employees logged on, and CREATOR is invis.
*/
return "\nJust you, I'm afraid.\n";
return sprintf("\n%s\n", query_multiple_short(results));
}
/* badge_list() */
/**
* @ignore yes
* The list of employees in the shop.
* This list is displayed sorted primarily by status (Retired, manager,
* supervisor, riff-raff) and then alphabetically within those groups.
* It also highlights those employees currently logged on (as long as they
* are visible).
*/
int do_list()
{
int emps_in;
string results = " Employees of "+ _shop_name + "\n"
" As at " + ctime(time()) + "\n\n";
/* Retired managers */
foreach (string word in sort_array(_retired, 1))
{
object ob = find_player(word);
if (ob)
results += "%^GREEN%^";
results += " "+ cap_name(word)+
"%^RESET%^ (retired manager)\n";
}
/* Managers */
foreach (string word in get_managers())
{
object ob = find_player(word);
if (ob)
{
emps_in++;
results += "%^GREEN%^";
}
results += " "+ cap_name(word)+ "%^RESET%^ (manager)"+
list_stuff(word);
}
/* Supervisors */
foreach (string word in get_supervisors())
{
object ob = find_player(word);
if (ob)
{
emps_in++;
results += "%^GREEN%^";
}
results += " "+ cap_name(word)+ "%^RESET%^ (supervisor)"+
list_stuff(word);
}
/* Riff-raff */
foreach (string word in get_employees())
{
object ob = find_player(word);
if (ob)
{
emps_in ++;
results += "%^GREEN%^";
}
results += " "+ cap_name(word)+ "%^RESET%^"+ list_stuff(word);
}
results += "\n";
/* If viewed by manager or creator, display number of employees logged
* on and number clocked in.
*/
if (this_player()->query_creator() ||
_employees[this_player()->query_name()][EMP_POINTS] & MANAGER)
{
results += (emps_in == 1)?" There is one employee ":
" There are "+ query_num(emps_in,0)+ " employees ";
results += "out of "+ query_num(sizeof(_employees) - 1)+
" on " + mud_name() + " at the moment, with "+ query_num(num_employees_in(),
0) + " currently clocked in.\n\n";
}
tell_object(this_player(), "$P$Employees$P$"+ results);
add_succeeded_mess("");
return 1;
}
/* do_list() */
/**
* @ignore yes
* Displays the list of commands available to each employee.
*/
private int do_office()
{
int employee;
object tp = this_player();
string tp_name = tp->query_name(),
board_mess = "";
if (!_board)
board_mess = " memo - send a memo to the other employees\n";
add_succeeded_mess("");
tp = this_player();
tp_name = tp->query_name();
if (member_array(tp_name, _retired) != -1)
{
tell_object( tp, "As a retired manager, you can use the following "
"commands:\n"
" claim - claim a badge or handbook\n"
" list - list the other employees of the shop\n"
" logs - review the shop's logs\n"
" resign - terminate your association with Tarnach's\n"+
board_mess+
"You may also enter the managers' office for more commands.\n" );
return 1;
}
employee = (tp->query_creator())?SUPERVISOR + MANAGER:
_employees[tp_name][EMP_POINTS];
tell_object(tp, "As an employee, you can use the following commands:\n"
" clock - start or finish your working day\n"+
" claim - claim a badge, handbook, or this month's bonus\n"
" bank - set to which bank account you are paid\n"
" list - list the other employees of the shop\n"
" promotion - request to be ignored for promotion\n"
" resign - end your employment at the shop\n"+
board_mess );
if (employee & SUPERVISOR)
tell_object( tp, "\nAs a supervisor, you can also use:\n"
" chart - change the information on the sales chart\n"
" check - check cabinet assignments\n"
" logs - review the shop's logs\n" );
if (employee & MANAGER)
tell_object( tp, "\nAs a manager you can enter the managers' "
"office and use the commands listed there.\n" );
add_succeeded_mess("");
return 1;
}
/* do_office() */
/**
* @ignore yes
*/
string employees_clocked_in()
{
object *words = ({}), ob;
if (!num_employees_in()) words = ({"No employees"});
if (find_object(_shopkeeper) &&
_employees[_shopkeeper->query_name()][EMP_POINTS] & CLOCKED_IN)
words = ({_shopkeeper->query_short()});
foreach (string word in m_indices(_employees))
{
ob = find_player(word);
if (ob && _employees[word][EMP_POINTS] & CLOCKED_IN)
words += ({ob->query_cap_name()});
}
return query_multiple_short(words);
}
/* employees_clocked_in() */
/**
* @ignore yes
* Displays an employee's percentage towards promotion, if applicable.
* Displays all employees' scores to creators.
* Displays last-action (leave) times to managers.
*/
private string list_stuff(string word)
{
string results = "",
tp = this_player()->query_name();
/* Nothing to display for retired managers */
if (member_array(word, _retired) != -1) return "\n";
/* Npc shopkeeper */
if (_employees[word][EMP_POINTS] & NPC) return query_worked(word) + "\n";
/* Creator viewing - display all scores */
if (this_player()->query_creator())
results = " ["+ (_employees[word][EMP_POINTS] / 32) +"]";
else if ((word == tp) && !(_employees[word][EMP_POINTS] & MANAGER))
if (_employees[word][EMP_POINTS] & SUPERVISOR)
results = " ["+ ((100 * (_employees[word][EMP_POINTS] /
32 - SUPER_POINTS)) /
(MANAGER_POINTS - SUPER_POINTS)) +"%]";
else
results = " ["+ ((100 * (_employees[word][EMP_POINTS] / 32)) /
SUPER_POINTS) +"%]";
/* Last-action times displayed to managers & creators */
if (this_player()->query_creator() || (_employees[tp][EMP_POINTS] & MANAGER))
results += query_worked(word);
return results + "\n";
}
/* list_stuff() */