/* /std/container.c * from Nightmare IV * object inherited by all objects with inventories * created by Descartes of Borg 940212 */ #include <std.h> #include <config.h> #include "container.h" inherit OBJECT; static private int __Encumbrance, __MaxEncumbrance; varargs int receive_objects(object ob) { if(!ob) ob = previous_object(); if((int)ob->query_mass() + query_encumbrance() > query_max_encumbrance()) return 0; return 1; } int release_objects(object ob) { return 1; } string describe_living_contents(object *exclude) { object *inv; mapping list; string *shorts; string tmp, ret; int i, x; if(!(i = sizeof(inv = query_living_contents() - exclude))) return ""; list = allocate_mapping(i); while(i--) { if((int)inv[i]->query_invis()) { if(creatorp(inv[i])) continue; else if(random(101) < (int)this_player()->query_level()) tmp = "a shadow"; else continue; } else if(!(tmp = (string)inv[i]->query_short())) tmp = (string)inv[i]->query_name(); if(!tmp) continue; if(!list[tmp]) list[tmp] = ({ inv[i] }); else list[tmp] += ({ inv[i] }); } i = sizeof(shorts = keys(list)); ret = ""; while(i--) { if((x=sizeof(list[shorts[i]])) < 2) ret = sprintf("%s%s\n", ret, capitalize(shorts[i])); else ret = sprintf("%s%s\n", ret, capitalize(consolidate(x, shorts[i]))); } return ret; } string describe_item_contents(object *exclude) { object *inv; mapping list; string ret, tmp; string *shorts; int i, x; list = allocate_mapping(i=sizeof(inv=query_item_contents()-exclude)); while(i--) { if((int)inv[i]->query_invis()) continue; if(!(tmp = (string)inv[i]->query_short())) tmp = (string)inv[i]->query_name(); if(!tmp || tmp == "") continue; if(!list[tmp]) list[tmp] = ({ inv[i] }); else list[tmp] += ({ inv[i] }); } if(!(i = sizeof(shorts = keys(list)))) return ""; if((x=sizeof(list[shorts[--i]])) == 1) ret = capitalize(shorts[i]); else ret = capitalize(consolidate(x, shorts[i])); if(!i) return sprintf("%s %s here.", ret, (x<2 ? "is" : "are")); else if(i==1) return sprintf("%s and %s are here.", ret, consolidate(sizeof(list[shorts[0]]), shorts[0])); else { while(i--) { if(!i) ret = sprintf("%s, and ", ret); else ret = sprintf("%s, ", ret); ret = sprintf("%s%s", ret, consolidate(sizeof(list[shorts[i]]), shorts[i])); } } return sprintf("%s are here.", ret); } void add_encumbrance(int x) { if(x + query_encumbrance() > query_max_encumbrance()) return; if((__Encumbrance += x) < 0) __Encumbrance = 0; } int query_encumbrance() { return __Encumbrance; } void set_max_encumbrance(int x) { __MaxEncumbrance = x; } int query_max_encumbrance() { return __MaxEncumbrance; } float query_encumbered() { return percent(query_encumbrance(), query_max_encumbrance()); } object *query_living_contents() { return filter_array(all_inventory(this_object()), "filter_living", this_object()); } object *query_item_contents() { return filter_array(all_inventory(this_object()),"filter_items", this_object()); } static int filter_living(object ob) { return living(ob); } static int filter_items(object ob) { return !living(ob); }