KNS Studio

Инструментарий творца

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Greasemonkey lub Violentmonkey.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, wymagana jest instalacje jednego z następujących rozszerzeń: Tampermonkey, Violentmonkey.

Aby zainstalować ten skrypt, wymagana będzie instalacja rozszerzenia Tampermonkey lub Userscripts.

You will need to install an extension such as Tampermonkey to install this script.

Aby zainstalować ten skrypt, musisz zainstalować rozszerzenie menedżera skryptów użytkownika.

(Mam już menedżera skryptów użytkownika, pozwól mi to zainstalować!)

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

You will need to install an extension such as Stylus to install this style.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Będziesz musiał zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

Musisz zainstalować rozszerzenie menedżera stylów użytkownika, aby zainstalować ten styl.

(Mam już menedżera stylów użytkownika, pozwól mi to zainstalować!)

// ==UserScript==
// @name         KNS Studio
// @namespace    http://tampermonkey.net/
// @version      1.0
// @description  Инструментарий творца
// @match        http*://*.catwar.su/cw3/kns
// @match        http*://*.catwar.net/cw3/kns
// @license      MIT
// @iconURL      https://raw.githubusercontent.com/iramorktum/pictures/refs/heads/main/103456.png
// @grant        none
// ==/UserScript==

(function() {
    'use strict';
    const furColors = [
        "#f5e5ce", "#ffffff", "#e6e6e6", "#d1d1d1", "#9e9e9e", "#5c5c5c",
        "#242424", "#141414", "#1d212c", "#2b1d1c", "#3d1c0b", "#6b3c28",
        "#9a715f", "#bd6d32", "#cb4402", "#e15c0f", "#ed9b2d", "#e5bd7f",
        "#d7ae98", "#b19798", "#a6b4b7", "#697a8a", "#465165", "#323d51"
    ];
    const skinColors = [
        "#f5e5ce", "#ffffff", "#9e9e9e", "#242424", "#3d1c0b", "#6b3c28",
        "#9a715f", "#bd6d32", "#e15c0f", "#cc8370", "#b19798", "#465165"
    ];
    const whiskersColors = ["#ffffff", "#5c5c5c", "#242424"];
    const eyeColors = [
        "#9C7941", "#362121", "#612322", "#D6700B", "#FCB10D", "#FCDF00",
        "#B3B059", "#A8AB0C", "#2FA12D", "#7DC210", "#0ECC90", "#87C3D4",
        "#148CCC", "#192580", "#7D8996", "#734563", "#B90000"
    ];
    let selectedColorCell = null;
    let mainPaletteContainer = null;
    let originalCode = "";
    let colorReplacements = {
        mainColors: {},
        skinColors: {},
        whiskersColor: {},
        eyeColors: {}
    };
    let updateButton = null;
    function createStyle() {
        let style = document.createElement("style");
        style.innerHTML = `.row-color-mode{margin:10px 0;page-break-after:always;display:flex;flex-wrap:wrap;}
        .row-color-mode div{height:30px;width:30px;border-radius:40%;box-sizing:border-box;}
        .all-palettes-container{margin-bottom:30px; margin-top:25px;}
        .palette-container{margin-bottom:10px}
        .main-palette-container{padding-top:20px;}
        #mode .btn-kns{margin:20px 0 0 0;}
        .update-code-btn{margin:30px 0 30px 0 !important;}
        #mode{margin-bottom:30px;}`;
        document.head.appendChild(style);
    }
    function createContainer() {
        let container = document.createElement("div");
        container.id = "mode";
        let header = document.querySelector("h2");
        if (header) {
            header.after(container);
        }
        return container;
    }
    function createButton(container) {
        let button = document.createElement("button");
        button.innerHTML = "Обработать код окраса";
        button.className = "btn-kns";
        button.onclick = () => parseCode();
        container.appendChild(button);
        return button;
    }
    function getColorArray(type) {
        switch(type) {
            case "mainColors": return furColors;
            case "skinColors": return skinColors;
            case "whiskersColor": return whiskersColors;
            case "eyeColors": return eyeColors;
            default: return [];
        }
    }
    function getTypeName(type) {
        switch(type) {
            case "mainColors": return "Основные цвета";
            case "skinColors": return "Уши внутри и нос";
            case "whiskersColor": return "Усы";
            case "eyeColors": return "Цвет глаз";
            default: return type;
        }
    }
    function createMainPalette() {
        if (mainPaletteContainer && mainPaletteContainer.parentNode) {
            mainPaletteContainer.remove();
        }
        mainPaletteContainer = document.createElement("div");
        mainPaletteContainer.className = "main-palette-container";
        let header = document.createElement("h3");
        header.innerHTML = "Выберите цвет из палитры";
        mainPaletteContainer.appendChild(header);
        let paletteRow = document.createElement("div");
        paletteRow.className = "row-color-mode";
        mainPaletteContainer.appendChild(paletteRow);
        return mainPaletteContainer;
    }
    function populateMainPalette(colorsArray) {
        let paletteRow = mainPaletteContainer.querySelector(".row-color-mode");
        paletteRow.innerHTML = "";
        colorsArray.forEach((color, index) => {
            let colorCell = document.createElement("div");
            colorCell.classList.add("colour");
            colorCell.style.backgroundColor = color;
            colorCell.dataset.colorIndex = index;
            colorCell.onclick = () => {
                if (selectedColorCell) {
                    let type = selectedColorCell.classList.contains("mainColors") ? "mainColors" :
                    selectedColorCell.classList.contains("skinColors") ? "skinColors" :
                    selectedColorCell.classList.contains("whiskersColor") ? "whiskersColor" : "eyeColors";
                    let colorsArray = getColorArray(type);
                    let newColorIndex = index;
                    let originalIndex = selectedColorCell.dataset.originalIndex || selectedColorCell.dataset.colorIndex;
                    selectedColorCell.dataset.originalIndex = originalIndex;
                    colorReplacements[type][originalIndex] = newColorIndex;
                    selectedColorCell.style.backgroundColor = colorsArray[newColorIndex];
                    selectedColorCell.dataset.colorIndex = newColorIndex;
                    if (updateButton) {
                        updateButton.style.display = "block";
                    }
                    selectedColorCell.classList.remove("selected_colour");
                    selectedColorCell = null;
                    mainPaletteContainer.style.display = "none";
                }
            };
            paletteRow.appendChild(colorCell);
        });
    }
    function createColorChangePalette(colorCell) {
        let originalIndex = colorCell.dataset.originalIndex || colorCell.dataset.colorIndex;
        colorCell.dataset.originalIndex = originalIndex;
        selectedColorCell = colorCell;
        let type = colorCell.classList.contains("mainColors") ? "mainColors" :
        colorCell.classList.contains("skinColors") ? "skinColors" :
        colorCell.classList.contains("whiskersColor") ? "whiskersColor" : "eyeColors";
        let colorsArray = getColorArray(type);
        if (!mainPaletteContainer) {
            let allPalettesContainer = document.querySelector(".all-palettes-container");
            if (allPalettesContainer) {
                let mainPalette = createMainPalette();
                allPalettesContainer.appendChild(mainPalette);
            }
        } else {
            mainPaletteContainer.style.display = "block";
        }
        populateMainPalette(colorsArray);
    }
    function createPaletteColors(type, values, container) {
        let palette = document.createElement("div");
        palette.className = "row-color-mode";
        container.appendChild(palette);
        let colorsArray = getColorArray(type);
        values.forEach(value => {
            let colorCell = document.createElement("div");
            colorCell.classList.add("colour", type);
            colorCell.style.backgroundColor = colorsArray[value];
            colorCell.dataset.colorIndex = value;
            colorCell.dataset.originalIndex = value;
            colorCell.onclick = () => {
                document.querySelectorAll(".selected_colour").forEach(el => {
                    el.classList.remove("selected_colour");
                });
                colorCell.classList.add("selected_colour");
                createColorChangePalette(colorCell);
            };
            palette.appendChild(colorCell);
        });
    }
    function createColorPalette(colors) {
        let existingContainer = document.querySelector(".all-palettes-container");
        if (existingContainer) {
            existingContainer.remove();
        }
        if (mainPaletteContainer) {
            mainPaletteContainer.remove();
            mainPaletteContainer = null;
        }
        let allPalettesContainer = document.createElement("div");
        allPalettesContainer.className = "all-palettes-container";
        if (button) {
            button.after(allPalettesContainer);
        }
        Object.keys(colors).forEach(type => {
            if (colors[type].length > 0) {
                let paletteContainer = document.createElement("div");
                paletteContainer.className = "palette-container";
                allPalettesContainer.appendChild(paletteContainer);
                let header = document.createElement("h3");
                header.innerHTML = getTypeName(type);
                paletteContainer.appendChild(header);
                createPaletteColors(type, colors[type], paletteContainer);
            }
        });
        if (!updateButton) {
            updateButton = document.createElement("button");
            updateButton.innerHTML = "Сгенерировать обновленный код";
            updateButton.className = "btn-kns update-code-btn";
            updateButton.style.display = "none";
            updateButton.onclick = generateUpdatedCode;
            let parent = document.querySelector(".all-palettes-container");
            parent.after(updateButton);
        } else {
            updateButton.style.display = "none";
            parent.after(updateButton);
        }
    }
    function parseCode() {
        let input = document.querySelector("#code");
        if (!input) return;
        originalCode = input.value.trim();
        colorReplacements = {mainColors:{}, skinColors:{}, whiskersColor:{}, eyeColors:{}};
        if (updateButton) {
            updateButton.style.display = "none";
        }
        let parts = input.value.split(' ');
        let secondLastIndex = parts.length - 2;
        let lastIndex = parts.length - 1;
        let mainColors = new Set();
        let skinColorsSet = new Set();
        let whiskersColorSet = new Set();
        let eyeColorsSet = new Set();
        parts.forEach((part, groupIndex) => {
            let isEyeGroup = (groupIndex === 1 || groupIndex === 19);
            let isSecondLastGroup = (groupIndex === secondLastIndex);
            let isLastGroup = (groupIndex === lastIndex);
            let is8th9thGroup = (groupIndex === 7 || groupIndex === 8);
            let is22ndElement = (groupIndex === 21);
            let elements = part.includes('-') ? part.split('-') : [part];
            elements.forEach((element, elementIndex) => {
                if (isEyeGroup) {
                    let eyeMatch = element.match(/^(\d+)(?:\|(\d+))?$/);
                    if (eyeMatch) {
                        let eyeColorIndex = parseInt(eyeMatch[1], 10) - 1;
                        if (!isNaN(eyeColorIndex) && eyeColorIndex >= 0 && eyeColorIndex < eyeColors.length) {
                            eyeColorsSet.add(eyeColorIndex);
                        }
                    }
                } else {
                    let match = element.match(/(\d+)\/(\d+)(?:\|(\d+))?/);
                    if (match) {
                        let beforeSlash = parseInt(match[1], 10);
                        let afterSlash = parseInt(match[2], 10) - 1;
                        if (isSecondLastGroup) {
                            whiskersColorSet.add(afterSlash);
                        } else if (isLastGroup) {
                            skinColorsSet.add(afterSlash);
                        } else if (is8th9thGroup && beforeSlash === 4) {
                            skinColorsSet.add(afterSlash);
                        } else if (is22ndElement) {
                            whiskersColorSet.add(afterSlash);
                        } else {
                            mainColors.add(afterSlash);
                        }
                    }
                }
            });
        });
        let colors = {
            mainColors: Array.from(mainColors).sort((a, b) => a - b),
            skinColors: Array.from(skinColorsSet).sort((a, b) => a - b),
            whiskersColor: Array.from(whiskersColorSet).sort((a, b) => a - b),
            eyeColors: Array.from(eyeColorsSet).sort((a, b) => a - b)
        };
        createColorPalette(colors);
    }
    function generateUpdatedCode() {
        if (!originalCode) return;
        let parts = originalCode.split(' ');
        let updatedParts = [];
        parts.forEach((part, groupIndex) => {
            let isEyeGroup = (groupIndex === 1 || groupIndex === 19);
            let isSecondLastGroup = (groupIndex === parts.length - 2);
            let isLastGroup = (groupIndex === parts.length - 1);
            let is8th9thGroup = (groupIndex === 7 || groupIndex === 8);
            let is22ndElement = (groupIndex === 21);
            if (isEyeGroup) {
                let elements = part.includes('-') ? part.split('-') : [part];
                let updatedElements = elements.map((element, elementIndex) => {
                    let eyeMatch = element.match(/^(\d+)(?:\|(\d+))?$/);
                    if (eyeMatch) {
                        let eyeColorIndex = parseInt(eyeMatch[1], 10) - 1;
                        let transparency = eyeMatch[2] || '';
                        if (!isNaN(eyeColorIndex) && eyeColorIndex >= 0) {
                            let originalIndex = eyeColorIndex;
                            if (colorReplacements.eyeColors[originalIndex] !== undefined) {
                                eyeColorIndex = colorReplacements.eyeColors[originalIndex];
                            }
                            let result = (eyeColorIndex + 1).toString();
                            if (transparency) {
                                result += '|' + transparency;
                            }
                            return result;
                        }
                    }
                    return element;
                });
                updatedParts.push(updatedElements.join('-'));
            } else if (part.includes('-')) {
                let elements = part.split('-');
                let updatedElements = elements.map(element => {
                    let match = element.match(/^(\d+)\/(\d+)(?:\|(\d+))?$/);
                    if (match) {
                        let beforeSlash = match[1];
                        let afterSlash = parseInt(match[2], 10) - 1;
                        let transparency = match[3] || '';
                        let colorType = 'mainColors';
                        if (isSecondLastGroup) {
                            colorType = 'whiskersColor';
                        } else if (isLastGroup) {
                            colorType = 'skinColors';
                        } else if (is22ndElement) {
                            colorType = 'whiskersColor';
                        } else if (is8th9thGroup) {
                            if (beforeSlash === '4') {
                                colorType = 'skinColors';
                            }
                        }
                        if (colorReplacements[colorType] && colorReplacements[colorType][afterSlash] !== undefined) {
                            afterSlash = colorReplacements[colorType][afterSlash];
                        }
                        let result = `${beforeSlash}/${afterSlash + 1}`;
                        if (transparency) {
                            result += '|' + transparency;
                        }
                        return result;
                    }
                    return element;
                });
                updatedParts.push(updatedElements.join('-'));
            } else {
                let match = part.match(/^(\d+)\/(\d+)(?:\|(\d+))?$/);
                if (match) {
                    let beforeSlash = match[1];
                    let afterSlash = parseInt(match[2], 10) - 1;
                    let transparency = match[3] || '';
                    let colorType = 'mainColors';
                    if (isSecondLastGroup) {
                        colorType = 'whiskersColor';
                    } else if (isLastGroup) {
                        colorType = 'skinColors';
                    } else if (is22ndElement) {
                        colorType = 'whiskersColor';
                    } else if (is8th9thGroup) {
                        if (beforeSlash === '4') {
                            colorType = 'skinColors';
                        }
                    }
                    if (colorReplacements[colorType] && colorReplacements[colorType][afterSlash] !== undefined) {
                        afterSlash = colorReplacements[colorType][afterSlash];
                    }
                    let result = `${beforeSlash}/${afterSlash + 1}`;
                    if (transparency) {
                        result += '|' + transparency;
                    }
                    updatedParts.push(result);
                } else {
                    updatedParts.push(part);
                }
            }
        });
        let updatedCode = updatedParts.join(' ');
        let resultDiv = document.querySelector(".code-result");
        if (resultDiv) {
            resultDiv.remove();
        }
        let newResultDiv = document.createElement("div");
        newResultDiv.className = "code-result";
        newResultDiv.innerHTML = `<h3>Обновленный код:</h3><textarea id="mode-code" style="width:100%;height:100px;margin-bottom:10px;font-family:monospace;background-color:#111111;color:white;border-radius:0.25rem;border:1px solid black;">${updatedCode}</textarea><button style="margin-bottom:30px;" class = "btn-kns" onclick="this.parentElement.querySelector('#mode-code').select();document.execCommand('copy');alert('Код скопирован!')">Копировать код</button>`;
        let allPalettesContainer = document.querySelector(".all-palettes-container");
        if (allPalettesContainer) {
            container.appendChild(newResultDiv);
        }
    }
    createStyle();
    const container = createContainer();
    const button = createButton(container);
})();