MediaWiki:ClassMasteryData.js: Difference between revisions

From EQOA Sandstorm Wiki
Jump to navigationJump to search
No edit summary
No edit summary
 
(7 intermediate revisions by the same user not shown)
Line 62: Line 62:
         var index = headers.indexOf(name);
         var index = headers.indexOf(name);
         return index === -1 ? "" : (row[index] || "").trim();
         return index === -1 ? "" : (row[index] || "").trim();
    }
    function getAll(row, name) {
        var values = [];
        headers.forEach(function (header, index) {
            if (header === name && row[index]) {
                values.push(String(row[index]).trim());
            }
        });
        return values;
     }
     }


Line 71: Line 83:
     window.EQOA_CM_DATA.masteries = lines.slice(1).map(function (line) {
     window.EQOA_CM_DATA.masteries = lines.slice(1).map(function (line) {
         var row = line.split("\t");
         var row = line.split("\t");
        var reqValues = []
            .concat(getAll(row, "CM Req 1"))
            .concat(getAll(row, "CM Req 2"))
            .concat(getAll(row, "CM Req 3"))
            .concat(getAll(row, "CM Req 4"));
        var reqNames = reqValues.filter(function (value) {
            if (!value) return false;
            /* removes ID-style requirements like 0001, 00DA, etc */
            if (/^[0-9A-F]{4}$/i.test(value)) return false;
            return true;
        });


         return {
         return {
Line 79: Line 106:
             races: splitCodes(get(row, "Race")),
             races: splitCodes(get(row, "Race")),
             archetype: get(row, "Archetype"),
             archetype: get(row, "Archetype"),
lycanthropy: get(row, "Lycanthropy"),
             classes: splitCodes(get(row, "Class")),
             classes: splitCodes(get(row, "Class")),
             level: parseInt(get(row, "Level"), 10) || 0,
             level: parseInt(get(row, "Level"), 10) || 0,
             points: parseInt(get(row, "Points"), 10) || 0,
             points: parseInt(get(row, "Points"), 10) || 0,
             cmSpentReq: parseInt(get(row, "CM Spent Req"), 10) || 0,
             cmSpentReq: parseInt(get(row, "CM Spent Req"), 10) || 0,
             req1: get(row, "CM Req 1"),
             requirements: reqNames,
            req2: get(row, "CM Req 2"),
 
            req3: get(row, "CM Req 3"),
stats: {
            req4: get(row, "CM Req 4")
    ac: parseInt(get(row, "AC"), 10) || 0,
    str: parseInt(get(row, "STR"), 10) || 0,
    sta: parseInt(get(row, "STA"), 10) || 0,
    agi: parseInt(get(row, "AGI"), 10) || 0,
    dex: parseInt(get(row, "DEX"), 10) || 0,
    wis: parseInt(get(row, "WIS"), 10) || 0,
    int: parseInt(get(row, "INT"), 10) || 0,
    cha: parseInt(get(row, "CHA"), 10) || 0,
    hp: parseInt(get(row, "HP Max"), 10) || 0,
    pow: parseInt(get(row, "PWR Max"), 10) || 0,
    hot: parseInt(get(row, "HoT"), 10) || 0,
    pot: parseInt(get(row, "PoT"), 10) || 0,
    ar: parseInt(get(row, "AR"), 10) || 0,
    cr: parseInt(get(row, "CR"), 10) || 0,
    lr: parseInt(get(row, "LR"), 10) || 0,
    fr: parseInt(get(row, "FR"), 10) || 0,
    pr: parseInt(get(row, "PR"), 10) || 0,
    dr: parseInt(get(row, "DR"), 10) || 0,
    strMax: parseInt(get(row, "STR Max"), 10) || 0,
    staMax: parseInt(get(row, "STA Max"), 10) || 0,
    agiMax: parseInt(get(row, "AGI Max"), 10) || 0,
    dexMax: parseInt(get(row, "DEX Max"), 10) || 0,
    wisMax: parseInt(get(row, "WIS Max"), 10) || 0,
    intMax: parseInt(get(row, "INT Max"), 10) || 0,
    chaMax: parseInt(get(row, "CHA Max"), 10) || 0,
    hpFactor: parseInt(get(row, "HP Factor"), 10) || 0,
    offMod: parseInt(get(row, "OFF Mod"), 10) || 0,
    defMod: parseInt(get(row, "DEF Mod"), 10) || 0,
    speed: parseInt(get(row, "Speed"), 10) || 0
},
 
spellsAdded: [
    get(row, "=+Spell 1"),
    get(row, "=+Spell 2"),
    get(row, "=+Spell 3"),
    get(row, "=+Spell 4"),
    get(row, "=+Spell 5"),
    get(row, "=+Spell 6")
].filter(Boolean),
 
spellsRemoved: [
    get(row, "-Spell 1"),
    get(row, "-Spell 2"),
    get(row, "-Spell 3"),
    get(row, "-Spell 4"),
    get(row, "-Spell 5"),
    get(row, "-Spell 6")
].filter(Boolean)
         };
         };
     }).filter(function (cm) {
     }).filter(function (cm) {
Line 92: Line 167:
     });
     });
})();
})();
var masteryNames = {};
window.EQOA_CM_DATA.masteries.forEach(function (cm) {
    masteryNames[cm.name] = true;
});
window.EQOA_CM_DATA.masteries.forEach(function (cm) {
    var sourceLine = lines.find(function (line) {
        return line.indexOf(cm.name + "\t") === 0;
    });
    if (!sourceLine) return;
    var cells = sourceLine.split("\t");
    cm.requirements = cells.filter(function (cell) {
        cell = String(cell || "").trim();
        return (
            cell &&
            cell !== cm.name &&
            masteryNames[cell]
        );
    });
});

Latest revision as of 19:34, 14 May 2026

window.EQOA_CM_DATA = {
    classes: {
        WAR: "Warrior",
        PAL: "Paladin",
        SK: "Shadowknight",
        RGE: "Rogue",
        BRD: "Bard",
        RAN: "Ranger",
        MNK: "Monk",
        CL: "Cleric",
        DRD: "Druid",
        SHA: "Shaman",
        NEC: "Necromancer",
        MAG: "Magician",
        ENC: "Enchanter",
        WIZ: "Wizard",
        ALC: "Alchemist"
    },

    raceClasses: {
        Human: ["WAR", "PAL", "RGE", "BRD", "RAN", "MNK", "CL", "DRD", "NEC", "MAG", "ENC", "WIZ", "ALC"],
        Elf: ["WAR", "PAL", "RGE", "BRD", "RAN", "CL", "DRD", "MAG", "ENC", "WIZ"],
        DarkElf: ["WAR", "SK", "RGE", "CL", "NEC", "MAG", "ENC", "WIZ", "ALC"],
        Gnome: ["WAR", "RGE", "CL", "NEC", "MAG", "ENC", "WIZ", "ALC"],
        Dwarf: ["WAR", "PAL", "RGE", "CL"],
        Halfling: ["WAR", "RGE", "RAN", "DRD"],
        Troll: ["WAR", "SK", "RGE", "SHA"],
        Ogre: ["WAR", "SK", "SHA", "ALC"],
        Erudite: ["PAL", "CL", "NEC", "MAG", "ENC", "WIZ", "ALC"],
        Barbarian: ["WAR", "RGE", "RAN", "SHA", "ALC"]
    },

    raceCodes: {
        Human: "HUM",
        Elf: "ELF",
        DarkElf: "DELF",
        Gnome: "GNO",
        Dwarf: "DWF",
        Halfling: "HLF",
        Troll: "TRL",
        Ogre: "OGR",
        Erudite: "ERU",
        Barbarian: "BAR"
    },

    maxLevel: 60,
    cmPerLevel: 25,
    masteries: []
};

(function () {
    if (!window.EQOA_CM_RAW) return;

    var lines = window.EQOA_CM_RAW.trim().split(/\r?\n/);
    if (lines.length < 2) return;

    var headers = lines[0].split("\t").map(function (h) {
        return h.trim();
    });

    function get(row, name) {
        var index = headers.indexOf(name);
        return index === -1 ? "" : (row[index] || "").trim();
    }

    function getAll(row, name) {
        var values = [];

        headers.forEach(function (header, index) {
            if (header === name && row[index]) {
                values.push(String(row[index]).trim());
            }
        });

        return values;
    }

    function splitCodes(value) {
        if (!value) return [];
        return value.split(/\s+/).filter(Boolean);
    }

    window.EQOA_CM_DATA.masteries = lines.slice(1).map(function (line) {
        var row = line.split("\t");

        var reqValues = []
            .concat(getAll(row, "CM Req 1"))
            .concat(getAll(row, "CM Req 2"))
            .concat(getAll(row, "CM Req 3"))
            .concat(getAll(row, "CM Req 4"));

        var reqNames = reqValues.filter(function (value) {
            if (!value) return false;

            /* removes ID-style requirements like 0001, 00DA, etc */
            if (/^[0-9A-F]{4}$/i.test(value)) return false;

            return true;
        });

        return {
            name: get(row, "Mastery"),
            description: get(row, "Description"),
            classification: get(row, "Classification"),
            subCategory: get(row, "Sub-Category"),
            races: splitCodes(get(row, "Race")),
            archetype: get(row, "Archetype"),
lycanthropy: get(row, "Lycanthropy"),
            classes: splitCodes(get(row, "Class")),
            level: parseInt(get(row, "Level"), 10) || 0,
            points: parseInt(get(row, "Points"), 10) || 0,
            cmSpentReq: parseInt(get(row, "CM Spent Req"), 10) || 0,
            requirements: reqNames,

stats: {
    ac: parseInt(get(row, "AC"), 10) || 0,
    str: parseInt(get(row, "STR"), 10) || 0,
    sta: parseInt(get(row, "STA"), 10) || 0,
    agi: parseInt(get(row, "AGI"), 10) || 0,
    dex: parseInt(get(row, "DEX"), 10) || 0,
    wis: parseInt(get(row, "WIS"), 10) || 0,
    int: parseInt(get(row, "INT"), 10) || 0,
    cha: parseInt(get(row, "CHA"), 10) || 0,
    hp: parseInt(get(row, "HP Max"), 10) || 0,
    pow: parseInt(get(row, "PWR Max"), 10) || 0,
    hot: parseInt(get(row, "HoT"), 10) || 0,
    pot: parseInt(get(row, "PoT"), 10) || 0,
    ar: parseInt(get(row, "AR"), 10) || 0,
    cr: parseInt(get(row, "CR"), 10) || 0,
    lr: parseInt(get(row, "LR"), 10) || 0,
    fr: parseInt(get(row, "FR"), 10) || 0,
    pr: parseInt(get(row, "PR"), 10) || 0,
    dr: parseInt(get(row, "DR"), 10) || 0,
    strMax: parseInt(get(row, "STR Max"), 10) || 0,
    staMax: parseInt(get(row, "STA Max"), 10) || 0,
    agiMax: parseInt(get(row, "AGI Max"), 10) || 0,
    dexMax: parseInt(get(row, "DEX Max"), 10) || 0,
    wisMax: parseInt(get(row, "WIS Max"), 10) || 0,
    intMax: parseInt(get(row, "INT Max"), 10) || 0,
    chaMax: parseInt(get(row, "CHA Max"), 10) || 0,
    hpFactor: parseInt(get(row, "HP Factor"), 10) || 0,
    offMod: parseInt(get(row, "OFF Mod"), 10) || 0,
    defMod: parseInt(get(row, "DEF Mod"), 10) || 0,
    speed: parseInt(get(row, "Speed"), 10) || 0
},

spellsAdded: [
    get(row, "=+Spell 1"),
    get(row, "=+Spell 2"),
    get(row, "=+Spell 3"),
    get(row, "=+Spell 4"),
    get(row, "=+Spell 5"),
    get(row, "=+Spell 6")
].filter(Boolean),

spellsRemoved: [
    get(row, "-Spell 1"),
    get(row, "-Spell 2"),
    get(row, "-Spell 3"),
    get(row, "-Spell 4"),
    get(row, "-Spell 5"),
    get(row, "-Spell 6")
].filter(Boolean)
        };
    }).filter(function (cm) {
        return cm.name;
    });
})();

var masteryNames = {};

window.EQOA_CM_DATA.masteries.forEach(function (cm) {
    masteryNames[cm.name] = true;
});

window.EQOA_CM_DATA.masteries.forEach(function (cm) {
    var sourceLine = lines.find(function (line) {
        return line.indexOf(cm.name + "\t") === 0;
    });

    if (!sourceLine) return;

    var cells = sourceLine.split("\t");

    cm.requirements = cells.filter(function (cell) {
        cell = String(cell || "").trim();

        return (
            cell &&
            cell !== cm.name &&
            masteryNames[cell]
        );
    });
});