MediaWiki

Event.js:修订间差异

来自卡厄思梦境WIKI

律Rhyme留言 | 贡献
创建页面,内容为“(function() { 'use strict'; // 等待页面加载完成 if (mw.config.get('wgPageName') !== 'MediaWiki:Event') { return; } var eventData = {}; var selectedEvent = null; // 地区和稀有度选项 var areaOptions = ['蓝壶', '双星之影', '雾之都市']; var rarityOptions = ['一般', '稀有', '传说']; // 创建主界面 function createInterface() { var container = document.getElementById('m…”
 
律Rhyme留言 | 贡献
无编辑摘要
第1行: 第1行:
(function() {
(function() {
     'use strict';
     'use strict';
 
   
    // 加载CSS
    mw.loader.load('/index.php?title=MediaWiki:Event.css&action=raw&ctype=text/css', 'text/css');
   
     // 等待页面加载完成
     // 等待页面加载完成
     if (mw.config.get('wgPageName') !== 'MediaWiki:Event') {
     if (mw.config.get('wgPageName') !== 'MediaWiki:Event') {
第379行: 第382行:
         }
         }
     }
     }
    // 加载CSS
    mw.loader.using(['mediawiki.util'], function() {
        mw.util.addCSS(mw.loader.load('MediaWiki:Event.css'));
        createInterface();
    });
})();
})();

2025年10月18日 (六) 13:13的版本

(function() {
    'use strict';
    
    // 加载CSS
    mw.loader.load('/index.php?title=MediaWiki:Event.css&action=raw&ctype=text/css', 'text/css');
    
    // 等待页面加载完成
    if (mw.config.get('wgPageName') !== 'MediaWiki:Event') {
        return;
    }

    var eventData = {};
    var selectedEvent = null;

    // 地区和稀有度选项
    var areaOptions = ['蓝壶', '双星之影', '雾之都市'];
    var rarityOptions = ['一般', '稀有', '传说'];

    // 创建主界面
    function createInterface() {
        var container = document.getElementById('mw-content-text');
        if (!container) return;

        container.innerHTML = '';

        var html = '<div class="event-manager">' +
            '<h2>事件管理器</h2>' +
            '<div class="event-toolbar">' +
                '<button id="btn-add-event">新增事件</button>' +
                '<button id="btn-export">导出Lua代码</button>' +
                '<button id="btn-import">导入数据</button>' +
            '</div>' +
            '<div class="event-list" id="event-list"></div>' +
            '<div class="output-container" id="output-container" style="display:none;">' +
                '<h3>导出的Lua代码</h3>' +
                '<pre id="lua-output"></pre>' +
                '<button class="copy-btn" id="btn-copy">复制代码</button>' +
            '</div>' +
        '</div>' +
        '<div class="event-overlay" id="event-overlay"></div>' +
        '<div class="event-form" id="event-form"></div>';

        container.innerHTML = html;

        // 绑定事件
        document.getElementById('btn-add-event').addEventListener('click', function() {
            showEventForm();
        });

        document.getElementById('btn-export').addEventListener('click', exportToLua);
        document.getElementById('btn-import').addEventListener('click', importData);
        document.getElementById('btn-copy').addEventListener('click', copyLuaCode);
        document.getElementById('event-overlay').addEventListener('click', hideEventForm);

        // 加载示例数据
        loadSampleData();
        renderEventList();
    }

    // 加载示例数据
    function loadSampleData() {
        eventData["小偷们 1"] = {
            id: "uk_300_s02_01a",
            area: "蓝壶",
            tag: "战斗,获得信用点数",
            rarity: "一般",
            option: {
                1: "购买匕首",
                2: "偷走他们的箱子",
                3: "赞扬这项技术"
            },
            effect: {
                1: "待补充",
                2: "遭遇战斗,获得{{文本|橙|120}}信用点数",
                3: "待补充"
            }
        };
    }

    // 渲染事件列表
    function renderEventList() {
        var listContainer = document.getElementById('event-list');
        listContainer.innerHTML = '';

        for (var eventName in eventData) {
            var event = eventData[eventName];
            var itemDiv = document.createElement('div');
            itemDiv.className = 'event-item';
            itemDiv.dataset.eventName = eventName;

            itemDiv.innerHTML = '<div class="event-item-header">' +
                '<div class="event-item-title">' + eventName + '</div>' +
                '<div>ID: ' + event.id + '</div>' +
            '</div>' +
            '<div class="event-item-meta">' +
                '<span>地区: ' + event.area + '</span>' +
                '<span>稀有度: ' + event.rarity + '</span>' +
                '<span>标签: ' + event.tag + '</span>' +
            '</div>';

            itemDiv.addEventListener('click', function() {
                var name = this.dataset.eventName;
                showEventForm(name);
            });

            listContainer.appendChild(itemDiv);
        }
    }

    // 显示事件表单
    function showEventForm(eventName) {
        var overlay = document.getElementById('event-overlay');
        var form = document.getElementById('event-form');
        
        overlay.className = 'event-overlay active';
        form.className = 'event-form active';

        var isEdit = !!eventName;
        var event = isEdit ? eventData[eventName] : {
            id: '',
            area: '',
            tag: '',
            rarity: '一般',
            option: {1: '', 2: '', 3: ''},
            effect: {1: '', 2: '', 3: ''}
        };

        var formHtml = '<h3>' + (isEdit ? '编辑事件' : '新增事件') + '</h3>' +
            '<div class="form-group">' +
                '<label>事件名称</label>' +
                '<input type="text" id="event-name" value="' + (eventName || '') + '">' +
            '</div>' +
            '<div class="form-group">' +
                '<label>ID</label>' +
                '<input type="text" id="event-id" value="' + event.id + '">' +
            '</div>' +
            '<div class="form-group">' +
                '<label>地区(可多选)</label>' +
                '<div class="checkbox-group">';

        // 地区复选框
        var selectedAreas = event.area ? event.area.split(',').map(function(s) { return s.trim(); }) : [];
        areaOptions.forEach(function(area) {
            var checked = selectedAreas.indexOf(area) !== -1 ? 'checked' : '';
            formHtml += '<label><input type="checkbox" name="area" value="' + area + '" ' + checked + '> ' + area + '</label>';
        });

        formHtml += '</div></div>' +
            '<div class="form-group">' +
                '<label>标签(用逗号分隔)</label>' +
                '<input type="text" id="event-tag" value="' + event.tag + '" placeholder="例如: 战斗,获得信用点数">' +
            '</div>' +
            '<div class="form-group">' +
                '<label>稀有度</label>' +
                '<select id="event-rarity">';

        rarityOptions.forEach(function(rarity) {
            var selected = event.rarity === rarity ? 'selected' : '';
            formHtml += '<option value="' + rarity + '" ' + selected + '>' + rarity + '</option>';
        });

        formHtml += '</select></div>' +
            '<div class="form-group">' +
                '<label>选项</label>' +
                '<div class="options-container">';

        for (var i = 1; i <= 3; i++) {
            formHtml += '<div class="option-item">' +
                '<span class="option-number">' + i + '.</span>' +
                '<input type="text" id="option-' + i + '" value="' + (event.option[i] || '') + '" placeholder="选项 ' + i + '">' +
            '</div>';
        }

        formHtml += '</div></div>' +
            '<div class="form-group">' +
                '<label>效果</label>' +
                '<div class="effects-container">';

        for (var j = 1; j <= 3; j++) {
            formHtml += '<div class="effect-item">' +
                '<span class="option-number">' + j + '.</span>' +
                '<div style="flex: 1;">' +
                    '<div class="effect-controls">' +
                        '<button class="text-format-btn" data-effect-id="' + j + '">橙色文本</button>' +
                    '</div>' +
                    '<textarea id="effect-' + j + '" placeholder="效果 ' + j + '">' + (event.effect[j] || '') + '</textarea>' +
                '</div>' +
            '</div>';
        }

        formHtml += '</div></div>' +
            '<div class="form-buttons">';

        if (isEdit) {
            formHtml += '<button class="btn-delete" id="btn-delete">删除</button>';
        }

        formHtml += '<button class="btn-cancel" id="btn-cancel">取消</button>' +
            '<button class="btn-save" id="btn-save">保存</button>' +
        '</div>';

        form.innerHTML = formHtml;

        // 绑定表单事件
        document.getElementById('btn-save').addEventListener('click', function() {
            saveEvent(eventName);
        });

        document.getElementById('btn-cancel').addEventListener('click', hideEventForm);

        if (isEdit) {
            document.getElementById('btn-delete').addEventListener('click', function() {
                if (confirm('确定要删除事件 "' + eventName + '" 吗?')) {
                    delete eventData[eventName];
                    renderEventList();
                    hideEventForm();
                }
            });
        }

        // 绑定橙色文本按钮
        var formatBtns = document.querySelectorAll('.text-format-btn');
        formatBtns.forEach(function(btn) {
            btn.addEventListener('click', function(e) {
                e.preventDefault();
                var effectId = this.dataset.effectId;
                insertOrangeText(effectId);
            });
        });
    }

    // 插入橙色文本模板
    function insertOrangeText(effectId) {
        var textarea = document.getElementById('effect-' + effectId);
        var start = textarea.selectionStart;
        var end = textarea.selectionEnd;
        var selectedText = textarea.value.substring(start, end);
        
        var insertText = selectedText ? 
            '{{文本|橙|' + selectedText + '}}' : 
            '{{文本|橙|}}';
        
        var newValue = textarea.value.substring(0, start) + 
                      insertText + 
                      textarea.value.substring(end);
        
        textarea.value = newValue;
        
        // 设置光标位置
        if (!selectedText) {
            var cursorPos = start + 7; // {{文本|橙| 的长度
            textarea.setSelectionRange(cursorPos, cursorPos);
        }
        
        textarea.focus();
    }

    // 隐藏表单
    function hideEventForm() {
        document.getElementById('event-overlay').className = 'event-overlay';
        document.getElementById('event-form').className = 'event-form';
    }

    // 保存事件
    function saveEvent(originalName) {
        var eventName = document.getElementById('event-name').value.trim();
        
        if (!eventName) {
            alert('请输入事件名称');
            return;
        }

        // 获取选中的地区
        var areaCheckboxes = document.querySelectorAll('input[name="area"]:checked');
        var areas = [];
        areaCheckboxes.forEach(function(cb) {
            areas.push(cb.value);
        });

        var newEvent = {
            id: document.getElementById('event-id').value.trim(),
            area: areas.join(','),
            tag: document.getElementById('event-tag').value.trim(),
            rarity: document.getElementById('event-rarity').value,
            option: {},
            effect: {}
        };

        for (var i = 1; i <= 3; i++) {
            var optionValue = document.getElementById('option-' + i).value.trim();
            var effectValue = document.getElementById('effect-' + i).value.trim();
            
            if (optionValue) {
                newEvent.option[i] = optionValue;
                newEvent.effect[i] = effectValue || '待补充';
            }
        }

        // 如果是编辑且名称改变了,删除原来的
        if (originalName && originalName !== eventName) {
            delete eventData[originalName];
        }

        eventData[eventName] = newEvent;
        renderEventList();
        hideEventForm();
    }

    // 导出为Lua代码
    function exportToLua() {
        var lua = 'local event = {}\n\n';

        for (var eventName in eventData) {
            var event = eventData[eventName];
            lua += 'event["' + eventName + '"] = {\n';
            lua += '    id = "' + event.id + '",\n';
            lua += '    area = "' + event.area + '",\n';
            lua += '    tag = "' + event.tag + '",\n';
            lua += '    rarity = "' + event.rarity + '",\n';
            lua += '    option = {\n';

            for (var opt in event.option) {
                lua += '        [' + opt + '] = "' + event.option[opt] + '",\n';
            }

            lua += '    },\n';
            lua += '    effect = {\n';

            for (var eff in event.effect) {
                lua += '        [' + eff + '] = "' + event.effect[eff] + '",\n';
            }

            lua += '    }\n';
            lua += '}\n\n';
        }

        lua += 'return event';

        document.getElementById('lua-output').textContent = lua;
        document.getElementById('output-container').style.display = 'block';
    }

    // 复制Lua代码
    function copyLuaCode() {
        var luaOutput = document.getElementById('lua-output').textContent;
        
        var textarea = document.createElement('textarea');
        textarea.value = luaOutput;
        document.body.appendChild(textarea);
        textarea.select();
        document.execCommand('copy');
        document.body.removeChild(textarea);
        
        alert('代码已复制到剪贴板');
    }

    // 导入数据
    function importData() {
        var input = prompt('请粘贴Lua代码:');
        if (!input) return;

        try {
            // 简单的Lua解析(实际使用中可能需要更复杂的解析器)
            var regex = /event\["([^"]+)"\]\s*=\s*\{([^}]+\}[^}]+)\}/g;
            var match;
            var newData = {};

            while ((match = regex.exec(input)) !== null) {
                var name = match[1];
                var content = match[2];
                
                // 这里需要更复杂的解析逻辑
                // 简化处理,仅作示例
                alert('导入功能需要更复杂的Lua解析器实现');
                return;
            }

            eventData = newData;
            renderEventList();
        } catch (e) {
            alert('导入失败: ' + e.message);
        }
    }
})();