MediaWiki:Common.js:修订间差异

来自勿忘草与永远的少女
跳到导航跳到搜索
Admin留言 | 贡献
无编辑摘要
标签已被回退
Admin留言 | 贡献
无编辑摘要
 
(未显示同一用户的52个中间版本)
第7行: 第7行:
         var navHtml = `
         var navHtml = `
             <div class="fixed-top-nav">
             <div class="fixed-top-nav">
                 [[File:logo.jpg|link=首页|alt=首页]]
                 <a href="首页" class="nav-logo">
                    <img src="/wikibg/logo.jpg" alt="网站Logo">
                     <span>万华镜</span>
                     <span>万华镜</span>
                 </a>
                 </a>
                 <div class="nav-links">
                 <div class="nav-links">
                     <a href="index.php?title=%E9%A6%96%E9%A1%B5" class="nav-link">
                     <a href="首页" class="nav-link">
                         📚 首页
                         📚 首页
                     </a>
                     </a>
                     <a href="/游戏攻略" class="nav-link">
                     <a href="游戏攻略" class="nav-link">
                         📖 游戏攻略
                         📖 游戏攻略
                     </a>
                     </a>
                     <a href="index.php?title=%E6%A3%8B%E5%AD%90" class="nav-link">
                     <a href="棋子" class="nav-link">
                         ⚔️ 棋子图鉴
                         ⚔️ 棋子图鉴
                     </a>
                     </a>
                     <a href="/天赋图鉴" class="nav-link">
                     <a href="天赋图鉴" class="nav-link">
                         🗺️ 天赋图鉴
                         🗺️ 天赋图鉴
                     </a>
                     </a>
                     <a href="/装备图鉴" class="nav-link">
                     <a href="装备图鉴" class="nav-link">
                         📊 装备图鉴
                         📊 装备图鉴
                     </a>
                     </a>
                     <a href="moniqi/moniqi.html" class="nav-link">
                    <a href="兑换中心" class="nav-link">
                        📊 兑换中心
                    </a>
                    <a href="羁绊详情" class="nav-link">
                        📊 羁绊详情
                    </a>
                     <a href="https://www.war3whj.top/war3wiki/moniqi/moniqi.html" class="nav-link">
                         📊 阵容模拟器
                         📊 阵容模拟器
                     </a>
                     </a>
第85行: 第92行:
     $(window).resize(adjustSidebarHeight);
     $(window).resize(adjustSidebarHeight);
});
});
/* ========== 棋子图鉴筛选功能(固定羁绊 + 包含匹配) ========== */
$(function() {
    var pageTitle = mw.config.get('wgTitle');
    if (pageTitle !== '棋子' && pageTitle !== '棋子图鉴') return;
    // ----------------------------------------------
    // 【自定义区域】请在这里填入你需要的固定羁绊列表
    // 筛选时会判断棋子的“羁绊”列是否包含这些字符串
    // ----------------------------------------------
    var FIXED_BOND_LIST = [
        "护卫", "暗杀者", "圣盾战士", "裁决使", "冰之魔女", "保镖", "重装战士", "神使者", "Geass", "雪下的誓言", "镜花水月", "神眼疾手", "武斗学院", "圆环之理", "救济的魔女", "叛逆的物语", "战略分析", "勇者", "东京食尸鬼", "坤比", "杀人冲动", "狂战士", "水之女神", "木灵使", "湖上的冰精", "叛逆小队", "游戏开发部", "法师", "狙神", "蓄力一击", "快枪手", "附魔师", "魔法少女", "迅击战士", "杀手", "宇智波的末裔", "六道之力", "我的回合抽卡", "最后的月牙天冲", "秘仪之影", "幕后花手", "中二病", "漆黑烈焰使", "世界的加护", "死亡笔记","奇迹之星","我的刀盾","圣祈凝辉","锻刀匠"
    ];  // 👈 按你的实际需要修改或增删
    // 等待 Cargo 表格出现
    var maxAttempts = 50;
    var attempt = 0;
    var interval = setInterval(function() {
        var $table = $('table.cargoDynamicTable, table.cargoTable');
        if ($table.length > 0) {
            clearInterval(interval);
            initFilters($table);
        } else if (++attempt >= maxAttempts) {
            clearInterval(interval);
            console.warn('棋子筛选器:未找到 Cargo 表格');
        }
    }, 200);
    function initFilters($table) {
        var $rows = $table.find('tbody tr');
        if ($rows.length === 0) return;
        if ($('#chess-filter-container').length) return;
        // 动态获取列索引
        var headerCells = $table.find('thead tr th');
        var colMap = {};
        headerCells.each(function(index) {
            var text = $(this).text().trim();
            if (text.includes('稀有度')) colMap.rarity = index;
            else if (text.includes('费用')) colMap.cost = index;
            else if (text.includes('定位')) colMap.role = index;
            else if (text.includes('羁绊')) colMap.bond = index;
        });
        var COL_RARITY = colMap.rarity !== undefined ? colMap.rarity : 4;
        var COL_COST    = colMap.cost  !== undefined ? colMap.cost  : 5;
        var COL_ROLE    = colMap.role  !== undefined ? colMap.role  : 6;
        var COL_BOND    = colMap.bond  !== undefined ? colMap.bond  : 7;
        // 获取其他筛选器的唯一值(稀有度、费用、定位)保持不变
        function getUniqueValues(colIndex) {
            var set = new Set();
            $rows.each(function() {
                var text = $(this).find('td').eq(colIndex).text().trim();
                if (text) set.add(text);
            });
            return Array.from(set).sort((a,b) => a.localeCompare(b, 'zh-CN'));
        }
        var rarityOpts = getUniqueValues(COL_RARITY);
        var costOpts  = getUniqueValues(COL_COST);
        var roleOpts  = getUniqueValues(COL_ROLE);
        // 羁绊选项直接使用固定列表(已排序)
        var bondOpts = FIXED_BOND_LIST.slice().sort((a,b) => a.localeCompare(b, 'zh-CN'));
        // 构建筛选器界面
        var $filterDiv = $('<div id="chess-filter-container" style="margin:20px 0;padding:15px;background:rgba(255,255,255,0.9);border-radius:12px;box-shadow:0 2px 8px rgba(0,0,0,0.1);"></div>');
        var $rowDiv = $('<div style="display:flex;flex-wrap:wrap;gap:15px;align-items:flex-end;"></div>');
        function createSelect(labelText, id, optionsArray) {
            var $wrapper = $('<div style="min-width:120px;"></div>');
            $wrapper.append($('<label style="display:block;font-weight:bold;margin-bottom:5px;color:#2c3e50;">').text(labelText));
            var $select = $('<select style="width:100%;padding:6px;border-radius:6px;border:1px solid #ccc;">').attr('id', id);
            $select.append($('<option value="">').text('全部'));
            optionsArray.forEach(function(val) {
                $select.append($('<option>').attr('value', val).text(val));
            });
            $wrapper.append($select);
            return $wrapper;
        }
        $rowDiv.append(createSelect('⭐ 稀有度', 'filter-rarity', rarityOpts));
        $rowDiv.append(createSelect('💰 费用', 'filter-cost', costOpts));
        $rowDiv.append(createSelect('⚔️ 定位', 'filter-role', roleOpts));
        $rowDiv.append(createSelect('🔗 羁绊', 'filter-bond', bondOpts));  // 使用固定羁绊列表
        var $btnWrapper = $('<div></div>');
        var $resetBtn = $('<button id="reset-filters" style="padding:6px 20px;background:#2c3e50;color:#fff;border:none;border-radius:20px;cursor:pointer;font-weight:bold;">重置筛选</button>');
        $btnWrapper.append($resetBtn);
        $rowDiv.append($btnWrapper);
        var $stats = $('<div id="filter-stats" style="margin-top:10px;font-size:14px;color:#555;"></div>');
        $filterDiv.append($rowDiv).append($stats);
        $table.before($filterDiv);
        var $raritySelect = $('#filter-rarity');
        var $costSelect = $('#filter-cost');
        var $roleSelect = $('#filter-role');
        var $bondSelect = $('#filter-bond');
        function applyFilters() {
            var rarity = $raritySelect.val() || '';
            var cost = $costSelect.val() || '';
            var role = $roleSelect.val() || '';
            var bond = $bondSelect.val() || '';  // 固定羁绊选中的值
            var visibleCount = 0;
            $rows.each(function() {
                var $tds = $(this).find('td');
                var rowRarity = $tds.eq(COL_RARITY).text().trim();
                var rowCost  = $tds.eq(COL_COST).text().trim();
                var rowRole  = $tds.eq(COL_ROLE).text().trim();
                var rowBond  = $tds.eq(COL_BOND).text().trim();  // 示例:"龙, 法师" 或 "斗士"
                var match = true;
                if (rarity && rowRarity !== rarity) match = false;
                if (cost  && rowCost  !== cost)  match = false;
                if (role  && rowRole  !== role)  match = false;
                // 【关键修改】羁绊筛选改为包含匹配(包含关系)
                if (bond  && !rowBond.includes(bond)) match = false;
                if (match) {
                    $(this).show();
                    visibleCount++;
                } else {
                    $(this).hide();
                }
            });
            $stats.text('当前显示 ' + visibleCount + ' 个棋子(共 ' + $rows.length + ' 个)');
            var $noRow = $table.find('.no-results-row');
            if (visibleCount === 0) {
                if ($noRow.length === 0) {
                    var colSpan = $table.find('thead tr th').length;
                    $table.find('tbody').append(
                        $('<tr class="no-results-row">').append(
                            $('<td>').attr('colspan', colSpan).css({
                                'text-align': 'center',
                                'padding': '20px',
                                'color': '#999'
                            }).text('没有符合条件的棋子')
                        )
                    );
                }
            } else {
                $noRow.remove();
            }
        }
        $raritySelect.on('change', applyFilters);
        $costSelect.on('change', applyFilters);
        $roleSelect.on('change', applyFilters);
        $bondSelect.on('change', applyFilters);
        $('#reset-filters').on('click', function() {
            $raritySelect.val('');
            $costSelect.val('');
            $roleSelect.val('');
            $bondSelect.val('');
            applyFilters();
        });
        applyFilters();
    }
});
/* ========== 装备图鉴筛选功能(仅类型、获取方式) ========== */
$(function() {
    // 判断是否为装备图鉴页面
    var pageTitle = mw.config.get('wgTitle');
    if (pageTitle !== '装备图鉴') return;
    // 等待 Cargo 表格出现(最多等待 5 秒)
    var maxAttempts = 50;
    var attempt = 0;
    var interval = setInterval(function() {
        var $table = $('table.cargoDynamicTable, table.cargoTable');
        if ($table.length > 0) {
            clearInterval(interval);
            initEquipmentFilters($table);
        } else if (++attempt >= maxAttempts) {
            clearInterval(interval);
            console.warn('装备图鉴筛选器:未找到 Cargo 表格');
        }
    }, 200);
    function initEquipmentFilters($table) {
        var $rows = $table.find('tbody tr');
        if ($rows.length === 0) return;
        // 避免重复创建筛选器
        if ($('#equipment-filter-container').length) return;
        // 通过表头动态获取列索引(更稳健)
        var headerCells = $table.find('thead tr th');
        var colMap = {};
        headerCells.each(function(index) {
            var text = $(this).text().trim();
            if (text.includes('类型')) colMap.type = index;
            else if (text.includes('获取方式')) colMap.source = index;
        });
        // 回退到固定索引(根据您的 fields 顺序:图片,图片文件名,名称,_pageName,类型,获取方式,合成公式)
        var COL_TYPE  = colMap.type  !== undefined ? colMap.type  : 4; // 类型
        var COL_SOURCE = colMap.source !== undefined ? colMap.source : 5; // 获取方式
        // 从表格提取唯一值
        function getUniqueValues(colIndex) {
            var set = new Set();
            $rows.each(function() {
                var text = $(this).find('td').eq(colIndex).text().trim();
                if (text) set.add(text);
            });
            return Array.from(set).sort(function(a, b) {
                return a.localeCompare(b, 'zh-CN');
            });
        }
        var typeOpts  = getUniqueValues(COL_TYPE);
        var sourceOpts = getUniqueValues(COL_SOURCE);
        // 构建筛选器容器
        var $filterDiv = $('<div id="equipment-filter-container" style="margin:20px 0;padding:15px;background:rgba(255,255,255,0.9);border-radius:12px;box-shadow:0 2px 8px rgba(0,0,0,0.1);"></div>');
        var $rowDiv = $('<div style="display:flex;flex-wrap:wrap;gap:15px;align-items:flex-end;"></div>');
        // 创建下拉框的辅助函数
        function createSelect(labelText, id, optionsArray) {
            var $wrapper = $('<div style="min-width:160px;"></div>');
            $wrapper.append($('<label style="display:block;font-weight:bold;margin-bottom:5px;color:#2c3e50;">').text(labelText));
            var $select = $('<select style="width:100%;padding:6px;border-radius:6px;border:1px solid #ccc;">').attr('id', id);
            $select.append($('<option value="">').text('全部'));
            optionsArray.forEach(function(val) {
                $select.append($('<option>').attr('value', val).text(val));
            });
            $wrapper.append($select);
            return $wrapper;
        }
        $rowDiv.append(createSelect('📦 类型', 'filter-type', typeOpts));
        $rowDiv.append(createSelect('🔍 获取方式', 'filter-source', sourceOpts));
        var $btnWrapper = $('<div></div>');
        var $resetBtn = $('<button id="reset-equipment-filters" style="padding:6px 20px;background:#2c3e50;color:#fff;border:none;border-radius:20px;cursor:pointer;font-weight:bold;">重置筛选</button>');
        $btnWrapper.append($resetBtn);
        $rowDiv.append($btnWrapper);
        var $stats = $('<div id="equipment-filter-stats" style="margin-top:10px;font-size:14px;color:#555;"></div>');
        $filterDiv.append($rowDiv).append($stats);
        // 插入到表格前
        $table.before($filterDiv);
        // 绑定筛选逻辑
        var $typeSelect = $('#filter-type');
        var $sourceSelect = $('#filter-source');
        function applyFilters() {
            var type = $typeSelect.val() || '';
            var source = $sourceSelect.val() || '';
            var visibleCount = 0;
            $rows.each(function() {
                var $tds = $(this).find('td');
                var rowType  = $tds.eq(COL_TYPE).text().trim();
                var rowSource = $tds.eq(COL_SOURCE).text().trim();
                var match = true;
                if (type  && rowType  !== type)  match = false;
                if (source && rowSource !== source) match = false;
                if (match) {
                    $(this).show();
                    visibleCount++;
                } else {
                    $(this).hide();
                }
            });
            $stats.text('当前显示 ' + visibleCount + ' 件装备(共 ' + $rows.length + ' 件)');
            // 无结果时添加提示行
            var $noRow = $table.find('.no-results-row');
            if (visibleCount === 0) {
                if ($noRow.length === 0) {
                    var colSpan = $table.find('thead tr th').length;
                    $table.find('tbody').append(
                        $('<tr class="no-results-row">').append(
                            $('<td>').attr('colspan', colSpan).css({
                                'text-align': 'center',
                                'padding': '20px',
                                'color': '#999'
                            }).text('没有符合条件的装备')
                        )
                    );
                }
            } else {
                $noRow.remove();
            }
        }
        $typeSelect.on('change', applyFilters);
        $sourceSelect.on('change', applyFilters);
        $('#reset-equipment-filters').on('click', function() {
            $typeSelect.val('');
            $sourceSelect.val('');
            applyFilters();
        });
        // 初始统计
        applyFilters();
    }
});
// 推荐直播间轮播切换(仅圆点版本,无箭头)
(function() {
    var streams = [
        {
            name: "B站主播:我就要迟到了哎",
            desc: "点击图片跳转至直播间",
            cover: "https://www.war3whj.top/war3wiki/images/b/ba/%E4%B8%BB%E6%92%AD1.png",
            link: "https://live.bilibili.com/1896524667"
        },
        {
            name: "B站主播:迦尔纳_Karna",
            desc: "点击图片跳转至直播间",
            cover: "https://www.war3whj.top/war3wiki/images/d/d5/%E4%B8%BB%E6%92%AD2.png",
            link: "https://live.bilibili.com/14628031"
        },
        {
            name: "B站主播:Elaina美好(地图作者)",
            desc: "点击图片跳转至直播间",
            cover: "https://www.war3whj.top/war3wiki/images/9/9d/%E4%B8%BB%E6%92%AD3.png",
            link: "https://live.bilibili.com/9457306"
        }
    ];
    var AUTO_INTERVAL = 5000;
    var currentIndex = 0;
    var total = streams.length;
    var timer = null;
    var coverDiv = document.getElementById('live-cover-img');
    var nameSpan = document.getElementById('live-name');
    var descSpan = document.getElementById('live-desc');
    var dotsContainer = document.getElementById('live-dots');
    // 生成圆点
    function buildDots() {
        if (!dotsContainer) return;
        dotsContainer.innerHTML = '';
        for (var i = 0; i < total; i++) {
            var dot = document.createElement('span');
            dot.setAttribute('data-index', i);
            dot.style.cssText = 'width: 10px; height: 10px; border-radius: 50%; background: rgba(255,255,255,0.5); cursor: pointer; transition: all 0.2s; display: inline-block;';
            if (i === currentIndex) {
                dot.style.background = 'white';
                dot.style.transform = 'scale(1.2)';
            }
            dot.addEventListener('click', (function(idx) {
                return function() {
                    stopAutoPlay();
                    currentIndex = idx;
                    updateDisplay();
                    startAutoPlay();
                };
            })(i));
            dotsContainer.appendChild(dot);
        }
    }
    function updateDots() {
        if (!dotsContainer) return;
        var dots = dotsContainer.querySelectorAll('span');
        for (var i = 0; i < dots.length; i++) {
            var dot = dots[i];
            if (i === currentIndex) {
                dot.style.background = 'white';
                dot.style.transform = 'scale(1.2)';
            } else {
                dot.style.background = 'rgba(255,255,255,0.5)';
                dot.style.transform = 'scale(1)';
            }
        }
    }
    function updateDisplay() {
        var data = streams[currentIndex];
        if (!data) return;
        if (coverDiv) {
            coverDiv.style.backgroundImage = 'url(' + data.cover + ')';
            coverDiv.setAttribute('data-link', data.link);
        }
        if (nameSpan) nameSpan.textContent = data.name;
        if (descSpan) descSpan.textContent = data.desc;
        updateDots();
    }
    function next() {
        currentIndex = (currentIndex + 1) % total;
        updateDisplay();
    }
    function prev() {
        currentIndex = (currentIndex - 1 + total) % total;
        updateDisplay();
    }
    function startAutoPlay() {
        if (timer) clearInterval(timer);
        timer = setInterval(next, AUTO_INTERVAL);
    }
    function stopAutoPlay() {
        if (timer) {
            clearInterval(timer);
            timer = null;
        }
    }
    function init() {
        if (!coverDiv) return;
        coverDiv.addEventListener('click', function() {
            var link = coverDiv.getAttribute('data-link');
            if (link) window.open(link, '_blank');
        });
        buildDots();
        updateDisplay();
        startAutoPlay();
        var container = document.getElementById('live-carousel-container');
        if (container) {
            container.addEventListener('mouseenter', stopAutoPlay);
            container.addEventListener('mouseleave', startAutoPlay);
        }
    }
    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
})();

2026年5月22日 (五) 21:59的最新版本

/* 这里的任何JavaScript将为所有用户在每次页面加载时加载。 */
$(function() {
    // 检查是否已存在导航栏,避免重复添加
    if ($('.fixed-top-nav').length === 0) {
        
        // 导航栏 HTML 结构
        var navHtml = `
            <div class="fixed-top-nav">
                <a href="首页" class="nav-logo">
                    <img src="/wikibg/logo.jpg" alt="网站Logo">
                    <span>万华镜</span>
                </a>
                <div class="nav-links">
                    <a href="首页" class="nav-link">
                        📚 首页
                    </a>
                    <a href="游戏攻略" class="nav-link">
                        📖 游戏攻略
                    </a>
                    <a href="棋子" class="nav-link">
                        ⚔️ 棋子图鉴
                    </a>
                    <a href="天赋图鉴" class="nav-link">
                        🗺️ 天赋图鉴
                    </a>
                    <a href="装备图鉴" class="nav-link">
                        📊 装备图鉴
                    </a>
                     <a href="兑换中心" class="nav-link">
                        📊 兑换中心
                    </a>
                     <a href="羁绊详情" class="nav-link">
                        📊 羁绊详情
                    </a>
                    <a href="https://www.war3whj.top/war3wiki/moniqi/moniqi.html" class="nav-link">
                        📊 阵容模拟器
                    </a>
                </div>
            </div>
        `;
        
        // 将导航栏插入到 body 开头
        $('body').prepend(navHtml);
        
        // 滚动时添加效果(可选)
        $(window).scroll(function() {
            if ($(window).scrollTop() > 50) {
                $('.fixed-top-nav').addClass('scrolled');
            } else {
                $('.fixed-top-nav').removeClass('scrolled');
            }
        });
    }
});


$(function() {
    // 确保页脚固定在底部
    var footer = $('#footer, .mw-footer');
    
    if (footer.length > 0) {
        // 设置底部内边距避免内容被遮挡
        var footerHeight = footer.outerHeight();
        $('body').css('padding-bottom', footerHeight + 20 + 'px');
        
        // 窗口大小改变时重新计算
        $(window).resize(function() {
            var newHeight = footer.outerHeight();
            $('body').css('padding-bottom', newHeight + 20 + 'px');
        });
    }
});

$(function() {
    // 为角色卡片添加悬停效果(可选,纯CSS已有,这里作为备用)
    $('.character-card').hover(
        function() { $(this).addClass('hover'); },
        function() { $(this).removeClass('hover'); }
    );
    
    // 动态计算右侧边栏高度(可选,用于对齐)
    function adjustSidebarHeight() {
        var leftHeight = $('.custom-homepage .left-column').outerHeight();
        var rightHeight = $('.custom-homepage .right-column').outerHeight();
        if (rightHeight < leftHeight && $(window).width() > 768) {
            $('.custom-homepage .right-column').css('min-height', leftHeight);
        }
    }
    
    // 延迟执行,等待图片加载完成
    setTimeout(adjustSidebarHeight, 500);
    $(window).resize(adjustSidebarHeight);
});

/* ========== 棋子图鉴筛选功能(固定羁绊 + 包含匹配) ========== */
$(function() {
    var pageTitle = mw.config.get('wgTitle');
    if (pageTitle !== '棋子' && pageTitle !== '棋子图鉴') return;

    // ----------------------------------------------
    // 【自定义区域】请在这里填入你需要的固定羁绊列表
    // 筛选时会判断棋子的“羁绊”列是否包含这些字符串
    // ----------------------------------------------
    var FIXED_BOND_LIST = [
        "护卫", "暗杀者", "圣盾战士", "裁决使", "冰之魔女", "保镖", "重装战士", "神使者", "Geass", "雪下的誓言", "镜花水月", "神眼疾手", "武斗学院", "圆环之理", "救济的魔女", "叛逆的物语", "战略分析", "勇者", "东京食尸鬼", "坤比", "杀人冲动", "狂战士", "水之女神", "木灵使", "湖上的冰精", "叛逆小队", "游戏开发部", "法师", "狙神", "蓄力一击", "快枪手", "附魔师", "魔法少女", "迅击战士", "杀手", "宇智波的末裔", "六道之力", "我的回合抽卡", "最后的月牙天冲", "秘仪之影", "幕后花手", "中二病", "漆黑烈焰使", "世界的加护", "死亡笔记","奇迹之星","我的刀盾","圣祈凝辉","锻刀匠"
    ];  // 👈 按你的实际需要修改或增删

    // 等待 Cargo 表格出现
    var maxAttempts = 50;
    var attempt = 0;
    var interval = setInterval(function() {
        var $table = $('table.cargoDynamicTable, table.cargoTable');
        if ($table.length > 0) {
            clearInterval(interval);
            initFilters($table);
        } else if (++attempt >= maxAttempts) {
            clearInterval(interval);
            console.warn('棋子筛选器:未找到 Cargo 表格');
        }
    }, 200);

    function initFilters($table) {
        var $rows = $table.find('tbody tr');
        if ($rows.length === 0) return;
        if ($('#chess-filter-container').length) return;

        // 动态获取列索引
        var headerCells = $table.find('thead tr th');
        var colMap = {};
        headerCells.each(function(index) {
            var text = $(this).text().trim();
            if (text.includes('稀有度')) colMap.rarity = index;
            else if (text.includes('费用')) colMap.cost = index;
            else if (text.includes('定位')) colMap.role = index;
            else if (text.includes('羁绊')) colMap.bond = index;
        });
        var COL_RARITY = colMap.rarity !== undefined ? colMap.rarity : 4;
        var COL_COST    = colMap.cost   !== undefined ? colMap.cost   : 5;
        var COL_ROLE    = colMap.role   !== undefined ? colMap.role   : 6;
        var COL_BOND    = colMap.bond   !== undefined ? colMap.bond   : 7;

        // 获取其他筛选器的唯一值(稀有度、费用、定位)保持不变
        function getUniqueValues(colIndex) {
            var set = new Set();
            $rows.each(function() {
                var text = $(this).find('td').eq(colIndex).text().trim();
                if (text) set.add(text);
            });
            return Array.from(set).sort((a,b) => a.localeCompare(b, 'zh-CN'));
        }
        var rarityOpts = getUniqueValues(COL_RARITY);
        var costOpts   = getUniqueValues(COL_COST);
        var roleOpts   = getUniqueValues(COL_ROLE);

        // 羁绊选项直接使用固定列表(已排序)
        var bondOpts = FIXED_BOND_LIST.slice().sort((a,b) => a.localeCompare(b, 'zh-CN'));

        // 构建筛选器界面
        var $filterDiv = $('<div id="chess-filter-container" style="margin:20px 0;padding:15px;background:rgba(255,255,255,0.9);border-radius:12px;box-shadow:0 2px 8px rgba(0,0,0,0.1);"></div>');
        var $rowDiv = $('<div style="display:flex;flex-wrap:wrap;gap:15px;align-items:flex-end;"></div>');

        function createSelect(labelText, id, optionsArray) {
            var $wrapper = $('<div style="min-width:120px;"></div>');
            $wrapper.append($('<label style="display:block;font-weight:bold;margin-bottom:5px;color:#2c3e50;">').text(labelText));
            var $select = $('<select style="width:100%;padding:6px;border-radius:6px;border:1px solid #ccc;">').attr('id', id);
            $select.append($('<option value="">').text('全部'));
            optionsArray.forEach(function(val) {
                $select.append($('<option>').attr('value', val).text(val));
            });
            $wrapper.append($select);
            return $wrapper;
        }

        $rowDiv.append(createSelect('⭐ 稀有度', 'filter-rarity', rarityOpts));
        $rowDiv.append(createSelect('💰 费用', 'filter-cost', costOpts));
        $rowDiv.append(createSelect('⚔️ 定位', 'filter-role', roleOpts));
        $rowDiv.append(createSelect('🔗 羁绊', 'filter-bond', bondOpts));  // 使用固定羁绊列表

        var $btnWrapper = $('<div></div>');
        var $resetBtn = $('<button id="reset-filters" style="padding:6px 20px;background:#2c3e50;color:#fff;border:none;border-radius:20px;cursor:pointer;font-weight:bold;">重置筛选</button>');
        $btnWrapper.append($resetBtn);
        $rowDiv.append($btnWrapper);

        var $stats = $('<div id="filter-stats" style="margin-top:10px;font-size:14px;color:#555;"></div>');
        $filterDiv.append($rowDiv).append($stats);
        $table.before($filterDiv);

        var $raritySelect = $('#filter-rarity');
        var $costSelect = $('#filter-cost');
        var $roleSelect = $('#filter-role');
        var $bondSelect = $('#filter-bond');

        function applyFilters() {
            var rarity = $raritySelect.val() || '';
            var cost = $costSelect.val() || '';
            var role = $roleSelect.val() || '';
            var bond = $bondSelect.val() || '';  // 固定羁绊选中的值

            var visibleCount = 0;
            $rows.each(function() {
                var $tds = $(this).find('td');
                var rowRarity = $tds.eq(COL_RARITY).text().trim();
                var rowCost   = $tds.eq(COL_COST).text().trim();
                var rowRole   = $tds.eq(COL_ROLE).text().trim();
                var rowBond   = $tds.eq(COL_BOND).text().trim();  // 示例:"龙, 法师" 或 "斗士"

                var match = true;
                if (rarity && rowRarity !== rarity) match = false;
                if (cost   && rowCost   !== cost)   match = false;
                if (role   && rowRole   !== role)   match = false;
                // 【关键修改】羁绊筛选改为包含匹配(包含关系)
                if (bond   && !rowBond.includes(bond)) match = false;

                if (match) {
                    $(this).show();
                    visibleCount++;
                } else {
                    $(this).hide();
                }
            });

            $stats.text('当前显示 ' + visibleCount + ' 个棋子(共 ' + $rows.length + ' 个)');

            var $noRow = $table.find('.no-results-row');
            if (visibleCount === 0) {
                if ($noRow.length === 0) {
                    var colSpan = $table.find('thead tr th').length;
                    $table.find('tbody').append(
                        $('<tr class="no-results-row">').append(
                            $('<td>').attr('colspan', colSpan).css({
                                'text-align': 'center',
                                'padding': '20px',
                                'color': '#999'
                            }).text('没有符合条件的棋子')
                        )
                    );
                }
            } else {
                $noRow.remove();
            }
        }

        $raritySelect.on('change', applyFilters);
        $costSelect.on('change', applyFilters);
        $roleSelect.on('change', applyFilters);
        $bondSelect.on('change', applyFilters);
        $('#reset-filters').on('click', function() {
            $raritySelect.val('');
            $costSelect.val('');
            $roleSelect.val('');
            $bondSelect.val('');
            applyFilters();
        });

        applyFilters();
    }
});

/* ========== 装备图鉴筛选功能(仅类型、获取方式) ========== */
$(function() {
    // 判断是否为装备图鉴页面
    var pageTitle = mw.config.get('wgTitle');
    if (pageTitle !== '装备图鉴') return;

    // 等待 Cargo 表格出现(最多等待 5 秒)
    var maxAttempts = 50;
    var attempt = 0;
    var interval = setInterval(function() {
        var $table = $('table.cargoDynamicTable, table.cargoTable');
        if ($table.length > 0) {
            clearInterval(interval);
            initEquipmentFilters($table);
        } else if (++attempt >= maxAttempts) {
            clearInterval(interval);
            console.warn('装备图鉴筛选器:未找到 Cargo 表格');
        }
    }, 200);

    function initEquipmentFilters($table) {
        var $rows = $table.find('tbody tr');
        if ($rows.length === 0) return;

        // 避免重复创建筛选器
        if ($('#equipment-filter-container').length) return;

        // 通过表头动态获取列索引(更稳健)
        var headerCells = $table.find('thead tr th');
        var colMap = {};
        headerCells.each(function(index) {
            var text = $(this).text().trim();
            if (text.includes('类型')) colMap.type = index;
            else if (text.includes('获取方式')) colMap.source = index;
        });

        // 回退到固定索引(根据您的 fields 顺序:图片,图片文件名,名称,_pageName,类型,获取方式,合成公式)
        var COL_TYPE   = colMap.type   !== undefined ? colMap.type   : 4; // 类型
        var COL_SOURCE = colMap.source !== undefined ? colMap.source : 5; // 获取方式

        // 从表格提取唯一值
        function getUniqueValues(colIndex) {
            var set = new Set();
            $rows.each(function() {
                var text = $(this).find('td').eq(colIndex).text().trim();
                if (text) set.add(text);
            });
            return Array.from(set).sort(function(a, b) {
                return a.localeCompare(b, 'zh-CN');
            });
        }

        var typeOpts   = getUniqueValues(COL_TYPE);
        var sourceOpts = getUniqueValues(COL_SOURCE);

        // 构建筛选器容器
        var $filterDiv = $('<div id="equipment-filter-container" style="margin:20px 0;padding:15px;background:rgba(255,255,255,0.9);border-radius:12px;box-shadow:0 2px 8px rgba(0,0,0,0.1);"></div>');
        var $rowDiv = $('<div style="display:flex;flex-wrap:wrap;gap:15px;align-items:flex-end;"></div>');

        // 创建下拉框的辅助函数
        function createSelect(labelText, id, optionsArray) {
            var $wrapper = $('<div style="min-width:160px;"></div>');
            $wrapper.append($('<label style="display:block;font-weight:bold;margin-bottom:5px;color:#2c3e50;">').text(labelText));
            var $select = $('<select style="width:100%;padding:6px;border-radius:6px;border:1px solid #ccc;">').attr('id', id);
            $select.append($('<option value="">').text('全部'));
            optionsArray.forEach(function(val) {
                $select.append($('<option>').attr('value', val).text(val));
            });
            $wrapper.append($select);
            return $wrapper;
        }

        $rowDiv.append(createSelect('📦 类型', 'filter-type', typeOpts));
        $rowDiv.append(createSelect('🔍 获取方式', 'filter-source', sourceOpts));

        var $btnWrapper = $('<div></div>');
        var $resetBtn = $('<button id="reset-equipment-filters" style="padding:6px 20px;background:#2c3e50;color:#fff;border:none;border-radius:20px;cursor:pointer;font-weight:bold;">重置筛选</button>');
        $btnWrapper.append($resetBtn);
        $rowDiv.append($btnWrapper);

        var $stats = $('<div id="equipment-filter-stats" style="margin-top:10px;font-size:14px;color:#555;"></div>');
        $filterDiv.append($rowDiv).append($stats);

        // 插入到表格前
        $table.before($filterDiv);

        // 绑定筛选逻辑
        var $typeSelect = $('#filter-type');
        var $sourceSelect = $('#filter-source');

        function applyFilters() {
            var type = $typeSelect.val() || '';
            var source = $sourceSelect.val() || '';

            var visibleCount = 0;
            $rows.each(function() {
                var $tds = $(this).find('td');
                var rowType   = $tds.eq(COL_TYPE).text().trim();
                var rowSource = $tds.eq(COL_SOURCE).text().trim();

                var match = true;
                if (type   && rowType   !== type)   match = false;
                if (source && rowSource !== source) match = false;

                if (match) {
                    $(this).show();
                    visibleCount++;
                } else {
                    $(this).hide();
                }
            });

            $stats.text('当前显示 ' + visibleCount + ' 件装备(共 ' + $rows.length + ' 件)');

            // 无结果时添加提示行
            var $noRow = $table.find('.no-results-row');
            if (visibleCount === 0) {
                if ($noRow.length === 0) {
                    var colSpan = $table.find('thead tr th').length;
                    $table.find('tbody').append(
                        $('<tr class="no-results-row">').append(
                            $('<td>').attr('colspan', colSpan).css({
                                'text-align': 'center',
                                'padding': '20px',
                                'color': '#999'
                            }).text('没有符合条件的装备')
                        )
                    );
                }
            } else {
                $noRow.remove();
            }
        }

        $typeSelect.on('change', applyFilters);
        $sourceSelect.on('change', applyFilters);
        $('#reset-equipment-filters').on('click', function() {
            $typeSelect.val('');
            $sourceSelect.val('');
            applyFilters();
        });

        // 初始统计
        applyFilters();
    }
});

// 推荐直播间轮播切换(仅圆点版本,无箭头)
(function() {
    var streams = [
        {
            name: "B站主播:我就要迟到了哎",
            desc: "点击图片跳转至直播间",
            cover: "https://www.war3whj.top/war3wiki/images/b/ba/%E4%B8%BB%E6%92%AD1.png",
            link: "https://live.bilibili.com/1896524667"
        },
        {
            name: "B站主播:迦尔纳_Karna",
            desc: "点击图片跳转至直播间",
            cover: "https://www.war3whj.top/war3wiki/images/d/d5/%E4%B8%BB%E6%92%AD2.png",
            link: "https://live.bilibili.com/14628031"
        },
        {
            name: "B站主播:Elaina美好(地图作者)",
            desc: "点击图片跳转至直播间",
            cover: "https://www.war3whj.top/war3wiki/images/9/9d/%E4%B8%BB%E6%92%AD3.png",
            link: "https://live.bilibili.com/9457306"
        }
    ];

    var AUTO_INTERVAL = 5000;
    var currentIndex = 0;
    var total = streams.length;
    var timer = null;

    var coverDiv = document.getElementById('live-cover-img');
    var nameSpan = document.getElementById('live-name');
    var descSpan = document.getElementById('live-desc');
    var dotsContainer = document.getElementById('live-dots');

    // 生成圆点
    function buildDots() {
        if (!dotsContainer) return;
        dotsContainer.innerHTML = '';
        for (var i = 0; i < total; i++) {
            var dot = document.createElement('span');
            dot.setAttribute('data-index', i);
            dot.style.cssText = 'width: 10px; height: 10px; border-radius: 50%; background: rgba(255,255,255,0.5); cursor: pointer; transition: all 0.2s; display: inline-block;';
            if (i === currentIndex) {
                dot.style.background = 'white';
                dot.style.transform = 'scale(1.2)';
            }
            dot.addEventListener('click', (function(idx) {
                return function() {
                    stopAutoPlay();
                    currentIndex = idx;
                    updateDisplay();
                    startAutoPlay();
                };
            })(i));
            dotsContainer.appendChild(dot);
        }
    }

    function updateDots() {
        if (!dotsContainer) return;
        var dots = dotsContainer.querySelectorAll('span');
        for (var i = 0; i < dots.length; i++) {
            var dot = dots[i];
            if (i === currentIndex) {
                dot.style.background = 'white';
                dot.style.transform = 'scale(1.2)';
            } else {
                dot.style.background = 'rgba(255,255,255,0.5)';
                dot.style.transform = 'scale(1)';
            }
        }
    }

    function updateDisplay() {
        var data = streams[currentIndex];
        if (!data) return;
        if (coverDiv) {
            coverDiv.style.backgroundImage = 'url(' + data.cover + ')';
            coverDiv.setAttribute('data-link', data.link);
        }
        if (nameSpan) nameSpan.textContent = data.name;
        if (descSpan) descSpan.textContent = data.desc;
        updateDots();
    }

    function next() {
        currentIndex = (currentIndex + 1) % total;
        updateDisplay();
    }

    function prev() {
        currentIndex = (currentIndex - 1 + total) % total;
        updateDisplay();
    }

    function startAutoPlay() {
        if (timer) clearInterval(timer);
        timer = setInterval(next, AUTO_INTERVAL);
    }

    function stopAutoPlay() {
        if (timer) {
            clearInterval(timer);
            timer = null;
        }
    }

    function init() {
        if (!coverDiv) return;

        coverDiv.addEventListener('click', function() {
            var link = coverDiv.getAttribute('data-link');
            if (link) window.open(link, '_blank');
        });

        buildDots();
        updateDisplay();
        startAutoPlay();

        var container = document.getElementById('live-carousel-container');
        if (container) {
            container.addEventListener('mouseenter', stopAutoPlay);
            container.addEventListener('mouseleave', startAutoPlay);
        }
    }

    if (document.readyState === 'loading') {
        document.addEventListener('DOMContentLoaded', init);
    } else {
        init();
    }
})();