#include <money.h> inherit "/cmds/base"; #define MAX_COUNT_SIZE 50 int is_not_in_other_player(object thing); int cmd(object *things, int brief) { string list; string *aliases; string message; mixed *stuff; object thing; object money; object sack; object *continuous, *collective; object *room_items; object *tmp; object tmp_ob; int i; int total; if (this_player()-> check_dark(environment(this_player())->query_light()) < 0) { add_failed_mess("It's too dark to count anything.\n"); return 0; } if(sizeof(things) > MAX_COUNT_SIZE) return add_failed_mess("You cannot count that many things!\n"); things = filter(things, (: !is_not_in_other_player($1) :)); if (!sizeof(things)) { write("You can't count things carried by other people.\n"); return 1; } money = 0; total = 0; list = ""; foreach (thing in things) { aliases = thing->query_alias(); if (aliases && member_array(MONEY_ALIAS, aliases) > -1) { if (!money) { money = clone_object(MONEY_OBJECT); } money->adjust_money(thing->query_money_array()); things -= ({ thing }); } } if (money) { total += money->query_number_coins(); if (sizeof(things)) { list = implode(money->half_short(1), ", "); if (sizeof(things) == 1) { list += " and "; } else { list += ", "; } } else { list = query_multiple_short(money->half_short(1)); } money->dest_me(); } continuous = filter(things, (: $1->query_continuous() :)); if (sizeof(continuous)) { sack = clone_object("/std/container"); foreach (thing in continuous) { thing->make_medium_clone(thing->query_amount())->move(sack); } things -= continuous; continuous = all_inventory(sack); foreach (thing in continuous) { total += thing->query_how_many(); } if (sizeof(things)) { list += implode(map(continuous, (: $1->amount_size(1) + " of " + $1->short() :)), ", "); if (sizeof(things) == 1) { list += " and "; } else { list += ", "; } } else { list += query_multiple_short(map(continuous, (: $1->amount_size(1) + " of " + $1->short() :))); } sack->dest_me(); } collective = filter(things, (: $1->query_collective() :)); if (sizeof(collective)) { sack = clone_object("/std/container"); foreach (thing in collective) { if (thing) { tmp_ob = thing->make_medium_clone(thing->query_amount()); if (tmp_ob) { tmp_ob->move(sack); } } } things -= collective; collective = all_inventory(sack); foreach (thing in collective) { total += thing->query_amount(); } if(sizeof(things)) { list += implode(map(collective, (: $1->query_amount() + " " + ($1->query_amount() == 1 ? $1->short() : $1->query_plural()) :)), ", "); if (sizeof(things) == 1) { list += " and "; } else { list += ", "; } } else { list += query_multiple_short(map(collective, (: $1->query_amount() + " " + ($1->query_amount() == 1 ? $1->short() : $1->query_plural()) :))); } sack->dest_me(); } room_items = filter(things, (: strsrch(file_name($1), "/std/room/basic/item") > -1 :)); if (sizeof(room_items)) { things -= room_items; tmp = filter(room_items, (: $1->query_count() :)); room_items -= tmp; if (sizeof(things)) { if (sizeof(tmp)) { list += implode(map(tmp, (: query_num($1->query_count()) + " " + ($1->query_count() > 1 ? $1->pretty_plural() : $1->pretty_short()) :)), ", "); foreach (thing in tmp) { total += thing->query_count(); } } if (sizeof(room_items)) { list += implode(map(room_items, (: "at least one " + $1->pretty_short() :)), ", "); total += sizeof(room_items); } if (sizeof(things) == 1) { list += " and "; } else { list += ", "; } } else { if (sizeof(tmp)) { list += query_multiple_short(map(tmp, (: query_num($1->query_count()) + " " + ($1->query_count() > 1 ? $1->pretty_plural() : $1->pretty_short()) :)), ", "); total += sizeof(tmp); } if (sizeof(room_items)) { list += query_multiple_short(map(room_items, (: "at least one " + $1->pretty_short() :))); total += sizeof(room_items); } } } if (sizeof(things)) { list += query_multiple_short(things, "one"); if (this_player() == find_player("presto")) tell_creator("presto", "list == %s\n", list); stuff = this_player()->reform_message(list, ({})); if (this_player() == find_player("presto")) printf("test message: %O\n", this_player()->evaluate_message(stuff)); message = stuff[0]; for (i = 0; i < sizeof(stuff[1]); i++) { message = replace_string(message, "$" + i + "$", this_player()->calc_shorts(stuff[1][i], 1)); } total += sizeof(things); } else { message = list; } if (brief) { write("You count " + total + " items.\n"); } else { write("You count " + message + " with a total of " + query_num(total) + (total > 1 ? " items.\n" : " item.\n")); } return 1; } int is_not_in_other_player(object env) { while ((env = environment(env)) && !living(env)) ; if (env && env != this_player()) return 1; else return 0; } mixed *query_patterns() { return ({ "<indirect:object:me-here'things [in <container>]'>", (: cmd($1, 0) :), "<indirect:object:me'things'> in inventory", (: cmd($1, 0) :), "<indirect:object:here'things'> in room", (: cmd($1, 0) :), "brief <indirect:object:me-here'things [in <container>]'>", (: cmd($1, 1) :), "brief <indirect:object:me'things'> in inventory", (: cmd($1, 1) :), "brief <indirect:object:here'things'> in room", (: cmd($1, 1) :) }); }