Модуль:Prototypes/Оружия: различия между версиями
Материал из Space Station 14 Вики
Pok (обсуждение | вклад) мНет описания правки |
AsnDen (обсуждение | вклад) м Поправил опечатку |
||
| (не показаны 4 промежуточные версии 1 участника) | |||
| Строка 7: | Строка 7: | ||
end | end | ||
-- Функция для форматирования списка повреждений с разделением | -- Функция для форматирования списка повреждений с разделением запятой | ||
local function formatDamageList(damageTable) | local function formatDamageList(damageTable) | ||
local items = {} | local items = {} | ||
| Строка 54: | Строка 54: | ||
if mode == "melee" then | if mode == "melee" then | ||
local resultParts = {} | |||
local melee = entry.MeleeWeapon | local melee = entry.MeleeWeapon | ||
if | if melee and melee.damage and melee.damage.types then | ||
local oneHandDamage = melee.damage.types | |||
table.insert(resultParts, "В одной руке: " .. formatDamageList(oneHandDamage)) | |||
if entry.IncreaseDamageOnWield | |||
and entry.IncreaseDamageOnWield.damage | |||
and entry.IncreaseDamageOnWield.damage.types then | |||
local twoHandDamage = combineDamageTables(oneHandDamage, entry.IncreaseDamageOnWield.damage.types) | |||
table.insert(resultParts, "В двух руках: " .. formatDamageList(twoHandDamage)) | |||
end | |||
local attackRate = melee.attackRate or 1 | |||
table.insert(resultParts, "Скорость атаки: " .. formatAttackRate(attackRate)) | |||
end | |||
if | if entry.DamageOtherOnHit | ||
local | and entry.DamageOtherOnHit.damage | ||
table.insert(resultParts, " | and entry.DamageOtherOnHit.damage.types then | ||
local throwingDamage = entry.DamageOtherOnHit.damage.types | |||
table.insert(resultParts, "Метательный: " .. formatDamageList(throwingDamage)) | |||
end | end | ||
if #resultParts == 0 then | |||
table. | return "Нет данных для оружия '" .. tostring(id) .. "'." | ||
else | |||
return frame:preprocess(table.concat(resultParts, "<br>")) | |||
end | |||
elseif mode == "attackRate" then | elseif mode == "attackRate" then | ||
local melee = entry.MeleeWeapon | local melee = entry.MeleeWeapon | ||
if | if melee then | ||
local attackRate = melee.attackRate or 1 | |||
return frame:preprocess(formatAttackRate(attackRate)) | |||
else | |||
return "нет" | return "нет" | ||
end | end | ||
else | else | ||
return "Неверный режим: " .. tostring(mode) | return "Неверный режим: " .. tostring(mode) | ||
Текущая версия от 16:47, 4 ноября 2025
Для документации этого модуля может быть создана страница Модуль:Prototypes/Оружия/doc
local weaponData = mw.loadData("Модуль:IanComradeBot/prototypes/weapon.json/data")
local p = {}
-- Функция для формирования строки с использованием ColorPalette
local function formatColorPalette(module, key, value)
return "{{ColorPalette|" .. module .. "|" .. key .. "|" .. tostring(value) .. "}}"
end
-- Функция для форматирования списка повреждений с разделением запятой
local function formatDamageList(damageTable)
local items = {}
for dmgType, value in pairs(damageTable) do
table.insert(items, formatColorPalette("Damage", dmgType, value) .. " {{#invoke:Ftl|main|translation|damage-type-" .. dmgType .. "}}")
end
return table.concat(items, ", ")
end
-- Функция для объединения двух таблиц повреждений
local function combineDamageTables(base, addition)
local result = {}
for dmgType, value in pairs(base) do
result[dmgType] = value
end
for dmgType, addValue in pairs(addition) do
result[dmgType] = (result[dmgType] or 0) + addValue
end
return result
end
-- Функция для форматирования скорости атаки
local function formatAttackRate(attackRate)
return formatColorPalette("Weapon", "attackRate", attackRate)
end
function p.main(frame)
local mode = frame.args[1]
local id = frame.args[2]
if not id then
return "Ошибка: не задан параметр id."
end
local entry = nil
for _, weapon in ipairs(weaponData) do
if weapon.id == id then
entry = weapon
break
end
end
if not entry then
return "нет"
end
if mode == "melee" then
local resultParts = {}
local melee = entry.MeleeWeapon
if melee and melee.damage and melee.damage.types then
local oneHandDamage = melee.damage.types
table.insert(resultParts, "В одной руке: " .. formatDamageList(oneHandDamage))
if entry.IncreaseDamageOnWield
and entry.IncreaseDamageOnWield.damage
and entry.IncreaseDamageOnWield.damage.types then
local twoHandDamage = combineDamageTables(oneHandDamage, entry.IncreaseDamageOnWield.damage.types)
table.insert(resultParts, "В двух руках: " .. formatDamageList(twoHandDamage))
end
local attackRate = melee.attackRate or 1
table.insert(resultParts, "Скорость атаки: " .. formatAttackRate(attackRate))
end
if entry.DamageOtherOnHit
and entry.DamageOtherOnHit.damage
and entry.DamageOtherOnHit.damage.types then
local throwingDamage = entry.DamageOtherOnHit.damage.types
table.insert(resultParts, "Метательный: " .. formatDamageList(throwingDamage))
end
if #resultParts == 0 then
return "Нет данных для оружия '" .. tostring(id) .. "'."
else
return frame:preprocess(table.concat(resultParts, "<br>"))
end
elseif mode == "attackRate" then
local melee = entry.MeleeWeapon
if melee then
local attackRate = melee.attackRate or 1
return frame:preprocess(formatAttackRate(attackRate))
else
return "нет"
end
else
return "Неверный режим: " .. tostring(mode)
end
end
return p