MediaWiki:ClassMasteryData.js: Difference between revisions
From EQOA Sandstorm Wiki
Jump to navigationJump to search
RenodorDev (talk | contribs) (Created page with "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", "...") |
RenodorDev (talk | contribs) No edit summary |
||
| (8 intermediate revisions by the same user not shown) | |||
| Line 31: | Line 31: | ||
}, | }, | ||
raceCodes: { | |||
Human: "HUM", | |||
Elf: "ELF", | |||
DarkElf: "DELF", | |||
Gnome: "GNO", | |||
Dwarf: "DWF", | |||
Halfling: "HLF", | |||
Troll: "TRL", | |||
Ogre: "OGR", | |||
Erudite: "ERU", | |||
Barbarian: "BAR" | |||
}, | |||
masteries: | 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] | |||
); | |||
}); | |||
}); | |||
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]
);
});
});