Term Window

bluebooth

Veteran
Veteran
Joined
Nov 12, 2015
Messages
95
Reaction score
115
First Language
English
Primarily Uses
N/A
Term Window v1.03b
Author:
Michael Morris @Blue Booth Studios, Yanfly (Message Core)


Introduction
Allows a popup help window to explain game "terms" (names, places, events, etc.) while and only while a message box (dialogue) is open. A prompt specifying what button to press to toggle help displays atop the messagebox. Data is loaded from JSON. A term is any text enclosed with "\c[4]." A different color code can be customized in plugin parameters.


Features
- Automatically load terms for any message box, provided terms are surrounded with "\c[4]."
- Term highlighting color and term window keys are now customizable parameters!
- If more than one term is present in a message, terms can be toggled between using left and right input. An index and total number of terms are also shown.
- Displays a small message above each message box with terms.
- Terms can be one word or multiple words!
- Each term is displayed only once in the Term Window regardless of number of repetitions in the message box.
- Quick, easy, and unobtrusive - let interested players learn more about the lore without blocking less interested players from moving on!



How to Use
- Copy script into your game js/plugins directory.
- Copy JSON into your game data directory.
- Import and configure plugin.
- Add any custom terms you have to Terms.JSON.

Requirements
-YEP_MessageCore.js (http://yanfly.moe/2015/10/10/yep-2-message-core/)

Screenshots



Demo
No demo provided.

Script
Code:
//=============================================================================
// Bluebooth Plugins - Term Window
// BBS_TermWindow.js
//=============================================================================

//=============================================================================
 /*:
 * @title Term Window
 * @author Michael Morris (https://www.*******.com/bluebooth)
 * @date Oct 12, 2016
 * @filename BBS_TermWindow.js
 * If you enjoy my work, consider supporting me on *******!
 *
 * https://www.*******.com/bluebooth
 *
 * @plugindesc v1.03b Allows a popup help window to explain game terms while
 * and only while a message box (dialogue) is open.
 * Special thanks to Yanfly, this borrows structures from his YEP_MessageCore, and my
 * own BBS_RandomConversations.js.
 *
 * ============================================================================
 * Terms of Use
 * ============================================================================
 *  - Free for use in non-commercial projects with credits
 *  - Contact me for commercial use
 *
 * ============================================================================
 * Parameters
 * ============================================================================
 * @param Term File
 * @desc Name of an external term file (name + definition) to load at game start. Default: data/Terms.json
 * @default data/Terms.json
 *
 * @param Term Color Index
 * @desc Words wrapped in a specific color tag are identified as terms.  Which color do you want to wrap terms in?
 * Default: 4
 * @default 4
 *
 * @param === KEYS USED ===
 *
 * @param Help Key
 * @desc The button to check for to toggle help. Default: pageup
 * @default pageup
 *
 * @param Previous Term Key
 * @desc The button to cycle left (1-3-2-1) through active terms in the term window. Default: Left
 * @default left
 *
 * @param Next Term Key
 * @desc The button to cycle right (1-2-3-1) through active terms in the term window. Default: Right
 * @default right
 *
 * @param === HELP PROMPT WINDOW ===
 *
 * @param Help Prompt
 * @desc Text to display indicating what button to press to display term window. Default: PgUp - help
 * @default PgUp - help
 *
 * @param Help Prompt Width
 * @desc Maximum width for the Help Prompt. Default: 200
 * @default 200
 *
 * @param Help Prompt Buffer X
 * @desc This is the buffer for the x location of the Help Prompt.
 * @default -28
 *
 * @param Help Prompt Buffer Y
 * @desc This is the buffer for the y location of the Help Prompt.
 * @default 0
 *
 * @param Help Prompt Text Size
 * @desc Font size for the Help Prompt.
 * Default: 20
 * @default 20
 *
 * @param Help Prompt Text Color
 * @desc Help Prompt font color. Use CSS format, or leave blank
 * to use standard color.
 * @default
 *
 * @param === TERM WINDOW ===
 *
 * @param Term Window Windowskin
 * @desc The windowskin to apply to the Term Window. Default:
 * @default
 *
 * @param Term Window Width
 * @desc Maximum width for the Term window. Default: 200
 * @default 200
 *
 * @param Term Window Height
 * @desc Maximum height for the Term window. Default: 300
 * @default 300

 * @param === TERM WINDOW TITLE ===
 *
 * @param Title Font
 * @desc Font face for the title. Leave blank to use standard. See help.
 * @default
 *
 * @param Title Size
 * @desc Font size for the Title in the details window.
 * Default: 22
 * @default 22
 *
 * @param Title Color
 * @desc Title font color. Use CSS format, or leave blank
 * to use standard color.
 * @default
 *
 * @param Title Outline Color
 * @desc Title text outline color. Use CSS format or leave
 * blank to use standard.
 * @default
 *
 * @param Title Italic
 * @desc Title font in Italic.      YES: true      NO: false
 * Default: false
 * @default false
 *
 * @param === TERM WINDOW LINE ===
 *
 * @param Line Center Color
 * @desc Center color of the gradient line below the title.
 * Use CSS format.    Default: rgba(255,255,255,1)
 * @default rgba(255,255,255,1)
 *
 * @param Line Border Color
 * @desc Border color of the gradient line below the title.
 * Use CSS format.    Default: rgba(255,255,255,0)
 * @default rgba(255,255,255,0)
 *
 * @param === DETAILS TEXT ===
 *
 * @param Text Font
 * @desc Font face for the details text. Leave blank to use standard. See help.
 * @default
 *
 * @param Text Size
 * @desc Font size for the details text.
 * Default: 20
 * @default 20
 *
 * @param Text Outline Color
 * @desc Details text outline color. Use CSS format or leave blank to use standard.
 * @default
 *
 * @param Debug Mode
 * @desc Enable to activate console variable logging.  Use for debugging odd behaviour.
 * true to enable console variable logging.
 * @default false
 *
 * @help
 * ============================================================================
 * Description
 * ============================================================================
 *
 * Allows a popup help window to explain game terms while and only while a message
 * box (dialogue) is open.  A prompt specifying what button to press to toggle
 * help displays atop the messagebox.  Data is loaded from JSON.
 *
 * Any one term must have the opening tag + term + closing tag on the same line.
 *
 * ============================================================================
 * Change Log
 * ============================================================================
 * 1.03b- Added more friendly crash error message.
 * 1.03a- Fixed issue causing parameters not to register.
 * 1.03 - Added option to change color index for Terms (default 4), and option to change
 *         - keys for Term Window.
 * 1.02 - Multiple word terms now supported using _.
 * 1.01 - Plugin finished and tested.
 *
 */
//=============================================================================

//=============================================================================
var Imported = Imported || {} ;
var BBS = BBS || {};
Imported.TermWindow = 1;
BBS.TermWindow = BBS.TermWindow || {};

(function() {

    var _terms;
    var _activeTerms = [];
 
    //=============================================================================
    // Parameter Variables
    //=============================================================================
    var parameters                     = PluginManager.parameters('BBS_TermWindow');
    var pTermFile                    = String(parameters['Term File'] || 'data/Terms.json');
    var pTermColorIndex                = Number(parameters['Term Color Index'] || 4);
 
    var pHelpKey                    = String(parameters['Help Key'] || 'pageup');
    var pPreviousTermKey            = String(parameters['Previous Term Key'] || 'left');
    var pNextTermKey                = String(parameters['Next Term Key'] || 'right');
 
    var pMsgHelpPromptText            = String(parameters['Help Prompt'] || 'X - help');
    var pMsgHelpPromptBufferX         = Number(parameters['Help Prompt Buffer X'] || -28);
    var pMsgHelpPromptBufferY         = Number(parameters['Help Prompt Buffer Y'] || 0);
    var pMsgHelpPromptBufferWidth    = Number(parameters['Help Prompt Width'] || 200);
    var pMsgHelpPromptTextColor        = String(parameters['Help Prompt Text Color'] || '').trim();
    var pMsgHelpPromptTextSz        = Number(parameters['Help Prompt Text Size'] || 20);
 
    var pCustomTermWindowskin        = String(parameters['Term Window Windowskin'] || '');
    var pTermWindowWidth            = Number(parameters['Term Window Width'] || 200);
    var pTermWindowHeight            = Number(parameters['Term Window Height'] || 300);
 
    var pTitleTxtFont                = String(parameters['Title Font'] || '').trim();
    var pTitleTxtSz                 = Number(parameters['Title Size'] || 22);
    var pTitleTxtColor                = String(parameters['Title Color'] || '').trim();
    var pTitleTxtOutlineColor        = String(parameters['Title Outline Color'] || '').trim();
    var pTitleTxtItalic             = eval(String(parameters['Title Italic'] || 'false'));
 
    var pGradientLineColorCenter     = String(parameters['Line Center Color'] || 'rgba(255,255,255,1)').trim();
    var pGradientLineColorBorder     = String(parameters['Line Border Color'] || 'rgba(255,255,255,0)').trim();

    var pDetailsTxtFont                = String(parameters['Text Font'] || '').trim();
    var pDetailsTxtFontSz            = Number(parameters['Text Size'] || 20);
    var pDetailsTxtOutlineColor        = String(parameters['Text Outline Color'] || '').trim();
 
    var pDebugging                    = eval(String(parameters['Debug Mode'] || 'false'));
 
    var BBS_helpPromptWnd = undefined;
    var BBS_termWnd = undefined;
 
    // Sanity check for valid color index.
    if (pTermColorIndex < 0 || pTermColorIndex > 28) {
        throw "BBS_TermWindow: Term color index " + pTermColorIndex + " is not a valid color!  Please use an index between 0 - 28 inclusive.";
    }
 
    //=============================================================================
    // Term Class
    //============================================================================= 
    function Term() {
        this.initialize.apply(this, arguments);
    };
 
    Term.prototype.initialize = function(data) {
        this._term = String(data.term);
        this._desc = String(data.description);
    };
 
    Term.prototype = Object.create(Term.prototype);
    Term.prototype.constructor = Term;
 
    /**
     * Creates rumors from the given data and loads their current state, afterwards.
     */
    var _create = function(data) {
        var temp = [];
        for(var i = 0, max = data.length; i < max; ++i) {
            entry = data[i];
            temp.push(new Term(entry));
        }
     
        _terms = temp;
     
        if (pDebugging) {
            console.log(_terms);
        }
    };
 
    var _getIndex = function(term) {
        if (pDebugging) {
            console.log(term);
            console.log(_terms);
        }
     
        for(var i = 0; i < _terms.length; i++) {
            if(_terms[i]._term === term) {
                return i;
            }
        }
     
        return -1;
    };
 
    //=============================================================================
    // Window_MsgHelpPrompt
    //=============================================================================
    function Window_MsgHelpPrompt() {
        this.initialize.apply(this, arguments);
    }

    Window_MsgHelpPrompt.prototype = Object.create(Window_Base.prototype);
    Window_MsgHelpPrompt.prototype.constructor = Window_MsgHelpPrompt;

    Window_MsgHelpPrompt.prototype.initialize = function(parentWindow) {
        this._parentWindow = parentWindow;
        Window_Base.prototype.initialize.call(this, 0, 0, 240, this.windowHeight());
        this._text = '';
        this._openness = 0;
        this._closeCounter = 0;
        this.deactivate();
     
        this.backOpacity = 0;
        this.opacity = 0;
        this.hide();
    };

    Window_MsgHelpPrompt.prototype.windowWidth = function() {
        this.resetFontSettings();
        var dw = this.textWidthEx(this._text);
        dw += this.padding * 2;
        var width = dw + eval(pMsgHelpPromptBufferWidth);
        return Math.ceil(width);
    };
 
    Window_MsgHelpPrompt.prototype.textWidthEx = function(text) {
        return this.drawTextEx(text, 0, this.contents.height);
    };

    Window_MsgHelpPrompt.prototype.calcNormalCharacter = function(textState) {
        return this.textWidth(textState.text[textState.index++]);
    };

    Window_MsgHelpPrompt.prototype.windowHeight = function() {
        return this.fittingHeight(1);
    };

    Window_MsgHelpPrompt.prototype.standardFontFace = function() {
        return $gameSystem.getMessageFontName();
    };

    Window_MsgHelpPrompt.prototype.standardFontSize = function() {
        return $gameSystem.getMessageFontSize();
    };

    Window_MsgHelpPrompt.prototype.update = function() {
        Window_Base.prototype.update.call(this);
        if (this.active) return;
        if (this.isClosed()) return;
        if (this.isClosing()) return;
        if (this._parentWindow.isClosing()) {
            this._openness = this._parentWindow.openness;
        }
    };

    Window_MsgHelpPrompt.prototype.refresh = function(text, position) {
        this.show();
        this._text = text;
        this._position = position;
        this.width = this.windowWidth();
        this.createContents();
        this.contents.clear();
        this.resetFontSettings();
     
        this.changeTextColor(this.textColor(pMsgHelpPromptTextColor));
        var padding = eval(pMsgHelpPromptBufferWidth) / 2;
        this.contents.fontSize = pMsgHelpPromptTextSz;
     
        this.drawTextEx(this._text, padding, 0, this.contents.width);
        this._parentWindow.adjustWindowSettings();
        this._parentWindow.updatePlacement();
     
        this.adjustPositionX();
        this.adjustPositionY();
        this.open();
        this.activate();
        this._closeCounter = 4;
        return '';
    };

    Window_MsgHelpPrompt.prototype.adjustPositionX = function() {
        if (this._position === 1) {
         this.x = this._parentWindow.x;
         this.x += eval(pMsgHelpPromptBufferX);
        }
        else if (this._position === 2) {
         this.x = this._parentWindow.x;
         this.x += this._parentWindow.width * 3 / 10;
         this.x -= this.width / 2;
        }
        else if (this._position === 3) {
         this.x = this._parentWindow.x;
         this.x += this._parentWindow.width / 2;
         this.x -= this.width / 2;
        }
        else if (this._position === 4) {
         this.x = this._parentWindow.x;
         this.x += this._parentWindow.width * 7 / 10;
         this.x -= this.width / 2;
        }
        else {
         this.x = this._parentWindow.x + this._parentWindow.width;
         this.x -= this.width;
         this.x -= eval(pMsgHelpPromptBufferX);
        }
        this.x = this.x.clamp(0, Graphics.boxWidth - this.width);
    };

    Window_MsgHelpPrompt.prototype.adjustPositionY = function() {
        if ($gameMessage.positionType() === 0) {
         this.y = this._parentWindow.y + this._parentWindow.height;
         this.y -= eval(pMsgHelpPromptBufferY);
        }
        else {
         this.y = this._parentWindow.y;
         this.y -= this.height;
         this.y += eval(pMsgHelpPromptBufferY);
        }
        if (this.y < 0) {
         this.y = this._parentWindow.y + this._parentWindow.height;
         this.y -= eval(pMsgHelpPromptBufferY);
        }
     
    };
 
    Window_MsgHelpPrompt.prototype.showPrompt = function() {
        if (this === undefined) { return; }
     
        this.visible = !this.visible;
        if(this.active) {
            this.deactivate();
        }
        else {
            this.activate();
        }
    };

 
    //=============================================================================
    // Window_MsgTerm
    //=============================================================================
    function Window_MsgTerm() {
        this.initialize.apply(this, arguments);
    }

    Window_MsgTerm.prototype = Object.create(Window_Base.prototype);
    Window_MsgTerm.prototype.constructor = Window_MsgTerm;

    Window_MsgTerm.prototype.initialize = function() {
        var width = pTermWindowWidth;
        var height = Math.max(pTermWindowHeight, this.fittingHeight(1));

        var x = Graphics.boxWidth - width;
        var y = Graphics.boxHeight - height - 164;

        this._wordWrap = true;
     
        Window_Base.prototype.initialize.call(this, x, y, width, height);
        if (pCustomTermWindowskin !== '') {
            this.windowskin = ImageManager.loadSystem(pCustomTermWindowskin);
        }
     
        this._title = '';
        this._text = '';
        this.index = 0;
     
        this._termIds = [];
     
        this.active = false;
        this.visible = false;
    };

    Window_MsgTerm.prototype.setDetails = function() { 
        if (this._termIds === undefined || this.index < 0) {
            this._title = '';
            this._text = '';
            this.refresh();
        }
        else {
         
            // Handle odd case where index does not reset.
            if(this.index >= this._termIds.length) {
                this.index = 0;
             
                // Odd bug where lengths and term values are not synced.
                if(this._termIds[0] === -1) {
                    this._title = '';
                    this._text = '';
                    this.refresh();
                }
            }
         
            var termIndex = this._termIds[this.index];
            // Handle odd case where termIds desync - resulting in a term Id with a bad ID.
            if (termIndex < 0) {
                termIndex = this._termIds[0];
            }
         
            if (_terms[termIndex] === undefined) {
                throw "Bad Term index: " + termIndex + "!  There's an error in the last or next message box's terms.";
            }

            this._title = _terms[termIndex]._term + " " + (this.index + 1) + "/" + this._termIds.length;
            this._text = '<WordWrap>' + _terms[termIndex]._desc;
            this.refresh();
        }
    };

    Window_MsgTerm.prototype.clear = function() {
        this.setDetails();
    };

    Window_MsgTerm.prototype.setActiveTerm = function(nextTerm, terms) {
        this._termIds = [];
        this._termIds = terms;
     
        for(var i = 0; i < this._termIds.length; i++) {
            this._termIds[i] = _getIndex(terms[i]);
        }
     
        if (pDebugging) {
            console.log(this._termIds);
            console.log(_activeTerms);
        }
     
        this.setDetails();
     
    };

    // Redefine the minimum number of functions to allow this non-command window to bind input handlers.
    Window_MsgTerm.prototype.setHandler = function(symbol, method) {
        this._handlers[symbol] = method;
    };

    Window_MsgTerm.prototype.isHandled = function(symbol) {
        return !!this._handlers[symbol];
    };

    Window_MsgTerm.prototype.callHandler = function(symbol) {
        if (this.isHandled(symbol)) {
            this._handlers[symbol]();
        }
    };
 
    Window_MsgTerm.prototype.update = function() {
        Window_Base.prototype.update.call(this);
     
        this.processCursorMove();
        this._stayCount++;
    };

    Window_MsgTerm.prototype.processCursorMove = function() {
        if (Input.isRepeated(pNextTermKey)) {
            if(Input.isTriggered(pNextTermKey) && this._termIds.length > 1) {
                this.flipSubEntry(1);
            }
        }
        if (Input.isRepeated(pPreviousTermKey)) {
            if(Input.isTriggered(pPreviousTermKey) && this._termIds.length > 1) {
                this.flipSubEntry(-1);
            }
        }
    };

    Window_MsgTerm.prototype.flipSubEntry = function(pageChange) {
        if (this.visible === false) { return; }
        if(this._termIds.length <= 1) {
            return;
        }
     
        this.index = this.index + pageChange;
        SoundManager.playCursor();
     
        // Cycle over to locked entry before reiterating through sub-entries.
        if (this.index >= this._termIds.length) {
            this.index = 0;
        }
        else if (this.index < 0) {
            this.index = this._termIds.length - 1;
        }

        this.setDetails();
        this.refresh();
    };

    Window_MsgTerm.prototype.refresh = function() {
        this.contents.clear();
        var contentsW = this.width - this.textPadding() - this.standardPadding() * 2;
        var contentsX = this.textPadding();
        var y = 2;
     
        //Title
        this.resetFontSettings();
        this.contents.fontSize = pTitleTxtSz;
        this.contents.fontItalic = pTitleTxtItalic;
        if(pTitleTxtFont !== '') {
            this.contents.fontFace = pTitleTxtFont; 
        }
        if(pTitleTxtColor !== '') {
            this.contents.textColor = pTitleTxtColor; 
        }
        if(pTitleTxtOutlineColor !== '') {
            this.contents.outlineColor = pTitleTxtOutlineColor;
        }
        this.drawText(this._title, contentsX, y, contentsW, 'center');
     
        //GradientLine
        y += this.lineHeight() + 10;
        this.drawGradientLine(y, contentsW);
        y += 10;
         
        //text
        this.resetFontSettings();
        if(pDetailsTxtFont !== '') {
            this.contents.fontFace = pDetailsTxtFont; 
        }
        if(pDetailsTxtOutlineColor !== '') {
            this.contents.outlineColor = pDetailsTxtOutlineColor;
        }
     
        this.contents.fontSize = pDetailsTxtFontSz;
        this.saveCurrentWindowSettings();
        this.drawTextEx(this._text, 0, y);
        this.restoreCurrentWindowSettings();
    };
 
    Window_MsgTerm.prototype.standardFontSize = function() {
        return pDetailsTxtFontSz;
    };

    Window_MsgTerm.prototype.drawGradientLine = function(y,w) {
        var ctx = this.contents.context;
        var lw = w * 2/3;
        var lx = (w - w * 2/3)/2;
     
        var lineargradient1 = ctx.createLinearGradient(lx,0,w/2,0);
        lineargradient1.addColorStop(0, pGradientLineColorBorder);
        lineargradient1.addColorStop(1, pGradientLineColorCenter);
        ctx.fillStyle = lineargradient1;
        ctx.fillRect(lx, y, lw/2, 2);
     
        var lineargradient2 = ctx.createLinearGradient(w/2,0,lx+lw,0);
        lineargradient2.addColorStop(0, pGradientLineColorCenter);
        lineargradient2.addColorStop(1, pGradientLineColorBorder);
        ctx.fillStyle = lineargradient2;
        ctx.fillRect(w/2, y, lw/2, 2);
    };
 
    Window_MsgTerm.prototype.toggleTermWindow = function(terms) {
        if (this === undefined) { return; }
     
        this.visible = !this.visible;
        if(this.active) {
            this.deactivate();
            this.index = 0;
        }
        else {
            this.activate();
        }
    };
 
    //=============================================================================
    // Window_Message
    //=============================================================================
    var BBS_TW_Window_Message_createSubWindows = Window_Message.prototype.createSubWindows;
    Window_Message.prototype.createSubWindows = function() {
        BBS_TW_Window_Message_createSubWindows.call(this);
        this._helpPromptWindow = new Window_MsgHelpPrompt(this);
        this._termWindow = new Window_MsgTerm(this);
        BBS_helpPromptWnd = this._helpPromptWindow;
        BBS_termWnd = this._termWindow;
     
        var scene = SceneManager._scene;
        scene.addChild(this._helpPromptWindow);
        scene.addChild(this._termWindow);
        _hasTerms = false;
    };
 
    var BBS_TW_Window_Message_startMessage = Window_Message.prototype.startMessage;
    Window_Message.prototype.startMessage = function() {
        this._helpPromptWindow.deactivate();
        this._termWindow.deactivate();
        BBS_TW_Window_Message_startMessage.call(this);
    };

    var BBS_TW_Window_Message_terminateMessage = Window_Message.prototype.terminateMessage;
    Window_Message.prototype.terminateMessage = function() {
        this._helpPromptWindow.deactivate();
        this._termWindow.deactivate();
     
        this._helpPromptWindow.visible = false;
        this._termWindow.visible = false;
        this._termWindow._termIds = [];
        _hasTerms = false;
     
        BBS_TW_Window_Message_terminateMessage.call(this);
    };
 
    Window_Message.prototype.isXPressed = function() {
        return Input.isRepeated(pHelpKey);
    };
 
    var BBS_TW_Window_Message_updateInput = Window_Message.prototype.updateInput;
    Window_Message.prototype.updateInput = function() {
        if (this.isXPressed()) {
            if (this._termWindow._termIds.length > 0) {
                this._termWindow.toggleTermWindow(_activeTerms);
            }
        }
        return BBS_TW_Window_Message_updateInput.call(this);
    };
 
    var BBS_TW_Window_Message_newPage = Window_Message.prototype.newPage;
    Window_Message.prototype.newPage = function(textState) {
        BBS_TW_Window_Message_newPage.call(this, textState);
     
        if (pDebugging) {
            console.log(_activeTerms);
            console.log(_hasTerms);
        }
     
        if(_hasTerms) {
            BBS_termWnd.setActiveTerm(_activeTerms[0], _activeTerms);
            BBS_helpPromptWnd.refresh(pMsgHelpPromptText, 4);
            _activeTerms = [];
            _hasTerms = false;
        }
    };
 
    //=============================================================================
    // class Game_Message
    //============================================================================= 
    Game_Message.prototype.addText = function(text) {
        // Don't override YEP.
        if ($gameSystem.wordWrap()) text = '<WordWrap>' + text;
         
        var termPrefix = "c[" + pTermColorIndex + "]";
        console.log(termPrefix);
     
        var termPostfix = "c[0]";
        var textIter = text;
         
        var sIdx = 1;
        var fIdx = -1;
        while(sIdx >= 0) {
            sIdx = textIter.indexOf(termPrefix);
            if(sIdx >= 0) {
                sIdx = sIdx + termPrefix.length;
            }
            else {
                break;
            }
             
            fIdx = textIter.indexOf(termPostfix) - 1;
            if(fIdx < 0) {
                fIdx = text.length - 1;
            }
             
            if(pDebugging) {
                console.log(fIdx);
                console.log(termPostfix.length);
                console.log(textIter.length);
            }
         
            // We have a term if we got this far, so process it.
            var termStr = textIter.substr(sIdx, (fIdx - sIdx));
            var alreadyAdded = false;
            for (var i = 0; i < _activeTerms.length; i++)
            {
                if(_activeTerms[i] === termStr) {
                    alreadyAdded = true;
                    break;
                }
            }
         
            if(alreadyAdded === false) {
                _activeTerms.push(termStr);
                _hasTerms = true;
            }
         
            // Advance to avoid infinite loop over same term tag.
            textIter = textIter.substr(sIdx);
        }
     
        this.add(text);
    };
 
    //=============================================================================
    // class Scene_Boot
    //=============================================================================
    var BBS_TW_Scene_Boot_create = Scene_Boot.prototype.create;
    Scene_Boot.prototype.create = function() {
        BBS_TW_Scene_Boot_create.call(this);
        this._loadFile(pTermFile, _create);
    };
 
    Scene_Boot.prototype._loadFile = function(url, callback) {
        var request = new XMLHttpRequest();
        request.open('GET', url);
        request.overrideMimeType('application/json');
        request.onload = function() { callback(JSON.parse(request.responseText)); }
        request.onerror = function() { throw new Error('There was an error loading the file ' + url); }
        request.send();
    };
 
    var BBS_TW_Scene_Boot_isReady = Scene_Boot.prototype.isReady;
    Scene_Boot.prototype.isReady = function() {
        return !!_terms && BBS_TW_Scene_Boot_isReady.call(this);
    };

})(BBS.TermWindow);
//=============================================================================
// End of File
//=============================================================================


Change Log
1.03b
- Missing term definition error is now much more user-friendly.
1.03a
- Fixed plugin parameters not registering properly. Sorry about that!
1.03
- Added option to change color index for Terms (default 4), and option to change keys for Term Window.
1.02
- Multiple word terms now supported using _.
1.01
- Plugin finished.


Known Bugs / TODO
Suggestions, bug reports, and feature requests are welcomed!


Compatibility Issues
None known.


Credit and Thanks
- Micheal Morris @Blue Booth Studios


Author's Notes
Free for non-commercial and commercial usage as long as credit is given.

a JSON file is also needed: http://www.bluebooth.ca/downloads/Terms.json
 

Attachments

Last edited:

The Stranger

The Faceless Friend
Veteran
Joined
Sep 14, 2012
Messages
3,153
Reaction score
20,338
First Language
English
Primarily Uses
RMMV
Does this work similar to the highlighted terms in Tyranny by Obsidian? Mousing over a different coloured word in a text box would reveal a smaller text box with some extra information; lore, mechanics, etc.
 

bluebooth

Veteran
Veteran
Joined
Nov 12, 2015
Messages
95
Reaction score
115
First Language
English
Primarily Uses
N/A
Thanks for the feedback and the patience, everyone, screenshots are up now!

@The Stranger Maybe? I haven't played that particular title, and it's not mouse-over based, but overwise it should be similar.
 

styx92

Veteran
Veteran
Joined
Jan 7, 2016
Messages
310
Reaction score
39
First Language
German
Primarily Uses
The link to Terms.json shows an 404 error :kaoback:
 

ashikai

Veteran
Veteran
Joined
Jun 2, 2015
Messages
456
Reaction score
342
First Language
English
Primarily Uses
N/A
Oooooo what a good idea! :0
 

bluebooth

Veteran
Veteran
Joined
Nov 12, 2015
Messages
95
Reaction score
115
First Language
English
Primarily Uses
N/A
Oooooo what a good idea! :0
Thank you! I got the original idea from Ghost of a Tale, and just loved how convenient it was, both for lore-seekers and casual players. So I decided to implement my own take on it for RMMV.

@styx92 Terms.json link is now fixed! Sorry about that!
 

styx92

Veteran
Veteran
Joined
Jan 7, 2016
Messages
310
Reaction score
39
First Language
German
Primarily Uses
Could you upload a demo?
I dont know how to set the words. /c[4]word/c[4]?

I get some crashes at the start, too. I show you screenshots if im at home
 

Farr

Veteran
Veteran
Joined
Feb 16, 2014
Messages
247
Reaction score
92
First Language
Portuguese
Could you upload a demo?
I dont know how to set the words. /c[4]word/c[4]?

I get some crashes at the start, too. I show you screenshots if im at home
It`s the regular \c[4]word\c[0].
The OP just misspelled I guess.
 

bluebooth

Veteran
Veteran
Joined
Nov 12, 2015
Messages
95
Reaction score
115
First Language
English
Primarily Uses
N/A
It`s the regular \c[4]word\c[0].
The OP just misspelled I guess.
Hey Farr, thanks for the correction! I did indeed misspell. I'm correcting the original post now.
 

Farr

Veteran
Veteran
Joined
Feb 16, 2014
Messages
247
Reaction score
92
First Language
Portuguese
Are you planning on adding more features?
Like change the color of the highlighted word or the hotkey needed to pop the help.
 

Rindai3

Warper
Member
Joined
Apr 2, 2015
Messages
2
Reaction score
1
First Language
Francais
Primarily Uses
Sorry i am a newbie and i have a problem with this plugin
"undefined is not a fonction"
I dont know why i have this message but i can't use the plugin,please help me.
 

bluebooth

Veteran
Veteran
Joined
Nov 12, 2015
Messages
95
Reaction score
115
First Language
English
Primarily Uses
N/A
Are you planning on adding more features?
Like change the color of the highlighted word or the hotkey needed to pop the help.
Hey, Farr, thanks for asking! All of my plugins are open to feature requests. Can I take it from your post that you'd like to request those changes?

@Rindai3 Sorry to hear you're having problems with the plugin. Please start up your game again. When you receive the error message, press F8. Please post the entire error message that you find in the console here so I can help you better.
 

Farr

Veteran
Veteran
Joined
Feb 16, 2014
Messages
247
Reaction score
92
First Language
Portuguese
Of course dude, I was just stating more customizations.
The whole system is a charm.
 

Rhino

~Inactive~
Veteran
Joined
Feb 28, 2017
Messages
482
Reaction score
787
First Language
English
Primarily Uses
RMMV
A possible update to this might be a parameter to change the call code from \c[4] to whichever colour you'd like? You could always edit the windowskin colours, but I thought this would be a cool feature :kaojoy:
 

The Stranger

The Faceless Friend
Veteran
Joined
Sep 14, 2012
Messages
3,153
Reaction score
20,338
First Language
English
Primarily Uses
RMMV
@bluebooth Awesome! After looking at your screenshots, I can see it's exactly what I thought it was - minus the mouse over bit. This is a handy little plug-in, which will come in handy in lore rich worlds.
 

bluebooth

Veteran
Veteran
Joined
Nov 12, 2015
Messages
95
Reaction score
115
First Language
English
Primarily Uses
N/A
@Farr Thank you for the kind words. By all means, suggest away!
@Rhino Fun fact, I actually just got done implementing Farr's suggestions today. I've been studying for my finals though and haven't uploaded it just yet. I'll do that now.

@The Stranger Thanks! I'm glad you like it.

Thank you everyone for the kind words, I'm really glad you like the plugin and are finding it useful!
 

Users Who Are Viewing This Thread (Users: 0, Guests: 1)

Latest Threads

Latest Posts

Latest Profile Posts

just a few more hours until the toughest, most pressure 72 hours of my life, wish me luck guys
Working on some bosses for my game-
His tracks are always so wonderful.
In a narrative Choose Your Own Adventure-style RPG, do you prefer the narrative to be in 2nd person ("you saw", "you thought"), or 3rd person ("he saw", "he thought")?

What's your preference, and why?

Forum statistics

Threads
100,558
Messages
977,220
Members
132,136
Latest member
alfredotrojse
Top