Mudanças entre as edições de "Widget:VisnoTeste"

De Wiki Gla
Ir para navegação Ir para pesquisar
 
(41 revisões intermediárias pelo mesmo usuário não estão sendo mostradas)
Linha 1: Linha 1:
{{#widget:Droflax}}
<!-- WEAPON TOGGLE SYSTEM - Estado global + popup -->
<script>
    (() => {
        let modalListenersBound = false;


{{Persona
        const bindModalEvents = () => {
|nome=Franky (Timeskip)
            if (modalListenersBound) return;
|tier=Diamante
            modalListenersBound = true;
|classe=Atirador/Tanque
            document.addEventListener('click', (ev) => {
|image=/images/9/91/Franky_ts_splash.png
                if (ev.target.closest('.weapon-modal-close') || ev.target.closest('.weapon-modal-btn')) {
|habilidadesRaw=<nowiki>
                    const checkbox = document.getElementById('weapon-dont-show');
<!--Hab1-->
                    if (checkbox && checkbox.checked) {
  nome=Strong Hammer
                        try { localStorage.setItem('glaWeaponPopupDismissed', '1'); } catch (x) { }
| icon=/images/0/05/Frankyts_sk1.png
                    }
| level=1
                    hidePopup();
| desc=Franky soca o oponente com um soco de ferro puro.
                    return;
| atr=2, -, 15, 9
                }
| video=/images/e/e5/Franky_ts_sk1.webm
                if (ev.target.classList.contains('weapon-modal-overlay')) {
||
                    hidePopup();
<!--Hab2-->
                }
  nome=Franky Boxing
            });
| icon=/images/e/ed/Frankyts_sk2.png
        };
| level=5
| desc=Basicamente, golpes de boxe padrão, mas, em razão dos punhos do Franky serem feitos de ferro, são muito superiores aos socos de um humano comum. Acerta até duas vezes e reduz a velocidade de movimento em <b>140</b> dos inimigos por <b>1 segundo</b>.
| atr=10, -, 14, 10
| video=/images/3/37/Franky_ts_sk2.webm
||
<!--Hab3-->
  nome=Franky Fireball
| icon=/images/e/ed/Frankyts_sk3.png
| level=12
| desc=Uma versão aprimorada da técnica Fresh Fire. Franky lança uma bola de fogo diretamente de sua boca, queimando o oponente por 6 vezes durante <b>2,5 segundos</b>.
| atr=18, -, 7, 5
| video=/images/2/21/Franky_ts_sk3.webm
||
<!--Hab4-->
  nome=Iron Pirate: Franky Shougun
| icon=/images/3/3a/Frankyts_sk4.png
| level=20
| desc=epois de dois anos estudando plantas de projetos deixadas pelo Dr. Vegapunk na Karakuri Island, Franky projetou e construiu o Franky Shogun. Um veículo de uma única pessoa, operado pelo próprio Franky em uma sala de controle dentro do peito. Enquanto está nessa forma, Franky ganha <b>15%</b> de redução de dano e desbloqueia novas técnicas. Se usado em uma instância PvP, a energia consumida enquanto estiver no Shogun será dobrada.
| atr=5, -, -, -
| video=/images/b/b8/Franky_ts_sk4.webm
||
<!--Hab5-->
  nome=General Sword
| icon=/images/f/fe/Frankyts_sk4-1.png
| level=20
| desc=Franky Shogun é equipado com uma grande espada chamada Franken. Ele a utiliza para cortar o oponente em uma área frontal. Inimigos atingidos tem a velocidade de movimento reduzida em <b>80</b> por <b>3 segundos</b>.
| atr=3, -, 25, 14
| video=/images/1/1a/Franky_ts_sk4-1.webm
||
<!--Hab6-->
  nome=General Shield
| icon=/images/8/84/Frankyts_sk4-2.png
| level=20
| desc=Franky remove uma parte do ombro do Franky Shogun, que tem uma estrela desenhada, e a utiliza como um escudo, tornando-se invulnerável e imparável durante <b>3 segundos</b> e reduzindo a velocidade de movimento de todos os inimigos em <b>50</b> por <b>3 segundos</b>. Ele também causa dano aos inimigos ao redor dele durante 3 segundos e provocando os inimigos.
| atr=25, -, -, -
| video=/images/9/95/Franky_ts_sk4-2.webm
||
<!--Hab7-->
  nome=Leave Franky Shougun
| icon=/images/3/3a/Frankyts_sk4.png
| level=20
| desc=Franky sai do Franky Shogun.
| atr=2, -, -, -
| video=/images/2/2a/Franky_ts_sk4-5.webm
||
<!--Hab8-->
  nome=Change Hair
| icon=/images/a/ab/Frankyts_sk8.png
| level=25
| desc=Depois de pressionar o seu nariz de metal como um botão, o cabelo de Franky saltará para fora do seu couro cabeludo. O cabelo é controlável e ele pode mudar para o estilo que desejar.
| atr=10, -, -, -
| video=/images/d/d0/Franky_ts_emote2.webm
||
<!--Hab9-->
  nome=General Ashimoto Dangerous
| icon=/images/5/5a/Frankyts_sk4-3.png
| level=30
| desc=Franky mantém o Franky Shogun agachado e, segurando a Franken no nível do joelho, faz com que o torso do robô gire rapidamente, puxando os inimigos em sua direção e causando dano até 5 vezes.
| atr=45, -, 9, 4
| video=/images/4/4e/Franky_ts_sk4-3.webm
||
<!--Hab10-->
  nome=Nipple Light
| icon=/images/3/39/Frankyts_sk5.png
| level=50
| desc=Franky usa seus mamilos para liberar uma luz muito forte, que reduz em <b>40%</b> o ataque dos oponentes e a velocidade deles em <b>60</b> por <b>6 segundos</b>.
| atr=50, -, -, -
| video=/images/2/26/Franky_ts_sk5.webm
||
<!--Hab11-->
  nome=Rocket Launcher
| icon=/images/6/6f/Frankyts_sk6.png
| level=70
| desc=Usando a tecnologia que adquiriu em Barjimoa Island, Franky usa seus grande ombros, dos quais ele libera uma linha (Battle Franky 37), revelando três pequenos, porém poderosos, mísseis que serão lançados no oponente. Causa dano em uma grande área e puxa o oponente. Oponentes que estiverem no caminho dos mísseis recebem apenas <b>75%</b> de dano e não são puxados.
| atr=35, -, 40, 35
| video=/images/0/00/Franky_ts_sk6.webm
||
<!--Hab12-->
  nome=Franky Radical Beam
| icon=/images/1/19/Frankyts_sk7.png
| level=90
| desc=Fazendo um gesto circular com ambas as mãos, Franky dispara um grande e poderoso raio laser capaz de destruir o oponente.
| atr=30, -, 45, 25
| video=/images/a/a9/Franky_ts_sk7.webm
||
<!--Hab13-->
  nome=General Cannon
| icon=/images/1/19/Frankyts_sk7.png
| level=90
| desc=Franky junta os braços do Franky Shogun, como se estivesse se preparando para carregar o Coup de Vent ou o Franky Radical Beam, então enche os braços com ar e dispara uma grande rajada de ar comprimido em direção ao oponente.
| atr=60, -, 90, 50
| video=/images/4/4b/Franky_ts_sk4-4.webm
||
<!--Hab14-->
  nome=No Fuel (Passiva)
| icon=/images/3/3e/Frankyts_passiva.png
| level=20
| desc=Franky precisa de Cola para manter o Franky Shogun. Quando estiver sem energia, Franky deixará o Shogun para trás.
| atr=1, -, -, -
| video=
||
<!--Hab15-->
  nome=Emote
| icon=/images/4/4b/Icon-emote.png
| level=25
| desc=
| atr=12, -, -, -
| video=/images/e/e8/Franky_ts_emote.webm
||
</nowiki>


|skinsRaw=<nowiki>
const applyWeaponState = (enabled) => {
<!--Skin1-->
    const first = document.querySelector('.skill-icon');
  image=/images/4/48/Franky_ts_dressrosa.png
    const selected = document.querySelector('.skill-icon.selected');
| tooltip=<b>Franky - Dressrosa</b><br>Pode ser obtido(a) trocando por <b>Medalhas de Valentia</b>
    if (first) {
||
        if (selected) selected.classList.remove('selected');
</nowiki>
        first.classList.add('selected');
}}
    }
 
    if (typeof window.__setGlobalWeaponEnabled === 'function') {
        window.__setGlobalWeaponEnabled(enabled);
    }
 
    try {
        localStorage.setItem('glaWeaponEnabled', enabled ? '1' : '0');
    } catch (x) { }
 
    document.querySelectorAll('.skill-icon[data-weapon]').forEach(el => {
        if (enabled) {
            el.classList.add('has-weapon-available');
            let ind = el.querySelector('.weapon-indicator');
            if (!ind) {
                ind = document.createElement('div');
                ind.className = 'weapon-indicator';
                el.appendChild(ind);
            }
        } else {
            el.classList.remove('has-weapon-available');
            el.classList.remove('weapon-equipped');
            el.style.removeProperty('--weapon-badge-url');
            const ind = el.querySelector('.weapon-indicator');
            if (ind) ind.remove();
        }
    });
 
    const sel = document.querySelector('.skill-icon.selected');
    if (sel) {
        sel.dispatchEvent(new Event('click', { bubbles: true }));
    }
};
 
 
        const ensureModal = () => {
            let modal = document.getElementById('weapon-info-modal');
            if (modal) return modal;
            modal = document.createElement('div');
            modal.id = 'weapon-info-modal';
            modal.className = 'weapon-modal';
            modal.innerHTML = `
            <div class="weapon-modal-overlay"></div>
            <div class="weapon-modal-content">
                <div class="weapon-modal-header">
                    <h3>Visualização com Arma Especial</h3>
                    <button class="weapon-modal-close">&times;</button>
                </div>
                <div class="weapon-modal-body">
                    <p>Este modo ativa a visualização do personagem equipado com sua <strong>arma especial</strong>.</p>
                    <p>As habilidades melhoradas ficam <strong>destacadas com borda e brilho azul</strong>, mesmo quando não selecionadas.</p>
                    <p class="weapon-info-link" style="margin-top:8px;display:none"></p>
                </div>
                <div class="weapon-modal-footer">
                    <label class="weapon-modal-checkbox">
                        <input type="checkbox" id="weapon-dont-show">
                        <span>Não mostrar novamente</span>
                    </label>
                    <button class="weapon-modal-btn">Entendi</button>
                </div>
            </div>
        `;
            document.body.appendChild(modal);
            try {
                const firstWithWeapon = document.querySelector('.skill-icon[data-weapon]');
                if (firstWithWeapon) {
                    const raw = firstWithWeapon.getAttribute('data-weapon');
                    const obj = JSON.parse(raw || '{}');
                    const nm = (obj && obj.name) ? String(obj.name).trim() : '';
                    if (nm) {
                        const linkHost = (window.mw && mw.util && typeof mw.util.getUrl === 'function') ? mw.util.getUrl(nm) : ('/index.php?title=' + encodeURIComponent(nm));
                        const holder = modal.querySelector('.weapon-info-link');
                        if (holder) {
                            holder.style.display = 'block';
                            holder.innerHTML = `<a href="${linkHost}" style="color:#6BB3FF;text-decoration:none;font-weight:600">Ver página da arma: ${nm}</a>`;
                        }
                    }
                }
            } catch (_) { }
            bindModalEvents();
            return modal;
        };
 
        const showPopup = () => {
            const modal = ensureModal();
            if (modal) modal.classList.add('show');
        };
 
        const hidePopup = () => {
            const m = document.getElementById('weapon-info-modal');
            if (m) m.classList.remove('show');
        };
 
        window.__applyWeaponState = applyWeaponState;
        window.__glaWeaponShowPopup = showPopup;
        window.__glaWeaponHidePopup = hidePopup;
        try {
            window.dispatchEvent(new CustomEvent('weapon:ready', { detail: { applyWeaponState, showPopup, hidePopup } }));
        } catch (err) {
        }
 
        const boot = () => {
            // Verificar se existe alguma skill com arma
            const hasAnyWeapon = document.querySelectorAll('.skill-icon[data-weapon]').length > 0;
            if (!hasAnyWeapon) return;
 
            ensureModal();
 
            // Estado inicial do toggle
            let init = false;
            try {
                if (localStorage.getItem('glaWeaponEnabled') === '1') init = true;
            } catch (x) { }
            setTimeout(() => applyWeaponState(init), 150);
        };
 
        if (document.readyState === 'loading') {
            document.addEventListener('DOMContentLoaded', boot);
        } else {
            boot();
        }
    })();
</script>
<style>
    .weapon-modal {
        position: fixed;
        inset: 0;
        z-index: 9999;
        display: flex;
        align-items: center;
        justify-content: center;
        opacity: 0;
        pointer-events: none;
        transition: opacity .3s;
    }
 
    .weapon-modal.show {
        opacity: 1;
        pointer-events: all;
    }
 
    .weapon-modal-overlay {
        position: absolute;
        inset: 0;
        background: rgba(0, 0, 0, .75);
        -webkit-backdrop-filter: blur(4px);
        backdrop-filter: blur(4px);
    }
 
    .weapon-modal-content {
        position: relative;
        background: linear-gradient(135deg, #1f1f1f, #2a2a2a);
        border: 1px solid rgba(255, 255, 255, .12);
        border-radius: 12px;
        max-width: 420px;
        width: 90%;
        box-shadow: 0 20px 60px rgba(0, 0, 0, .6);
        animation: modalIn .3s;
    }
 
    @keyframes modalIn {
        from {
            transform: translateY(-20px);
            opacity: 0;
        }
 
        to {
            transform: translateY(0);
            opacity: 1;
        }
    }
 
    .weapon-modal-header {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: 16px 20px;
        border-bottom: 1px solid rgba(255, 255, 255, .08);
    }
 
    .weapon-modal-header h3 {
        margin: 0;
        font-size: 16px;
        font-weight: 600;
        color: #fff;
    }
 
    .weapon-modal-close {
        background: transparent;
        border: none;
        color: rgba(255, 255, 255, .5);
        font-size: 24px;
        cursor: pointer;
        padding: 0;
        width: 28px;
        height: 28px;
        display: flex;
        align-items: center;
        justify-content: center;
        border-radius: 4px;
        transition: background .15s, color .15s;
    }
 
    .weapon-modal-close:hover {
        background: rgba(255, 255, 255, .1);
        color: #fff;
    }
 
    .weapon-modal-body {
        padding: 20px;
        color: rgba(255, 255, 255, .8);
        line-height: 1.6;
        font-size: 14px;
    }
 
    .weapon-modal-body p {
        margin: 0 0 12px;
    }
 
    .weapon-modal-body p:last-child {
        margin: 0;
    }
 
    .weapon-modal-body strong {
        color: #6BB3FF;
    }
 
    .weapon-modal-footer {
        display: flex;
        align-items: center;
        justify-content: space-between;
        padding: 14px 20px;
        border-top: 1px solid rgba(255, 255, 255, .08);
        gap: 12px;
    }
 
    .weapon-modal-checkbox {
        display: flex;
        align-items: center;
        gap: 8px;
        font-size: 12px;
        color: rgba(255, 255, 255, .6);
        cursor: pointer;
    }
 
    .weapon-modal-checkbox input[type="checkbox"] {
        accent-color: #4A9EFF;
    }
 
    .weapon-modal-btn {
        background: #4A9EFF;
        border: none;
        color: #fff;
        padding: 10px 24px;
        border-radius: 6px;
        font-weight: 600;
        font-size: 13px;
        cursor: pointer;
        transition: background .15s;
    }
 
    .weapon-modal-btn:hover {
        background: #3A8EEF;
    }
 
    @media (max-width: 600px) {
        .weapon-modal-content {
            width: 95%;
        }
 
        .weapon-modal-header,
        .weapon-modal-body,
        .weapon-modal-footer {
            padding: 12px 16px;
        }
 
        .weapon-modal-footer {
            flex-direction: column;
        }
    }
</style>

Edição atual tal como às 16h34min de 2 de dezembro de 2025

<script>

   (() => {
       let modalListenersBound = false;
       const bindModalEvents = () => {
           if (modalListenersBound) return;
           modalListenersBound = true;
           document.addEventListener('click', (ev) => {
               if (ev.target.closest('.weapon-modal-close') || ev.target.closest('.weapon-modal-btn')) {
                   const checkbox = document.getElementById('weapon-dont-show');
                   if (checkbox && checkbox.checked) {
                       try { localStorage.setItem('glaWeaponPopupDismissed', '1'); } catch (x) { }
                   }
                   hidePopup();
                   return;
               }
               if (ev.target.classList.contains('weapon-modal-overlay')) {
                   hidePopup();
               }
           });
       };

const applyWeaponState = (enabled) => {

   const first = document.querySelector('.skill-icon');
   const selected = document.querySelector('.skill-icon.selected');
   if (first) {
       if (selected) selected.classList.remove('selected');
       first.classList.add('selected');
   }
   if (typeof window.__setGlobalWeaponEnabled === 'function') {
       window.__setGlobalWeaponEnabled(enabled);
   }
   try {
       localStorage.setItem('glaWeaponEnabled', enabled ? '1' : '0');
   } catch (x) { }
   document.querySelectorAll('.skill-icon[data-weapon]').forEach(el => {
       if (enabled) {
           el.classList.add('has-weapon-available');
           let ind = el.querySelector('.weapon-indicator');
           if (!ind) {
               ind = document.createElement('div');
               ind.className = 'weapon-indicator';
               el.appendChild(ind);
           }
       } else {
           el.classList.remove('has-weapon-available');
           el.classList.remove('weapon-equipped');
           el.style.removeProperty('--weapon-badge-url');
           const ind = el.querySelector('.weapon-indicator');
           if (ind) ind.remove();
       }
   });
   const sel = document.querySelector('.skill-icon.selected');
   if (sel) {
       sel.dispatchEvent(new Event('click', { bubbles: true }));
   }

};


       const ensureModal = () => {
           let modal = document.getElementById('weapon-info-modal');
           if (modal) return modal;
           modal = document.createElement('div');
           modal.id = 'weapon-info-modal';
           modal.className = 'weapon-modal';
           modal.innerHTML = `

Visualização com Arma Especial

                   <button class="weapon-modal-close">×</button>

Este modo ativa a visualização do personagem equipado com sua arma especial.

As habilidades melhoradas ficam destacadas com borda e brilho azul, mesmo quando não selecionadas.

       `;
           document.body.appendChild(modal);
           try {
               const firstWithWeapon = document.querySelector('.skill-icon[data-weapon]');
               if (firstWithWeapon) {
                   const raw = firstWithWeapon.getAttribute('data-weapon');
                   const obj = JSON.parse(raw || '{}');
                   const nm = (obj && obj.name) ? String(obj.name).trim() : ;
                   if (nm) {
                       const linkHost = (window.mw && mw.util && typeof mw.util.getUrl === 'function') ? mw.util.getUrl(nm) : ('/index.php?title=' + encodeURIComponent(nm));
                       const holder = modal.querySelector('.weapon-info-link');
                       if (holder) {
                           holder.style.display = 'block';
                           holder.innerHTML = `<a href="${linkHost}" style="color:#6BB3FF;text-decoration:none;font-weight:600">Ver página da arma: ${nm}</a>`;
                       }
                   }
               }
           } catch (_) { }
           bindModalEvents();
           return modal;
       };
       const showPopup = () => {
           const modal = ensureModal();
           if (modal) modal.classList.add('show');
       };
       const hidePopup = () => {
           const m = document.getElementById('weapon-info-modal');
           if (m) m.classList.remove('show');
       };
       window.__applyWeaponState = applyWeaponState;
       window.__glaWeaponShowPopup = showPopup;
       window.__glaWeaponHidePopup = hidePopup;
       try {
           window.dispatchEvent(new CustomEvent('weapon:ready', { detail: { applyWeaponState, showPopup, hidePopup } }));
       } catch (err) {
       }
       const boot = () => {
           // Verificar se existe alguma skill com arma
           const hasAnyWeapon = document.querySelectorAll('.skill-icon[data-weapon]').length > 0;
           if (!hasAnyWeapon) return;
           ensureModal();
           // Estado inicial do toggle
           let init = false;
           try {
               if (localStorage.getItem('glaWeaponEnabled') === '1') init = true;
           } catch (x) { }
           setTimeout(() => applyWeaponState(init), 150);
       };
       if (document.readyState === 'loading') {
           document.addEventListener('DOMContentLoaded', boot);
       } else {
           boot();
       }
   })();

</script> <style>

   .weapon-modal {
       position: fixed;
       inset: 0;
       z-index: 9999;
       display: flex;
       align-items: center;
       justify-content: center;
       opacity: 0;
       pointer-events: none;
       transition: opacity .3s;
   }
   .weapon-modal.show {
       opacity: 1;
       pointer-events: all;
   }
   .weapon-modal-overlay {
       position: absolute;
       inset: 0;
       background: rgba(0, 0, 0, .75);
       -webkit-backdrop-filter: blur(4px);
       backdrop-filter: blur(4px);
   }
   .weapon-modal-content {
       position: relative;
       background: linear-gradient(135deg, #1f1f1f, #2a2a2a);
       border: 1px solid rgba(255, 255, 255, .12);
       border-radius: 12px;
       max-width: 420px;
       width: 90%;
       box-shadow: 0 20px 60px rgba(0, 0, 0, .6);
       animation: modalIn .3s;
   }
   @keyframes modalIn {
       from {
           transform: translateY(-20px);
           opacity: 0;
       }
       to {
           transform: translateY(0);
           opacity: 1;
       }
   }
   .weapon-modal-header {
       display: flex;
       align-items: center;
       justify-content: space-between;
       padding: 16px 20px;
       border-bottom: 1px solid rgba(255, 255, 255, .08);
   }
   .weapon-modal-header h3 {
       margin: 0;
       font-size: 16px;
       font-weight: 600;
       color: #fff;
   }
   .weapon-modal-close {
       background: transparent;
       border: none;
       color: rgba(255, 255, 255, .5);
       font-size: 24px;
       cursor: pointer;
       padding: 0;
       width: 28px;
       height: 28px;
       display: flex;
       align-items: center;
       justify-content: center;
       border-radius: 4px;
       transition: background .15s, color .15s;
   }
   .weapon-modal-close:hover {
       background: rgba(255, 255, 255, .1);
       color: #fff;
   }
   .weapon-modal-body {
       padding: 20px;
       color: rgba(255, 255, 255, .8);
       line-height: 1.6;
       font-size: 14px;
   }
   .weapon-modal-body p {
       margin: 0 0 12px;
   }
   .weapon-modal-body p:last-child {
       margin: 0;
   }
   .weapon-modal-body strong {
       color: #6BB3FF;
   }
   .weapon-modal-footer {
       display: flex;
       align-items: center;
       justify-content: space-between;
       padding: 14px 20px;
       border-top: 1px solid rgba(255, 255, 255, .08);
       gap: 12px;
   }
   .weapon-modal-checkbox {
       display: flex;
       align-items: center;
       gap: 8px;
       font-size: 12px;
       color: rgba(255, 255, 255, .6);
       cursor: pointer;
   }
   .weapon-modal-checkbox input[type="checkbox"] {
       accent-color: #4A9EFF;
   }
   .weapon-modal-btn {
       background: #4A9EFF;
       border: none;
       color: #fff;
       padding: 10px 24px;
       border-radius: 6px;
       font-weight: 600;
       font-size: 13px;
       cursor: pointer;
       transition: background .15s;
   }
   .weapon-modal-btn:hover {
       background: #3A8EEF;
   }
   @media (max-width: 600px) {
       .weapon-modal-content {
           width: 95%;
       }
       .weapon-modal-header,
       .weapon-modal-body,
       .weapon-modal-footer {
           padding: 12px 16px;
       }
       .weapon-modal-footer {
           flex-direction: column;
       }
   }

</style>