No documentation subpage (
/doc) found for this module.const Utils = await require("Utils");
const Game = await require("TEST/Game");
const { latest: latestVersion } = requireData("TEST/Versions");
const { TooltipBuilder } = await require("TEST/Tooltip_Builder");
async function renderTable(items, type = "weapon", version) {
let wikitext = "";
let tooltips = "";
const versionTooltip = new TooltipBuilder(`Equipment:Table:${type}:Version:${version.replace(/\./g, '_')}`);
versionTooltip.addLine(`Data version: '''${version}''' <span class="${version === latestVersion ? 'latest' : 'outdated'}">(${version === latestVersion ? 'latest' : 'outdated'})</span>`);
const filteredItems = type === null ? items : Utils.sortObject(Utils.filterObjectByProperty(items, 'type', type), (a, b) => {
// Sort by level requirement, then by name
const levelA = a.requirements.level || 0;
const levelB = b.requirements.level || 0;
if (levelA !== levelB) {
return levelA - levelB;
}
const nameA = a.name || '';
const nameB = b.name || '';
return nameA.localeCompare(nameB);
});
if (Object.keys(filteredItems).length === 0 && type !== null) {
return `''No equipment of type '''${type}''' found in data version ${version}.''`;
}
if (type == "weapon") {
wikitext += '{| class="wiki-table" style="width: auto;"\n';
wikitext += `! colspan=5 | Version: ${Game.versionCode(version, versionTooltip)}\n`;
wikitext += '|-\n';
wikitext += '! Name !! Level !! Rarity !! Element !! Base Damage\n';
for (const id in filteredItems) {
const item = filteredItems[id];
wikitext += '|-\n';
const tooltipId = `Equipment:${type}:Table:${id}`;
// Name
wikitext += `| data-tooltip-id="${tooltipId}" | [[Equipment/${item.name || id}|${item.name || id}]]\n`;
// Level
wikitext += `| ${item.requirements.level || 'Unknown'}\n`;
// Rarity
wikitext += `| ${Game.wikiRarity(item.rarity)}\n`;
// Element
wikitext += `| ${item.element || 'Normal'}\n`;
// Base Damage
wikitext += `| ${item.damage.min || '0'} - ${item.damage.max || '0'}\n`;
// Add tooltip
const tooltip = new TooltipBuilder(tooltipId);
tooltip.addLine(`'''${item.name || id}'''`);
if (item.description) {
const lines = item.description.replace(/\n{2,}/g, "\n").split('\n');
for (const line of lines) {
tooltip.addLine(line.replace(/<color=(.*?)>(.*?)<\/color>/g, "<span style='color:$1;'>$2</span>"));
}
}
tooltips += tooltip.build();
}
} else if (type == "armor") {
const { data: classesData, version: classesVersion } = await Utils.resolveData("Classes", true);
wikitext += '{| class="wiki-table" style="width: auto;"\n';
wikitext += `! colspan=4 | Version: ${Game.versionCode(version, versionTooltip)}\n`;
wikitext += '|-\n';
wikitext += '! Name !! Level !! Rarity !! Class\n';
for (const id in filteredItems) {
const item = filteredItems[id];
wikitext += '|-\n';
const tooltipId = `Equipment:${type}:Table:${id}`;
// Name
wikitext += `| data-tooltip-id="${tooltipId}" | [[Equipment/${item.name || id}|${item.name || id}]]\n`;
// Level
wikitext += `| ${item.requirements.level || 'Unknown'}\n`;
// Rarity
wikitext += `| ${Game.wikiRarity(item.rarity)}\n`;
// Class
const className = Utils.findByProperty(classesData, 'guid', item.requirements.class)?.name;
wikitext += `| ${className ? "[[Classes/" + className + "|" + className + "]]" : "Any"}\n`;
// Add tooltip
const tooltip = new TooltipBuilder(tooltipId);
tooltip.addLine(`'''${item.name || id}'''`);
if (item.description) {
const lines = item.description.replace(/\n{2,}/g, "\n").split('\n');
for (const line of lines) {
tooltip.addLine(line.replace(/<color=(.*?)>(.*?)<\/color>/g, "<span style='color:$1;'>$2</span>"));
}
}
tooltips += tooltip.build();
}
} else if (type === null) { // Render a merged table of both weapons AND armors
const { data: classesData, version: classesVersion } = await Utils.resolveData("Classes", true);
wikitext += '{| class="wiki-table"\n';
wikitext += `! colspan=10 | Version: ${Game.versionCode(version, versionTooltip)}\n`;
wikitext += '|-\n';
wikitext += '! colspan=5 | Weapons !! !! colspan=4 | Armors\n';
wikitext += '|-\n';
wikitext += '! Name !! Level !! Rarity !! Element !! Base Damage !! !! Name !! Level !! Rarity !! Class\n';
const weapons = Utils.sortObject(Utils.filterObjectByProperty(filteredItems, 'type', 'weapon'), (a, b) => {
const levelA = a.requirements.level || 0;
const levelB = b.requirements.level || 0;
if (levelA !== levelB) {
return levelA - levelB;
}
const nameA = a.name || '';
const nameB = b.name || '';
return nameA.localeCompare(nameB);
});
const armors = Utils.sortObject(Utils.filterObjectByProperty(filteredItems, 'type', 'armor'), (a, b) => {
const levelA = a.requirements.level || 0;
const levelB = b.requirements.level || 0;
if (levelA !== levelB) {
return levelA - levelB;
}
const nameA = a.name || '';
const nameB = b.name || '';
return nameA.localeCompare(nameB);
});
const weaponKeys = Object.keys(weapons);
const armorKeys = Object.keys(armors);
const maxRows = Math.max(weaponKeys.length, armorKeys.length);
for (let i = 0; i < maxRows; i++) {
wikitext += '|-\n';
/* ===== WEAPON SIDE ===== */
if (weaponKeys[i]) {
const id = weaponKeys[i];
const item = weapons[id];
const tooltipId = `Equipment:weapon:Table:${id}`;
wikitext += `| data-tooltip-id="${tooltipId}" | [[Equipment/${item.name || id}|${item.name || id}]]\n`;
wikitext += `| ${item.requirements.level || 'Unknown'}\n`;
wikitext += `| ${Game.wikiRarity(item.rarity)}\n`;
wikitext += `| ${item.element || 'Normal'}\n`;
wikitext += `| ${item.damage.min || '0'} - ${item.damage.max || '0'}\n`;
const tooltip = new TooltipBuilder(tooltipId);
tooltip.addLine(`'''${item.name || id}'''`);
if (item.description) {
const lines = item.description.replace(/\n{2,}/g, "\n").split('\n');
for (const line of lines) {
tooltip.addLine(
line.replace(/<color=(.*?)>(.*?)<\/color>/g, "<span style='color:$1;'>$2</span>")
);
}
}
tooltips += tooltip.build();
} else {
wikitext += '| || || || ||\n';
}
/* ===== SEPARATOR COLUMN ===== */
wikitext += '|\n';
/* ===== ARMOR SIDE ===== */
if (armorKeys[i]) {
const id = armorKeys[i];
const item = armors[id];
const tooltipId = `Equipment:armor:Table:${id}`;
wikitext += `| data-tooltip-id="${tooltipId}" | [[Equipment/${item.name || id}|${item.name || id}]]\n`;
wikitext += `| ${item.requirements.level || 'Unknown'}\n`;
wikitext += `| ${Game.wikiRarity(item.rarity)}\n`;
const className = Utils.findByProperty(classesData, 'guid', item.requirements.class)?.name;
wikitext += `| ${className ? "[[Classes/" + className + "|" + className + "]]" : "Any"}\n`;
const tooltip = new TooltipBuilder(tooltipId);
tooltip.addLine(`'''${item.name || id}'''`);
if (item.description) {
const lines = item.description.replace(/\n{2,}/g, "\n").split('\n');
for (const line of lines) {
tooltip.addLine(
line.replace(/<color=(.*?)>(.*?)<\/color>/g, "<span style='color:$1;'>$2</span>")
);
}
}
tooltips += tooltip.build();
} else {
wikitext += '| || || ||\n';
}
}
} else return `''Equipment type '''${type}''' is not supported for table rendering.''`;
wikitext += '|}\n';
wikitext += tooltips;
return wikitext;
}
function renderNavbox(items, version) {
let wikitext = '';
const versionTooltip = new TooltipBuilder(`EquipmentItem:Navbox:Version:${version.replace(/\./g, '_')}`);
versionTooltip.addLine(`Data version: '''${version}''' <span class="${version === latestVersion ? 'latest' : 'outdated'}">(${version === latestVersion ? 'latest' : 'outdated'})</span>`);
wikitext += `{| class="wiki-table navbox"\n`;
wikitext += `! colspan=2 | Version: ${Game.versionCode(version, versionTooltip)}\n`;
wikitext += `|-\n`;
wikitext += `! colspan=2 | Equipment Navigation\n`;
const weaponsList = [];
const armorsList = [];
let tooltips = "";
for (const id in items) {
const item = items[id];
const tooltipId = item.type == "weapon" ? `EquipmentItem:Navbox:weapon:${id}` : `EquipmentItem:Navbox:armor:${id}`;
const span = `<span data-tooltip-id="${tooltipId}">[[Equipment/${item.name || id}|${item.name || id}]]</span>`;
if (item.type == "weapon") weaponsList.push(span);
else armorsList.push(span);
// Add tooltip
const tooltip = new TooltipBuilder(tooltipId);
tooltip.addLine(`'''${item.name || id}'''`);
if (item.description) {
const lines = item.description.replace(/\n{2,}/g, "\n").split('\n');
for (const line of lines) {
tooltip.addLine(line.replace(/<color=(.*?)>(.*?)<\/color>/g, "<span style='color:$1;'>$2</span>"));
}
}
tooltips += tooltip.build();
}
wikitext += `|-\n`;
wikitext += `! style="word-break: normal" | Weapons \n| ${weaponsList.join(' • ')}\n`;
wikitext += `|-\n`;
wikitext += `! Armor \n| ${armorsList.join(' • ')}\n`;
wikitext += `|}\n`;
wikitext += tooltips;
return wikitext;
}
async function TEST() {
const { data, version } = await Utils.resolveData("Equipment", true);
if (Utils.isModuleEmpty(data)) {
return '⚠️ Equipment data is unavailable for all known versions.';
}
const sortedData = Utils.sortObjectByKey(data);
return await renderTable(sortedData, null, version);
}
async function TEST_navbox() {
const { data, version } = await Utils.resolveData("Equipment", true);
if (Utils.isModuleEmpty(data)) {
return '⚠️ Equipment data is unavailable for all known versions.';
}
const sortedData = Utils.sortObjectByKey(data);
let output = '';
output += renderNavbox(sortedData, version);
return output;
};
exports = {
TEST,
TEST_navbox
}