Equipment.js:修订间差异
来自卡厄思梦境WIKI
无编辑摘要 |
无编辑摘要 |
||
| 第1行: | 第1行: | ||
(function() { | (function() { | ||
'use strict'; | 'use strict'; | ||
// | // 装备管理器 | ||
var EquipmentManager = { | var EquipmentManager = { | ||
// 固定选项 | |||
areas: ['蓝壶', '双星之影', '雾之都市'], | |||
rarities: ['蓝', '金', '彩'], | |||
types: ['武器', '装甲', '戒指'], | |||
// 当前装备数据 | |||
equipmentData: {}, | |||
currentEditItem: null, | |||
// 初始化 | // 初始化 | ||
init: function() { | init: function() { | ||
this. | var container = document.getElementById('equipment-manager'); | ||
this. | if (!container) return; | ||
// 加载CSS | |||
mw.loader.load(['ext.gadget.Equipment-css']); | |||
this.loadEquipmentData(); | |||
this.render(); | |||
this.bindEvents(); | this.bindEvents(); | ||
}, | }, | ||
// | // 加载装备数据 | ||
loadEquipmentData: function() { | |||
var self = this; | var self = this; | ||
new mw.Api().get({ | new mw.Api().get({ | ||
action: ' | action: 'query', | ||
prop: 'revisions', | |||
titles: 'Module:装备/data', | |||
rvprop: 'content', | |||
format: 'json' | |||
}).done(function(data) { | }).done(function(data) { | ||
var pages = data.query.pages; | |||
for (var pageId in pages) { | |||
var content = pages[pageId].revisions[0]['*']; | |||
self.parseEquipmentData(content); | |||
} | } | ||
self.renderEquipmentList(); | |||
}); | }); | ||
}, | }, | ||
// | // 解析Lua数据 | ||
parseEquipmentData: function(luaContent) { | |||
var | var self = this; | ||
// 简单的Lua解析器,提取装备数据 | |||
this. | var regex = /equipment$$"([^"]+)"$$\s*=\s*\{([^}]+)\}/g; | ||
var match; | |||
while ((match = regex.exec(luaContent)) !== null) { | |||
var name = match[1]; | |||
var dataStr = match[2]; | |||
// 解析装备属性 | |||
var equipment = { | |||
name: name, | |||
id: this.extractValue(dataStr, 'id'), | |||
area: this.extractStringValue(dataStr, 'area'), | |||
rarity: this.extractStringValue(dataStr, 'rarity'), | |||
type: this.extractStringValue(dataStr, 'type'), | |||
tag: this.extractStringValue(dataStr, 'tag'), | |||
desc: this.extractDescArray(dataStr) | |||
}; | |||
self.equipmentData[name] = equipment; | |||
} | } | ||
}, | }, | ||
// | // 提取数值 | ||
extractValue: function(str, key) { | |||
var | var regex = new RegExp(key + '\\s*=\\s*(\\d+)'); | ||
var match = str.match(regex); | |||
return match ? parseInt(match[1]) : 0; | |||
}, | |||
// 提取字符串值 | |||
extractStringValue: function(str, key) { | |||
var regex = new RegExp(key + '\\s*=\\s*"([^"]+)"'); | |||
var match = str.match(regex); | |||
return match ? match[1] : ''; | |||
}, | }, | ||
// | // 提取描述数组 | ||
extractDescArray: function(str) { | |||
var | var descMatch = str.match(/desc\s*=\s*\{([^}]+)\}/); | ||
if (!descMatch) return []; | |||
var descStr = descMatch[1]; | |||
var descs = []; | |||
var regex = /"([^"]+)"/g; | |||
var match; | |||
while ((match = regex.exec(descStr)) !== null) { | |||
descs.push(match[1]); | |||
} | |||
return descs; | |||
}, | }, | ||
// | // 渲染界面 | ||
render: function() { | |||
var container = document.getElementById('equipment-manager'); | |||
'<div class=" | |||
var html = [ | |||
'<div class="equipment-container">', | |||
'</div>' | ' <div class="equipment-header">', | ||
'<div class=" | ' <h2>装备管理器</h2>', | ||
' <div class="equipment-actions">', | |||
'</div>' | ' </div>', | ||
'<div class=" | ' </div>', | ||
' <div class="equipment-form-container" style="display:none;">', | |||
' <h3 class="form-title">新增装备</h3>', | |||
' <div class="equipment-form">', | |||
' <div class="form-group">', | |||
' <label>装备名称:</label>', | |||
' <input type="text" class="form-input" id="equipment-name" />', | |||
' </div>', | |||
' <div class="form-group">', | |||
' <label>装备ID:</label>', | |||
'</div>' | ' <input type="number" class="form-input" id="equipment-id" />', | ||
'<div class=" | ' </div>', | ||
' <div class="form-group">', | |||
' <label>地区:</label>', | |||
' <div class="radio-group">', | |||
this.areas.map(function(area) { | |||
return '<label class="radio-label"><input type="radio" name="equipment-area" value="' + area + '" /> ' + area + '</label>'; | |||
}).join(''), | |||
' </div>', | |||
' </div>', | |||
' <div class="form-group">', | |||
'</div>' | ' <label>稀有度:</label>', | ||
'<div class=" | ' <div class="radio-group">', | ||
this.rarities.map(function(rarity) { | |||
return '<label class="radio-label"><input type="radio" name="equipment-rarity" value="' + rarity + '" /> ' + rarity + '</label>'; | |||
}).join(''), | |||
' </div>', | |||
' </div>', | |||
' <div class="form-group">', | |||
' <label>类型:</label>', | |||
' <div class="radio-group">', | |||
this.types.map(function(type) { | |||
'</div>' | return '<label class="radio-label"><input type="radio" name="equipment-type" value="' + type + '" /> ' + type + '</label>'; | ||
'<div class=" | }).join(''), | ||
' </div>', | |||
' </div>', | |||
'</div>' | ' <div class="form-group">', | ||
'<div class=" | ' <label>标签(用逗号分隔):</label>', | ||
' <input type="text" class="form-input" id="equipment-tag" placeholder="例如: 暴击率提升,获得信用点数" />', | |||
' </div>', | |||
'</div>' | ' <div class="form-group">', | ||
'<div class=" | ' <label>描述(每行一个等级):</label>', | ||
' <textarea class="form-textarea" id="equipment-desc" rows="5" placeholder="每行输入一个等级的描述"></textarea>', | |||
' </div>', | |||
'</ | ' <div class="form-actions">', | ||
' <a href="#" class="equipment-btn equipment-btn-save">保存</a>', | |||
' 取消</a>', | |||
' </div>', | |||
' </div>', | |||
' </div>', | |||
' <div class="equipment-list-container">', | |||
' <h3>装备列表</h3>', | |||
' <div class="equipment-filter">', | |||
' <input type="text" class="filter-input" id="equipment-search" placeholder="搜索装备..." />', | |||
' </div>', | |||
' <div class="equipment-list" id="equipment-list">', | |||
' <!-- 装备列表将在这里动态生成 -->', | |||
' </div>', | |||
' </div>', | |||
'</div>' | |||
].join(''); | |||
container.innerHTML = html; | |||
}, | }, | ||
// 渲染装备列表 | // 渲染装备列表 | ||
renderEquipmentList: function() { | renderEquipmentList: function() { | ||
var | var listContainer = document.getElementById('equipment-list'); | ||
if (!listContainer) return; | |||
var html = | var html = []; | ||
for (var name in this. | for (var name in this.equipmentData) { | ||
var equipment = this.equipmentData[name]; | |||
var | html.push(this.renderEquipmentItem(equipment)); | ||
html | |||
} | } | ||
html += '</div></div>' | listContainer.innerHTML = html.join(''); | ||
}, | |||
// 渲染单个装备项 | |||
renderEquipmentItem: function(equipment) { | |||
var imageUrl = '/images/' + equipment.id + '.png'; | |||
return [ | |||
'<div class="equipment-item" data-name="' + equipment.name + '">', | |||
' <div class="equipment-image">', | |||
' <img src="' + imageUrl + '" alt="' + equipment.name + '" onerror="this.src=\'/images/default-equipment.png\'" />', | |||
' </div>', | |||
' <div class="equipment-info">', | |||
' <div class="equipment-name">' + equipment.name + '</div>', | |||
' <div class="equipment-meta">', | |||
' <span class="equipment-rarity rarity-' + equipment.rarity + '">' + equipment.rarity + '</span>', | |||
' <span class="equipment-type">' + equipment.type + '</span>', | |||
' <span class="equipment-area">' + equipment.area + '</span>', | |||
' </div>', | |||
' <div class="equipment-tags">' + equipment.tag + '</div>', | |||
' </div>', | |||
' <div class="equipment-actions">', | |||
' 编辑', | |||
' 删除', | |||
' </div>', | |||
'</div>' | |||
].join(''); | |||
}, | }, | ||
| 第218行: | 第224行: | ||
// 新增按钮 | // 新增按钮 | ||
$(document).on('click', ' | $(document).on('click', '.equipment-btn-add', function(e) { | ||
self. | e.preventDefault(); | ||
self.showForm(); | |||
self.currentEditItem = null; | |||
}); | |||
// 保存按钮 | |||
$(document).on('click', '.equipment-btn-save', function(e) { | |||
e.preventDefault(); | |||
self.saveEquipment(); | |||
}); | |||
// 取消按钮 | |||
$(document).on('click', '.equipment-btn-cancel', function(e) { | |||
e.preventDefault(); | |||
self.hideForm(); | |||
}); | }); | ||
// 编辑按钮 | // 编辑按钮 | ||
$(document).on('click', '. | $(document).on('click', '.action-edit', function(e) { | ||
e.preventDefault(); | |||
var name = $(this).data('name'); | var name = $(this).data('name'); | ||
self. | self.editEquipment(name); | ||
}); | }); | ||
// 删除按钮 | // 删除按钮 | ||
$(document).on('click', '. | $(document).on('click', '.action-delete', function(e) { | ||
e.preventDefault(); | |||
var name = $(this).data('name'); | var name = $(this).data('name'); | ||
self.deleteEquipment(name); | self.deleteEquipment(name); | ||
}); | }); | ||
// | // 搜索框 | ||
$(document).on(' | $(document).on('input', '#equipment-search', function() { | ||
self. | self.filterEquipment($(this).val()); | ||
}); | }); | ||
}, | }, | ||
// | // 显示表单 | ||
showForm: function() { | |||
$('.equipment-form-container').slideDown(); | |||
this.clearForm(); | |||
}, | }, | ||
// | // 隐藏表单 | ||
hideForm: function() { | |||
$(' | $('.equipment-form-container').slideUp(); | ||
this. | this.clearForm(); | ||
}, | }, | ||
// 清空表单 | // 清空表单 | ||
clearForm: function() { | clearForm: function() { | ||
$(' | $('#equipment-name').val(''); | ||
$(' | $('#equipment-id').val(''); | ||
$(' | $('#equipment-tag').val(''); | ||
$(' | $('#equipment-desc').val(''); | ||
$(' | $('input[name="equipment-area"]').prop('checked', false); | ||
$('input[name="equipment-rarity"]').prop('checked', false); | |||
$('input[name="equipment-type"]').prop('checked', false); | |||
}, | }, | ||
// | // 编辑装备 | ||
editEquipment: function(name) { | |||
var | var equipment = this.equipmentData[name]; | ||
if (!equipment) return; | |||
this.currentEditItem = name; | |||
this.showForm(); | |||
$('.form-title').text('编辑装备'); | |||
$('#equipment-name').val(equipment.name); | |||
$('#equipment-id').val(equipment.id); | |||
$('#equipment-tag').val(equipment.tag); | |||
$('#equipment-desc').val(equipment.desc.join('\n')); | |||
$('input[name="equipment-area"][value="' + equipment.area + '"]').prop('checked', true); | |||
$('input[name="equipment-rarity"][value="' + equipment.rarity + '"]').prop('checked', true); | |||
$('input[name="equipment-type"][value="' + equipment.type + '"]').prop('checked', true); | |||
}, | |||
// 删除装备 | |||
deleteEquipment: function(name) { | |||
if (!confirm('确定要删除装备 "' + name + '" 吗?')) return; | |||
delete this.equipmentData[name]; | |||
this.saveLuaData(); | |||
this.renderEquipmentList(); | |||
}, | }, | ||
// 保存装备 | // 保存装备 | ||
saveEquipment: function() { | saveEquipment: function() { | ||
var | var name = $('#equipment-name').val().trim(); | ||
var | var id = $('#equipment-id').val(); | ||
var area = $('input[name="equipment-area"]:checked').val(); | |||
var rarity = $('input[name="equipment-rarity"]:checked').val(); | |||
var type = $('input[name="equipment-type"]:checked').val(); | |||
var tag = $('#equipment-tag').val().trim(); | |||
var desc = $('#equipment-desc').val().trim().split('\n').filter(function(d) { return d.trim(); }); | |||
if (!name || !id || !area || !rarity || !type) { | |||
if (! | alert('请填写所有必填字段'); | ||
return; | return; | ||
} | } | ||
var equipment = { | |||
var | name: name, | ||
id: parseInt(id), | |||
area: area, | |||
rarity: rarity, | |||
type: type, | |||
tag: tag, | |||
desc: desc | |||
}; | }; | ||
// 如果是编辑模式且名称改变了,需要删除旧的 | |||
if (this.currentEditItem && this.currentEditItem !== name) { | |||
delete this.equipmentData[this.currentEditItem]; | |||
// | |||
if (this. | |||
delete this. | |||
} | } | ||
this. | this.equipmentData[name] = equipment; | ||
this.saveLuaData(); | |||
this.hideForm(); | |||
this.renderEquipmentList(); | |||
this. | |||
}, | }, | ||
// | // 保存到Lua模块 | ||
saveLuaData: function() { | |||
var | var luaContent = this.generateLuaContent(); | ||
new mw.Api().postWithToken('csrf', { | |||
action: 'edit', | |||
} | title: 'Module:装备/data', | ||
text: luaContent, | |||
summary: '通过装备管理器更新装备数据', | |||
format: 'json' | |||
}).done(function() { | |||
mw.notify('装备数据已保存', { type: 'success' }); | |||
}).fail(function() { | |||
mw.notify('保存失败,请检查权限', { type: 'error' }); | |||
}); | |||
}, | }, | ||
// | // 生成Lua内容 | ||
generateLuaContent: function() { | |||
var | var lines = ['local equipment = {}', '']; | ||
for (var name in this.equipmentData) { | |||
var eq = this.equipmentData[name]; | |||
lines.push('equipment["' + name + '"] = {'); | |||
for (var | lines.push(' id = ' + eq.id + ','); | ||
var | lines.push(' area = "' + eq.area + '",'); | ||
lines.push(' rarity = "' + eq.rarity + '",'); | |||
lines.push(' type = "' + eq.type + '",'); | |||
lines.push(' tag = "' + eq.tag + '",'); | |||
lines.push(' desc = {'); | |||
eq.desc.forEach(function(desc, index) { | |||
var comma = index < eq.desc.length - 1 ? ',' : ''; | |||
lines.push(' "' + desc + '"' + comma); | |||
}); | |||
lines.push(' }'); | |||
lines.push('}'); | |||
lines.push(''); | |||
} | } | ||
lines.push('return equipment'); | |||
return lines.join('\n'); | |||
return | |||
}, | }, | ||
// | // 过滤装备 | ||
filterEquipment: function(searchText) { | |||
var | var items = document.querySelectorAll('.equipment-item'); | ||
var search = searchText.toLowerCase(); | |||
items.forEach(function(item) { | |||
var name = item.getAttribute('data-name').toLowerCase(); | |||
var info = item.textContent.toLowerCase(); | |||
if (name.indexOf(search) !== -1 || info.indexOf(search) !== -1) { | |||
item.style.display = ''; | |||
if ( | |||
} else { | } else { | ||
item.style.display = 'none'; | |||
} | } | ||
}); | }); | ||
} | } | ||
| 第507行: | 第413行: | ||
// 页面加载完成后初始化 | // 页面加载完成后初始化 | ||
$(function() { | $(function() { | ||
EquipmentManager.init(); | if (mw.config.get('wgPageName') === 'Equipment') { | ||
EquipmentManager.init(); | |||
} | |||
}); | }); | ||
})(); | })(); | ||
2025年10月17日 (五) 19:12的版本
(function() {
'use strict';
// 装备管理器
var EquipmentManager = {
// 固定选项
areas: ['蓝壶', '双星之影', '雾之都市'],
rarities: ['蓝', '金', '彩'],
types: ['武器', '装甲', '戒指'],
// 当前装备数据
equipmentData: {},
currentEditItem: null,
// 初始化
init: function() {
var container = document.getElementById('equipment-manager');
if (!container) return;
// 加载CSS
mw.loader.load(['ext.gadget.Equipment-css']);
this.loadEquipmentData();
this.render();
this.bindEvents();
},
// 加载装备数据
loadEquipmentData: function() {
var self = this;
new mw.Api().get({
action: 'query',
prop: 'revisions',
titles: 'Module:装备/data',
rvprop: 'content',
format: 'json'
}).done(function(data) {
var pages = data.query.pages;
for (var pageId in pages) {
var content = pages[pageId].revisions[0]['*'];
self.parseEquipmentData(content);
}
self.renderEquipmentList();
});
},
// 解析Lua数据
parseEquipmentData: function(luaContent) {
var self = this;
// 简单的Lua解析器,提取装备数据
var regex = /equipment$$"([^"]+)"$$\s*=\s*\{([^}]+)\}/g;
var match;
while ((match = regex.exec(luaContent)) !== null) {
var name = match[1];
var dataStr = match[2];
// 解析装备属性
var equipment = {
name: name,
id: this.extractValue(dataStr, 'id'),
area: this.extractStringValue(dataStr, 'area'),
rarity: this.extractStringValue(dataStr, 'rarity'),
type: this.extractStringValue(dataStr, 'type'),
tag: this.extractStringValue(dataStr, 'tag'),
desc: this.extractDescArray(dataStr)
};
self.equipmentData[name] = equipment;
}
},
// 提取数值
extractValue: function(str, key) {
var regex = new RegExp(key + '\\s*=\\s*(\\d+)');
var match = str.match(regex);
return match ? parseInt(match[1]) : 0;
},
// 提取字符串值
extractStringValue: function(str, key) {
var regex = new RegExp(key + '\\s*=\\s*"([^"]+)"');
var match = str.match(regex);
return match ? match[1] : '';
},
// 提取描述数组
extractDescArray: function(str) {
var descMatch = str.match(/desc\s*=\s*\{([^}]+)\}/);
if (!descMatch) return [];
var descStr = descMatch[1];
var descs = [];
var regex = /"([^"]+)"/g;
var match;
while ((match = regex.exec(descStr)) !== null) {
descs.push(match[1]);
}
return descs;
},
// 渲染界面
render: function() {
var container = document.getElementById('equipment-manager');
var html = [
'<div class="equipment-container">',
' <div class="equipment-header">',
' <h2>装备管理器</h2>',
' <div class="equipment-actions">',
' 新增装备',
' </div>',
' </div>',
' <div class="equipment-form-container" style="display:none;">',
' <h3 class="form-title">新增装备</h3>',
' <div class="equipment-form">',
' <div class="form-group">',
' <label>装备名称:</label>',
' <input type="text" class="form-input" id="equipment-name" />',
' </div>',
' <div class="form-group">',
' <label>装备ID:</label>',
' <input type="number" class="form-input" id="equipment-id" />',
' </div>',
' <div class="form-group">',
' <label>地区:</label>',
' <div class="radio-group">',
this.areas.map(function(area) {
return '<label class="radio-label"><input type="radio" name="equipment-area" value="' + area + '" /> ' + area + '</label>';
}).join(''),
' </div>',
' </div>',
' <div class="form-group">',
' <label>稀有度:</label>',
' <div class="radio-group">',
this.rarities.map(function(rarity) {
return '<label class="radio-label"><input type="radio" name="equipment-rarity" value="' + rarity + '" /> ' + rarity + '</label>';
}).join(''),
' </div>',
' </div>',
' <div class="form-group">',
' <label>类型:</label>',
' <div class="radio-group">',
this.types.map(function(type) {
return '<label class="radio-label"><input type="radio" name="equipment-type" value="' + type + '" /> ' + type + '</label>';
}).join(''),
' </div>',
' </div>',
' <div class="form-group">',
' <label>标签(用逗号分隔):</label>',
' <input type="text" class="form-input" id="equipment-tag" placeholder="例如: 暴击率提升,获得信用点数" />',
' </div>',
' <div class="form-group">',
' <label>描述(每行一个等级):</label>',
' <textarea class="form-textarea" id="equipment-desc" rows="5" placeholder="每行输入一个等级的描述"></textarea>',
' </div>',
' <div class="form-actions">',
' 保存',
' 取消',
' </div>',
' </div>',
' </div>',
' <div class="equipment-list-container">',
' <h3>装备列表</h3>',
' <div class="equipment-filter">',
' <input type="text" class="filter-input" id="equipment-search" placeholder="搜索装备..." />',
' </div>',
' <div class="equipment-list" id="equipment-list">',
' <!-- 装备列表将在这里动态生成 -->',
' </div>',
' </div>',
'</div>'
].join('');
container.innerHTML = html;
},
// 渲染装备列表
renderEquipmentList: function() {
var listContainer = document.getElementById('equipment-list');
if (!listContainer) return;
var html = [];
for (var name in this.equipmentData) {
var equipment = this.equipmentData[name];
html.push(this.renderEquipmentItem(equipment));
}
listContainer.innerHTML = html.join('');
},
// 渲染单个装备项
renderEquipmentItem: function(equipment) {
var imageUrl = '/images/' + equipment.id + '.png';
return [
'<div class="equipment-item" data-name="' + equipment.name + '">',
' <div class="equipment-image">',
' <img src="' + imageUrl + '" alt="' + equipment.name + '" onerror="this.src=\'/images/default-equipment.png\'" />',
' </div>',
' <div class="equipment-info">',
' <div class="equipment-name">' + equipment.name + '</div>',
' <div class="equipment-meta">',
' <span class="equipment-rarity rarity-' + equipment.rarity + '">' + equipment.rarity + '</span>',
' <span class="equipment-type">' + equipment.type + '</span>',
' <span class="equipment-area">' + equipment.area + '</span>',
' </div>',
' <div class="equipment-tags">' + equipment.tag + '</div>',
' </div>',
' <div class="equipment-actions">',
' + equipment.name + '">编辑',
' + equipment.name + '">删除',
' </div>',
'</div>'
].join('');
},
// 绑定事件
bindEvents: function() {
var self = this;
// 新增按钮
$(document).on('click', '.equipment-btn-add', function(e) {
e.preventDefault();
self.showForm();
self.currentEditItem = null;
});
// 保存按钮
$(document).on('click', '.equipment-btn-save', function(e) {
e.preventDefault();
self.saveEquipment();
});
// 取消按钮
$(document).on('click', '.equipment-btn-cancel', function(e) {
e.preventDefault();
self.hideForm();
});
// 编辑按钮
$(document).on('click', '.action-edit', function(e) {
e.preventDefault();
var name = $(this).data('name');
self.editEquipment(name);
});
// 删除按钮
$(document).on('click', '.action-delete', function(e) {
e.preventDefault();
var name = $(this).data('name');
self.deleteEquipment(name);
});
// 搜索框
$(document).on('input', '#equipment-search', function() {
self.filterEquipment($(this).val());
});
},
// 显示表单
showForm: function() {
$('.equipment-form-container').slideDown();
this.clearForm();
},
// 隐藏表单
hideForm: function() {
$('.equipment-form-container').slideUp();
this.clearForm();
},
// 清空表单
clearForm: function() {
$('#equipment-name').val('');
$('#equipment-id').val('');
$('#equipment-tag').val('');
$('#equipment-desc').val('');
$('input[name="equipment-area"]').prop('checked', false);
$('input[name="equipment-rarity"]').prop('checked', false);
$('input[name="equipment-type"]').prop('checked', false);
},
// 编辑装备
editEquipment: function(name) {
var equipment = this.equipmentData[name];
if (!equipment) return;
this.currentEditItem = name;
this.showForm();
$('.form-title').text('编辑装备');
$('#equipment-name').val(equipment.name);
$('#equipment-id').val(equipment.id);
$('#equipment-tag').val(equipment.tag);
$('#equipment-desc').val(equipment.desc.join('\n'));
$('input[name="equipment-area"][value="' + equipment.area + '"]').prop('checked', true);
$('input[name="equipment-rarity"][value="' + equipment.rarity + '"]').prop('checked', true);
$('input[name="equipment-type"][value="' + equipment.type + '"]').prop('checked', true);
},
// 删除装备
deleteEquipment: function(name) {
if (!confirm('确定要删除装备 "' + name + '" 吗?')) return;
delete this.equipmentData[name];
this.saveLuaData();
this.renderEquipmentList();
},
// 保存装备
saveEquipment: function() {
var name = $('#equipment-name').val().trim();
var id = $('#equipment-id').val();
var area = $('input[name="equipment-area"]:checked').val();
var rarity = $('input[name="equipment-rarity"]:checked').val();
var type = $('input[name="equipment-type"]:checked').val();
var tag = $('#equipment-tag').val().trim();
var desc = $('#equipment-desc').val().trim().split('\n').filter(function(d) { return d.trim(); });
if (!name || !id || !area || !rarity || !type) {
alert('请填写所有必填字段');
return;
}
var equipment = {
name: name,
id: parseInt(id),
area: area,
rarity: rarity,
type: type,
tag: tag,
desc: desc
};
// 如果是编辑模式且名称改变了,需要删除旧的
if (this.currentEditItem && this.currentEditItem !== name) {
delete this.equipmentData[this.currentEditItem];
}
this.equipmentData[name] = equipment;
this.saveLuaData();
this.hideForm();
this.renderEquipmentList();
},
// 保存到Lua模块
saveLuaData: function() {
var luaContent = this.generateLuaContent();
new mw.Api().postWithToken('csrf', {
action: 'edit',
title: 'Module:装备/data',
text: luaContent,
summary: '通过装备管理器更新装备数据',
format: 'json'
}).done(function() {
mw.notify('装备数据已保存', { type: 'success' });
}).fail(function() {
mw.notify('保存失败,请检查权限', { type: 'error' });
});
},
// 生成Lua内容
generateLuaContent: function() {
var lines = ['local equipment = {}', ''];
for (var name in this.equipmentData) {
var eq = this.equipmentData[name];
lines.push('equipment["' + name + '"] = {');
lines.push(' id = ' + eq.id + ',');
lines.push(' area = "' + eq.area + '",');
lines.push(' rarity = "' + eq.rarity + '",');
lines.push(' type = "' + eq.type + '",');
lines.push(' tag = "' + eq.tag + '",');
lines.push(' desc = {');
eq.desc.forEach(function(desc, index) {
var comma = index < eq.desc.length - 1 ? ',' : '';
lines.push(' "' + desc + '"' + comma);
});
lines.push(' }');
lines.push('}');
lines.push('');
}
lines.push('return equipment');
return lines.join('\n');
},
// 过滤装备
filterEquipment: function(searchText) {
var items = document.querySelectorAll('.equipment-item');
var search = searchText.toLowerCase();
items.forEach(function(item) {
var name = item.getAttribute('data-name').toLowerCase();
var info = item.textContent.toLowerCase();
if (name.indexOf(search) !== -1 || info.indexOf(search) !== -1) {
item.style.display = '';
} else {
item.style.display = 'none';
}
});
}
};
// 页面加载完成后初始化
$(function() {
if (mw.config.get('wgPageName') === 'Equipment') {
EquipmentManager.init();
}
});
})();