/* -*- LPC -*- */ /* * $Locker: $ * $Id: coverage.c,v 1.5 2003/02/21 01:28:10 pinkfish Exp $ * * */ inherit "/cmds/base.c"; #define CLOTHING_HANDLER "/obj/handlers/clothing_handler" private string _zone_patterns; int cmd(object *items, int inverse, string bits) { object armor; object *wearing; object *fail = ({ }); object *armors; object *covering; string *types; string equiv_type; string type; string *zones; string *all_zones; string *parts; string zone; string verb; string mess; mapping covered; mapping pot_covered; all_zones = keys(CLOTHING_HANDLER->query_all_clothing_zones()); covered = allocate_mapping(sizeof(all_zones)); pot_covered = allocate_mapping(sizeof(all_zones)); foreach (zone in all_zones) { covered[zone] = ({ }); pot_covered[zone] = ({ }); } if (sizeof(items) == 0) armors = this_player()->query_armours(); else armors = items; fail = filter(armors, (: !$1->query_armour() && !$1->query_clothing() :)); armors -= fail; wearing = this_player()->query_wearing(); if (bits) { bits = replace(bits, " ", ","); bits = replace(bits, ",and,", ","); zones = explode(bits, ",") - ({ "" }); parts = filter(zones, (: member_array($1, $(all_zones)) != -1 :)); if (sizeof(parts) == 0) { write("Please choose some combination of " + query_multiple_short(all_zones) + ".\n"); return 1; } } foreach (armor in armors) { if (!arrayp(armor->query_type())) types = ({ armor->query_type() }); else types = armor->query_type(); zones = ({ }); foreach (type in types) { equiv_type = CLOTHING_HANDLER->query_equivilant_type(type); if (equiv_type) zones += CLOTHING_HANDLER->query_zone_names(equiv_type); else zones += CLOTHING_HANDLER->query_zone_names(type); } if (sizeof(zones)) { if (member_array(armor, wearing) > -1) foreach (zone in zones) covered[zone] += ({ armor }); else foreach (zone in zones) pot_covered[zone] += ({ armor }); } else fail += ({ armor }); } if (bits) { covered = filter(covered, (: member_array($1, $(parts)) != -1 :)); pot_covered = filter(pot_covered, (: member_array($1, $(parts)) != -1 :)); } if (inverse) { zones = filter(all_zones, (: sizeof($(covered)[$1]) == 0 :)); if (sizeof(zones) > 0) { if (sizeof(zones) > 1 || zones[0] == "arms" || zones[0] == "hands" || zones[0] == "legs" || zones[0] == "feet") verb = " are"; else verb = " is"; write("Your " + query_multiple_short(zones) + verb + " unprotected.\n"); } else write("You are covered from head to foot.\n"); return 1; } zones = sort_array(keys(covered) | keys(pot_covered), 1); foreach (zone in zones) { if (zone == "arms" || zone == "hands" || zone == "legs" || zone == "feet") verb = " are"; else verb = " is"; if (sizeof(covering = covered[zone]) > 0) { if (sizeof(covering) == 1) mess = "Your " + zone + verb + " protected by " + covering[0]->one_short(); else mess = "Your " + zone + verb + " protected by " + query_num(sizeof(covering)) + " things, " + query_multiple_short(covering, "one"); if (sizeof(pot_covered[zone]) > 0) { mess += " and could be protected by " + query_multiple_short(pot_covered[zone], "one") + ".\n"; pot_covered[zone] = ({ }); } else mess += ".\n"; write(mess); } else if (sizeof(covering = pot_covered[zone]) > 0) { write("Your " + zone + " could be protected by " + query_multiple_short(covering, "one") + ".\n"); } else if (bits) write("Your " + zone + verb + " unprotected.\n"); } if (sizeof(fail) != 0 && sizeof(items) != 0) { if (sizeof(fail) == 1 && fail[0] == this_player()) write("You don't offer any protection. Perhaps you should invest " "in some sonkies?\n"); else write(query_multiple_short(fail, "the") + (sizeof(fail) == 1 ? " doesn't" : " don't") + " offer any protection.\n"); } else if (sizeof(armors - fail) == 0) /* Everything failed! */ write("You are completely unprotected. Good luck!\n"); return 1; } mixed *query_patterns() { return ({ "", (: cmd(({ }), 0, 0) :), "[by] <indirect:object'armour/clothing'>", (: cmd($1, 0, 0) :), "unprotected", (: cmd(({ }), 1, 0) :), "of <string'body part(s)'>", (: cmd(({ }), 0, $4[0]) :) }); }