<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="ru">
	<id>https://wiki.adventurestation.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AEntity_Sprite%2Fall</id>
	<title>Модуль:Entity Sprite/all - История изменений</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.adventurestation.ru/index.php?action=history&amp;feed=atom&amp;title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C%3AEntity_Sprite%2Fall"/>
	<link rel="alternate" type="text/html" href="https://wiki.adventurestation.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Entity_Sprite/all&amp;action=history"/>
	<updated>2026-05-04T21:56:15Z</updated>
	<subtitle>История изменений этой страницы в вики</subtitle>
	<generator>MediaWiki 1.45.1</generator>
	<entry>
		<id>https://wiki.adventurestation.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Entity_Sprite/all&amp;diff=3193&amp;oldid=prev</id>
		<title>Eddiemercury: WikiBotADT*</title>
		<link rel="alternate" type="text/html" href="https://wiki.adventurestation.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Entity_Sprite/all&amp;diff=3193&amp;oldid=prev"/>
		<updated>2025-03-17T19:39:40Z</updated>

		<summary type="html">&lt;p&gt;WikiBotADT*&lt;/p&gt;
&lt;table style=&quot;background-color: #fff; color: #202122;&quot; data-mw=&quot;interface&quot;&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;col class=&quot;diff-marker&quot; /&gt;
				&lt;col class=&quot;diff-content&quot; /&gt;
				&lt;tr class=&quot;diff-title&quot; lang=&quot;ru&quot;&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;← Предыдущая версия&lt;/td&gt;
				&lt;td colspan=&quot;2&quot; style=&quot;background-color: #fff; color: #202122; text-align: center;&quot;&gt;Версия от 19:39, 17 марта 2025&lt;/td&gt;
				&lt;/tr&gt;&lt;tr&gt;&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot; id=&quot;mw-diff-left-l117&quot;&gt;Строка 117:&lt;/td&gt;
&lt;td colspan=&quot;2&quot; class=&quot;diff-lineno&quot;&gt;Строка 117:&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     local param = frame.args[1]&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     local param = frame.args[1]&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;−&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #ffe49c; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     local data = loadData(&#039;User:&lt;del style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;IanComradeBot&lt;/del&gt;/prototypes/entity sprite.json&#039;)&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot; data-marker=&quot;+&quot;&gt;&lt;/td&gt;&lt;td style=&quot;color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #a3d3ff; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     local data = loadData(&#039;User:&lt;ins style=&quot;font-weight: bold; text-decoration: none;&quot;&gt;WikiBotADT&lt;/ins&gt;/prototypes/entity sprite.json&#039;)&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if not data or type(data) ~= &amp;#039;table&amp;#039; then&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;     if not data or type(data) ~= &amp;#039;table&amp;#039; then&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         return &amp;#039;Ошибка: Невозможно загрузить данные из JSON.&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;td class=&quot;diff-marker&quot;&gt;&lt;/td&gt;&lt;td style=&quot;background-color: #f8f9fa; color: #202122; font-size: 88%; border-style: solid; border-width: 1px 1px 1px 4px; border-radius: 0.33em; border-color: #eaecf0; vertical-align: top; white-space: pre-wrap;&quot;&gt;&lt;div&gt;         return &amp;#039;Ошибка: Невозможно загрузить данные из JSON.&amp;#039;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;

&lt;!-- diff cache key mediawiki:diff:1.41:old-3191:rev-3193:php=table --&gt;
&lt;/table&gt;</summary>
		<author><name>Eddiemercury</name></author>
	</entry>
	<entry>
		<id>https://wiki.adventurestation.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Entity_Sprite/all&amp;diff=3191&amp;oldid=prev</id>
		<title>Eddiemercury: Новая страница: «local p = {}  -- Загрузка данных local function loadData(filePath)     local page = mw.title.new(filePath)     local content = page and page:getContent()     return content and mw.text.jsonDecode(content) or nil end  -- Проверка равенства двух таблиц local function deepEqual(t1, t2)     if t1 == t2 then return true end     if type(t1) ~= &quot;table&quot; or type(t2) ~= &quot;table&quot; then return false end      local function isArray(...»</title>
		<link rel="alternate" type="text/html" href="https://wiki.adventurestation.ru/index.php?title=%D0%9C%D0%BE%D0%B4%D1%83%D0%BB%D1%8C:Entity_Sprite/all&amp;diff=3191&amp;oldid=prev"/>
		<updated>2025-03-17T19:38:00Z</updated>

		<summary type="html">&lt;p&gt;Новая страница: «local p = {}  -- Загрузка данных local function loadData(filePath)     local page = mw.title.new(filePath)     local content = page and page:getContent()     return content and mw.text.jsonDecode(content) or nil end  -- Проверка равенства двух таблиц local function deepEqual(t1, t2)     if t1 == t2 then return true end     if type(t1) ~= &amp;quot;table&amp;quot; or type(t2) ~= &amp;quot;table&amp;quot; then return false end      local function isArray(...»&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Новая страница&lt;/b&gt;&lt;/p&gt;&lt;div&gt;local p = {}&lt;br /&gt;
&lt;br /&gt;
-- Загрузка данных&lt;br /&gt;
local function loadData(filePath)&lt;br /&gt;
    local page = mw.title.new(filePath)&lt;br /&gt;
    local content = page and page:getContent()&lt;br /&gt;
    return content and mw.text.jsonDecode(content) or nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Проверка равенства двух таблиц&lt;br /&gt;
local function deepEqual(t1, t2)&lt;br /&gt;
    if t1 == t2 then return true end&lt;br /&gt;
    if type(t1) ~= &amp;quot;table&amp;quot; or type(t2) ~= &amp;quot;table&amp;quot; then return false end&lt;br /&gt;
&lt;br /&gt;
    local function isArray(t)&lt;br /&gt;
        local count = 0&lt;br /&gt;
        for k in pairs(t) do&lt;br /&gt;
            if type(k) ~= &amp;quot;number&amp;quot; then return false end&lt;br /&gt;
            count = count + 1&lt;br /&gt;
        end&lt;br /&gt;
        return count == #t&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if isArray(t1) and isArray(t2) then&lt;br /&gt;
        if #t1 ~= #t2 then return false end&lt;br /&gt;
        for i = 1, #t1 do&lt;br /&gt;
            if not deepEqual(t1[i], t2[i]) then&lt;br /&gt;
                return false&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return true&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for k, v in pairs(t1) do&lt;br /&gt;
        if t2[k] == nil or not deepEqual(v, t2[k]) then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    for k, v in pairs(t2) do&lt;br /&gt;
        if t1[k] == nil or not deepEqual(v, t1[k]) then&lt;br /&gt;
            return false&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return true&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Получение пути спрайта &lt;br /&gt;
local function getSpritePath(entry)&lt;br /&gt;
    if entry.Sprite and entry.Sprite.sprite then&lt;br /&gt;
        return entry.Sprite.sprite&lt;br /&gt;
    elseif entry.Icon and entry.Icon.sprite then&lt;br /&gt;
        return entry.Icon.sprite&lt;br /&gt;
    elseif entry.Sprite and entry.Sprite.layers then&lt;br /&gt;
        for _, layer in pairs(entry.Sprite.layers) do&lt;br /&gt;
            if layer.sprite then&lt;br /&gt;
                return layer.sprite&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Генерация шаблона repeat&lt;br /&gt;
local function generateRepeatTemplate(data)&lt;br /&gt;
    local spriteGroups = {}&lt;br /&gt;
&lt;br /&gt;
    for _, entry in pairs(data) do&lt;br /&gt;
        local found = false&lt;br /&gt;
        for _, group in pairs(spriteGroups) do&lt;br /&gt;
            if deepEqual(entry.Sprite, group[1].Sprite) and&lt;br /&gt;
               deepEqual(entry.EntityStorageVisuals, group[1].EntityStorageVisuals) and&lt;br /&gt;
               deepEqual(entry.Icon, group[1].Icon) then&lt;br /&gt;
                table.insert(group, entry)&lt;br /&gt;
                found = true&lt;br /&gt;
                break&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
&lt;br /&gt;
        if not found then&lt;br /&gt;
            table.insert(spriteGroups, {entry})&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    local result = {}&lt;br /&gt;
    for _, group in pairs(spriteGroups) do&lt;br /&gt;
        if #group &amp;gt; 1 then&lt;br /&gt;
            local idLinks = {}&lt;br /&gt;
            for _, entry in pairs(group) do&lt;br /&gt;
                table.insert(idLinks, &amp;quot;[[:Файл:&amp;quot; .. entry.id .. &amp;quot;.png]]&amp;quot;)&lt;br /&gt;
            end&lt;br /&gt;
            table.insert(result, mw.getCurrentFrame():preprocess(&amp;quot;{{Entity Sprite/Repeat|&amp;quot; .. table.concat(idLinks, &amp;quot; &amp;quot;) .. &amp;quot;|&amp;quot; .. group[1].id .. &amp;quot;}}&amp;quot;))&lt;br /&gt;
        end&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return table.concat(result, &amp;quot;\n&amp;quot;)&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
-- Функция генерации шаблона по записи&lt;br /&gt;
local function generateTemplate(entry, param, data)&lt;br /&gt;
    local spritePath = getSpritePath(entry)&lt;br /&gt;
    if not entry.id or not spritePath then&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if param == &amp;quot;image&amp;quot; then&lt;br /&gt;
        return mw.getCurrentFrame():preprocess(&amp;quot;{{Entity Sprite/Image|&amp;quot; .. entry.id .. &amp;quot;|&amp;quot; .. spritePath .. &amp;quot;}}&amp;quot;)&lt;br /&gt;
    elseif param == &amp;quot;path&amp;quot; then&lt;br /&gt;
        return mw.getCurrentFrame():preprocess(&amp;quot;{{Entity Sprite/Path|&amp;quot; .. entry.id .. &amp;quot;|&amp;quot; .. spritePath .. &amp;quot;}}&amp;quot;)&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    return nil&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
function p.main(frame)&lt;br /&gt;
    local param = frame.args[1]&lt;br /&gt;
&lt;br /&gt;
    local data = loadData(&amp;#039;User:IanComradeBot/prototypes/entity sprite.json&amp;#039;)&lt;br /&gt;
    if not data or type(data) ~= &amp;#039;table&amp;#039; then&lt;br /&gt;
        return &amp;#039;Ошибка: Невозможно загрузить данные из JSON.&amp;#039;&lt;br /&gt;
    end&lt;br /&gt;
&lt;br /&gt;
    if param == &amp;quot;repeat&amp;quot; then&lt;br /&gt;
        return generateRepeatTemplate(data)&lt;br /&gt;
    elseif param == &amp;quot;image&amp;quot; or param == &amp;quot;path&amp;quot; then&lt;br /&gt;
        local result = {}&lt;br /&gt;
        for _, entry in pairs(data) do&lt;br /&gt;
            local template = generateTemplate(entry, param, data)&lt;br /&gt;
            if template then&lt;br /&gt;
                table.insert(result, template)&lt;br /&gt;
            end&lt;br /&gt;
        end&lt;br /&gt;
        return table.concat(result, &amp;quot;\n&amp;quot;)&lt;br /&gt;
    else&lt;br /&gt;
        return nil&lt;br /&gt;
    end&lt;br /&gt;
end&lt;br /&gt;
&lt;br /&gt;
return p&lt;/div&gt;</summary>
		<author><name>Eddiemercury</name></author>
	</entry>
</feed>