Greasy Fork is available in English.

The West - Skills Calc

Calculates sum of skills obtained from items

Verzia zo dňa 2015-04-26 15:47:30 UTC. Pozri najnovšiu verziu.

// ==UserScript==
// @namespace		https://greasyfork.org/users/8637
// @name        	The West - Skills Calc
// @author      	neversleep1911
// @description		Calculates sum of skills obtained from items
// @include     	http://*.the-west.*/game.php*
// @grant       	none
// @version     	2.1.1
// @copyright		Copyright (c) 2015 neversleep1911 (full list of contributors/translators see here: https://greasyfork.org/scripts/7829)
// @license			MIT (http://opensource.org/licenses/MIT)
// ==/UserScript==

(function(func) {
    var script;
    script = document.createElement("script");
    script.setAttribute("type", "text/javascript");
    script.textContent = "(" + func.toString() + ")();";
    document.body.appendChild(script);
    document.body.removeChild(script);
})(function() {
    var Gui, I18n, SkillsCalc;
    I18n = function() {
        function I18n() {}
        var DEFAULT_LANGUAGE, STRINGS, language;
        DEFAULT_LANGUAGE = "en_US";
        STRINGS = {
            en_US: {
                dialogs: {
                    add_item: "Add item",
                    add_character_items: "Character's items"
                },
                groups: {
                    skills: "Skills",
                    items: "Items"
                },
                buttons: {
                    character: "Character",
                    add: "Add",
                    reset: "Reset"
                },
                checkboxes: {
                    show_bonus: "Show bonus",
                    show_skills: "Show my skills"
                },
                labels: {
                    level: "Level",
                    item_id: "Item ID",
                    character_name: "Character's name",
                    health: "Health"
                },
                tooltip: {
                    health: "Normal / Solder / Solder with bonus"
                },
                errors: {
                    player_not_found: "Player not found!"
                }
            },
            pl_PL: {
                dialogs: {
                    add_item: "Dodaj przedmiot",
                    add_character_items: "Przedmioty gracza"
                },
                groups: {
                    skills: "Umiejętności",
                    items: "Przedmioty"
                },
                buttons: {
                    character: "Gracz",
                    add: "Dodaj",
                    reset: "Reset"
                },
                checkboxes: {
                    show_bonus: "Pokaż bonus",
                    show_skills: "Pokaż moje umiejętności"
                },
                labels: {
                    level: "Level",
                    item_id: "ID przedmiotu",
                    character_name: "Nazwa gracza",
                    health: "Życie"
                },
                tooltip: {
                    health: "Normalny / Żołnierz / Żołnierz z bonusem"
                },
                errors: {
                    player_not_found: "Gracz nie znaleziony!"
                }
            },
            ru_RU: {
                dialogs: {
                    add_item: "Добавить предмет",
                    add_character_items: "Предметы персонажа"
                },
                groups: {
                    skills: "Навыки",
                    items: "Предметы"
                },
                buttons: {
                    character: "Персонаж",
                    add: "Добавить",
                    reset: "Сбросить"
                },
                checkboxes: {
                    show_bonus: "Показывать бонусы",
                    show_skills: "Показывать мои навыки"
                },
                labels: {
                    level: "Уровень",
                    item_id: "ID предмета",
                    character_name: "Имя персонажа",
                    health: "Здоровье"
                },
                tooltip: {
                    health: "Минимум / Солдат / Солдат с бонусом"
                },
                errors: {
                    player_not_found: "Игрок не найден!"
                }
            }
        };
        language = DEFAULT_LANGUAGE;
        I18n.language = function() {
            return language;
        };
        I18n.setLanguage = function(lang) {
            return language = STRINGS[lang] ? lang : DEFAULT_LANGUAGE;
        };
        I18n.tr = function(id) {
            var string;
            string = STRINGS[language];
            $(id.split(".")).each(function(k, v) {
                return (string = string[v]) !== void 0;
            });
            return string || id;
        };
        return I18n;
    }();
    Gui = function() {
        function Gui() {}
        Gui.createMenuButton = function(options) {
            var button;
            if (options == null) {
                options = {};
            }
            button = $("<div class='menulink' title='" + options.title + "' />");
            if (options.image) {
                button.css("background-image", "url(" + options.image + ")");
            }
            button.hover(function() {
                $(this).css("background-position", "-25px 0px");
                return true;
            }, function() {
                $(this).css("background-position", "0px 0px");
                return true;
            }).on("click", options.onclick);
            $("div#ui_menubar").append($('<div class="ui_menucontainer" />').append(button).append('<div class="menucontainer_bottom" />'));
            return button;
        };
        Gui.createGroup = function(options) {
            var content, group, scrollPane;
            if (options == null) {
                options = {};
            }
            group = new west.gui.Groupframe("", "<div />");
            if (options.css) {
                $(group.getMainDiv()).css(options.css);
            }
            content = $(".tw2gui_groupframe_content_pane div", group.getMainDiv()).first();
            if (options.title) {
                content.append($("<h2>" + options.title + "</h2><hr style='margin-top: 2px; margin-bottom: 4px;' />"));
            }
            if (options.scrollPane) {
                scrollPane = new west.gui.Scrollpane;
                if (options.scrollPane.css) {
                    $(scrollPane.getMainDiv()).css(options.scrollPane.css);
                }
                content.append(scrollPane.getMainDiv());
                group.scrollPane = scrollPane;
                group.appendToScrollContentPane = function(content) {
                    scrollPane.appendContent(content);
                    return group;
                };
            }
            return group;
        };
        Gui.createButton = function(options) {
            var button;
            if (options == null) {
                options = {};
            }
            button = new west.gui.Button(options.text);
            button.click(options.onclick);
            $(button.getMainDiv()).css(options.css);
            return button;
        };
        Gui.createCheckbox = function(options) {
            var checkbox;
            if (options == null) {
                options = {};
            }
            checkbox = new west.gui.Checkbox(options.text, "", options.onclick);
            $(checkbox.getMainDiv()).css(options.css);
            return checkbox;
        };
        Gui.createTextfield = function(options) {
            var field;
            if (options == null) {
                options = {};
            }
            field = new west.gui.Textfield;
            field.setSize(options.size);
            field.setLabel($("<span>" + options.label + "</span>"));
            if (options.value) {
                field.setValue(options.value);
            }
            if (options.css) {
                $(field.getMainDiv()).css(options.css);
            }
            return field;
        };
        return Gui;
    }();
    SkillsCalc = function() {
        function SkillsCalc() {
            var self;
            self = this;
            I18n.setLanguage(Game.locale);
            Gui.createMenuButton({
                title: SkillsCalc.NAME,
                image: this.MENU_BUTTON_IMAGE,
                onclick: function(e) {
                    self.createWindow();
                    e.preventDefault();
                    return false;
                }
            });
        }
        var ItemCalculator, Window;
        SkillsCalc.ID = "tw_skills_calc";
        SkillsCalc.NAME = "Skills Calc";
        SkillsCalc.AUTHOR = "neversleep1911";
        SkillsCalc.WEB_SITE = "https://greasyfork.org/scripts/7829";
        SkillsCalc.MIN_GAME_VERSION = "2.21";
        SkillsCalc.MAX_GAME_VERSION = Game.version.toString();
        SkillsCalc.prototype.MENU_BUTTON_IMAGE = "data:image/png;base64,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";
        SkillsCalc.prototype.windows = {};
        SkillsCalc.prototype.createWindow = function() {
            var self, wndId;
            self = this;
            while (true) {
                wndId = Math.ceil(Math.random() * 1024);
                if (!this.windows[wndId]) {
                    break;
                }
            }
            this.windows[wndId] = new Window({
                id: wndId,
                title: SkillsCalc.NAME,
                miniTitle: SkillsCalc.NAME
            });
            this.windows[wndId].onDestroy = function(wnd) {
                delete self.windows[wnd.id];
                return true;
            };
            return true;
        };
        Window = function() {
            function Window(options) {
                var self;
                self = this;
                this.images = {};
                this.items = {};
                this.calculator = new ItemCalculator;
                this.calculator.level = Character.level;
                this.id = options.id;
                this.wnd = wman.open("skills-calc-window-" + options.id, null, "noreload");
                this.wnd.setTitle(options.title);
                this.wnd.setMiniTitle(options.miniTitle);
                this.wnd.addEventListener("WINDOW_DESTROY", function() {
                    if (self.onDestroy) {
                        return self.onDestroy(self);
                    } else {
                        return true;
                    }
                });
                this.wnd.appendToContentPane((this.groupSkills = Gui.createGroup({
                    id: "skills",
                    title: I18n.tr("groups.skills"),
                    css: {
                        width: 402,
                        position: "absolute"
                    },
                    scrollPane: {
                        css: {
                            height: 264
                        }
                    }
                })).getMainDiv());
                this.wnd.appendToContentPane((this.groupItems = Gui.createGroup({
                    id: "items",
                    title: I18n.tr("groups.items"),
                    css: {
                        left: 400,
                        width: 294
                    },
                    scrollPane: {
                        css: {
                            height: 264
                        }
                    }
                })).getMainDiv());
                this.wnd.appendToContentPane(Gui.createButton({
                    text: I18n.tr("buttons.reset"),
                    css: {
                        left: 592,
                        top: 342,
                        position: "absolute"
                    },
                    onclick: function(button, data) {
                        return self.onButtonResetClick(button, data);
                    }
                }).getMainDiv());
                this.wnd.appendToContentPane(Gui.createButton({
                    text: I18n.tr("buttons.add"),
                    css: {
                        left: 490,
                        top: 342,
                        position: "absolute"
                    },
                    onclick: function(button, data) {
                        return self.onButtonAddClick(button, data);
                    }
                }).getMainDiv());
                this.wnd.appendToContentPane(Gui.createButton({
                    text: I18n.tr("buttons.character"),
                    css: {
                        left: 388,
                        top: 342,
                        position: "absolute"
                    },
                    onclick: function(button, data) {
                        return self.onButtonCharacterClick(button, data);
                    }
                }).getMainDiv());
                this.wnd.appendToContentPane((this.checkboxBonus = Gui.createCheckbox({
                    text: I18n.tr("checkboxes.show_bonus"),
                    css: {
                        left: 2,
                        top: 324,
                        position: "absolute"
                    },
                    onclick: function(state) {
                        return self.onCheckboxBonusClick(state);
                    }
                })).getMainDiv());
                this.wnd.appendToContentPane((this.checkboxSkills = Gui.createCheckbox({
                    text: I18n.tr("checkboxes.show_skills"),
                    css: {
                        left: 2,
                        top: 350,
                        position: "absolute"
                    },
                    onclick: function(state) {
                        return self.onCheckboxSkillsClick(state);
                    }
                })).getMainDiv());
                this.wnd.appendToContentPane((this.textfieldLevel = Gui.createTextfield({
                    size: 6,
                    label: I18n.tr("labels.level"),
                    value: this.calculator.level,
                    css: {
                        left: 180,
                        top: 320,
                        position: "absolute"
                    }
                })).getMainDiv());
                this.wnd.appendToContentPane(this.labelHealth = $("<span />").css({
                    position: "absolute",
                    left: 180,
                    top: 352
                }).attr("title", I18n.tr("tooltip.health")));
                this.textfieldLevel.onlyNumeric().getField().keyup(function(e) {
                    var level;
                    level = parseInt(self.textfieldLevel.getValue());
                    if (!isNaN(level) && level > 0) {
                        self.calculator.level = level;
                        self.recalc();
                        self.repaint();
                    }
                    return true;
                });
                this.initGroupSkills();
                this.initGroupItems();
            }
            Window.prototype.initGroupSkills = function() {
                var attr, attrs, div, img, j, l, len, len1, skill, skillType, skills;
                attrs = CharacterSkills.allAttrKeys;
                for (j = 0, len = attrs.length; j < len; j++) {
                    attr = attrs[j];
                    div = $('<div style="height: 41px;" />');
                    skills = CharacterSkills.skillKeys4Attr[attr];
                    for (l = 0, len1 = skills.length; l < len1; l++) {
                        skillType = skills[l];
                        skill = new Skill(skillType);
                        img = skill.getSkillImage();
                        img.removeAttr("class").css({
                            width: 72,
                            display: "inline-block",
                            "text-align": "center",
                            "font-weight": "bold",
                            "margin-left": 2
                        });
                        $("img.skillicon", img).removeAttr("class").css({
                            width: "100%"
                        });
                        $("span.skillpoints_label", img).attr("class", "skills-calc-skillpoints_label").css({
                            display: "inline-block",
                            position: "relative",
                            top: -16,
                            width: "100%",
                            height: 12,
                            color: "#ffffff",
                            "text-align": "center",
                            "font-size": "9pt",
                            "text-shadow": "1px 1px 1px rgb(0, 0, 0)",
                            "background-image": "url('/images/tw2gui/plusminus/plusminus_display_bg2.png')"
                        });
                        div.append(img);
                        this.images[skillType] = img.get(0);
                    }
                    this.groupSkills.appendToScrollContentPane(div);
                    this.groupSkills.appendToScrollContentPane($('<hr style="margin: 12px 0;" />'));
                }
                return true;
            };
            Window.prototype.initGroupItems = function() {
                var items, j, len, ref, slot;
                items = [];
                ref = Wear.slots;
                for (j = 0, len = ref.length; j < len; j++) {
                    slot = ref[j];
                    if (Wear.wear[slot]) {
                        items.push(Wear.wear[slot].obj);
                    }
                }
                this.addItems(items);
                return this.repaint();
            };
            Window.prototype.onButtonCharacterClick = function() {
                var content, dlg, ok, self, textfieldName;
                self = this;
                dlg = new west.gui.Dialog(I18n.tr("dialogs.add_character_items"));
                content = $("<div style='margin-top: 10px; text-align: center;'></div>");
                content.append((textfieldName = Gui.createTextfield({
                    size: 25,
                    label: I18n.tr("labels.character_name")
                })).getMainDiv());
                ok = function() {
                    var name;
                    if (!(name = $.trim(textfieldName.getValue()))) {
                        return false;
                    }
                    self.wnd.showLoader();
                    return Ajax.remoteCallMode("ranking", "get_data", {
                        rank: NaN,
                        search: name = name.toLowerCase(),
                        tab: "duels"
                    }, function(json) {
                        var found, j, len, player, ref;
                        if (json.error) {
                            self.wnd.hideLoader();
                            return (new UserMessage(json.msg, UserMessage.TYPE_ERROR)).show();
                        }
                        found = false;
                        ref = json.ranking;
                        for (j = 0, len = ref.length; j < len; j++) {
                            player = ref[j];
                            found = player.name.toLowerCase() === name;
                            if (found) {
                                Ajax.remoteCallMode("profile", "init", {
                                    name: player.name,
                                    playerId: player.id
                                }, function(resp) {
                                    var items, l, len1, ref1, slot;
                                    if (resp.error) {
                                        self.wnd.hideLoader();
                                        return (new UserMessage(resp.message, UserMessage.TYPE_ERROR)).show();
                                    } else {
                                        items = [];
                                        ref1 = Wear.slots;
                                        for (l = 0, len1 = ref1.length; l < len1; l++) {
                                            slot = ref1[l];
                                            if (resp.wear[slot]) {
                                                items.push(ItemManager.get(resp.wear[slot]));
                                            }
                                        }
                                        self.reset();
                                        self.calculator.level = resp.level;
                                        self.textfieldLevel.setValue(resp.level);
                                        self.addItems(items);
                                        self.repaint();
                                        self.wnd.hideLoader();
                                    }
                                    return true;
                                });
                                break;
                            }
                        }
                        if (!found) {
                            self.wnd.hideLoader();
                            (new UserMessage(I18n.tr("errors.player_not_found"), UserMessage.TYPE_ERROR)).show();
                        }
                        return true;
                    });
                };
                textfieldName.getField().keypress(function(e) {
                    if (e.which === 13 && ok()) {
                        dlg.hide();
                    }
                    return true;
                });
                dlg.setText(content).addButton("ok", ok).addButton("cancel").show();
                textfieldName.getField().focus();
                return true;
            };
            Window.prototype.onButtonAddClick = function() {
                var content, dlg, ok, self, textfieldId;
                self = this;
                dlg = new west.gui.Dialog(I18n.tr("dialogs.add_item"));
                content = $('<div style="margin-top: 10px; text-align: center;"><div id="skills-calc-preview-item" style="height: 60px; width: 60px; float: right; border: 1px solid black; border-radius: 4px;" /></div>');
                content.append((textfieldId = Gui.createTextfield({
                    size: 25,
                    label: I18n.tr("labels.item_id")
                })).maxlength(8).getMainDiv());
                textfieldId.getItem = function() {
                    var id;
                    id = parseInt(this.getValue());
                    if (isNaN(id)) {
                        return void 0;
                    } else {
                        return ItemManager.get(id);
                    }
                };
                ok = function() {
                    var item;
                    if (item = textfieldId.getItem()) {
                        self.addItems([ item ]);
                        self.repaint();
                        return true;
                    } else {
                        return false;
                    }
                };
                dlg.setText(content).addButton("ok", ok).addButton("cancel").show();
                textfieldId.getField().keypress(function(e) {
                    if (e.which === 13 && ok()) {
                        dlg.hide();
                    }
                    return true;
                }).keyup(function(e) {
                    var item, preview;
                    preview = $("#skills-calc-preview-item", content).empty();
                    if (item = textfieldId.getItem()) {
                        item = new tw2widget.InventoryItem(item);
                        preview.append($(item.getMainDiv()).css({
                            "float": "none"
                        }));
                    }
                    return true;
                }).focus();
                return true;
            };
            Window.prototype.onButtonResetClick = function() {
                return this.reset();
            };
            Window.prototype.onCheckboxBonusClick = function(state) {
                return this.repaint();
            };
            Window.prototype.onCheckboxSkillsClick = function(state) {
                this.recalc();
                return this.repaint();
            };
            Window.prototype.addItems = function(items) {
                var item, j, len, self;
                self = this;
                for (j = 0, len = items.length; j < len; j++) {
                    item = items[j];
                    this.removeItem(item);
                    this.items[item.type] = new tw2widget.InventoryItem(item);
                    $(this.items[item.type].getMainDiv()).css({
                        "float": "none",
                        display: "inline-block"
                    }).on("click", function(e) {
                        if (!e.shiftKey) {
                            item = ItemManager.get($(e.target).data("itemId"));
                            if (item && self.removeItem(item)) {
                                self.repaint();
                            }
                        }
                        return true;
                    });
                    this.calculator.sumItem(item);
                    this.groupItems.appendToScrollContentPane($(this.items[item.type].getMainDiv()));
                }
                return true;
            };
            Window.prototype.removeItem = function(item) {
                if (this.items[item.type]) {
                    this.calculator.subItem(this.items[item.type].obj);
                    $(this.items[item.type].getMainDiv()).remove();
                    delete this.items[item.type];
                    return true;
                } else {
                    return false;
                }
            };
            Window.prototype.recalc = function() {
                var item, ref, ref1, skill, type, value;
                this.calculator.reset();
                ref = this.items;
                for (type in ref) {
                    item = ref[type];
                    this.calculator.sumItem(item.obj);
                }
                if (this.checkboxSkills.isSelected()) {
                    ref1 = CharacterSkills.skills;
                    for (skill in ref1) {
                        value = ref1[skill];
                        this.calculator.calcSkill(skill, value.points, ItemCalculator.SUM_OP);
                    }
                }
                return true;
            };
            Window.prototype.repaint = function() {
                var health, min_health, result, skill, value;
                result = this.checkboxBonus.isSelected() ? this.calculator.resultWithBonus() : this.calculator.result;
                for (skill in result) {
                    value = result[skill];
                    if (this.images[skill]) {
                        $("span.skills-calc-skillpoints_label", this.images[skill]).text(value);
                    }
                }
                min_health = this.calculator.level * 10 + 90;
                health = {
                    normal: format_number(min_health + result.health * 10),
                    solder: format_number(min_health + result.health * 15),
                    solderBonus: format_number(min_health + result.health * 20),
                    toString: function() {
                        return this.normal + " / " + this.solder + " / " + this.solderBonus;
                    }
                };
                this.labelHealth.text(I18n.tr("labels.health") + ": " + health.toString());
                return true;
            };
            Window.prototype.reset = function() {
                var item, ref, type;
                ref = this.items;
                for (type in ref) {
                    item = ref[type];
                    $(item.getMainDiv()).remove();
                }
                $("span.skills-calc-skillpoints_label", this.groupSkills.getMainDiv()).text("0");
                this.items = {};
                this.calculator.reset();
                this.calculator.level = Character.level;
                this.textfieldLevel.setValue(Character.level);
                this.labelHealth.text(I18n.tr("labels.health") + ": 0 / 0 / 0");
                this.checkboxBonus.setSelected(false, true);
                this.checkboxSkills.setSelected(false, true);
                return true;
            };
            return Window;
        }();
        ItemCalculator = function() {
            function ItemCalculator() {
                this.level = 1;
                this._bonusExtractor = new west.item.BonusExtractor({
                    level: this.level
                });
                this._resultStack = [];
                this.reset();
            }
            ItemCalculator.SUM_OP = "sum";
            ItemCalculator.SUB_OP = "sub";
            ItemCalculator.prototype.sum = function(skill, value) {
                return this.result[skill] += value;
            };
            ItemCalculator.prototype.sub = function(skill, value) {
                return this.result[skill] -= value;
            };
            ItemCalculator.prototype.sumItem = function(item) {
                return this.calcItem(item, ItemCalculator.SUM_OP);
            };
            ItemCalculator.prototype.subItem = function(item) {
                return this.calcItem(item, ItemCalculator.SUB_OP);
            };
            ItemCalculator.prototype.calcItem = function(item, operator) {
                if (item.bonus.attributes) {
                    this.calcAttributes(item.bonus.attributes, operator);
                }
                if (item.bonus.skills) {
                    this.calcSkills(item.bonus.skills, operator);
                }
                if (item.bonus.item) {
                    this.calcBonuses(item.bonus.item, operator);
                }
                if (item.item_level > 0) {
                    this.calcDifference(item.bonus.item, item.item_level, operator);
                }
                if (item.set) {
                    this.calcSet(item.set, operator);
                }
                return this.result;
            };
            ItemCalculator.prototype.calcAttribute = function(attr, value, operator) {
                var j, len, skill, skills;
                skills = CharacterSkills.skillKeys4Attr[attr];
                for (j = 0, len = skills.length; j < len; j++) {
                    skill = skills[j];
                    this[operator](skill, value);
                }
                return this.result;
            };
            ItemCalculator.prototype.calcAttributes = function(attrs, operator) {
                var attr, value;
                for (attr in attrs) {
                    value = attrs[attr];
                    if (this.isAttribute(attr)) {
                        this.calcAttribute(attr, value, operator);
                    }
                }
                return this.result;
            };
            ItemCalculator.prototype.calcSkill = function(skill, value, operator) {
                return this[operator](skill, value);
            };
            ItemCalculator.prototype.calcSkills = function(skills, operator) {
                var skill, value;
                for (skill in skills) {
                    value = skills[skill];
                    if (this.isSkill(skill)) {
                        this.calcSkill(skill, value, operator);
                    }
                }
                return this.result;
            };
            ItemCalculator.prototype.calcDifference = function(bonuses, itemLevel, operator) {
                var bonus, diff, j, len;
                for (j = 0, len = bonuses.length; j < len; j++) {
                    bonus = bonuses[j];
                    diff = this._bonusExtractor.getCharacterItemValueDifferenceToItemLevel(bonus, 0, itemLevel);
                    if (diff <= 0) {
                        continue;
                    }
                    switch (bonus.bonus.type) {
                      case "attribute":
                        this.calcAttribute(bonus.bonus.name, diff, operator);
                        break;
                      case "skill":
                        this.calcSkill(bonus.bonus.name, diff, operator);
                    }
                }
                return this.result;
            };
            ItemCalculator.prototype.calcBonuses = function(bonuses, operator) {
                var bonus, j, len;
                this._bonusExtractor.character.level = this.level;
                for (j = 0, len = bonuses.length; j < len; j++) {
                    bonus = bonuses[j];
                    this.calcSkills(this._bonusExtractor.getAffectedSkills(bonus), operator);
                }
                return this.result;
            };
            ItemCalculator.prototype.calcSet = function(set, operator) {
                switch (operator) {
                  case ItemCalculator.SUM_OP:
                    this.itemSets[set] = (this.itemSets[set] || 0) + 1;
                    break;
                  case ItemCalculator.SUB_OP:
                    if (this.itemSets[set] && (this.itemSets[set] -= 1) <= 0) {
                        delete this.itemSets[set];
                    }
                }
                return this.result;
            };
            ItemCalculator.prototype.isAttribute = function(attr) {
                return CharacterSkills.allAttrKeys.indexOf(attr) !== -1;
            };
            ItemCalculator.prototype.isSkill = function(skill) {
                return CharacterSkills.allSkillKeys.indexOf(skill) !== -1;
            };
            ItemCalculator.prototype.reset = function() {
                var j, len, ref, skill;
                this.itemSets = {};
                this.result = {};
                ref = CharacterSkills.allSkillKeys;
                for (j = 0, len = ref.length; j < len; j++) {
                    skill = ref[j];
                    this.result[skill] = 0;
                }
                return this.result;
            };
            ItemCalculator.prototype.resultWithBonus = function() {
                var b, bonus, cb, found, i, itemCount, itemSet, j, l, len, len1, len2, m, n, name1, name2, ref, ref1, ref2, ref3, result, setId, stage, value;
                this.pushResult();
                this._bonusExtractor.level = this.level;
                bonus = {};
                ref = this.itemSets;
                for (setId in ref) {
                    itemCount = ref[setId];
                    itemSet = west.storage.ItemSetManager.get(setId);
                    for (i = j = 1, ref1 = itemCount; 1 <= ref1 ? j <= ref1 : j >= ref1; i = 1 <= ref1 ? ++j : --j) {
                        stage = itemSet.bonus[i];
                        if (stage) {
                            for (l = 0, len = stage.length; l < len; l++) {
                                b = stage[l];
                                switch (b.type) {
                                  case "attribute":
                                  case "skill":
                                    bonus[name1 = b.type] || (bonus[name1] = {});
                                    bonus[b.type][b.name] = (bonus[b.type][b.name] || 0) + b.value;
                                    break;
                                  case "character":
                                    bonus[name2 = b.type] || (bonus[name2] = []);
                                    found = false;
                                    ref2 = bonus[b.type];
                                    for (i = m = 0, len1 = ref2.length; m < len1; i = ++m) {
                                        cb = ref2[i];
                                        found = cb.type === b.bonus.type && cb.name === b.bonus.name && cb.key === b.key && cb.roundingMethod === b.roundingMethod;
                                        if (found) {
                                            bonus[b.type][i].value += b.bonus.value;
                                            break;
                                        }
                                    }
                                    if (!found) {
                                        bonus[b.type].push({
                                            type: b.bonus.type,
                                            name: b.bonus.name,
                                            value: b.bonus.value,
                                            key: b.key,
                                            roundingMethod: b.roundingMethod
                                        });
                                    }
                                }
                            }
                        }
                    }
                }
                if (bonus.attribute) {
                    this.calcAttributes(bonus.attribute, ItemCalculator.SUM_OP);
                }
                if (bonus.skill) {
                    this.calcSkills(bonus.skill, ItemCalculator.SUM_OP);
                }
                if (bonus.character) {
                    ref3 = bonus.character;
                    for (n = 0, len2 = ref3.length; n < len2; n++) {
                        b = ref3[n];
                        if (b.key === "level") {
                            value = this._bonusExtractor.getRoundedValue(b.value * this.level, b.roundingMethod);
                            switch (b.type) {
                              case "attribute":
                                this.calcAttribute(b.name, value, ItemCalculator.SUM_OP);
                                break;
                              case "skill":
                                this.calcSkill(b.name, value, ItemCalculator.SUM_OP);
                            }
                        }
                    }
                }
                result = this.result;
                this.popResult();
                return result;
            };
            ItemCalculator.prototype.pushResult = function() {
                return this._resultStack.push($.extend(true, {}, this.result));
            };
            ItemCalculator.prototype.popResult = function() {
                return this.result = this._resultStack.pop();
            };
            return ItemCalculator;
        }();
        return SkillsCalc;
    }();
    $(document).ready(function() {
        var api, calc;
        api = TheWestApi.register(SkillsCalc.ID, SkillsCalc.NAME, SkillsCalc.MIN_GAME_VERSION, SkillsCalc.MAX_GAME_VERSION, SkillsCalc.AUTHOR, SkillsCalc.WEB_SITE);
        api.setGui("Copyrights, changelog and other details see <a href='" + SkillsCalc.WEB_SITE + "' target='_blank'>here</a>.");
        calc = null;
        EventHandler.listen([ "itemmanager_loaded", "itemsetmanager_loaded" ], function() {
            if (calc === null && ItemManager.isLoaded() && west.storage.ItemSetManager.isLoaded()) {
                calc = new SkillsCalc;
            }
            return EventHandler.ONE_TIME_EVENT;
        });
        return true;
    });
    return true;
});