public

Rpg Maker Developers Group

Simple enough for a child, powerful enough for a developer

2 Followers

I'm using Simultaneous Messages...

BMM Archive · July 15, 2026

Preserved forum archive. This topic stores the original first post and locally mirrored RPG Maker Web attachments when available. It is posted by the BMMPlay archive account, not by the original creator.

Original Source

  • Original title: I'm using Simultaneous Messages...
  • Original author: Nonameded
  • Original date: July 7, 2020
  • Source thread: https://forums.rpgmakerweb.com/threads/im-using-simultaneous-messages.123757/
  • Source forum path: Game Development Engines > RPG Maker Javascript Plugins > Javascript/Plugin Support

Summary

This plugin(←Link) I can see some errors. First of all, this plug-in maker can no longer give feedback, so I need you to tell me how to fix it. The biggest problem is that the message, whether it's at the top or in the middle, doesn't have a command, but the bottom is bound to come out.

Archived First Post

This plugin(←Link)
I can see some errors.
First of all, this plug-in maker can no longer give feedback, so I need you to tell me how to fix it.
The biggest problem is that the message, whether it's at the top or in the middle, doesn't have a command, but the bottom is bound to come out.

Protected download(Window Position :Bottom)Protected downloadProtected download(Window Position: Top)Protected download


And if you use the "show text" command in a row, the event will slow down a bit because the window will close and open.
a little on edge

I need you to tell me how to modify it, or how to disable some of this plug-in with switches or variables.
(Using translator)

(Edit)
Add plug-in code for quick resolution
Code:
/*:
*
* @plugindesc Shows Multiple Messages Simultaneously
* @author Jake Jilg "mogwai"
*
*
*  When any of these tags are used, the tag will override default Top/Middle/Bottom
*
*  Use tags \[top] \[middle] \[bottom] on the same line to show text at the same time.
* \[bottom]Hello, how are you doing?\[top]¿Hola cómo estás?
*
* Optional tag parameters (only needed on first line) (must be in this order)
*
* \[pos hue:R,G,B] \[top face:FaceName,Index,HueRotate] face hueRotate is optional
*
* example \[middle hue:155,0,250 face:People4,2,150]
*
* version 0.3
*/

// ------- globals -------

var subWindowLayer;

var messageWindowBottom = {};
var messageWindowMiddle = {};
var messageWindowTop = {};

var simultaneousAquisition = [];

var okGetNum = {
    "bottom": 2,
    "middle": 1,
    "top"   : 0
};

var okGetFace = {
    2 : [],
    1 : [],
    0 : []
};

var okGetTone = {
    2 : [0,0,0],
    1 : [0,0,0],
    0 : [0,0,0]
};

// ------ aliases ----

// create three window children
(function(alias){
    Scene_Base.prototype.createWindowLayer = function() {
        alias.apply(this, arguments);
        var width = Graphics.boxWidth;
        var height = Graphics.boxHeight;
        var x = (Graphics.width - width) / 2;
        var y = (Graphics.height - height) / 2;
       
        subWindowLayer = this._windowLayer;
    };
})(Scene_Base.prototype.createWindowLayer);

// add our two new message window siblings
(function(alias){
    Scene_Map.prototype.createMessageWindow = function() {
        alias.apply(this, arguments);
       
        messageWindowBottom = this._messageWindow;
        messageWindowMiddle = new Window_Message();
        messageWindowTop    = new Window_Message();
       
        // the mainChild is the reactor
        messageWindowBottom._isMainChild = true;
        messageWindowMiddle._isMainChild = false;
        messageWindowTop._isMainChild    = false;
       
        subWindowLayer.addChild(messageWindowTop);
        subWindowLayer.addChild(messageWindowMiddle);
       
        messageWindowBottom._positionType = 2;
        messageWindowMiddle._positionType = 1;
        messageWindowTop._positionType    = 0;
     };  
})(Scene_Map.prototype.createMessageWindow);

// when they clear, we clear too $gameMessage.clear
(function(alias){
    Game_Message.prototype.clear = function() {
       
        alias.apply(this, arguments);
        if(this.positionType() !== undefined)
            simultaneousAquisition = [this.positionType()];
        else
            simultaneousAquisition = [];
        okGetFace = {
            2 : [],
            1 : [],
            0 : []
        };
        okGetTone = {
            2 : [0,0,0],
            1 : [0,0,0],
            0 : [0,0,0]
        };
    };
})(Game_Message.prototype.clear);

// look for sign to simul-text $gameMessage.add
(function(alias){
    Game_Message.prototype.add = function() {
       
        var pe = simultaneousAquisition;
        if(pe.indexOf($gameMessage.positionType()) === -1)
            pe.push($gameMessage.positionType());
       
        arguments[0] = arguments[0].replace(
        /\\\[(top|middle|bottom)( hue:([\d,]+))?( face:([^\]]+))?]/g,
        function(m, tag, m2, hue, m3, face){
           
            $gameMap._interpreter._waitCount += 5;
           
            if(m2 !== undefined){
                var hues = hue.split(",");
                for(var i = 0; i < hues.length; i++){
                    hues[i] = parseInt(hues[i]);
                }
                okGetTone[okGetNum[tag]] = hues;
            }
           
            if(m3 !== undefined){
                okGetFace[okGetNum[tag]] = face.split(",");
            }
           
            if(pe.indexOf(okGetNum[tag]) === -1)
                pe.push(okGetNum[tag]);

            // lets hope this string doesn't come up in-game (it's used to parse)
            return "xThIsTx4G03sOn(" + okGetNum[tag] + "):";
            //      ^ sloppy yet functional
        });
        alias.apply(this, arguments);
    };
})(Game_Message.prototype.add);

// when I close, you close... just like that..
(function(alias){
    Window_Message.prototype.close = function() {
        $gameMap._interpreter._waitCount += 5;
        if(this._isMainChild){
            messageWindowMiddle.close();
            messageWindowTop.close();
        }
        alias.apply(this, arguments);
       
        this.isMakeMessage = false;
    };
})(Window_Message.prototype.close);

// when I open, you close... just like that..
(function(alias){
    Window_Message.prototype.open = function(textState) {
        var pe = simultaneousAquisition;
        if(pe.indexOf(this._positionType) !== -1)
            alias.apply(this, arguments);
    };
})(Window_Message.prototype.open);

// I want to look pretty for my window message
(function(alias){
    Window_Message.prototype.updateTone = function() {
        var tone = okGetTone[this._positionType] || [];
        if(tone.length > 0){
            this.setTone(tone[0]||0, tone[1]||0, tone[2]||0);
        }else{
            alias.apply(this, arguments);
        }
    };
})(Window_Message.prototype.updateTone);

// a unique face for a unique monicker
(function(alias){
    Window_Message.prototype.drawFace =function(faceName, faceIndex, x, y, width, height){
        var face = okGetFace[this._positionType];
       
        if(face.length === 0)
            return alias.apply(this, arguments);
       
        var punim = face[0] !== undefined ?
            face[0] : $gameMessage.faceName();
        var faceIndex = face[1] !== undefined ?
            parseInt(face[1]) - 1 : $gameMessage.faceIndex();
        var hue =   face[2] !== undefined ?
            parseInt(face[2]) : 0;
       
        width = width || Window_Base._faceWidth;
        height = height || Window_Base._faceHeight;
        var bitmap = ImageManager.loadFace(punim, hue);
        var pw = Window_Base._faceWidth;
        var ph = Window_Base._faceHeight;
        var sw = Math.min(width, pw);
        var sh = Math.min(height, ph);
        var dx = Math.floor(x + Math.max(width - pw, 0) / 2);
        var dy = Math.floor(y + Math.max(height - ph, 0) / 2);
        var sx = faceIndex % 4 * pw + (pw - sw) / 2;
        var sy = Math.floor(faceIndex / 4) * ph + (ph - sh) / 2;
       
        var contents = this.contents;
        bitmap.addLoadListener(function(){
            contents.blt(bitmap, sx, sy, sw, sh, dx, dy);
        });
    };
})(Window_Message.prototype.drawFace);



// ------ overwrites -------

// 3 endings for 1

Window_Message.prototype.updateMessage = function() {

    var top = messageWindowTop._textState || this._textState;
    var mid = messageWindowMiddle._textState || this._textState;;
    var bot = messageWindowBottom._textState || this._textState;;
   
    var pe = simultaneousAquisition;
    if(pe.indexOf(0) === -1)
        mid = this._textState;
    if(pe.indexOf(1) === -1)
        top = this._textState;
   
    if (this._textState) {
        while (!this.isEndOfText(this._textState)) {
            if (this.needsNewPage(this._textState)) {
                this.newPage(this._textState);
            }
            this.updateShowFast();
            this.processCharacter(this._textState);
            if (!this._showFast && !this._lineShowFast) {
                break;
            }
            if (this.pause || this._waitCount > 0) {
                break;
            }
        }
        if (this.isEndOfText(bot) && this.isEndOfText(mid) && this.isEndOfText(top)) {
            this.onEndOfText();
        }
        return true;
    } else {
        return false;
    }
};

// 3 message starts for 1
Window_Message.prototype.startMessage = function() {
   
    var text = $gameMessage.allText();
    if(text.match(/xThIsTx4G03sOn\(\d\):/) !== null){
        var txt = text.split(/xThIsTx4G03sOn/g);
        var text = "";
        for(var i = 0; i < txt.length; i++){
            if(txt[i].charAt(1) === (this._positionType+""))
                text += txt[i].substr(4) + "\n";
        }
        text = text.replace(/\n{2}/g,"\n");
    }
    this.isMakeMessage = true;
   
    if(this._isMainChild){
        if(!messageWindowMiddle.isMakeMessage){
            messageWindowMiddle.pause = false;
            messageWindowMiddle.startMessage();
        }
        if(!messageWindowTop.isMakeMessage){
            messageWindowTop.pause = false;
            messageWindowTop.startMessage();
        }
    }
   
    this._textState = {};
    this._textState.index = 0;
    this._textState.text = this.convertEscapeCharacters(text);
    this.newPage(this._textState);
    this.updatePlacement();
    this.updateBackground();
     this.open();
};

// each window has it's own position type
Window_Message.prototype.updatePlacement = function() {
    //this._positionType = $gameMessage.positionType();
    messageWindowBottom._positionType = 2;
    messageWindowMiddle._positionType = 1;
    messageWindowTop._positionType    = 0;
   
    this.y = this._positionType * (Graphics.boxHeight - this.height) / 2;
    this._goldWindow.y = this.y > 0 ? 0 : Graphics.boxHeight - this._goldWindow.height;
};

// if we move the windows to $gameMessage.positionType(), they overlap
Window_Message.prototype.areSettingsChanged = function() {
    return (this._background !== $gameMessage.background());
            //this._positionType !== $gameMessage.positionType()
};

Downloads / Referenced Files

Log in to download

Log in, then follow the RPG Maker Developers Group to see these download links.

Log in to download

Referenced Images / Attachments

multi message (1).png
multi message (1).png
multi message (2).png
multi message (2).png
multi message (3).png
multi message (3).png
multi message (4).png
multi message (4).png
Creator Claims / Removal

If you are the original creator and want this listing reassigned, edited, or removed, join BMMPlay and contact the moderators with proof that matches the original RPG Maker Web profile, linked GitHub, itch.io page, or another public creator identity.

#039#rpg-maker-archive#js-support

Replies (0)

No replies yet.

0 replies 1 view

Log in to reply.

User Avatar