/* Cygnus@Nightmare */ #include <balance.h> #include <std.h> inherit DAEMON; string path; int is_weapon; string short; string long; string name; string *id; string type; int ac, wc, value, weight; string wield_string; object wield_func_ob, hit_func_ob; int decay_rate; string read_msg; status check_weapon(object ob) { status error; int i; error = 0; if (member_array("std/weapon.c", deep_inherit_list(ob)) == -1) if (path != "/std/weapon") { write("Warning: " + file_name(ob) + " is not a subclass of /std/weapon.\n"); error = 1; } is_weapon = (int)ob->is_weapon(); if (!intp(is_weapon)) { write("Warning: is_weapon() did not return an int.\n"); error = 1; } else if (!is_weapon) { write("Warning: is_weapon() did not return true.\n"); error = 1; } name = (string)ob->query_name(); if (!stringp(name)) { write("Warning: query_name() did not return a string.\n"); error = 1; } id = (string *)ob->query_id(); if (!pointerp(id)) { write("Warning: query_id() did not return an array.\n"); error = 1; } else for (i = 0; i < sizeof(id); i++) if (!stringp(id[i])) { write("Warning: query_id() array member " + i + " is not a string.\n"); error = 1; } short = (string)ob->query_short(); if (!stringp(short)) { write("Warning: query_short() did not return a string.\n"); error = 1; } long = (string)ob->query_long(); if (!stringp(long)) { write("Warning: query_long() did not return a string.\n"); error = 1; } type = (string)ob->query_type(); if (!stringp(type)) { write("Warning: query_type() did not return a string.\n"); error = 1; } else if (member_array(type, WEAPON_TYPES) == -1) { write("Warning: query_type() returned unknown weapon " + "type: " + type + ".\n"); error = 1; } ac = (int)ob->query_ac(); if (!intp(ac)) { write("Warning: query_ac() did not return an int.\n"); error = 1; } else if (ac < WEAPON_MIN_AC[type] || ac > WEAPON_MAX_AC[type]) { write("Warning: query_ac() is not balanced.\n"); error = 1; } wc = (int)ob->query_wc(); if (!intp(wc)) { write("Warning: query_wc() did not return an int.\n"); error = 1; } else if (wc < WEAPON_MIN_WC[type] || wc > WEAPON_MAX_WC[type]) { write("Warning: query_wc() is not balanced.\n"); error = 1; } value = (int)ob->query_value(); if (!intp(value)) { write("Warning: query_value() did not return an int.\n"); error = 1; } else if (value < WEAPON_MIN_VALUE[type] || value > WEAPON_MAX_VALUE[type]) { write("Warning: query_value() is not balanced.\n"); error = 1; } weight = (int)ob->query_weight(); if (!intp(weight)) { write("Warning: query_weight() did not return an int.\n"); error = 1; } else if (weight < WEAPON_MIN_WEIGHT[type]) { write("Warning: query_weight() is not balanced.\n"); error = 1; } wield_string = (string)ob->query_wield_string(); wield_func_ob = (object)ob->query_wield_func(); if (objectp(wield_func_ob)) if (!stringp(function_exists("extra_wield", wield_func_ob))) { write("Warning: function \"extra_wield\" does not exist in " + " object " + file_name(wield_func_ob)); error = 1; } hit_func_ob = (object)ob->query_hit_func(); if (objectp(hit_func_ob)) if (!stringp(function_exists("extra_hit", hit_func_ob))) { write("Warning: function \"extra_hit\" does not exist in " + " object " + file_name(hit_func_ob)); error = 1; } decay_rate = (int)ob->query_decay_rate(); if (!intp(decay_rate)) { write("Warning: query_decay_rate() did not return an int.\n"); error = 1; } read_msg = (string)ob->query_read_msg(); return !error; } void print_weapon(object ob) { int i; write("User IDs: " + getuid(ob) + "/" + geteuid(ob) + "\n"); write("Name: " + name + "\n"); write("IDs:"); for (i = 0; i < sizeof(id); i++) write(" \"" + id[i] + "\""); write("\n"); write("Short:\n" + short + "\n"); write("Long:\n" + long + "\n"); write("Type: " + type + "\n"); write("Armour Class: " + ac + " "); write("Weapon Class: " + wc + " "); write("Value: " + value + ((int)ob->query_destroy() ? "*" : "") + " "); write("Weight: " + weight); write("\n"); if (stringp(wield_string)) write("Wield String:\n" + wield_string); if (objectp(wield_func_ob)) write("Wield Function: \"" + file_name(wield_func_ob) + "\"->extra_wield()\n"); if (objectp(hit_func_ob)) write("Hit Function: \"" + file_name(hit_func_ob) + "\"->extra_hit()\n"); write("Decay Rate: " + decay_rate + "\n"); if (stringp(read_msg)) write("Read Message:\n" + read_msg); } int cmd_wcheck(string weapon) { object ob; if (!stringp(weapon)) { notify_fail("usage: " + query_verb() + " <weapon-id>\n"); return 0; } ob = present(weapon, this_player()); if (!objectp(ob)) { notify_fail(query_verb() + ": \"" + weapon + "\" not present.\n"); return 0; } path = base_name(ob); write("Weapon Check for: " + path + "\n"); if (check_weapon(ob)) print_weapon(ob); return 1; } int help() { write( @EndText Syntax: wcheck <name> Effect: Balance command to check weapons. Checks the weapon called <name> in your inventory for weight, wc, etc See doc: /doc/QC/check.doc See also: acheck, rcheck EndText ); return 1; }