ФЭНДОМ


--WARFRAME Wiki Таблица Реликвий
--http://warframe.fandom.com/ru
--Написано пользователем:ChickenBar с EN wiki (Written by User:ChickenBar from EN wiki)
--Локализовано на русский User:Max.Archy (Rus localization by User:Max.Archy)
 
--Из-за особенностей языка применение русских символов в переменных не допускается
 
local p = {}
                                                        --здесь и далее пометки об исходных именах
local VoidData = mw.loadData( 'Модуль:Бездна/Данные' )  --Void/data
local Icon = require( "Модуль:Иконки" )                 --Module:Icon
local Shared = require( "Модуль:БазаФункций" )          --Module:Shared
 
local TxtColors = {Common = '#9C7344', Uncommon = '#D3D3D3', Rare = '#D1B962'}
 
local tooltipStart = "<span class=\"relic-tooltip\" data-param=\"" --<<<<<<<<<<<<<
local tooltipCenter = "\">"
local tooltipEnd = "</span>"
 
-- Дополняет название окончанием "Прайм" за исключением Формы
-- Позволяет базу данных заполнять без этой приписки >>>>>>>>>а надо ли?
-- Например, "Латрон" преобразует в "Латрон Прайм"
function p.getItemName(itemStr)
    caseItem = string.gsub(itemStr, "(%a)([%w_']*)", Shared.titleCase)
    if(itemStr ~= "ФОРМА") then
        caseItem = caseItem.." Прайм"
    end
    return caseItem
end
 
-- Преобразует название части (Converts part names in data to proper casing)
function p.getPartName(partStr, keepBlueprint)
    --Дополнение пользователя:
    --User:Falterfire 6/19/2018:
    --      New parameter to remove ' Blueprint' if wanted
    --      IE returns 'Neuroptics' instead of 'Neuroptics Blueprint'
    if keepBlueprint == nil then keepBlueprint = true end
    local result = string.gsub(partStr, "(%a)([%w_']*)", Shared.titleCase)
    if not keepBlueprint and Shared.contains(result, ' Blueprint') then
        result = string.gsub(result, ' Blueprint', '')
    end
    return result
end
 
--Получение Реликвии с определенным названием в базе "Бездна/Данные"
function p.getRelic(Tier, Name)
    for i, relic in pairs(VoidData["Relics"]) do
        if (relic.Tier == Tier and relic.Name == Name) then
            return relic
        end
    end
    return nil
end
 
--На текущий момент все реликвии совпадают на всех платформах
--Задел на будущее, если появятся расхождения в Реликвиях по разным платформам
function p.isRelicOnPlatform(Relic, Platform)
    local Platforms = Relic.Platforms
    if(Platforms == nil) then
        return true
    else
        local foundIt = false
        for i, plat in pairs(Platforms) do
            if (plat == Platform) then
                foundIt = true
            end
        end
        return foundIt
    end
end
 
--Возвращает Категорию редкости выпадения элемента списка выпадения реликвии,
--если это часть или чертеж, иначе возвращает "пусто"
function p.getRelicDropRarity(Relic, item, part)
    for i, drop in pairs(Relic.Drops) do
        if ( drop.Item == item and drop.Part == part) then
            return drop.Rarity
        end
    end
 
    return nil
end
 
--Возвращает иконку элемента
--(например, при входных данных Брэйтон Прайм Ствол вернет Прайм_Ствол_иконка)
function p.getPartIconForDrop(drop)
    local iName = p.getItemName(drop.Item)
    local pName = p.getPartName(drop.Part)
    local iconSize ='50'
    local primeToggle = '_Прайм'
 
    if iName == 'Одоната Прайм' then
        if pName == 'Упряж' or pName == 'Система' or pName == 'Крылья' then
            primeToggle = '_Арчвинг'                                --'Archwing '
        end
--    elseif pName == 'Carapace' or pName == 'Cerebrum' or pName == 'Systems' then
--        primeToggle = ''
    end
 
    local icon =''
    if(pName == 'Чертеж') then                                      --'Blueprint'
        icon = Icon._Prime(Shared.titleCase(drop.Item), nil,iconSize)
    elseif iName == 'Каваса Прайм' then                             --'Kavasa Prime'
        icon = Icon._Prime('Каваса Прайм', nil,iconSize)                  --'Kavasa'
    else
        icon = Icon._Item(pName..primeToggle,"",iconSize)
    end
 
    return icon
end
 
--Возвращает наименование для иконки Оружия, Варфрейма и т.д.
--(например, при входных данных Брэйтон Прайм Ствол вернет Брэйтон_Прайм)
function p.getItemIconForDrop(drop)
    local iName = p.getItemName(drop.Item)
    local pName = p.getPartName(drop.Part)
    local iconSize ='40'
 
    local icon =''
    icon = Icon._Prime(Shared.titleCase(drop.Item), nil, iconSize)
 
    return icon
end
 
function p.item(frame)
    local platform = frame.args[1]
    local item_type = frame.args[2]
    local item_part = frame.args[3]
    local relic_tier = frame.args[4]
 
    return p._item(item_type,item_part,relic_tier,platform)
end
----------------------------------------------------------
--ПРОПИСАТЬ ПЕРЕНАЗНАЧЕНИЕ ДЛЯ ПРОЧИХ ЭЛЕМЕНТОВ ЧАСТЕЙ!!!!
--Ж--Ж-ЖЖЖ----ЖЖ---Ж--ЖЖЖ-Ж---Ж-ЖЖЖЖЖ-Ж----Ж-Ж-Ж
--Ж--*-Ж-----Ж--Ж-Ж-Ж-Ж---Ж---Ж---Ж---Ж----Ж-Ж-Ж
--ЖЖЖЖ-ЖЖЖ-----Ж--ЖЖЖ-ЖЖЖ-ЖЖЖ-Ж---Ж---ЖЖЖ--Ж-Ж-Ж
--Ж--Ж-Ж-----Ж--Ж-Ж-Ж-Ж-Ж-Ж-Ж-Ж---Ж---Ж-Ж-------
--Ж--Ж-ЖЖЖ----ЖЖ--Ж-Ж-ЖЖЖ-ЖЖЖ-Ж---Ж---ЖЖЖ--Ж-Ж-Ж
----------------------------------------------------------
function p._item(item_type,item_part,relic_tier,platform)
    item_type = string.upper(item_type)
    item_part = string.upper(item_part)
---    if (item_part == "HELMET BLUEPRINT") then
---        item_part = "NEUROPTICS BLUEPRINT"
---    end
--пока что уберу, так как наименования Шлем не должно быть
    local locations = {}
    local vaultLocations = {}
    local i
    for i, relic in pairs(VoidData["Relics"]) do  --Русификация???? <<<<<<<<<<<<<<<
        if(p.isRelicOnPlatform(relic, platform) and (relic_tier == nil or relic.Tier == relic_tier)) then
            local dropRarity = p.getRelicDropRarity(relic, item_type, item_part)
            if(dropRarity ~= nil) then
                local relicText = relic.Tier.." "..relic.Name
                local relicString = tooltipStart..relicText..tooltipCenter.."[["..relicText.."]]"..tooltipEnd.." "..dropRarity
                if(relic.IsVaulted == 1) then
                    relicString = relicString.." ([[Прайм Хранилище|Пр.хр.]])"  --Prime Vault|V
                    table.insert(vaultLocations, relicString)
                else
                    if(relic.IsBaro == 1) then
                        relicString = relicString.." ([[Баро Ки%27Тир|Баро]])"    --Baro Ki%27Teer|B
                    end
                    table.insert(locations, relicString)
                end
            end
        end
    end
 
    for _, i in pairs(vaultLocations) do
        table.insert(locations, i)
    end
    return table.concat(locations, "<br/>")
end
 
function p.relicTooltip(frame)
    local relicName = frame.args ~= nil and frame.args[1] or frame
    local platform = frame.args ~= nil and frame.args[2]
    if(platform == nil) then platform = 'PC' end
    if(relicName == nil) then return nil end
 
    local bits = Shared.splitString(relicName, ' ')
    local Tier = bits[1]
    local RName = bits[2]
 
    local theRelic = p.getRelic(Tier, RName)
    if(theRelic == nil) then return 'ОШИБКА: Данная реликвия не найдена' end
 --   if(not p.isRelicOnPlatform(theRelic, Platform)) then return "ERROR: That relic isn't on that platform" end
    if(not p.isRelicOnPlatform(theRelic, Platform)) then return "ОШИБКА: Эта реликвия не найдена для данной платформы" end
 
    local result = '{|'
 
    local rareTxt = {Common = '', Uncommon = '', Rare = ''}
 
    for i, drop in pairs(theRelic.Drops) do
        local rarity = drop.Rarity
        if(rarity ~= nil) then
            if(rareTxt[rarity] ~= '') then rareTxt[rarity] = rareTxt[rarity]..'\n' end
            if(i > 1) then rareTxt[rarity] = rareTxt[rarity]..'|-' end
 
            local iName = p.getItemName(drop.Item)
            local pName = p.getPartName(drop.Part)
 
            local icon = p.getPartIconForDrop(drop)
 
            rareTxt[rarity] = rareTxt[rarity]..'\n| rowspan=2 class=\"Image\" | '..icon
 
            rareTxt[rarity] = rareTxt[rarity]..'\n| class = "gradientText" style = "vertical-align:bottom; color:'..TxtColors[rarity]..';" | '..iName
            rareTxt[rarity] = rareTxt[rarity]..'\n|-\n| class = "gradientText" style = "vertical-align:top; color:'..TxtColors[rarity]..';" | '..pName
        end
    end
 
 
    result = result..rareTxt['Common']..'\n'..rareTxt['Uncommon']
    result = result..'\n'..rareTxt['Rare']
    result = result..'\n|}'
 
    return result
end
 
function p.getRelicDrop(frame)
    local relicName = frame.args ~= nil and frame.args[1] or nil
    local rarity = frame.args ~= nil and frame.args[2] or nil
    local number = frame.args ~= nil and frame.args[3] or nil
    if number == nil then 
        --\количество по умолчанию 1, если не указано
        number = 1 
    elseif type(number) == 'string' then
        --Принудительное преобразование типа "строка" в "числовое"
        number = tonumber(number)
    end
 
    --Платформа как отдельный аргумент. По умолчанию для PC не указывается
    local platform = frame.args ~= nil and frame.args.platform or nil
    if platform == nil then platform = 'PC' end
 
    --Возвращает ошибку при отсутствии любой требуемой переменной
    if relicName == nil or relicName == '' then
        return "ОШИБКА: Не задана переменная 'Название реликвии'"           --Relic Name
    elseif rarity == nil or rarity == '' then
        return "ОШИБКА: Не задана переменная 'Категория редкости'"          --Rarity
    end
 
    local bits = Shared.splitString(relicName, ' ')
    local Tier = bits[1]
    local RName = bits[2]
 
    local theRelic = p.getRelic(Tier, RName)
 
    --Возвращает ошибку если имя реликвии некорректно
    if theRelic == nil then
        return "ОШИБКА: Некорректное название реликвии '"..relicName.."'"
    end
 
    local count = 0
    for i, drop in pairs(theRelic.Drops) do
        --Цикл по базе реликвий для поиска Части, Чертежа в соответствии 
        --с заданной категорией редкости
        if drop.Rarity == rarity then
            count = count + 1
            --В случае достижения необходимого количества возвращает Иконку + Название предмета
            if count == number then
                local iName = p.getItemName(drop.Item)
                local pName = p.getPartName(drop.Part, false)
                local icon = p.getItemIconForDrop(drop)
 
                return icon..' [['..iName..'|'..iName..' '..pName..']]'
            end
        end
    end
 
    --Если добрались до данной строки кода, значит найдено
    --недостаточное количество предметов заданной категории редкости
    return "ОШИБКА: Найдено только "..count.." предметов категории редкости "..rarity.." для реликвии "..relicName
end
 
function p.getRelicTotal(frame)
    local total = 0
 
    if(Shared.contains(frame.args, "unvaulted")) then   --русификация?
        for _,relic in pairs(VoidData["Relics"]) do
            if(relic.IsVaulted == 0) then
                total = total + 1
            end
        end
    end
    if(Shared.contains(frame.args, "vaulted")) then     --русификация?
        for _,relic in pairs(VoidData["Relics"]) do
            if(relic.IsVaulted == 1) then
                total = total + 1
            end
        end
    end
    if(Shared.contains(frame.args, "baro")) then        --русификация?
        for _,relic in pairs(VoidData["Relics"]) do
            if(relic.IsBaro == 1) then
                total = total + 1
            end
        end
    end
    if(frame.args[1] == nil) then
        total = Shared.tableCount(VoidData["Relics"])
    end
 
    return total
end
 
local function relicData()
    --Поиск в базе Бездны m:VoidByReward p.byReward
    local data = {}
 
    for _, relic in pairs(VoidData["Relics"]) do
        for i, drop in pairs(Relic.Drops) do
            local newObj = {Tier = relic.Tier, Name = relic.Name, Rarity = drop.Rarity, IsVaulted = relic.IsVaulted == 1, IsBaro = relic.IsBaro == 1}
            if (data[drop.Item] == nil) then
                data[drop.Item] = {}
            end
            if(data[drop.Item][drop.Part] == nil) then
                data[drop.Item][drop.Part] = {}
            end
            table.insert(data[drop.Item][drop.Part], newObj)
        end
    end
 
    return data
end
 
local function checkData(data)
    if data == nil or type(data) ~= 'table' then
        local data = relicData()
        return data
    elseif type(data) == 'table' then
        return data
    end
end
 
local function getItemRarities(itemName, partName, data)
    local data = checkData(data)
 
    local rarities ={}
    itemName = string.upper(itemName)
    partName = string.upper(partName)
 
    for n, drop in Shared.skpairs(data[itemName][partName]) do
        rarities[drop.Rarity] = true
    end
 
    --[[for rar, n in pairs(rarities) do
        mw.log(rar)
    end--]]
 
    return rarities
end
 
function p.getDucatValue(frame)
    --This is just for invoking p._getDucatValue on article pages.
    local itemName = frame.args ~= nil and frame.args[1] or nil
    local partName = frame.args ~= nil and frame.args[2] or nil
 
    if itemName == nil or itemName == '' then
        return 'Item name missing'
    elseif partName == nil or partName == '' then
        return 'Part name missing'
    end
    return p._getDucatValue(itemName, partName)
end
 
function p._getDucatValue(itemName, partName, data)
    --Calculating the ducat value of an item. A few don't follow the rule of (common=15, uncommon=45, rare=100, common+uncommon=25, uncommon+rare=65) so they are handled before calling "getItemRarities" for a slight efficiency gain.
    --A small local function for checking if the two strings match.
    local function uCheck(name, expected)
        if string.upper(name) == string.upper(expected) then
            return true
        end
        return false
    end
    -->>>>отрихтовать<<<<<<<<
    if uCheck(itemName, 'Сома') and uCheck(partName, 'Чертеж') then
        return 15
    elseif uCheck(itemName, 'Брэйтон') and uCheck(partName, 'Ствол') then   --Stock
        return 15
    elseif uCheck(itemName, 'Акстилетто') and uCheck(partName, 'Приёмник') then
        return 45
    elseif uCheck(itemName, 'Рубико') and uCheck(partName, 'Ствол') then
        return 45
    elseif uCheck(itemName, 'Сарина') and uCheck(partName, 'Нейрооптика Чертеж') then
        return 45
    elseif uCheck(itemName, 'Анкирос') and uCheck(partName, 'Лезвие') then
        return 65
    elseif uCheck(itemName, 'Рино') and uCheck(partName, 'Каркас Чертеж') then
        return 65
    elseif uCheck(itemName, 'Валькирия') and uCheck(partName, 'Система Чертеж') then
        return 100
    end
 
    local data = checkData(data)
 
    local rarities = getItemRarities(itemName, partName, data)
    local ducatValue = 0
    local lenght = Shared.tableCount(rarities)
 
    --Проверка подпадает ли под обозначенную Редкость
    --For checking whether the table contains a dictionary of the particular rarity.
    local function tableContains(table, rarity)
        for rar, value in pairs(table) do
            if rar == rarity then
                return true
            end
        end
        return false
    end
 
    --Проверка к какой Редкости принадлежит для определения корректной стоимости в Дукатах
    --Checking whether the lenght of table "rarities" is 1 or 2 and accordingly perform more checks to assing the correct ducat value.
    if lenght == 1 then
        if rarities['Common'] then
            return 15
        elseif rarities['Uncommon'] then
            return 45
        elseif rarities['Rare'] then
            return 100
        end
    elseif lenght == 2 then
        if tableContains(rarities, 'Common') then
            return 25
        elseif tableContains(rarities, 'Rare') then
            return 65
        end
    elseif lenght == 3 then
        return 25
    end
 
    return ducatValue
end
 
--Подсчет общей стоимости в Дукатах
function p.getTotalDucats(frame)
    local tierName = frame.args ~= nil and frame.args[1]
    local data = relicData()
    local totalItemCount = 0    --все предметы
    local withoutFormaCount = 0 --все предметы, за исключением Формы
    local totalDucats = 0       --всего в Дукатах
    local availableDucats = 0   --всего в Дукатах для всех доступных предметов
    local availableItems = 0    --доступные предметы
    local availableItemsEF = 0  --доступные предметы, за исключением Формы
    local vaultedDucats = 0     --всего в Дукатах для предметов из Реликвий в Хранилище
    local vaultedItems = 0      --предметы из Реликвий в Хранилище
    local vaultedItemsEF = 0    --предметы из Реликвий в Хранилище, за исключением Формы
    local result = ''
 
    for item, parts in Shared.skpairs(data) do
        for part, drops in Shared.skpairs(parts) do
            for n, drop in Shared.skpairs(drops) do
                if tierName == drop.Tier or tierName == nil then
                    if drop.IsVaulted then
                        vaultedItems = vaultedItems + 1
                    else
                        availableItems = availableItems + 1
                    end
 
                    totalItemCount = totalItemCount + 1
                    if item ~= 'FORMA' then
                        local tempDucat =p._getDucatValue(item, part, data)
                        totalDucats = totalDucats + tempDucat
                        withoutFormaCount = withoutFormaCount + 1
                        if drop.IsVaulted then
                            vaultedDucats = vaultedDucats + tempDucat
                            vaultedItemsEF = vaultedItemsEF + 1
                        else
                            availableDucats = availableDucats + tempDucat
                            availableItemsEF = availableItemsEF + 1
                        end
                    end
                end
            end
        end
    end
 
    if tierName then
        result = "'''Средняя стоимость составляет'''&#58; "..Icon._Item('Ducats').."'''"..Shared.round((totalDucats / totalItemCount),2).."''' ("..totalItemCount..' наград с '..withoutFormaCount..' частями)'
        result = result.."<br>'''Стоимость доступных составляет'''&#58; "..Icon._Item('Ducats').."'''"..Shared.round((availableDucats/availableItems),2).."''' ("..availableItems..' наград с '..availableItemsEF..' parts)'
        result = result.." | '''Запечато в Хранилище'''&#58; "..Icon._Item('Ducats').."'''"..Shared.round((vaultedDucats/vaultedItems),2).."''' ("..vaultedItems..' наград с '..vaultedItemsEF..' parts)' --<<<<<<<<<<<<<ЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖЖ
    else
        result = "'''Total Ducats Value'''&#58; "..Icon._Item('Ducats').."'''"..Shared.formatnum(totalDucats).."''' ("..totalItemCount..' наград с '..withoutFormaCount..' parts)'
        result = result.."<br>'''Доступно'''&#58; "..Icon._Item('Ducats').."'''"..Shared.formatnum(availableDucats).."''' ("..availableItems..' наград с '..availableItemsEF..' parts)'
        result = result.." | '''Запечато в Хранилище'''&#58; "..Icon._Item('Ducats').."'''"..Shared.formatnum(vaultedDucats).."''' ("..vaultedItems..' наград с '..vaultedItemsEF..' parts)'
    end
 
    return result
end
 
local function ducatPriceRow(itemName, partName, tierName, data)
    local ducatValue = p._getDucatValue(itemName, partName, data)
    local sortValue = ''
 
    local function createRelicText(itemName, partName, tierName, data)
        itemName = string.upper(itemName)
        partName = string.upper(partName)
 
        local locations = {}
        local vaultLocations = {}
        for n, drop in Shared.skpairs(data[itemName][partName]) do
            if drop.Tier == tierName or tierName == nil then
                local dropRarity = drop.Rarity
                if dropRarity ~= nil then
                    local relicText = drop.Tier.." "..drop.Name
                    local relicString = tooltipStart..relicText..tooltipCenter.."[["..relicText.."]]"..tooltipEnd.." "..dropRarity
                    if drop.IsVaulted then
                        relicString = relicString.." ([[Prime Vault|V]])"
                        table.insert(vaultLocations, relicString)
                    else
                        if drop.IsBaro then
                            relicString = relicString.." ([[Baro Ki%27Teer|B]])"
                        end
                        table.insert(locations, relicString)
                    end
                end
            end
        end
 
        for _, i in pairs(vaultLocations) do
            table.insert(locations, i)
        end
 
        return table.concat(locations, "<br/>")
    end
 
 
    if itemName == nil or itemName == '' or partName == nil or partName == '' then
        return 'Please enter item and part names'
    end
 
    --first cell
    if partName == 'Blueprint' then
        sortValue = itemName..' _'..partName
    else
        sortValue = itemName..' '..partName
    end
    local cell1 = '\n|data-sort-value="'..sortValue..'"|'..Icon._Prime(itemName,partName)
    local cell2 = '\n|'..createRelicText(itemName, partName, tierName, data)
    local cell3 = '\n|data-sort-value="'..ducatValue..'"|'..Icon._Item('Ducats').."'''"..ducatValue.."'''\n|-"
 
    return cell1..cell2..cell3
end
 
function p.ducatRelicList(frame)
    local data = relicData()
    local tierName = frame.args ~= nil and frame.args[1] or nil
    --Adding switch to choose only vaulted or unvaulted items to show
    local listMode = frame.args ~= nil and frame.args[2] or 'ALL'
    listMode = string.upper(listMode)
    local itemList = {}
    local result = {}
 
    for item, parts in Shared.skpairs(data) do
        if item ~= 'FORMA' then
            for part, drops in Shared.skpairs(parts) do
                for i, drop in pairs(drops) do
                    if drop.Tier == tierName or tierName == nil then
                        local tempName = ''
                        if part == 'BLUEPRINT' then
                            tempName = Shared.titleCase(item..'<> '..part)
                        else
                            tempName = Shared.titleCase(item..'<>'..part)
                        end
                        if not Shared.contains(itemList, tempName) then
                            if listMode == 'VAULTED' then
                                if drop.isBaro or drop.IsVaulted then
                                    table.insert(itemList, tempName)
                                end
                            elseif listMode == 'UNVAULTED' then
                                if not drop.IsBaro and not drop.IsVaulted then
                                    table.insert(itemList, tempName)
                                end
                            else
                                table.insert(itemList, tempName)
                            end
                        end
                    end
                end
            end
        end
    end
    table.sort(itemList)
 
    for num, itm in pairs(itemList) do
        local item = Shared.splitString(itm, '<>')
        item[1] = Shared.trim(item[1])
        item[2] = Shared.trim(item[2])
        table.insert(result, (ducatPriceRow(item[1], item[2], tierName, data)))
    end
    return table.concat(result)
end
 
return p
Материалы сообщества доступны в соответствии с условиями лицензии CC-BY-SA , если не указано иное.