fusioneer Author

Создал новый тикет, потому что старый не смог переоткрыть.
Пересмотрел ещё раз всю функцию целиком.
Переделал так:

  function createCalculationForItem(item) {
    $("#cwas-price-calculator-calculate").click(function(){
        var startLvl = parseInt($("#cwas-price-calculator-startLvl").val());
        var endLvl = parseInt($("#cwas-price-calculator-endLvl").val());
        var results = $("#cwas-price-calculator-results");
        results.children().remove();

        var resourceDict = {};
        for (var updateLvl = startLvl + 1; updateLvl <= endLvl; updateLvl++) {
            var levelPrice = item.price(updateLvl);
            for (var resourceName in levelPrice) {
                var resourceAmount = levelPrice[resourceName];
                if (resourceAmount > 0) {
                    if (resourceDict[resourceName] === undefined) {
                        resourceDict[resourceName] = 0;
                    }
                    resourceDict[resourceName] += resourceAmount;
                }
            }
        }
        for (var r in resourceDict) {
            if (r !== 'time') {
                results.append(createResourceSection(r, resourceDict[r]));
            }
        }
        results.append(createResourceSection('time', formatTimeFromSeconds(resourceDict.time)));
    });
  }

За один цикл одновременно собираем и нужные ресурсы и их количество.
Проходимся только по нужным уровням.
Значения с ресурсом, равным 0, отфильтровываем.


Если добавить в конец функции createCalculationInterface

      $('#cwas-price-calculator-startLvl').val(item.currentLevel());

не прийдётся каждый раз вводить текущий уровень в поле начального значения калькулятора


Пересмотрел ещё раз всю функцию целиком.
Переделал так:

  function createCalculationForItem(item) {
    $("#cwas-price-calculator-calculate").click(function(){
        var startLvl = parseInt($("#cwas-price-calculator-startLvl").val());
        var endLvl = parseInt($("#cwas-price-calculator-endLvl").val());
        var results = $("#cwas-price-calculator-results");
        results.children().remove();

        var resourceDict = {};
        for (var updateLvl = startLvl + 1; updateLvl <= endLvl; updateLvl++) {
            var levelPrice = item.price(updateLvl);
            for (var resourceName in levelPrice) {
                var resourceAmount = levelPrice[resourceName];
                if (resourceAmount > 0) {
                    if (resourceDict[resourceName] === undefined) {
                        resourceDict[resourceName] = 0;
                    }
                    resourceDict[resourceName] += resourceAmount;
                }
            }
        }
        for (var r in resourceDict) {
            if (r !== 'time') {
                results.append(createResourceSection(r, resourceDict[r]));
            }
        }
        results.append(createResourceSection('time', formatTimeFromSeconds(resourceDict.time)));
    });
  }

За один цикл одновременно собираются и нужные ресурсы и их количество.
Проходимся только по нужным уровням.
Те уровни, на которых ресурс объявлен, но равен 0, не попадают в результат.


Прошу прощения, недокопипастил:

        var startTier = Math.trunc(startLvl / 20);
        var endTier = Math.trunc((endLvl - 1) / 20);
        for (var currTier = startTier; currTier <= endTier; currTier++)
        {
            var additionalResourceNames = Object.keys(item.price((20 * currTier) + 1));
            for (var i = additionalResourceNames.length - 1; i >= 0; i--) {
                if (resourceNames.indexOf(additionalResourceNames[i]) === -1) {
                    resourceNames.push(additionalResourceNames[i]);
                }
            }
        }

Цикл

        while (endLvl - (startLvl + 20 * lvlMult++) > 20) {
            var additionalResourceNames = Object.keys(item.price((startLvl + 20 * lvlMult) + 1));
            for (var i = additionalResourceNames.length - 1; i >= 0; i--) {
                if (resourceNames.indexOf(additionalResourceNames[i]) === -1) {
                    resourceNames.push(additionalResourceNames[i]);
                }
            }
        }

не собирает последний доп. ресурс, если разница между начальным и конечным уровнем меньше 20
предлагаю такой вариант:

        var startTier = Math.trunc(startLvl / 20);
        var endTier = Math.trunc((endLvl - 1) / 20);
        for (var currTier = startTier; currTier <= endTier; currTier++)
            var additionalResourceNames = Object.keys(item.price((20 * currTier) + 1));
            for (var i = additionalResourceNames.length - 1; i >= 0; i--) {
                if (resourceNames.indexOf(additionalResourceNames[i]) === -1) {
                    resourceNames.push(additionalResourceNames[i]);
                }
            }