|
|
| 第1行: |
第1行: |
| <!-- JavaScript -->
| |
| <script> | | <script> |
| // 存储当前选择状态 | | // 找到被点击的角色卡片(最外层div) |
| let currentSelection = { | | let target = e.target; |
| character: null,
| | while (target && target !== characterList) { |
| partner: null,
| | if (target.style && target.style.position === 'relative' && target.style.width === '150px') { |
| cards: [],
| | selectCharacter(target); |
| weapon: null,
| | break; |
| armor: null,
| |
| ring: null
| |
| };
| |
| | |
| // 打开选择模态框
| |
| function openSelectionModal(type) {
| |
| const modal = document.getElementById('selection-modal');
| |
| const content = document.getElementById('modal-content');
| |
|
| |
| if (!modal || !content) {
| |
| console.error('Modal elements not found');
| |
| return;
| |
| }
| |
|
| |
| switch(type) {
| |
| case 'character':
| |
| content.innerHTML = `{{#ask:[[分类:战斗员]]
| |
| |?名称
| |
| |?稀有度
| |
| |?职业
| |
| |?属性
| |
| |sort=实装日期,稀有度,id
| |
| |order=desc,desc,desc
| |
| |mainlabel=-
| |
| |link=none
| |
| |template=配队/战斗员
| |
| |headers=hide
| |
| |format=template
| |
| |limit=1000
| |
| }}`;
| |
| break;
| |
|
| |
| case 'partner':
| |
| content.innerHTML = `{{#ask:[[分类:伙伴]]
| |
| |?名称
| |
| |?稀有度
| |
| |?职业
| |
| |?属性
| |
| |?id
| |
| |sort=实装日期,稀有度,id
| |
| |order=desc,desc,desc
| |
| |mainlabel=-
| |
| |link=none
| |
| |template=配队/伙伴
| |
| |headers=hide
| |
| |format=template
| |
| |limit=1000
| |
| }}`;
| |
| break;
| |
|
| |
| case 'card':
| |
| // 需要先选择角色才能选择卡牌
| |
| if (!currentSelection.character) {
| |
| alert('请先选择角色'); | |
| return; | |
| } | | } |
| content.innerHTML = generateCardSelection(); | | target = target.parentElement; |
| break;
| | } |
|
| |
| case 'weapon':
| |
| content.innerHTML = generateEquipmentSelection('武器');
| |
| break;
| |
|
| |
| case 'armor':
| |
| content.innerHTML = generateEquipmentSelection('装甲');
| |
| break;
| |
|
| |
| case 'ring':
| |
| content.innerHTML = generateEquipmentSelection('戒指');
| |
| break;
| |
| }
| |
|
| |
| modal.style.display = 'block';
| |
| document.body.style.overflow = 'hidden';
| |
|
| |
| // 为生成的元素添加点击事件
| |
| setTimeout(() => {
| |
| addSelectionEvents(type);
| |
| }, 100);
| |
| }
| |
| | |
| // 关闭选择模态框
| |
| function closeSelectionModal() {
| |
| const modal = document.getElementById('selection-modal');
| |
| if (modal) {
| |
| modal.style.display = 'none';
| |
| document.body.style.overflow = 'auto';
| |
| }
| |
| }
| |
| | |
| // 生成卡牌选择界面
| |
| function generateCardSelection() {
| |
| if (!currentSelection.character) return '';
| |
|
| |
| // 这里需要根据选择的角色获取对应的卡牌数据
| |
| // 假设从模板中获取卡牌信息
| |
| return `
| |
| <div>
| |
| <h3>选择卡牌 - ${currentSelection.character}</h3>
| |
| <div style="display: flex; flex-wrap: wrap; gap: 10px;">
| |
| <!-- 自我意识技能 -->
| |
| <div class="card-selection" data-card-type="ego">
| |
| {{#invoke:卡牌|main|角色模块|自我意识技能卡牌}}
| |
| </div>
| |
|
| |
| <!-- 起始卡牌 -->
| |
| <div class="card-selection" data-card-type="start1">
| |
| {{#invoke:卡牌|main|角色模块|起始卡牌_1}}
| |
| </div>
| |
| <div class="card-selection" data-card-type="start2">
| |
| {{#invoke:卡牌|main|角色模块|起始卡牌_2}}
| |
| </div>
| |
| <div class="card-selection" data-card-type="start3">
| |
| {{#invoke:卡牌|main|角色模块|起始卡牌_3}}
| |
| </div>
| |
| <div class="card-selection" data-card-type="start4">
| |
| {{#invoke:卡牌|main|角色模块|起始卡牌_4}}
| |
| </div>
| |
|
| |
| <!-- 独特卡牌 -->
| |
| <div class="card-selection" data-card-type="unique1">
| |
| {{#invoke:卡牌|main|角色模块|独特卡牌_1}}
| |
| </div>
| |
| <div class="card-selection" data-card-type="unique2">
| |
| {{#invoke:卡牌|main|角色模块|独特卡牌_2}}
| |
| </div>
| |
| <div class="card-selection" data-card-type="unique3">
| |
| {{#invoke:卡牌|main|角色模块|独特卡牌_3}}
| |
| </div>
| |
| <div class="card-selection" data-card-type="unique4">
| |
| {{#invoke:卡牌|main|角色模块|独特卡牌_4}}
| |
| </div>
| |
| </div>
| |
| </div>`;
| |
| }
| |
| | |
| // 生成装备选择界面
| |
| function generateEquipmentSelection(type) {
| |
| return `
| |
| <div>
| |
| <h3>选择${type}</h3>
| |
| <div style="display: flex; flex-wrap: wrap; gap: 10px;">
| |
| {{#invoke:装备|generateCards}}
| |
| </div>
| |
| </div>`;
| |
| }
| |
| | |
| // 添加选择事件
| |
| function addSelectionEvents(type) {
| |
| const items = document.querySelectorAll('.selection-item');
| |
|
| |
| items.forEach(item => {
| |
| item.addEventListener('click', function() { | |
| const name = this.getAttribute('data-name');
| |
| const id = this.getAttribute('data-id');
| |
|
| |
| switch(type) {
| |
| case 'character':
| |
| selectCharacter(name, id);
| |
| break;
| |
| case 'partner':
| |
| selectPartner(name, id);
| |
| break;
| |
| case 'card':
| |
| selectCard(name, this.getAttribute('data-card-type'));
| |
| break;
| |
| case 'weapon':
| |
| selectWeapon(name, id);
| |
| break;
| |
| case 'armor':
| |
| selectArmor(name, id);
| |
| break;
| |
| case 'ring':
| |
| selectRing(name, id);
| |
| break;
| |
| }
| |
|
| |
| closeSelectionModal();
| |
| });
| |
| });
| |
| }
| |
| | |
| // 选择角色
| |
| function selectCharacter(name, id) {
| |
| currentSelection.character = name;
| |
| const slot = document.getElementById('character-slot');
| |
| if (slot) {
| |
| slot.innerHTML = `[[File:战斗员图鉴_${name}.png|150px|link=]]`;
| |
| slot.style.justifyContent = 'center';
| |
| }
| |
| }
| |
| | |
| // 选择伙伴
| |
| function selectPartner(name, id) {
| |
| currentSelection.partner = name;
| |
| const slot = document.getElementById('partner-slot');
| |
| if (slot) {
| |
| slot.innerHTML = `[[File:face_character_wide_${id}.png|150px|link=]]`;
| |
| slot.style.justifyContent = 'center';
| |
| }
| |
| }
| |
| | |
| // 选择卡牌
| |
| function selectCard(name, cardType) {
| |
| currentSelection.cards.push({name, type: cardType});
| |
| updateDeckDisplay();
| |
| }
| |
| | |
| // 选择武器
| |
| function selectWeapon(name, id) {
| |
| currentSelection.weapon = name;
| |
| const slot = document.getElementById('weapon-slot');
| |
| if (slot) {
| |
| slot.innerHTML = generateEquipmentDisplay(name, id);
| |
| slot.style.justifyContent = 'center';
| |
| }
| |
| }
| |
| | |
| // 选择装甲
| |
| function selectArmor(name, id) {
| |
| currentSelection.armor = name;
| |
| const slot = document.getElementById('armor-slot');
| |
| if (slot) {
| |
| slot.innerHTML = generateEquipmentDisplay(name, id);
| |
| slot.style.justifyContent = 'center';
| |
| }
| |
| }
| |
| | |
| // 选择戒指
| |
| function selectRing(name, id) {
| |
| currentSelection.ring = name;
| |
| const slot = document.getElementById('ring-slot');
| |
| if (slot) {
| |
| slot.innerHTML = generateEquipmentDisplay(name, id);
| |
| slot.style.justifyContent = 'center';
| |
| }
| |
| }
| |
| | |
| // 生成装备显示
| |
| function generateEquipmentDisplay(name, id) {
| |
| const formattedId = id.toString().padStart(4, '0');
| |
| return `
| |
| <div style="position:relative;width:124px;height:124px">
| |
| <div style="position:absolute;top:0px;left:0px">[[File:frame_item_rarity_金.png|124px]]</div>
| |
| <div style="position:absolute;top:8px;left:8px;width:108px;height:108px;border:1px solid #fff;"></div>
| |
| <div style="position:absolute;top:6px;left:6px;">[[File:relic_${formattedId}.png|112px|center]]</div>
| |
| <div style="position:absolute;bottom:2px;left:6px;">{{描边|黑|${name}}}</div>
| |
| </div>`;
| |
| }
| |
| | |
| // 更新卡组显示
| |
| function updateDeckDisplay() {
| |
| const deckArea = document.getElementById('deck-area');
| |
| if (!deckArea) return;
| |
|
| |
| if (currentSelection.cards.length === 0) {
| |
| deckArea.innerHTML = '<div style="font-size: 48px; color: #ccc;">+</div>';
| |
| return;
| |
| }
| |
|
| |
| let cardsHTML = '<div style="display: flex; flex-wrap: wrap; gap: 10px;">';
| |
| currentSelection.cards.forEach(card => {
| |
| cardsHTML += `<div class="card-in-deck" data-card="${card.name}">
| |
| {{#invoke:卡牌|main|角色模块|${card.name}}}
| |
| </div>`;
| |
| }); | | }); |
| cardsHTML += '</div>';
| |
| | | |
| deckArea.innerHTML = cardsHTML; | | function selectCharacter(characterCard) { |
| }
| | // 克隆角色卡片 |
| | | const clone = characterCard.cloneNode(true); |
| // 安全的元素绑定函数 | | |
| function safeAddEventListener(elementId, event, handler) {
| | // 提取角色名称 |
| const element = document.getElementById(elementId);
| | const nameDiv = clone.querySelector('div[style*="bottom: 5px"]'); |
| if (element) {
| | const characterName = nameDiv ? nameDiv.textContent.trim() : ''; |
| element.addEventListener(event, handler); | | |
| } else {
| | // 清空character-slot并添加选中的角色 |
| console.warn(`Element with id '${elementId}' not found`); | | characterSlot.innerHTML = ''; |
| | characterSlot.style.border = '2px solid #28a745'; |
| | characterSlot.appendChild(clone); |
| | |
| | // 存储选中的角色名称 |
| | characterSlot.dataset.selectedCharacter = characterName; |
| | |
| | // 关闭弹窗 |
| | characterModal.style.display = 'none'; |
| } | | } |
| } | | })(); |
| | |
| // 初始化点击事件
| |
| function initializeEventListeners() {
| |
| // 战斗员选择
| |
| safeAddEventListener('character-slot', 'click', function() {
| |
| openSelectionModal('character');
| |
| });
| |
|
| |
| // 伙伴选择
| |
| safeAddEventListener('partner-slot', 'click', function() {
| |
| openSelectionModal('partner');
| |
| });
| |
|
| |
| // 卡组选择
| |
| safeAddEventListener('deck-area', 'click', function() {
| |
| openSelectionModal('card');
| |
| });
| |
|
| |
| // 装备选择
| |
| safeAddEventListener('weapon-slot', 'click', function() {
| |
| openSelectionModal('weapon');
| |
| });
| |
|
| |
| safeAddEventListener('armor-slot', 'click', function() {
| |
| openSelectionModal('armor');
| |
| });
| |
|
| |
| safeAddEventListener('ring-slot', 'click', function() {
| |
| openSelectionModal('ring');
| |
| });
| |
|
| |
| // 全局点击事件用于关闭模态框
| |
| document.addEventListener('click', function(event) {
| |
| const modal = document.getElementById('selection-modal');
| |
| if (modal && modal.style.display === 'block') {
| |
| // 如果点击的是模态框背景(不是内容区域)
| |
| if (event.target === modal) {
| |
| closeSelectionModal();
| |
| }
| |
| }
| |
| });
| |
|
| |
| // ESC键关闭模态框
| |
| document.addEventListener('keydown', function(event) {
| |
| if (event.key === 'Escape') {
| |
| closeSelectionModal();
| |
| }
| |
| });
| |
| }
| |
| | |
| // 页面加载完成后初始化
| |
| if (document.readyState === 'loading') {
| |
| document.addEventListener('DOMContentLoaded', initializeEventListeners);
| |
| } else {
| |
| initializeEventListeners();
| |
| }
| |
| | |
| // MediaWiki页面内容加载完成后重新初始化(用于动态加载的内容)
| |
| if (typeof mw !== 'undefined' && mw.hook) {
| |
| mw.hook('wikipage.content').add(function($content) {
| |
| // 检查是否包含我们的模拟器元素
| |
| if ($content.find('#team-simulator').length > 0) {
| |
| setTimeout(initializeEventListeners, 100);
| |
| }
| |
| });
| |
| }
| |
| </script> | | </script> |
|
| |
|
| <style> | | <style> |
| .selection-slot {
| | #character-modal button:hover { |
| transition: all 0.3s ease; | | opacity: 0.8; |
| cursor: pointer;
| |
| }
| |
| | |
| .selection-slot:hover {
| |
| border-color: #666;
| |
| background: #f8f8f8;
| |
| } | | } |
|
| |
|
| .selection-item {
| | #character-list > div { |
| cursor: pointer; | | cursor: pointer; |
| transition: transform 0.2s ease; | | transition: transform 0.2s; |
| display: inline-block;
| |
| margin: 5px;
| |
| } | | } |
|
| |
|
| .selection-item:hover {
| | #character-list > div:hover { |
| transform: scale(1.05); | | transform: scale(1.05); |
| }
| |
|
| |
| .card-in-deck {
| |
| cursor: pointer;
| |
| }
| |
|
| |
| .card-in-deck:hover {
| |
| opacity: 0.8;
| |
| }
| |
|
| |
| /* 模态框样式改进 */
| |
| #selection-modal {
| |
| transition: opacity 0.3s ease;
| |
| }
| |
|
| |
| #selection-modal > div {
| |
| transition: transform 0.3s ease;
| |
| } | | } |
| </style> | | </style> |