I am working on a game with a lot of dialog, sometimes i need to show very large text on the options dialogue.
Something like:
[Intimidate] Lorem ipsum dolor sit amet, consectetur adipiscing elit. Etiam vitae consectetur [Manipulation+Intimidation] [86%]
When a large text is used, the text is cut, if i try to use line breaks (\n), the second line of text appears above the first line.
Maybe a plugin to adress this exists?
Line break in dialog message choices.
● ARCHIVED · READ-ONLY
-
-
Feel free to try the plugin below. It allows choices in the Show Choices command to use a lot of text. Long text is split automatically by the plugin. Text can be split over multiple lines manually by adding '\n' to the choice text.
Code:// LongTextChoiceList.js // Created on 10/3/2018 // Last modified on 10/5/2018 by Yethwhinger var objYeth = objYeth || {}; /*: * @plugindesc This plugin is meant to allow the use of choices * with a lot of text in the Show Choices command. * @author Yethwhinger * * @help This plugin allows choices in the Show Choices event * command to have text that occupies more than a single line. * The plugin automatically splits long choice text into multiple * lines if the text will not fit in the choice window. Manual * line breaks can also be inserted by entering '\n' in the * choice text. */ //------------------------------ // Changes to Window_ChoiceList //------------------------------ objYeth.Window_ChoiceList_initializeLong = Window_ChoiceList.prototype.initialize; Window_ChoiceList.prototype.initialize = function (messageWindow) { this._choices = []; objYeth.Window_ChoiceList_initializeLong.call(this, messageWindow); }; objYeth.Window_ChoiceList_startLong = Window_ChoiceList.prototype.start; Window_ChoiceList.prototype.start = function () { this.resetChoices(); objYeth.Window_ChoiceList_startLong.call(this); }; Window_ChoiceList.prototype.resetChoices = function () { var nChoices = $gameMessage._choices.length; var i, j; var choice = {}; var maxWidth = Graphics.boxWidth - 2 * this.textPadding() - 2 * this.standardPadding(); var text; var wChoice; var row = 0; var nLines, newLength; var autoLines, frontArray, backArray; this._choices = []; this._numLines = 0; for (i = 0; i < nChoices; i++) { choice.row = row; text = $gameMessage._choices[i]; choice.lines = text.split('\\n'); nLines = choice.lines.length; for (j = 1; j < nLines; j++) { choice.lines[j] = ' ' + choice.lines[j]; } for (j = 0; j < nLines; j++) { text = choice.lines[j]; wChoice = this.textWidthEx(text); if (wChoice > maxWidth) { autoLines = this.makeChoiceLines(text); newLength = autoLines.length; frontArray = choice.lines.slice(0, j); backArray = choice.lines.slice(j + 1); frontArray = frontArray.concat(autoLines); choice.lines = frontArray.concat(backArray); nLines += newLength - 1; j += newLength - 1; } } this._choices[i] = choice; this._numLines += choice.lines.length; row = this._numLines; choice = {}; } }; Window_ChoiceList.prototype.makeChoiceLines = function (text) { var maxWidth = Graphics.boxWidth - 2 * this.textPadding() - 2 * this.standardPadding(); var textArray = text.split(' '); var nWords = textArray.length; var strStart = textArray[0]; var strTest = strStart; var i = 1; var lines = []; var j = 0; for (i = 1; i < nWords; i++) { strTest += ' ' + textArray[i]; if (this.textWidthEx(strTest) < maxWidth) { strStart = strTest; } else { lines[j] = strStart; j++; strStart = ' ' + textArray[i]; strTest = strStart; } } lines[j] = strStart; return lines; }; Window_ChoiceList.prototype.numVisibleRows = function () { var messageY = this._messageWindow.y; var messageHeight = this._messageWindow.height; var centerY = Graphics.boxHeight / 2; var maxLines = 8; var numLines = this._numLines; if (messageY < centerY && messageY + messageHeight > centerY) { maxLines = 4; } if (numLines > maxLines) { numLines = maxLines; } return numLines; }; Window_ChoiceList.prototype.itemHeight = function (index) { var choice = this._choices[index]; var h; if (choice) { h = this.lineHeight() * choice.lines.length; } return h; }; Window_ChoiceList.prototype.row = function () { var row = 0; var choice = this._choices[this.index()]; if (choice) { row = choice.row; } return row; }; Window_ChoiceList.prototype.maxRows = function () { return this._numLines; }; Window_ChoiceList.prototype.topRow = function () { return Math.floor(this._scrollY / this.lineHeight()); }; Window_ChoiceList.prototype.setTopRow = function (row) { var scrollY = row.clamp(0, this.maxTopRow()) * this.lineHeight(); if (this._scrollY !== scrollY) { this._scrollY = scrollY; this.refresh(); this.updateCursor(); } }; Window_ChoiceList.prototype.topIndex = function () { var lastIndex = this.maxItems() - 1; var topRow = this.topRow(); var i; var topIndex = lastIndex; for (i = lastIndex; i > 0; i--) { if (this._choices[i].row > topRow) { topIndex = i - 1; } } return topIndex; }; Window_ChoiceList.prototype.maxPageRows = function () { var pageHeight = this.height - this.padding * 2; return Math.floor(pageHeight / this.lineHeight()); }; Window_ChoiceList.prototype.updateCursor = function () { if (this._cursorAll) { var allRowsHeight = this.contentsHeight(); this.setCursorRect(0, 0, this.contents.width, allRowsHeight); this.setTopRow(0); } else if (this.isCursorVisible()) { var rect = this.itemRect(this.index()); this.setCursorRect(rect.x, rect.y, rect.width, rect.height); } else { this.setCursorRect(0, 0, 0, 0); } }; Window_ChoiceList.prototype.isCursorVisible = function () { var row = this.row(); var topRow = this.topRow(); var hChoice = 1; var choice = this._choices[this.index()]; var visible = false; if (choice) { hChoice = choice.lines.length; } if ((row + hChoice - 1) >= topRow && row <= this.bottomRow()) { visible = true; } return visible; }; Window_ChoiceList.prototype.ensureCursorVisible = function () { var row = this.row(); var choiceBottom; var hChoice = 1; var choice = this._choices[this.index()]; if (choice) { hChoice = choice.lines.length; } choiceBottom = row + hChoice - 1; if (row < this.topRow()) { this.setTopRow(row); } else if (choiceBottom > this.bottomRow()) { this.setBottomRow(choiceBottom); } }; Window_ChoiceList.prototype.itemRect = function (index) { var rect = new Rectangle(); var i; rect.width = this.itemWidth(); rect.height = this.itemHeight(index); rect.x = -this._scrollX; rect.y = -this._scrollY; for (i = 0; i < index; i++) { rect.y += this.itemHeight(i); } return rect; }; Window_ChoiceList.prototype.maxChoiceWidth = function () { var maxWidth = 96; var choices = this._choices; var nChoices = choices.length; var allLines = []; var i, choiceWidth; var numLines = this._numLines || 0; for (i = 0; i < nChoices; i++) { allLines = allLines.concat(choices[i].lines); } for (i = 0; i < numLines; i++) { choiceWidth = this.textWidthEx(allLines[i]) + this.textPadding() * 2; if (maxWidth < choiceWidth) { maxWidth = choiceWidth; } } return maxWidth; }; Window_ChoiceList.prototype.contentsHeight = function () { var maxItems = this.maxItems(); var i; var h = 0; for (i = 0; i < maxItems; i++) { h += this.itemHeight(i); } return h; }; Window_ChoiceList.prototype.drawItem = function (index) { var lines = this._choices[index].lines; var nLines = lines.length; var hLine = this.lineHeight(); var rect = this.itemRectForText(index); var textLine; var i; var y = rect.y; for (i = 0; i < nLines; i++) { textLine = lines[i]; this.drawTextEx(textLine, rect.x, y); y += hLine; } }; -
Feel free to try the plugin below. It allows choices in the Show Choices command to use a lot of text. Long text is split automatically by the plugin. Text can be split over multiple lines manually by adding '\n' to the choice text.
Code:// LongTextChoiceList.js // Created on 10/3/2018 // Last modified on 10/5/2018 by Yethwhinger var objYeth = objYeth || {}; /*: * @plugindesc This plugin is meant to allow the use of choices * with a lot of text in the Show Choices command. * @author Yethwhinger * * @help This plugin allows choices in the Show Choices event * command to have text that occupies more than a single line. * The plugin automatically splits long choice text into multiple * lines if the text will not fit in the choice window. Manual * line breaks can also be inserted by entering '\n' in the * choice text. */ //------------------------------ // Changes to Window_ChoiceList //------------------------------ objYeth.Window_ChoiceList_initializeLong = Window_ChoiceList.prototype.initialize; Window_ChoiceList.prototype.initialize = function (messageWindow) { this._choices = []; objYeth.Window_ChoiceList_initializeLong.call(this, messageWindow); }; objYeth.Window_ChoiceList_startLong = Window_ChoiceList.prototype.start; Window_ChoiceList.prototype.start = function () { this.resetChoices(); objYeth.Window_ChoiceList_startLong.call(this); }; Window_ChoiceList.prototype.resetChoices = function () { var nChoices = $gameMessage._choices.length; var i, j; var choice = {}; var maxWidth = Graphics.boxWidth - 2 * this.textPadding() - 2 * this.standardPadding(); var text; var wChoice; var row = 0; var nLines, newLength; var autoLines, frontArray, backArray; this._choices = []; this._numLines = 0; for (i = 0; i < nChoices; i++) { choice.row = row; text = $gameMessage._choices[i]; choice.lines = text.split('\\n'); nLines = choice.lines.length; for (j = 1; j < nLines; j++) { choice.lines[j] = ' ' + choice.lines[j]; } for (j = 0; j < nLines; j++) { text = choice.lines[j]; wChoice = this.textWidthEx(text); if (wChoice > maxWidth) { autoLines = this.makeChoiceLines(text); newLength = autoLines.length; frontArray = choice.lines.slice(0, j); backArray = choice.lines.slice(j + 1); frontArray = frontArray.concat(autoLines); choice.lines = frontArray.concat(backArray); nLines += newLength - 1; j += newLength - 1; } } this._choices[i] = choice; this._numLines += choice.lines.length; row = this._numLines; choice = {}; } }; Window_ChoiceList.prototype.makeChoiceLines = function (text) { var maxWidth = Graphics.boxWidth - 2 * this.textPadding() - 2 * this.standardPadding(); var textArray = text.split(' '); var nWords = textArray.length; var strStart = textArray[0]; var strTest = strStart; var i = 1; var lines = []; var j = 0; for (i = 1; i < nWords; i++) { strTest += ' ' + textArray[i]; if (this.textWidthEx(strTest) < maxWidth) { strStart = strTest; } else { lines[j] = strStart; j++; strStart = ' ' + textArray[i]; strTest = strStart; } } lines[j] = strStart; return lines; }; Window_ChoiceList.prototype.numVisibleRows = function () { var messageY = this._messageWindow.y; var messageHeight = this._messageWindow.height; var centerY = Graphics.boxHeight / 2; var maxLines = 8; var numLines = this._numLines; if (messageY < centerY && messageY + messageHeight > centerY) { maxLines = 4; } if (numLines > maxLines) { numLines = maxLines; } return numLines; }; Window_ChoiceList.prototype.itemHeight = function (index) { var choice = this._choices[index]; var h; if (choice) { h = this.lineHeight() * choice.lines.length; } return h; }; Window_ChoiceList.prototype.row = function () { var row = 0; var choice = this._choices[this.index()]; if (choice) { row = choice.row; } return row; }; Window_ChoiceList.prototype.maxRows = function () { return this._numLines; }; Window_ChoiceList.prototype.topRow = function () { return Math.floor(this._scrollY / this.lineHeight()); }; Window_ChoiceList.prototype.setTopRow = function (row) { var scrollY = row.clamp(0, this.maxTopRow()) * this.lineHeight(); if (this._scrollY !== scrollY) { this._scrollY = scrollY; this.refresh(); this.updateCursor(); } }; Window_ChoiceList.prototype.topIndex = function () { var lastIndex = this.maxItems() - 1; var topRow = this.topRow(); var i; var topIndex = lastIndex; for (i = lastIndex; i > 0; i--) { if (this._choices[i].row > topRow) { topIndex = i - 1; } } return topIndex; }; Window_ChoiceList.prototype.maxPageRows = function () { var pageHeight = this.height - this.padding * 2; return Math.floor(pageHeight / this.lineHeight()); }; Window_ChoiceList.prototype.updateCursor = function () { if (this._cursorAll) { var allRowsHeight = this.contentsHeight(); this.setCursorRect(0, 0, this.contents.width, allRowsHeight); this.setTopRow(0); } else if (this.isCursorVisible()) { var rect = this.itemRect(this.index()); this.setCursorRect(rect.x, rect.y, rect.width, rect.height); } else { this.setCursorRect(0, 0, 0, 0); } }; Window_ChoiceList.prototype.isCursorVisible = function () { var row = this.row(); var topRow = this.topRow(); var hChoice = 1; var choice = this._choices[this.index()]; var visible = false; if (choice) { hChoice = choice.lines.length; } if ((row + hChoice - 1) >= topRow && row <= this.bottomRow()) { visible = true; } return visible; }; Window_ChoiceList.prototype.ensureCursorVisible = function () { var row = this.row(); var choiceBottom; var hChoice = 1; var choice = this._choices[this.index()]; if (choice) { hChoice = choice.lines.length; } choiceBottom = row + hChoice - 1; if (row < this.topRow()) { this.setTopRow(row); } else if (choiceBottom > this.bottomRow()) { this.setBottomRow(choiceBottom); } }; Window_ChoiceList.prototype.itemRect = function (index) { var rect = new Rectangle(); var i; rect.width = this.itemWidth(); rect.height = this.itemHeight(index); rect.x = -this._scrollX; rect.y = -this._scrollY; for (i = 0; i < index; i++) { rect.y += this.itemHeight(i); } return rect; }; Window_ChoiceList.prototype.maxChoiceWidth = function () { var maxWidth = 96; var choices = this._choices; var nChoices = choices.length; var allLines = []; var i, choiceWidth; var numLines = this._numLines || 0; for (i = 0; i < nChoices; i++) { allLines = allLines.concat(choices[i].lines); } for (i = 0; i < numLines; i++) { choiceWidth = this.textWidthEx(allLines[i]) + this.textPadding() * 2; if (maxWidth < choiceWidth) { maxWidth = choiceWidth; } } return maxWidth; }; Window_ChoiceList.prototype.contentsHeight = function () { var maxItems = this.maxItems(); var i; var h = 0; for (i = 0; i < maxItems; i++) { h += this.itemHeight(i); } return h; }; Window_ChoiceList.prototype.drawItem = function (index) { var lines = this._choices[index].lines; var nLines = lines.length; var hLine = this.lineHeight(); var rect = this.itemRectForText(index); var textLine; var i; var y = rect.y; for (i = 0; i < nLines; i++) { textLine = lines[i]; this.drawTextEx(textLine, rect.x, y); y += hLine; } };
Thanks a lot for taking the time with this plugin and sharing it @Yethwhinger, its exactly what i need.
Whats the license for this? Can be used on commercial games?
Thanks -
This plugin may be used with any RPG Maker MV project, whether the project is commercial or not.