MediaWiki:Herostatscalc.js

Версия от 00:44, 19 ноября 2020; Sadist007 (обсуждение | вклад) (Откат правок Sadist007 (обсуждение) к версии MrGorun)
(разн.) ← Предыдущая версия | Текущая версия (разн.) | Следующая версия → (разн.)

Замечание: Возможно, после публикации вам придётся очистить кэш своего браузера, чтобы увидеть изменения.

  • Firefox / Safari: Удерживая клавишу Shift, нажмите на панели инструментов Обновить либо нажмите Ctrl+F5 или Ctrl+R (⌘+R на Mac)
  • Google Chrome: Нажмите Ctrl+Shift+R (⌘+Shift+R на Mac)
  • Internet Explorer / Edge: Удерживая Ctrl, нажмите Обновить либо нажмите Ctrl+F5
  • Opera: Нажмите Ctrl+F5.
/* Скрипт импортируется через [[MediaWiki:ImportJS]] */
/*         Автор: АбырвалГ#3393 (Discord)         */
/*          Калькулятор характеристик героя        */

var statsTable, hero, heroStats, insertRangeSlider, arrRares, listRares,
    rankCnt, rankDiv, rankLabel, rankInput, rankLabelCnt,
    doblCnt, doblDiv, doblLabel, doblInput, doblLabelCnt,
    selectRare, doblCss, doblImg, siegeDiv, siegeCnt;
 
function init() {
    hero = {};
    heroStats = document.querySelectorAll("#parent .hero-block-icons");
    hero.baseRareName = document.querySelector("#parent [class^='hero-border']").className;
 
    statsTable = document.querySelectorAll("#calc_table_out tbody")[1];
 
    targetHeroRare = document.getElementById("brdHero");
    targetHeroRank = document.querySelector("#calc_table_out b");
 
    selectRare = document.getElementById("slider_stats_ppls_out");
    rankDiv = document.getElementById("slider_stats_rangs_out");
    doblDiv = document.getElementById("slider_stats_dobl_out");
 
    doblCss = "hero-border-dobl";
 
    doblImg = document.createElement('img');
    doblImg.src = "https://vignette.wikia.nocookie.net/dungeoncrusher/images/1/14/Доблесть_рамка.png/revision/latest?cb=20200316195856&format=original&path-prefix=ru";
    doblImg.className = doblCss;
    doblImg.hidden = true;
    targetHeroRare.prepend(doblImg);
 
    hero.sum = Number.parseInt(heroStats[0].innerText);
    hero.hp = Number.parseInt(heroStats[1].innerText);
    hero.atk = Number.parseInt(heroStats[2].innerText);
    hero.def = Number.parseInt(heroStats[3].innerText);
    hero.wis = Number.parseInt(heroStats[4].innerText);
    hero.agi = Number.parseInt(heroStats[5].innerText);
    hero.rank = 5500;
    hero.rare = 25;
    hero.dobl = 0;
    
    siegeDiv = document.getElementById("switchSiegeTypes");
    siegeCnt = 1;

    if (siegeDiv) {
        for (var i = 0; i < siegeDiv.children.length; i++) {
            siegeDiv.children[i].setAttribute("onclick", "updateSiege(this)");
         }
    }
 
    arrRares = [
        { key: "ob", cnt: 1, name: "Обычный", css: "hero-border-ob", rank: 10},
        { key: "neob", cnt: 1, name: "Необычный", css: "hero-border-neob", rank: 25},
        { key: "redkiy", cnt: 2, name: "Редкий", css: "hero-border-redkiy", rank: 50},
        { key: "redkiy2", cnt: 3, name: "Редчайший", css: "hero-border-redkiy2", rank: 100},
        { key: "epic", cnt: 3, name: "Эпический", css: "hero-border-epic", rank: 250},
        { key: "lega", cnt: 5, name: "Легендарный", css: "hero-border-lega", rank: 500},
        { key: "mifik", cnt: 7, name: "Мифический", css: "hero-border-mifik", rank: 2500},
        { key: "bozh", cnt: 8, name: "Божественный", css: "hero-border-bozh", rank: 3250},
        { key: "bozh2", cnt: 13, name: "Богоподобный", css: "hero-border-bozh2", rank: 4000},
        { key: "vechn", cnt: 17, name: "Вечный", css: "hero-border-vechn", rank: 4750},
        { key: "gal", cnt: 25, name: "Галактический", css: "hero-border-gal", rank: 5500}
    ];
 
    listRares = new Map();
 
    for (var i in arrRares) {
        listRares.set(arrRares[i].key, arrRares[i]);
    }
 
    selectRare.classList.add("selectRare");
    selectRare.style.display = "flex";
 
    rankCnt = document.createElement('input');
    rankCnt.type = "range";
    rankCnt.id = "rankCnt";
    rankCnt.min = 0;
    rankCnt.max = 5500;
    rankCnt.value = 5500;
    rankCnt.step = 25;
    rankCnt.setAttribute("oninput", "changeRankCnt()");
 
    rankInput = document.createElement('input');
    rankInput.type = "number";
    rankInput.value = rankCnt.value;
    rankInput.min = rankCnt.min;
    rankInput.max = rankCnt.max;
    rankInput.step = rankCnt.step;
    rankInput.setAttribute("oninput", "changeRankInput()");
 
    rankDiv.classList.add("rankRangeSelector");
 
    rankLabel = document.createElement('div');
    rankLabel.innerHTML = 'Кол-во рангов: ';
 
    rankDiv.append(rankLabel);
    rankDiv.append(rankInput);
    rankDiv.append(rankCnt);
 
    doblDiv.classList.add("doblRangeSelector");
 
    doblCnt = document.createElement('input');
    doblCnt.type = "range";
    doblCnt.id = "doblCnt";
    doblCnt.min = 0;
    doblCnt.max = 35;
    doblCnt.value = 0;
    doblCnt.setAttribute("oninput", "changeDoblCnt()");
 
    doblInput = document.createElement('input');
    doblInput.type = "number";
    doblInput.value = doblCnt.value;
    doblInput.min = doblCnt.min;
    doblInput.max = doblCnt.max;
    doblInput.setAttribute("oninput", "changeDoblInput()");
 
    doblLabel = document.createElement('div');
    doblLabel.innerHTML = 'Кол-во доблестей: ';
 
    doblDiv.append(doblLabel);
    doblDiv.append(doblInput);
    doblDiv.append(doblCnt);
 
    setBaseRare();
    addListOfRares();
 
}
 
function formatSum(s, k, i) {
    return Number.parseInt(s / hero.baseRareCnt * k * 
    (1 + 0.2 * i)).toString().replace(/(\d)(?=(\d\d\d)+([^\d]|$))/g, '$1 ');
}
 
function updateHeroStats() {
    var koef = hero.rare *  //редкость текущая
     siegeCnt * // осадный коэффициент
        (1 + hero.rank * 0.001) * //ранги
        (1 + 0.2 * hero.dobl); //доблесть
    // hero.baseRareCnt базовая редкость
 
    // SUM HP ATK DEF WIS AGI
    for (var i = 1; i <= 8; i++) {
        statsTable.children[i].children[1].innerHTML = formatSum(hero.sum, koef, i);
        statsTable.children[i].children[2].innerHTML = formatSum(hero.hp, koef, i);
        statsTable.children[i].children[3].innerHTML = formatSum(hero.atk, koef, i);
        statsTable.children[i].children[4].innerHTML = formatSum(hero.def, koef, i);
        statsTable.children[i].children[5].innerHTML = formatSum(hero.wis, koef, i);
        statsTable.children[i].children[6].innerHTML = formatSum(hero.agi, koef, i);
    }
 
 
}
 
function setBaseRare() {
    for (var i in arrRares) {
        if (arrRares[i].css == hero.baseRareName) {
            hero.baseRareId = arrRares[i].key;
            hero.baseRareCnt = arrRares[i].cnt;
            break;
        }
    }
}
 
 
function changeRankCnt() {
    hero.rank = Number.parseInt(rankCnt.value);
    targetHeroRank.innerHTML = rankCnt.value;
    rankInput.value = Number.parseInt(rankCnt.value);
 
    updateHeroStats();
}
function changeRankInput() {
    hero.rank = Number.parseInt(rankInput.value);
    targetHeroRank.innerHTML = rankInput.value;
    rankCnt.value = rankInput.value;
 
    updateHeroStats();
}
 
 
function changeDoblCnt() {
    hero.dobl = Number.parseInt(doblCnt.value);
    doblInput.value = doblCnt.value;
 
    if (doblInput.value == 0 && !doblImg.hidden) {
        doblImg.hidden = true;
    }
 
    if (doblInput.value > 0 && doblImg.hidden) {
        doblImg.hidden = false;
    }
 
    updateHeroStats();
}
function changeDoblInput() {
    hero.dobl = Number.parseInt(doblInput.value);
    doblCnt.value = doblInput.value;
 
    if (doblCnt.value == 0 && !doblImg.hidden) {
        doblImg.hidden = true;
    }
 
    if (doblCnt.value > 0 && doblImg.hidden) {
        doblImg.hidden = false;
    }
 
    updateHeroStats();
}
 
function addListOfRares() {
    for (var i in arrRares) {
        var div = document.createElement('div');
        div.setAttribute("onclick", "updateHeroRare(this)");
        div.setAttribute("name", arrRares[i].key);
        div.setAttribute("title", arrRares[i].name);
        div.classList.add(arrRares[i].css+"_mini");
         div.classList.add("hero-border-mini");
 
        if (arrRares[i].cnt == 25) {
             div.classList.add("checked");
        }
        var img = document.createElement('img');
        img.src = targetHeroRare.children[1].src;
 
        div.append(img);
        selectRare.append(div);
    }
}
function updateHeroRare(t) {
    var newRare = listRares.get(t.getAttribute("name"));
    var maxRank = false;
   
    targetHeroRare.className = newRare.css;
    hero.rare = newRare.cnt;

    selectRare.getElementsByClassName("checked")[0].classList.remove("checked");
    t.classList.add("checked");

    if (rankCnt.value == rankCnt.max) {
        maxRank = true;
    }

    if (newRare.rank <= 25 && rankCnt.step !== 5) {
        rankCnt.step = 5;
        rankInput.step = 5;
    }

    if (newRare.rank > 25 && rankCnt.step == 5) {
        if (rankCnt.value < 25) {
            rankCnt.value = 25;
            rankInput.value = 25;
        }
        rankCnt.step = 25;
        rankInput.step = 25;
        
    }

    rankCnt.max = newRare.rank;
    rankInput.max = newRare.rank;
    
    if (maxRank) {
        rankInput.value = rankCnt.max;
        rankCnt.value = rankCnt.max;
        }

    targetHeroRank.innerHTML = rankCnt.value;
    hero.rank = Number.parseInt(rankCnt.value);
 
    updateHeroStats();
}

function updateSiege(t) {
    siegeCnt = Number.parseInt(t.dataset.id);

    for (var i = 0; i < siegeDiv.children.length; i++) {
        siegeDiv.children[i].classList.remove("checked");
    }
    t.classList.add("checked");
    updateHeroStats();
  }