Плохо! Плохо!:  0
Показано с 1 по 3 из 3

Тема: [MZ] Phileas_TextWrap

  1. #1
    Бывалый Аватар для Phileas
    Информация о пользователе
    Регистрация
    05.02.2016
    Адрес
    HD 128620, HR 5459, CP−60°5483, GCTP 3309.00A, LHS 50
    Сообщений
    621
    Записей в дневнике
    26
    Репутация: 22 Добавить или отнять репутацию

    По умолчанию [MZ] Phileas_TextWrap

    Название плагина: Phileas_TextWrap

    Автор: Phileas

    Версия: 1.0.2 для MZ

    Дата выхода:
    1.0.0 - 02.07.2023
    1.0.1 - 03.07.2023
    1.0.2 - 03.07.2023

    Описание плагина:
    Плагин добавляет разрыв строки к тексту таким образом, чтобы текст не выходил за границы окна.
    Плагин работает автоматически для окон сообщений и плагина TAA_BookMenu.

    Текст переносится по словам. То есть невозможна ситуация, что одна половина слова будет на одной строке, а другая половина на следующей. Слово будет перенесено на новую строчку целиком. Примерно так работает перенос слов в Windows Notepad и много где ещё. Таким образом, текст будет выглядеть аккуратно.
    Плагин может плохо работать, если какое-то слово будет шире окна диалога. Но вряд ли на практике кто-то станет в здравом уме использовать такие слова.

    Команда плагина: getWrappedText
    Эта команда позволит вам записать обработанный текст в переменную.

    Особенность плагина: настройка цвета (\C[x]) текста сохраняется при переносе строки. Даже если новая строка отобразится в другом окне (что часто бывает при переносе текста в окне сообщений).

    Код:
    Спойлер Версия 1.0.2:
    Код:
    //=============================================================================
    // Phileas_TextWrap.js
    //=============================================================================
    // [Update History]
    // 2023.July.02 Ver1.0.0 First Release
    // 2023.July.03 Ver1.0.1 Fixed TAA bug
    // 2023.July.03 Ver1.0.2 TAA_BookMenu standard padding
    
    /*:
     * @target MZ
     * @plugindesc Automatic text wrapping.
     * @author Phileas
     *
     * @command getWrappedText
     * @text Writes the wrapped text to a variable.
     * @desc Inserts line breaks into the given text so that the width of the text does not exceed the specified one.
     *
     * @arg text
     * @text Text
     * @type string
     * @desc Input non-empty text
     * @default String
     *
     * @arg fontName
     * @text Font name
     * @type combo
     * @option GameFont
     * @option Arial
     * @option Courier New
     * @option SimHei
     * @option Heiti TC
     * @option Dotum
     * @option AppleGothic
     * @desc Text font.
     * @default GameFont
     *
     * @arg fontSize
     * @text Font size
     * @type number
     * @desc Input a positive number.
     * @default 26
     *
     * @arg maxWidth
     * @text Max text width
     * @type number
     * @desc Input a positive number.
     * @default 700
     *
     * @arg variableId
     * @text A variable id
     * @type variable
     * @desc The text will be written to this variable.
     * @default 1
     *
     *
     * @help
     * The plugin adds a line break to the text in such a way that the text does not go beyond the borders of the window.
     * The plugin works automatically for message windows and the TAA_BookMenu plugin.
     *  
     * Plugin Command: getWrappedText
     * This command will allow you to write the processed text to a variable.
     *
     * Feature of the plugin: the text color setting (\C[x]) is saved when the line is moved. Even if the new line is displayed in another window (which often happens when transferring text in the message window).
     *
     * You can always write to the author if you need support for other windows. Or if you need other features or even plugins.
     * Email: olek.olegovich@gmail.com
     * Telegram: @olekolegovich
     * RPG Maker Web: https://forums.rpgmakerweb.com/index.php?members/phileas.176075/
     * RPG Maker Union: https://rpgmakerunion.ru/id/phileas
     * 
     * [License]
     * This plugin is released under MIT license.
     * http://opensource.org/licenses/mit-license.php
     */
    
    (function() {
    
    //--------MY CODE:    
        PluginManager.registerCommand("Phileas_TextWrap", "getWrappedText", getWrappedTextByCommand);
        
        function getColor(word) {
            for (let i = word.length - 2; i > -1; --i) {
                if (word[i] == "\\" && word[i + 1] == "C" && word[i + 2] == "[") {
                    let tag = "\\C[";
                    let j = i + 3;
                    while (word[j] != ']' && j < word.length) {
                        tag += word[j];
                        ++j;
                    }
                    if (j == word.length) {
                        return "";
                    }
                    
                    if (i > 0 && word[i - 1] == "\\") {
                        tag = "\\" + tag;
                    }
                    
                    return tag + "]"
                }
            }
            
            return "";
        }
        
        Window_Base.prototype.phileasGetTextWidth = function(text, x, y, width) {
            const textState = this.createTextState(text, x, y, width);
            this.processAllText(textState);
            return textState.outputWidth;
        };
        
        function getWrappedText(text, maxWidth, mainWindow) {
            let wrapWindow = new Window_Base(new Rectangle(mainWindow.x, mainWindow.y, maxWidth, mainWindow.height));
            wrapWindow.contents.fontFace = mainWindow.contents.fontFace;
            wrapWindow.contents.fontSize = mainWindow.contents.fontSize;
            rect = wrapWindow.baseTextRect();
            let result = "";
            let word = "";
            let line = "";
            let lastIndex = 0;
            let currentColor = "";
            let nFlag = false;
            if (text[text.length - 1] != " ") {
                text += " ";
            }
            
            for (let i = 0; i < text.length; ++i) {
                if (text[i] == "\\" && i + 1 < text.length && text[i] == "n") {
                    nFlag = true;
                }
                else if (text[i] != " ") {
                    continue;
                }
                
                word = text.substring(lastIndex, i + 1);
                let newColor = getColor(word);
                if (newColor != "") {
                    currentColor = newColor;
                }
                
                line += word;
                let currentWidth = wrapWindow.phileasGetTextWidth(line, rect.x, rect.y, rect.width);
                //console.log('parsed: ', [line, currentWidth]);
                if (currentWidth > maxWidth) {
                    result += "\n";
                    currentWidth = wrapWindow.textWidth(wrapWindow.convertEscapeCharacters(word));
                    line = word = currentColor + word;
                }
                
                result += word;
                lastIndex = i + 1;
                if (nFlag) {
                    result += "\n";
                    line = word = currentColor;
                    ++lastIndex;
                    ++i;
                    nFlag = false;
                }
            }
            
            return result;
        }
        
        function getWrappedTextByCommand(params) {
            let text = params['text'];
            let fontName = params['fontName'];
            let fontSize = Number(params['fontSize']);
            let maxWidth = Number(params['maxWidth']);
            let variableId = Number(params['variableId']);
            if (text == undefined || text == "" || fontName == undefined || fontName == ""
                || fontSize < 1 || maxWidth < 1 || variableId < 1) {
                    console.log('Wrapping failed for these parameters: ', {'text':text, 'fontName':fontName, 'fontSize':fontSize, 'maxWidth':maxWidth, 'variableId':variableId});
                    return;
            }
            
            let wrapWindow = new Window_Base(new Rectangle(0, 0, maxWidth, Graphics.boxHeight));
            wrapWindow.contents.fontFace = fontName;
            wrapWindow.contents.fontSize = fontSize;
            let wrappedText = getWrappedText(text, maxWidth, wrapWindow);
            $gameVariables.setValue(variableId, wrappedText);
        }
        
        Window_Message.prototype.phileasGetWindowMessageMargin = function() {
            const faceExists = $gameMessage.faceName() !== "";
            const spacing = 30;
            return faceExists ? ImageManager.faceWidth + spacing : 4;
        }
    
    //--------CHANGED CORE:
        
        Origin_startMessage = Window_Message.prototype.startMessage;
        Window_Message.prototype.startMessage = function() {
            let text = $gameMessage.allText();
            let maxWidth = this.width - this.phileasGetWindowMessageMargin();
            let wrappedText = getWrappedText(text, maxWidth, this);
            $gameMessage._texts.length = 0;
            $gameMessage._texts = [wrappedText];
            Origin_startMessage.call(this);
        };
        
        if (typeof Window_BookText != "undefined") {
            Origin_TaaPreparePrintableObjects = Window_BookText.prototype.preparePrintableObjects;
            Window_BookText.prototype.preparePrintableObjects = function(text) {
                let wrappedText = getWrappedText(text, this.windowWidth() - this.standardPadding(), this);
                Origin_TaaPreparePrintableObjects.call(this, wrappedText);
            }
        }
    }());

    Или можно скачать файл тут.

    Лицензия
    MIT, вся ответственность на пользователе.

    Совместимость:
    Если будут проблемы - пишите мне.
    Последний раз редактировалось Phileas; 03.03.2024 в 18:33.
    Мои игры

    Мои плагины

    Мой Telegram-канал

    Мой Boosty



    Спойлер In my humble opinion :

    Все мои сообщения отражают лишь моё скромное мнение. Я ни в коем случае не пытаюсь кого-либо обидеть, ни на кого/что не наезжаю и ничего не навязываю. Благодарю за понимание и адекватность.

  2. #2
    Бывалый Аватар для Phileas
    Информация о пользователе
    Регистрация
    05.02.2016
    Адрес
    HD 128620, HR 5459, CP−60°5483, GCTP 3309.00A, LHS 50
    Сообщений
    621
    Записей в дневнике
    26
    Репутация: 22 Добавить или отнять репутацию

    По умолчанию

    Обновил до версии 1.0.1.
    Исправлен баг: плагин не работал, если не был установлен плагин TAA_BookMenu.
    Теперь мой плагин работает как с ним, так и без него.

    Я забыл написать один условный оператор. Приношу свои искренние сожаления, мне очень стыдно за это(

    Смотрите первое сообщение темы.

    UPD: немного улучшил поведение при использовании плагина TAA_BookMenu. Теперь учитывается window standard padding.
    Последний раз редактировалось Phileas; 04.07.2023 в 01:18.
    Мои игры

    Мои плагины

    Мой Telegram-канал

    Мой Boosty



    Спойлер In my humble opinion :

    Все мои сообщения отражают лишь моё скромное мнение. Я ни в коем случае не пытаюсь кого-либо обидеть, ни на кого/что не наезжаю и ничего не навязываю. Благодарю за понимание и адекватность.

  3. #3
    Бывалый Аватар для Phileas
    Информация о пользователе
    Регистрация
    05.02.2016
    Адрес
    HD 128620, HR 5459, CP−60°5483, GCTP 3309.00A, LHS 50
    Сообщений
    621
    Записей в дневнике
    26
    Репутация: 22 Добавить или отнять репутацию

    По умолчанию

    Я заметил, что плохо объяснил принцип работы плагина и его основную фичу. Поэтому добавил в описание выше следующее:
    Текст переносится по словам. То есть невозможна ситуация, что одна половина слова будет на одной строке, а другая половина на следующей. Слово будет перенесено на новую строчку целиком. Примерно так работает перенос слов в Windows Notepad и много где ещё. Таким образом, текст будет выглядеть аккуратно.
    Плагин может плохо работать, если какое-то слово будет шире окна диалога. Но вряд ли на практике кто-то станет в здравом уме использовать такие слова.
    Мои игры

    Мои плагины

    Мой Telegram-канал

    Мой Boosty



    Спойлер In my humble opinion :

    Все мои сообщения отражают лишь моё скромное мнение. Я ни в коем случае не пытаюсь кого-либо обидеть, ни на кого/что не наезжаю и ничего не навязываю. Благодарю за понимание и адекватность.

Информация о теме

Пользователи, просматривающие эту тему

Эту тему просматривают: 1 (пользователей: 0 , гостей: 1)

Метки этой темы

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения
  •  
[MZ] Phileas_TextWrap