parent $misc object $has_settings var $root dbref 'has_settings var $root child_index 0 var $root fertile 1 var $root manager $has_settings var $root owned [$has_settings] var $root owners [$has_settings] var $root writable [] var $root readable ['parameters, 'methods, 'code] var $root inited 1 var $has_settings settings #[] var $has_settings setting_templates #[] method setting_templates (> .perms(sender()) <); return setting_templates || #[]; . method all_setting_templates var obj, tmpl, out; (> .perms(sender()) <); out = #[]; for obj in (.ancestors()) { tmpl = (| obj.setting_templates() |); if (tmpl) out = dict_add(out, obj, tmpl); if (obj == definer()) break; } return out; . method add_setting_template arg template, type; (> .perms(sender()) <); if (!setting_templates) setting_templates = #[]; if (type(template) != 'string) throw(~type, "Setting templates must be strings."); if (type(type) != 'symbol) throw(~type, "Setting data types must be symbols."); setting_templates = dict_add(setting_templates, template, type); . method del_setting_template arg template; (> .perms(sender()) <); if (setting_templates) { if (template in dict_keys(setting_templates)) setting_templates = dict_del(setting_templates, template); } . method set_setting arg flag, value; var template, objects, x, y, type; (> .perms(sender()) <); // is it a valid template? template = (| .setting_template(flag) |); if (!template) throw(~setting, ("Unknown setting \"" + flag) + "\"."); // make sure the value is submitted correctly. type = template[2]; switch (type) { case 'boolean: if (!(value in [1, 0])) throw(~type, ("Value must be boolean (+/-" + flag) + ")."); case 'integer: if (type(value) != 'integer) throw(~type, ("Value must be an integer (" + flag) + "=<integer>)."); case 'string: if (type(value) != 'string) throw(~type, ("Value must be a string (" + flag) + "=<string>)."); default: throw(~type, "Setting has an unknown type definition, IT'S BROKE."); } // incase they weren't initialized, initialize settings. if (!settings) settings = #[]; // Ok, set it... // for space concerns, if value is null remove the setting. if (((type == 'boolean) && (value == 0)) || ((type == 'string) && (value == ""))) { if ((| settings[template[1]] |)) return .unset_setting(template[1]); } settings = dict_add(settings, template[1], [type, value]); . method unset_setting arg template; (> .perms(sender()) <); if ((| settings[template] |)) settings = dict_del(settings, template); . method settings (> .perms(sender()) <); return settings || #[]; . method setting arg template; return (| (settings[template])[2] |) || 0; . method setting_template arg template; var templates, t, obj; (> .perms(sender()) <); for obj in (.ancestors()) { templates = (| obj.setting_templates() |); if (templates) { t = (| templates[template] |); if (t) return [template, t]; } if (obj == definer()) break; } return 0; .