Модуль:Prototypes/Химия/Растения: различия между версиями

Материал из Space Station 14 Вики
Новая страница: «local p = {} local plantData = mw.loadData("Модуль:IanComradeBot/prototypes/chem/plant.json/data") local chemData = mw.loadData("Модуль:IanComradeBot/chem prototypes.json/data") -- Шаблоны описания эффектов local EFFECT_TEMPLATES = { PlantAdjustPotency = "Изменяет потенцию на %s.", PlantAdjustHealth = "Изменяет здоровье на...»
 
Нет описания правки
Строка 6: Строка 6:
-- Шаблоны описания эффектов
-- Шаблоны описания эффектов
local EFFECT_TEMPLATES = {
local EFFECT_TEMPLATES = {
    PlantAdjustPotency      = "Изменяет [[#Потенция|потенцию]] на %s.",
PlantAdjustPotency      = "изменяет [[#Потенция|потенцию]] на %s.",
    PlantAdjustHealth        = "Изменяет [[#Здоровье|здоровье]] на %s.",
PlantAdjustHealth        = "изменяет [[#Здоровье|здоровье]] на %s.",
    PlantAdjustNutrition    = "Изменяет [[#Потребление нутриентов|нутриенты]] на %s.",
PlantAdjustNutrition    = "изменяет [[#Потребление нутриентов|нутриенты]] на %s.",
    PlantAdjustWater        = "Изменяет [[#Потребление воды|воду]] на %s.",
PlantAdjustWater        = "изменяет [[#Потребление воды|воду]] на %s.",
    PlantAdjustToxins        = "Изменяет [[#Устойчивость к токсинам|токсины]] на %s.",
PlantAdjustToxins        = "изменяет [[#Устойчивость к токсинам|токсины]] на %s.",
    PlantAdjustPests        = "Изменяет [[#Защита от вредителей|вредителей]] на %s.",
PlantAdjustPests        = "изменяет [[#Защита от вредителей|вредителей]] на %s.",
    PlantAdjustWeeds        = "Изменяет [[#Защита от сорняков|сорняки]] на %s.",
PlantAdjustWeeds        = "изменяет [[#Защита от сорняков|сорняки]] на %s.",
    PlantAdjustMutationMod  = "Изменяет '''модификатор мутации''' на %s.",
PlantAdjustMutationMod  = "изменяет '''модификатор мутации''' на %s.",
    PlantAdjustMutationLevel = "Изменяет '''уровень мутации''' на %s.",
PlantAdjustMutationLevel = "изменяет '''уровень мутации''' на %s.",
    PlantAffectGrowth        = "Изменяет [[#Возраст|возраст]] на %s.",
PlantAffectGrowth        = "изменяет [[#Возраст|возраст]] на %s.",
    -- более сложные эффекты, которые находятся в коде
-- более сложные эффекты, которые находятся в коде
    PlantRestoreSeeds = "Восстанавливает семена (делает растение не [[#Бесплодное|бесплодным]], если оно было таковым).",
PlantRestoreSeeds = "восстанавливает семена (делает растение не [[#Бесплодное|бесплодным]], если оно было таковым).",
PlantDestroySeeds = "Уничтожает семена (делает растение [[#Бесплодное|бесплодным]]).",
PlantDestroySeeds = "уничтожает семена (делает растение [[#Бесплодное|бесплодным]]).",
    PlantPhalanximine = "Делает растение жизнеспособным (если оно было нежизнеспособным).",
PlantPhalanximine = "делает растение жизнеспособным (если оно было нежизнеспособным).",
    PlantCryoxadone  = "Уменьшает возраст растения.",
PlantCryoxadone  = "уменьшает возраст растения.",
    RobustHarvest    = "Специфический эффект:<ul>" ..
RobustHarvest    = "специфический эффект:<ul>" ..
        "<li>Если [[#Потенция|потенция]] растения меньше 50, она увеличивается на {{цвет|text|good|c='''3'''}} (до максимума 50).</li>" ..
"<li>Если [[#Потенция|потенция]] растения меньше 50, она увеличивается на {{цвет|text|good|c='''3'''}} (до максимума 50).</li>" ..
        "<li>Если [[#Потенция|потенция]] превышает 30, растение становится [[#Бесплодное|бесплодным]].</li>" ..
"<li>Если [[#Потенция|потенция]] превышает 30, растение становится [[#Бесплодное|бесплодным]].</li>" ..
        "<li>Если [[#Потенция|потенция]] достигла 50 и [[#Урожайность|урожайность]] больше 1, то с шансом '''10 %''' [[#Урожайность|урожайность]] уменьшается на {{цвет|text|bad|c='''1'''}}.</li>" ..
"<li>Если [[#Потенция|потенция]] достигла 50 и [[#Урожайность|урожайность]] больше 1, то с шансом '''10 %''' изменяет [[#Урожайность|урожайность]] на {{цвет|text|bad|c='''-1'''}}.</li>" ..
    "</ul>",
"</ul>",
    PlantDiethylamine = "Специфический эффект:<ul>" ..
PlantDiethylamine = "специфический эффект:<ul>" ..
        "<li>С шансом '''10 %''' увеличивает [[#Срок жизни|срок жизни]] на {{цвет|text|good|c='''1'''}}.</li>" ..
"<li>С шансом '''10 %''' изменяет [[#Срок жизни|срок жизни]] на {{цвет|text|good|c='''1'''}}.</li>" ..
        "<li>С шансом '''10 %''' увеличивает [[#Выносливость|выносливость]] на {{цвет|text|good|c='''1'''}}.</li>" ..
"<li>С шансом '''10 %''' изменяет [[#Выносливость|выносливость]] на {{цвет|text|good|c='''1'''}}.</li>" ..
    "</ul>",
"</ul>",
}
}


-- Вспомогательные функции
-- Вспомогательные функции
local function formatEffect(effect)
local function formatEffect(effect)
    local rawType = effect['!type']
local rawType = effect['!type']
    if not rawType then return "<li>Ошибка: не найден тип эффекта.</li>" end
if not rawType then return "<li>Ошибка: не найден тип эффекта.</li>" end
    local effectType = rawType:gsub("%s*%b{}", "")
local effectType = rawType:gsub("%s*%b{}", "")


    local template = EFFECT_TEMPLATES[effectType]
local template = EFFECT_TEMPLATES[effectType]
    local description
local description
    if template then
if template then
        if effect.amount then
if effect.amount then
            local num = tonumber(effect.amount)
local num = tonumber(effect.amount)
            local color = num and (num > 0 and "good" or "bad") or "text"
local color = num and (num > 0 and "good" or "bad") or "text"
            local amt = num and tostring(num) or tostring(effect.amount)
local amt = num and tostring(num) or tostring(effect.amount)
            description = string.format(template, string.format("{{цвет|text|%s|c='''%s'''}}", color, amt))
description = string.format(template, string.format("{{цвет|text|%s|c='''%s'''}}", color, amt))
        else
else
            description = template
description = template
        end
end
    else
else
        description = string.format("<code>Неизвестный эффект: %s</code>", effectType)
description = string.format("<code>Неизвестный эффект: %s</code>", effectType)
    end
end


    if effect.probability and effect.probability < 1 then
if effect.probability and effect.probability < 1 then
        local pct = tostring(effect.probability * 100)
local pct = tostring(effect.probability * 100)
        description = string.format("С шансом '''%s %%:''' %s", pct, description:sub(1,1):lower() .. description:sub(2))
description = string.format("С шансом '''%s %%''' %s", pct, description:sub(1,1):lower() .. description:sub(2))
    end
end


    return "<li>" .. description .. "</li>"
return "<li>{{ucfirst:" .. description .. "}}</li>"
end
end


-- Основная функция  
-- Основная функция  
function p.reagentRow(frame)
function p.reagentRow(frame)
    local args       = frame.args
local args   = frame.args
    local reagentId  = args.id or ""
local reagentId  = args.id or ""
    if reagentId == "" then
if reagentId == "" then
        return [[<tr><td colspan="2">'''Ошибка: не указан ID реагента.'''</td></tr>]]
return [[<tr><td colspan="2">'''Ошибка: не указан ID реагента.'''</td></tr>]]
    end
end


    local reagentEntry
local reagentEntry
    for _, r in ipairs(plantData) do
for _, r in ipairs(plantData) do
        if r.id == reagentId then reagentEntry = r; break end
if r.id == reagentId then reagentEntry = r; break end
    end
end


    local chemEntry
local chemEntry
    for _, c in ipairs(chemData) do
for _, c in ipairs(chemData) do
        if c.id == reagentId then chemEntry = c; break end
if c.id == reagentId then chemEntry = c; break end
    end
end


local entry = chemData[reagentId]
local entry = chemData[reagentId]
    local reagentName = entry and entry.name or reagentId
local reagentName = entry and entry.name or reagentId
    local reagentCell = string.format("! [[Химия#chem_%s|%s]]", reagentId, reagentName)
local reagentCell = string.format("! [[Химия#chem_%s|%s]]", reagentId, reagentName)


    local fragments = {}
local fragments = {}


    if reagentEntry and type(reagentEntry.plantMetabolism) == 'table' then
if reagentEntry and type(reagentEntry.plantMetabolism) == 'table' then
        for _, eff in ipairs(reagentEntry.plantMetabolism) do
for _, eff in ipairs(reagentEntry.plantMetabolism) do
            table.insert(fragments, formatEffect(eff))
table.insert(fragments, formatEffect(eff))
        end
end
    end
end


    -- Ручное описание при вызове параметром "manualEffects"
-- Ручное описание при вызове параметром "manualEffects"
    if args.manualEffects and args.manualEffects ~= "" then
if args.manualEffects and args.manualEffects ~= "" then
        table.insert(fragments, args.manualEffects)
table.insert(fragments, args.manualEffects)
    end
end


    if reagentEntry and reagentEntry.chemicals then
if reagentEntry and reagentEntry.chemicals then
        table.insert(fragments, formatChemicals(reagentEntry))
table.insert(fragments, formatChemicals(reagentEntry))
    end
end


    local allItems   = table.concat(fragments)
local allItems = table.concat(fragments)
    local effectsCell = string.format("| <ul>%s</ul>", allItems)
local effectsCell = string.format("| <ul>%s</ul>", allItems)


    return frame:preprocess(string.format("|-\n%s\n%s", reagentCell, effectsCell))
return frame:preprocess(string.format("|-\n%s\n%s", reagentCell, effectsCell))
end
end


return p
return p

Версия от 17:55, 25 июля 2025

Для документации этого модуля может быть создана страница Модуль:Prototypes/Химия/Растения/doc

local p = {}

local plantData = mw.loadData("Модуль:IanComradeBot/prototypes/chem/plant.json/data")
local chemData = mw.loadData("Модуль:IanComradeBot/chem prototypes.json/data")

-- Шаблоны описания эффектов
local EFFECT_TEMPLATES = {
	PlantAdjustPotency       = "изменяет [[#Потенция|потенцию]] на %s.",
	PlantAdjustHealth        = "изменяет [[#Здоровье|здоровье]] на %s.",
	PlantAdjustNutrition     = "изменяет [[#Потребление нутриентов|нутриенты]] на %s.",
	PlantAdjustWater         = "изменяет [[#Потребление воды|воду]] на %s.",
	PlantAdjustToxins        = "изменяет [[#Устойчивость к токсинам|токсины]] на %s.",
	PlantAdjustPests         = "изменяет [[#Защита от вредителей|вредителей]] на %s.",
	PlantAdjustWeeds         = "изменяет [[#Защита от сорняков|сорняки]] на %s.",
	PlantAdjustMutationMod   = "изменяет '''модификатор мутации''' на %s.",
	PlantAdjustMutationLevel = "изменяет '''уровень мутации''' на %s.",
	PlantAffectGrowth        = "изменяет [[#Возраст|возраст]] на %s.",
	-- более сложные эффекты, которые находятся в коде
	PlantRestoreSeeds = "восстанавливает семена (делает растение не [[#Бесплодное|бесплодным]], если оно было таковым).",
	PlantDestroySeeds = "уничтожает семена (делает растение [[#Бесплодное|бесплодным]]).",
	PlantPhalanximine = "делает растение жизнеспособным (если оно было нежизнеспособным).",
	PlantCryoxadone   = "уменьшает возраст растения.",
	RobustHarvest     = "специфический эффект:<ul>" ..
		"<li>Если [[#Потенция|потенция]] растения меньше 50, она увеличивается на {{цвет|text|good|c='''3'''}} (до максимума 50).</li>" ..
		"<li>Если [[#Потенция|потенция]] превышает 30, растение становится [[#Бесплодное|бесплодным]].</li>" ..
		"<li>Если [[#Потенция|потенция]] достигла 50 и [[#Урожайность|урожайность]] больше 1, то с шансом '''10 %''' изменяет [[#Урожайность|урожайность]] на {{цвет|text|bad|c='''-1'''}}.</li>" ..
	"</ul>",
	PlantDiethylamine = "специфический эффект:<ul>" ..
		"<li>С шансом '''10 %''' изменяет [[#Срок жизни|срок жизни]] на {{цвет|text|good|c='''1'''}}.</li>" ..
		"<li>С шансом '''10 %''' изменяет [[#Выносливость|выносливость]] на {{цвет|text|good|c='''1'''}}.</li>" ..
	"</ul>",
}

-- Вспомогательные функции
local function formatEffect(effect)
	local rawType = effect['!type']
	if not rawType then return "<li>Ошибка: не найден тип эффекта.</li>" end
	local effectType = rawType:gsub("%s*%b{}", "")

	local template = EFFECT_TEMPLATES[effectType]
	local description
	if template then
		if effect.amount then
			local num = tonumber(effect.amount)
			local color = num and (num > 0 and "good" or "bad") or "text"
			local amt = num and tostring(num) or tostring(effect.amount)
			description = string.format(template, string.format("{{цвет|text|%s|c='''%s'''}}", color, amt))
		else
			description = template
		end
	else
		description = string.format("<code>Неизвестный эффект: %s</code>", effectType)
	end

	if effect.probability and effect.probability < 1 then
		local pct = tostring(effect.probability * 100)
		description = string.format("С шансом '''%s %%''' %s", pct, description:sub(1,1):lower() .. description:sub(2))
	end

	return "<li>{{ucfirst:" .. description .. "}}</li>"
end

-- Основная функция 
function p.reagentRow(frame)
	local args	   = frame.args
	local reagentId  = args.id or ""
	if reagentId == "" then
		return [[<tr><td colspan="2">'''Ошибка: не указан ID реагента.'''</td></tr>]]
	end

	local reagentEntry
	for _, r in ipairs(plantData) do
		if r.id == reagentId then reagentEntry = r; break end
	end

	local chemEntry
	for _, c in ipairs(chemData) do
		if c.id == reagentId then chemEntry = c; break end
	end

	local entry = chemData[reagentId]
	local reagentName = entry and entry.name or reagentId
	local reagentCell = string.format("! [[Химия#chem_%s|%s]]", reagentId, reagentName)

	local fragments = {}

	if reagentEntry and type(reagentEntry.plantMetabolism) == 'table' then
		for _, eff in ipairs(reagentEntry.plantMetabolism) do
			table.insert(fragments, formatEffect(eff))
		end
	end

	-- Ручное описание при вызове параметром "manualEffects"
	if args.manualEffects and args.manualEffects ~= "" then
		table.insert(fragments, args.manualEffects)
	end

	if reagentEntry and reagentEntry.chemicals then
		table.insert(fragments, formatChemicals(reagentEntry))
	end

	local allItems	= table.concat(fragments)
	local effectsCell = string.format("| <ul>%s</ul>", allItems)

	return frame:preprocess(string.format("|-\n%s\n%s", reagentCell, effectsCell))
end

return p