MediaWiki

Equipment.js:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
无编辑摘要
律Rhyme留言 | 贡献
无编辑摘要
第1行: 第1行:
(function() {
(function() {
     'use strict';
     'use strict';
    // 加载 CSS
    mw.loader.load('/index.php?title=MediaWiki:Equipment.css&action=raw&ctype=text/css', 'text/css');
      
      
     // 装备数据管理类
     // 装备管理器
     var EquipmentManager = {
     var EquipmentManager = {
         currentData: {},
         // 固定选项
         editingEquipment: null,
        areas: ['蓝壶', '双星之影', '雾之都市'],
        rarities: ['蓝', '金', '彩'],
        types: ['武器', '装甲', '戒指'],
       
        // 当前装备数据
        equipmentData: {},
         currentEditItem: null,
          
          
         // 初始化
         // 初始化
         init: function() {
         init: function() {
             this.loadData();
            var container = document.getElementById('equipment-manager');
             this.renderUI();
            if (!container) return;
           
            // 加载CSS
            mw.loader.load(['ext.gadget.Equipment-css']);
           
             this.loadEquipmentData();
             this.render();
             this.bindEvents();
             this.bindEvents();
         },
         },
          
          
         // 从模块加载数据
         // 加载装备数据
         loadData: function() {
         loadEquipmentData: function() {
             var self = this;
             var self = this;
             new mw.Api().get({
             new mw.Api().get({
                 action: 'parse',
                 action: 'query',
                 page: '模块:装备/data',
                 prop: 'revisions',
                 prop: 'wikitext'
                titles: 'Module:装备/data',
                 rvprop: 'content',
                format: 'json'
             }).done(function(data) {
             }).done(function(data) {
                 if (data.parse && data.parse.wikitext) {
                 var pages = data.query.pages;
                     self.parseDataModule(data.parse.wikitext['*']);
                for (var pageId in pages) {
                     var content = pages[pageId].revisions[0]['*'];
                    self.parseEquipmentData(content);
                 }
                 }
                self.renderEquipmentList();
             });
             });
         },
         },
          
          
         // 解析 Lua 数据模块
         // 解析Lua数据
         parseDataModule: function(luaCode) {
         parseEquipmentData: function(luaContent) {
             var dataMatch = luaCode.match(/local data = \{([\s\S]*)\}\s*return/);
             var self = this;
             if (dataMatch) {
            // 简单的Lua解析器,提取装备数据
                 this.loadDataViaInvoke();
            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;
             }
             }
         },
         },
          
          
         // 通过 scribunto 调用获取数据
         // 提取数值
         loadDataViaInvoke: function() {
         extractValue: function(str, key) {
             var self = this;
             var regex = new RegExp(key + '\\s*=\\s*(\\d+)');
             new mw.Api().get({
             var match = str.match(regex);
                action: 'expandtemplates',
            return match ? parseInt(match[1]) : 0;
                text: '{{#invoke:装备|getAllData}}',
        },
                prop: 'wikitext'
       
            }).done(function(data) {
        // 提取字符串值
                if (data.expandtemplates && data.expandtemplates.wikitext) {
        extractStringValue: function(str, key) {
                    try {
            var regex = new RegExp(key + '\\s*=\\s*"([^"]+)"');
                        self.currentData = JSON.parse(data.expandtemplates.wikitext);
            var match = str.match(regex);
                        self.renderEquipmentList();
            return match ? match[1] : '';
                    } catch(e) {
                        console.error('数据解析失败', e);
                    }
                }
            });
         },
         },
          
          
         // 渲染界面
         // 提取描述数组
         renderUI: function() {
         extractDescArray: function(str) {
             var $container = $('#mw-content-text');
             var descMatch = str.match(/desc\s*=\s*\{([^}]+)\}/);
             $container.empty();
             if (!descMatch) return [];
           
            var descStr = descMatch[1];
            var descs = [];
            var regex = /"([^"]+)"/g;
            var match;
              
              
             var html = '<div class="equipment-manager">' +
             while ((match = regex.exec(descStr)) !== null) {
                '<div class="eq-header">' +
                 descs.push(match[1]);
                    '<div class="eq-title">装备数据管理</div>' +
             }
                    '<div class="eq-btn eq-btn-primary" id="eq-add-new">新增装备</div>' +
                 '</div>' +
                '<div class="eq-list" id="equipment-list"></div>' +
                '<div class="eq-modal" id="eq-modal" style="display:none;">' +
                    '<div class="eq-modal-content">' +
                        '<div class="eq-modal-header">' +
                            '<div class="eq-modal-title" id="modal-title">新增装备</div>' +
                            '<div class="eq-modal-close" id="modal-close">×</div>' +
                        '</div>' +
                        '<div class="eq-modal-body">' +
                            this.renderForm() +
                        '</div>' +
                        '<div class="eq-modal-footer">' +
                            '<div class="eq-btn eq-btn-secondary" id="eq-cancel">取消</div>' +
                            '<div class="eq-btn eq-btn-primary" id="eq-save">保存</div>' +
                        '</div>' +
                    '</div>' +
                '</div>' +
                '<div class="eq-modal-backdrop" id="modal-backdrop" style="display:none;"></div>' +
             '</div>';
              
              
             $container.html(html);
             return descs;
         },
         },
          
          
         // 渲染表单
         // 渲染界面
         renderForm: function() {
         render: function() {
             return '<div class="eq-form">' +
             var container = document.getElementById('equipment-manager');
                 '<div class="eq-form-group">' +
           
                    '<div class="eq-label">装备名称:</div>' +
            var html = [
                    '<div class="eq-input" contenteditable="true" id="eq-name" data-placeholder="请输入装备名称"></div>' +
                '<div class="equipment-container">',
                 '</div>' +
                 ' <div class="equipment-header">',
                 '<div class="eq-form-group">' +
                '   <h2>装备管理器</h2>',
                    '<div class="eq-label">遗物ID:</div>' +
                '   <div class="equipment-actions">',
                    '<div class="eq-input" contenteditable="true" id="eq-relic-id" data-placeholder="例如: 1001"></div>' +
                 '</div>' +
                '    </div>',
                 '<div class="eq-form-group">' +
                 ' </div>',
                    '<div class="eq-label">地区:</div>' +
                 ' <div class="equipment-form-container" style="display:none;">',
                    '<div class="eq-select" id="eq-area">' +
                '   <h3 class="form-title">新增装备</h3>',
                        '<div class="eq-select-display" data-value="">请选择地区</div>' +
                '    <div class="equipment-form">',
                        '<div class="eq-select-dropdown">' +
                '     <div class="form-group">',
                            '<div class="eq-select-option" data-value="蓝壶">蓝壶</div>' +
                '        <label>装备名称:</label>',
                            '<div class="eq-select-option" data-value="双星之影">双星之影</div>' +
                '        <input type="text" class="form-input" id="equipment-name" />',
                            '<div class="eq-select-option" data-value="雾之都市">雾之都市</div>' +
                 '     </div>',
                        '</div>' +
                 '     <div class="form-group">',
                    '</div>' +
                '       <label>装备ID:</label>',
                 '</div>' +
                '       <input type="number" class="form-input" id="equipment-id" />',
                 '<div class="eq-form-group">' +
                '     </div>',
                    '<div class="eq-label">稀有度:</div>' +
                '     <div class="form-group">',
                    '<div class="eq-select" id="eq-rarity">' +
                '       <label>地区:</label>',
                        '<div class="eq-select-display" data-value="">请选择稀有度</div>' +
                '       <div class="radio-group">',
                        '<div class="eq-select-dropdown">' +
                this.areas.map(function(area) {
                            '<div class="eq-select-option" data-value="蓝">蓝</div>' +
                    return '<label class="radio-label"><input type="radio" name="equipment-area" value="' + area + '" /> ' + area + '</label>';
                            '<div class="eq-select-option" data-value="紫">紫</div>' +
                }).join(''),
                            '<div class="eq-select-option" data-value="金">金</div>' +
                '       </div>',
                        '</div>' +
                 '     </div>',
                    '</div>' +
                 '     <div class="form-group">',
                 '</div>' +
                '       <label>稀有度:</label>',
                 '<div class="eq-form-group">' +
                '       <div class="radio-group">',
                    '<div class="eq-label">类型:</div>' +
                this.rarities.map(function(rarity) {
                    '<div class="eq-select" id="eq-type">' +
                    return '<label class="radio-label"><input type="radio" name="equipment-rarity" value="' + rarity + '" /> ' + rarity + '</label>';
                        '<div class="eq-select-display" data-value="">请选择类型</div>' +
                }).join(''),
                        '<div class="eq-select-dropdown">' +
                '       </div>',
                            '<div class="eq-select-option" data-value="武器">武器</div>' +
                 '     </div>',
                            '<div class="eq-select-option" data-value="装甲">装甲</div>' +
                 '     <div class="form-group">',
                            '<div class="eq-select-option" data-value="戒指">戒指</div>' +
                '       <label>类型:</label>',
                        '</div>' +
                '       <div class="radio-group">',
                    '</div>' +
                this.types.map(function(type) {
                 '</div>' +
                    return '<label class="radio-label"><input type="radio" name="equipment-type" value="' + type + '" /> ' + type + '</label>';
                 '<div class="eq-form-group">' +
                }).join(''),
                    '<div class="eq-label">属性类型:</div>' +
                '       </div>',
                    '<div class="eq-input" contenteditable="true" id="eq-value-type" data-placeholder="例如: 攻击力"></div>' +
                 '     </div>',
                 '</div>' +
                 '     <div class="form-group">',
                 '<div class="eq-form-group">' +
                '       <label>标签(用逗号分隔):</label>',
                    '<div class="eq-label">TAG (用逗号分隔):</div>' +
                '       <input type="text" class="form-input" id="equipment-tag" placeholder="例如: 暴击率提升,获得信用点数" />',
                    '<div class="eq-input" contenteditable="true" id="eq-tag" data-placeholder="例如: 输出,爆发"></div>' +
                 '     </div>',
                 '</div>' +
                 '     <div class="form-group">',
                 '<div class="eq-form-section">' +
                '       <label>描述(每行一个等级):</label>',
                    '<div class="eq-section-title">等级数据</div>' +
                '       <textarea class="form-textarea" id="equipment-desc" rows="5" placeholder="每行输入一个等级的描述"></textarea>',
                    this.renderLevelInputs() +
                 '     </div>',
                 '</div>' +
                 '     <div class="form-actions">',
            '</div>';
                '       <a href="#" class="equipment-btn equipment-btn-save">保存</a>',
        },
                 '       取消</a>',
       
                '     </div>',
        // 渲染等级输入
                '    </div>',
        renderLevelInputs: function() {
                 ' </div>',
            var html = '';
                ' <div class="equipment-list-container">',
            for (var i = 1; i <= 5; i++) {
                '   <h3>装备列表</h3>',
                 html += '<div class="eq-level-group">' +
                '   <div class="equipment-filter">',
                    '<div class="eq-level-title">' + i + '</div>' +
                '     <input type="text" class="filter-input" id="equipment-search" placeholder="搜索装备..." />',
                    '<div class="eq-form-row">' +
                '   </div>',
                        '<div class="eq-form-col">' +
                '   <div class="equipment-list" id="equipment-list">',
                            '<div class="eq-label-small">属性值:</div>' +
                '     <!-- 装备列表将在这里动态生成 -->',
                            '<div class="eq-input-small" contenteditable="true" id="eq-value-' + i + '" data-placeholder="数值"></div>' +
                '   </div>',
                        '</div>' +
                ' </div>',
                        '<div class="eq-form-col">' +
                '</div>'
                            '<div class="eq-label-small">描述:</div>' +
            ].join('');
                            '<div class="eq-input-small" contenteditable="true" id="eq-desc-' + i + '" data-placeholder="效果描述"></div>' +
              
                        '</div>' +
             container.innerHTML = html;
                    '</div>' +
                '</div>';
             }
             return html;
         },
         },
          
          
         // 渲染装备列表
         // 渲染装备列表
         renderEquipmentList: function() {
         renderEquipmentList: function() {
             var $list = $('#equipment-list');
             var listContainer = document.getElementById('equipment-list');
             $list.empty();
             if (!listContainer) return;
              
              
             var html = '<div class="eq-table">' +
             var html = [];
                '<div class="eq-table-header">' +
                    '<div class="eq-th eq-th-image">图片</div>' +
                    '<div class="eq-th eq-th-name">名称</div>' +
                    '<div class="eq-th">地区</div>' +
                    '<div class="eq-th">稀有度</div>' +
                    '<div class="eq-th">类型</div>' +
                    '<div class="eq-th">TAG</div>' +
                    '<div class="eq-th eq-th-actions">操作</div>' +
                '</div>' +
                '<div class="eq-table-body">';
              
              
             for (var name in this.currentData) {
             for (var name in this.equipmentData) {
                if (name === 'base') continue;
                 var equipment = this.equipmentData[name];
                 var equip = this.currentData[name];
                 html.push(this.renderEquipmentItem(equipment));
                var base = equip.base;
                var relicId = base.art ? base.art.replace('.png', '') : 'unknown';
               
                 html += '<div class="eq-table-row" data-equipment="' + name + '">' +
                    '<div class="eq-td eq-td-image">' +
                        '<img src="/images/' + relicId + '.png" alt="' + name + '" class="eq-thumbnail">' +
                    '</div>' +
                    '<div class="eq-td eq-td-name">' + name + '</div>' +
                    '<div class="eq-td">' + (base.area || '') + '</div>' +
                    '<div class="eq-td"><span class="eq-rarity eq-rarity-' + base.rarity + '">' + base.rarity + '</span></div>' +
                    '<div class="eq-td">' + (base.type || '') + '</div>' +
                    '<div class="eq-td">' + (base.tag || '') + '</div>' +
                    '<div class="eq-td eq-td-actions">' +
                        '<div class="eq-btn-small eq-btn-edit" data-name="' + name + '">编辑</div>' +
                        '<div class="eq-btn-small eq-btn-delete" data-name="' + name + '">删除</div>' +
                    '</div>' +
                '</div>';
             }
             }
              
              
             html += '</div></div>';
             listContainer.innerHTML = html.join('');
             $list.html(html);
        },
       
        // 渲染单个装备项
        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', '#eq-add-new', function() {
             $(document).on('click', '.equipment-btn-add', function(e) {
                 self.openModal('add');
                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', '.eq-btn-edit', function() {
             $(document).on('click', '.action-edit', function(e) {
                e.preventDefault();
                 var name = $(this).data('name');
                 var name = $(this).data('name');
                 self.openModal('edit', name);
                 self.editEquipment(name);
             });
             });
              
              
             // 删除按钮
             // 删除按钮
             $(document).on('click', '.eq-btn-delete', function() {
             $(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('click', '#modal-close, #eq-cancel, #modal-backdrop', function() {
             $(document).on('input', '#equipment-search', function() {
                 self.closeModal();
                 self.filterEquipment($(this).val());
            });
           
            // 保存按钮
            $(document).on('click', '#eq-save', function() {
                self.saveEquipment();
            });
           
            // 自定义下拉框
            $(document).on('click', '.eq-select-display', function(e) {
                e.stopPropagation();
                $(this).siblings('.eq-select-dropdown').toggle();
            });
           
            $(document).on('click', '.eq-select-option', function() {
                var value = $(this).data('value');
                var text = $(this).text();
                $(this).closest('.eq-select').find('.eq-select-display')
                    .text(text)
                    .attr('data-value', value);
                $(this).parent().hide();
            });
           
            $(document).on('click', function() {
                $('.eq-select-dropdown').hide();
             });
             });
         },
         },
          
          
         // 打开模态框
         // 显示表单
         openModal: function(mode, equipmentName) {
         showForm: function() {
             this.editingEquipment = equipmentName;
             $('.equipment-form-container').slideDown();
           
             this.clearForm();
            if (mode === 'edit' && equipmentName) {
                $('#modal-title').text('编辑装备');
                this.fillFormData(equipmentName);
             } else {
                $('#modal-title').text('新增装备');
                this.clearForm();
            }
           
            $('#eq-modal, #modal-backdrop').fadeIn(200);
         },
         },
          
          
         // 关闭模态框
         // 隐藏表单
         closeModal: function() {
         hideForm: function() {
             $('#eq-modal, #modal-backdrop').fadeOut(200);
             $('.equipment-form-container').slideUp();
             this.editingEquipment = null;
             this.clearForm();
        },
       
        // 填充表单数据
        fillFormData: function(name) {
            var equip = this.currentData[name];
            if (!equip) return;
           
            var base = equip.base;
            $('#eq-name').text(name);
            $('#eq-relic-id').text(base.art ? base.art.replace('.png', '') : '');
            $('#eq-area .eq-select-display').text(base.area).attr('data-value', base.area);
            $('#eq-rarity .eq-select-display').text(base.rarity).attr('data-value', base.rarity);
            $('#eq-type .eq-select-display').text(base.type).attr('data-value', base.type);
            $('#eq-value-type').text(base.value_type || '');
            $('#eq-tag').text(base.tag || '');
           
            for (var i = 1; i <= 5; i++) {
                if (equip[i]) {
                    $('#eq-value-' + i).text(equip[i].value || '');
                    $('#eq-desc-' + i).text(equip[i].desc_global || '');
                }
            }
         },
         },
          
          
         // 清空表单
         // 清空表单
         clearForm: function() {
         clearForm: function() {
             $('.eq-input, .eq-input-small').text('');
             $('#equipment-name').val('');
             $('.eq-select-display').text('请选择').attr('data-value', '');
            $('#equipment-id').val('');
             $('#eq-area .eq-select-display').text('请选择地区');
             $('#equipment-tag').val('');
             $('#eq-rarity .eq-select-display').text('请选择稀有度');
            $('#equipment-desc').val('');
             $('#eq-type .eq-select-display').text('请选择类型');
             $('input[name="equipment-area"]').prop('checked', false);
             $('input[name="equipment-rarity"]').prop('checked', false);
             $('input[name="equipment-type"]').prop('checked', false);
         },
         },
          
          
         // 获取表单数据
         // 编辑装备
         getFormData: function() {
         editEquipment: function(name) {
             var name = $('#eq-name').text().trim();
             var equipment = this.equipmentData[name];
            var relicId = $('#eq-relic-id').text().trim();
             if (!equipment) return;
            var area = $('#eq-area .eq-select-display').attr('data-value');
            var rarity = $('#eq-rarity .eq-select-display').attr('data-value');
            var type = $('#eq-type .eq-select-display').attr('data-value');
             var valueType = $('#eq-value-type').text().trim();
            var tag = $('#eq-tag').text().trim();
              
              
             // 验证必填项
             this.currentEditItem = name;
            if (!name) {
             this.showForm();
                mw.notify('请输入装备名称', {type: 'error'});
             $('.form-title').text('编辑装备');
                return null;
             }
            if (!relicId) {
                mw.notify('请输入遗物ID', {type: 'error'});
                return null;
            }
             if (!area) {
                mw.notify('请选择地区', {type: 'error'});
                return null;
            }
            if (!rarity) {
                mw.notify('请选择稀有度', {type: 'error'});
                return null;
            }
            if (!type) {
                mw.notify('请选择类型', {type: 'error'});
                return null;
            }
              
              
             var data = {
             $('#equipment-name').val(equipment.name);
                name: name,
            $('#equipment-id').val(equipment.id);
                base: {
            $('#equipment-tag').val(equipment.tag);
                    area: area,
            $('#equipment-desc').val(equipment.desc.join('\n'));
                    rarity: rarity,
            $('input[name="equipment-area"][value="' + equipment.area + '"]').prop('checked', true);
                    type: type,
            $('input[name="equipment-rarity"][value="' + equipment.rarity + '"]').prop('checked', true);
                    value_type: valueType,
            $('input[name="equipment-type"][value="' + equipment.type + '"]').prop('checked', true);
                    tag: tag,
        },
                    art: relicId + '.png'
       
                },
        // 删除装备
                levels: {}
        deleteEquipment: function(name) {
             };
             if (!confirm('确定要删除装备 "' + name + '" 吗?')) return;
              
              
             // 获取等级数据
             delete this.equipmentData[name];
             for (var i = 1; i <= 5; i++) {
             this.saveLuaData();
                var value = $('#eq-value-' + i).text().trim();
            this.renderEquipmentList();
                var desc = $('#eq-desc-' + i).text().trim();
               
                if (value || desc) {
                    data.levels[i] = {
                        value: value,
                        desc_global: desc
                    };
                }
            }
           
            return data;
         },
         },
          
          
         // 保存装备
         // 保存装备
         saveEquipment: function() {
         saveEquipment: function() {
             var self = this;
             var name = $('#equipment-name').val().trim();
             var formData = this.getFormData();
            var id = $('#equipment-id').val();
              
            var area = $('input[name="equipment-area"]:checked').val();
             if (!formData) return;
            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 (!this.editingEquipment && this.currentData[formData.name]) {
                 alert('请填写所有必填字段');
                 mw.notify('装备名称已存在', {type: 'error'});
                 return;
                 return;
             }
             }
              
              
            // 更新本地数据
             var equipment = {
             var equipmentData = {
                 name: name,
                 base: formData.base
                id: parseInt(id),
                area: area,
                rarity: rarity,
                type: type,
                tag: tag,
                desc: desc
             };
             };
              
              
            for (var level in formData.levels) {
             // 如果是编辑模式且名称改变了,需要删除旧的
                equipmentData[level] = formData.levels[level];
             if (this.currentEditItem && this.currentEditItem !== name) {
            }
                 delete this.equipmentData[this.currentEditItem];
           
             // 如果是编辑模式且名称改变,删除旧条目
             if (this.editingEquipment && this.editingEquipment !== formData.name) {
                 delete this.currentData[this.editingEquipment];
             }
             }
              
              
             this.currentData[formData.name] = equipmentData;
             this.equipmentData[name] = equipment;
              
             this.saveLuaData();
             // 生成 Lua 代码
             this.hideForm();
            var luaCode = this.generateLuaCode();
             this.renderEquipmentList();
           
            // 保存到模块
             this.saveToModule(luaCode);
         },
         },
          
          
         // 删除装备
         // 保存到Lua模块
         deleteEquipment: function(name) {
         saveLuaData: function() {
             var self = this;
             var luaContent = this.generateLuaContent();
              
              
             if (!confirm('确定要删除装备"' + name + '"吗?')) {
             new mw.Api().postWithToken('csrf', {
                 return;
                action: 'edit',
             }
                title: 'Module:装备/data',
           
                text: luaContent,
            delete this.currentData[name];
                summary: '通过装备管理器更新装备数据',
           
                format: 'json'
            // 生成 Lua 代码
            }).done(function() {
            var luaCode = this.generateLuaCode();
                 mw.notify('装备数据已保存', { type: 'success' });
              
             }).fail(function() {
            // 保存到模块
                mw.notify('保存失败,请检查权限', { type: 'error' });
            this.saveToModule(luaCode);
             });
         },
         },
          
          
         // 生成 Lua 代码
         // 生成Lua内容
         generateLuaCode: function() {
         generateLuaContent: function() {
             var lua = 'local data = {\n';
             var lines = ['local equipment = {}', ''];
              
              
            // 按名称排序
             for (var name in this.equipmentData) {
            var names = Object.keys(this.currentData).sort();
                 var eq = this.equipmentData[name];
           
                 lines.push('equipment["' + name + '"] = {');
             for (var i = 0; i < names.length; i++) {
                 lines.push('    id = ' + eq.id + ',');
                 var name = names[i];
                 lines.push('   area = "' + eq.area + '",');
                var equip = this.currentData[name];
                 lines.push('   rarity = "' + eq.rarity + '",');
                  
                 lines.push('   type = "' + eq.type + '",');
                lua += '   ["' + this.escapeLua(name) + '"] = {\n';
                 lines.push('   tag = "' + eq.tag + '",');
                 lua += '       base = {\n';
                 lines.push('   desc = {');
                 lua += '           area = "' + this.escapeLua(equip.base.area) + '",\n';
                 lua += '           rarity = "' + this.escapeLua(equip.base.rarity) + '",\n';
                 lua += '           type = "' + this.escapeLua(equip.base.type) + '",\n';
                 lua += '            value_type = "' + this.escapeLua(equip.base.value_type || '') + '",\n';
                lua += '            tag = "' + this.escapeLua(equip.base.tag || '') + '",\n';
                 lua += '            art = "' + this.escapeLua(equip.base.art) + '"\n';
                lua += '       },\n';
                  
                  
                 // 添加等级数据
                 eq.desc.forEach(function(desc, index) {
                for (var level = 1; level <= 5; level++) {
                     var comma = index < eq.desc.length - 1 ? ',' : '';
                     if (equip[level]) {
                    lines.push('       "' + desc + '"' + comma);
                        lua += '       ["' + level + '"] = {\n';
                });
                        lua += '            value = "' + this.escapeLua(equip[level].value || '') + '",\n';
                        lua += '           desc_global = "' + this.escapeLua(equip[level].desc_global || '') + '"\n';
                        lua += '        },\n';
                    }
                }
                  
                  
                 lua += '    },\n';
                 lines.push('    }');
                lines.push('}');
                lines.push('');
             }
             }
              
              
             lua += '}\n\nreturn data';
             lines.push('return equipment');
           
             return lines.join('\n');
            return lua;
        },
       
        // 转义 Lua 字符串
        escapeLua: function(str) {
            if (!str) return '';
             return str.replace(/\\/g, '\\\\')
                    .replace(/"/g, '\\"')
                    .replace(/\n/g, '\\n')
                    .replace(/\r/g, '\\r');
         },
         },
          
          
         // 保存到模块
         // 过滤装备
         saveToModule: function(luaCode) {
         filterEquipment: function(searchText) {
             var self = this;
             var items = document.querySelectorAll('.equipment-item');
            var search = searchText.toLowerCase();
              
              
             // 显示保存中状态
             items.forEach(function(item) {
            mw.notify('正在保存...', {type: 'info'});
                 var name = item.getAttribute('data-name').toLowerCase();
           
                 var info = item.textContent.toLowerCase();
            new mw.Api().postWithToken('csrf', {
               
                 action: 'edit',
                 if (name.indexOf(search) !== -1 || info.indexOf(search) !== -1) {
                title: '模块:装备/data',
                     item.style.display = '';
                 text: luaCode,
                summary: '通过装备管理器更新数据',
                minor: true
            }).done(function(data) {
                 if (data.edit && data.edit.result === 'Success') {
                     mw.notify('保存成功!', {type: 'success'});
                    self.closeModal();
                    self.renderEquipmentList();
                 } else {
                 } else {
                     mw.notify('保存失败', {type: 'error'});
                     item.style.display = 'none';
                 }
                 }
            }).fail(function(code, result) {
                mw.notify('保存失败: ' + (result.error ? result.error.info : '未知错误'), {type: 'error'});
             });
             });
         }
         }
第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();
        }
    });
})();