/** * This is the file with all the functions that get information * about objects. All of these methods assume they are called * with the following data: seller, objects * @author Pinkfish * @started Fri Jun 1 21:37:14 PDT 2001 */ #include <expressions.h> #include <player_handler.h> #define CHARGE_MULT 10 /* This is out of /obj/weapons/maces/cleric_rod.c */ string query_owner(); string* query_allowed(); void add_allowed_function(string name, int type, int* args, function value); void add_allowed_variable(string name, int type, function value); private int function_object_base_value(object* obs) { int value; object ob; int tmp; value = 1000000000; foreach (ob in obs) { tmp = ob->query_base_value(); if (tmp < value) { value = tmp; } } return value; } /* function_object_base_value() */ private int function_object_value(object* obs) { int value; object ob; int tmp; value = 1000000000; foreach (ob in obs) { tmp = ob->query_value(); if (tmp < value) { value = tmp; } } return value; } /* function_object_value() */ private int function_object_condition(object* obs) { int cond; object ob; int tmp; int max; cond = 100; foreach (ob in obs) { tmp = ob->query_cond(); max = ob->query_max_cond(); if (max) { tmp = tmp * 100 / max; if (tmp < cond) { cond = tmp; } } } return cond; } /* function_object_condition() */ private int function_object_enchant(object*obs) { int enchant; object ob; int tmp; int max; string bing; if (!sizeof(obs)) { return 0; } // // First check to see if any of the owners can actually detect this. // if (!PLAYER_HANDLER->test_guild(query_owner())->query_see_octarine()) { foreach (bing in query_allowed()) { if (PLAYER_HANDLER->test_guild(bing)->query_see_octarine()) { tmp = 1; } } if (!tmp) { return 0; } } enchant = 100; foreach (ob in obs) { tmp = ob->query_enchant(); max = ob->query_max_enchant(); tmp = tmp * 100 / max; if (tmp < enchant) { enchant = tmp; } } return enchant; } /* function_object_enchant() */ private string function_object_type(object* obs) { string type; string old_type; object ob; if (!sizeof(obs)) { return 0; } // // First check to see if any of the owners can actually detect this. // foreach (ob in obs) { if (ob->query_weapon()) { type = "weapon"; } else if (ob->query_armour()) { type = "armour"; } else if (ob->query_clothing()) { type = "clothing"; } else { type = "misc"; } if (old_type && old_type != type) { type = "mixed"; } old_type = type; } return type; } /* function_object_type() */ private object* function_object_stolen(object* obs) { obs = filter(obs, (: $1->query_property("stolen") :)); return obs; } /* function_object_stolen() */ private object* function_object_warded(object* obs) { string classification; classification = "/std/effects/object/ward"->query_classification(); obs = filter(obs, (: sizeof($1->effects_matching($2)) :), classification); return obs; } /* function_object_warded() */ private object* function_object_contains_spell(object* obs, string spell_name) { string bing; int tmp; if (!sizeof(obs)) { return 0; } // // First check to see if any of the owners can actually detect this. // if (!PLAYER_HANDLER->test_guild(query_owner())->query_see_spells()) { foreach (bing in query_allowed()) { if (PLAYER_HANDLER->test_guild(bing)->query_see_spells()) { tmp = 1; } } if (!tmp) { return 0; } } obs = filter(obs, (: $1->query_magic_scroll() && ($2 == "any" || lower_case($1->query_spell_name()) == lower_case($2)) :), spell_name); return obs; } /* function_object_contains_spell() */ private object* function_object_contains_imbue(object* obs, string ritual_name) { if (!sizeof(obs)) { return ({ }); } obs = filter(obs, (: $1->query_faith_imbue() && ($2 == "any" || lower_case($1->query_ritual_name()) == lower_case($2)) :), ritual_name ); return obs; } /* function_object_contains_ritual() */ private int function_object_percentage_liquid(object* obs, string liquid_name) { object ob; object* liquids; object liq; int volume; int found; int tmp; if (!sizeof(obs)) { return 0; } volume = 100; foreach (ob in obs) { // // See what liquids are in the object // liquids = filter(all_inventory(ob), (: $1->query_liquid() :)); if (sizeof(liquids)) { foreach (liq in liquids) { if (liq->query_short() && lower_case(liq->query_short()) == lower_case(liquid_name)) { tmp = liq->query_weight() * 100 / ob->query_max_weight(); if (tmp < volume) { volume = tmp; found = 1; } } } } // Problem: some things (like healing vials) don't actually have // anything in them. So we have to do something different. else if (ob->query_liquid_short() && lower_case(ob->query_liquid_short()) == lower_case(liquid_name)) { tmp = ob->query_water_volume() * 100 / ob->query_max_volume(); if (tmp < volume) { volume = tmp; found = 1; } } } if (found) { return volume; } return 0; } /* function_object_percentage_liquid() */ private int function_object_charges(object* obs) { int total = 0; int possible = 0; int charges; mixed info; object ob; foreach (ob in obs) { charges = ob->query_charges(); if (charges) { info = ob->query_static_auto_load(); if (pointerp(info) && sizeof(info) == 2 && info[0] == charges) { possible += info[1] * CHARGE_MULT; total += charges; } } } if (possible) return 100 * total / possible; else return 0; } /* function_object_charges() */ private object* function_object_matching(object* obs, string match) { object ob; string *bits; string bit; object* ret; bits = explode(match, ","); ret = ({ }); foreach (ob in obs) { foreach(bit in bits) { if (ob && ob->full_id(bit)) { ret += ({ ob }); } } } return ret; } /* function_object_matching() */ private object* function_object_short(object* obs, string match) { string* bits; object* result; bits = explode(match, ","); result = filter(obs, (: member_array(strip_colours($1->query_short()), $2) != -1 :), bits); return result; } /* function_object_short() */ private object* function_contents(object ob) { if (!ob) { return ({ }); } return all_inventory(ob); } /* function_contents() */ /** * This method adds all the object base functions. */ void create() { if (!function_exists("add_allowed_function", this_object())) { return ; } add_allowed_function("objectenchant", EXPRESSION_TYPE_INTEGER, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET }), (: function_object_enchant :) ); add_allowed_function("objectvalue", EXPRESSION_TYPE_MONEY, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET }), (: function_object_value :) ); add_allowed_function("objectbasevalue", EXPRESSION_TYPE_MONEY, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET }), (: function_object_base_value :) ); add_allowed_function("objectcondition", EXPRESSION_TYPE_INTEGER, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET }), (: function_object_condition :) ); add_allowed_function("objecttype", EXPRESSION_TYPE_STRING, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET }), (: function_object_type :) ); add_allowed_function("objectwarded", EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET }), (: function_object_warded :) ); add_allowed_function("objectstolen", EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET }), (: function_object_stolen :) ); add_allowed_function("charges", EXPRESSION_TYPE_INTEGER, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET }), (: function_object_charges :) ); add_allowed_function("containsspell", EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET, EXPRESSION_TYPE_STRING }), (: function_object_contains_spell :) ); add_allowed_function("containsimbue", EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET, EXPRESSION_TYPE_STRING }), (: function_object_contains_imbue :) ); add_allowed_function("percentageliquid", EXPRESSION_TYPE_INTEGER, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET, EXPRESSION_TYPE_STRING }), (: function_object_percentage_liquid :) ); add_allowed_function("objectmatch", EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET, EXPRESSION_TYPE_STRING }), (: function_object_matching :) ); add_allowed_function("objectshort", EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET, ({ EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET, EXPRESSION_TYPE_STRING }), (: function_object_short :) ); add_allowed_function("contents", EXPRESSION_TYPE_OBJECT + EXPRESSION_TYPE_ARRAY_OFFSET, ({ EXPRESSION_TYPE_OBJECT }), (: function_contents :) ); } /* create() */