Switching Message Window Face & Facename for Actor Face & Facename (Irina_VisualNovelBusts Issue)
BMM Archive · July 15, 2026
Original Source
- Original title: Switching Message Window Face & Facename for Actor Face & Facename (Irina_VisualNovelBusts Issue)
- Original author: Anyone
- Original date: November 4, 2019
- Source thread: https://forums.rpgmakerweb.com/threads/switching-message-window-face-facename-for-actor-face-facename-irina_visualnovelbusts-issue.114897/
- Source forum path: Game Development Engines > RPG Maker Javascript Plugins > Javascript/Plugin Support
Summary
Hey, javascript newbie here. My team bought the Visual Novel Busts plugin for RPG Maker MV by RPG Maker Irina. Unfortunately, the plugin does not support using the Actor's face, only the message face. All attempts to bypass that via script calls, script calls in text via escape plugins, \af[x] commands by Yanfly's Message Core plugin or even the \f[x] escape of the MoreEscapeCodes plugin by Shaz, have all failed.
Archived First Post
My team bought the Visual Novel Busts plugin for RPG Maker MV by RPG Maker Irina.
Unfortunately, the plugin does not support using the Actor's face, only the message face.
All attempts to bypass that via script calls, script calls in text via escape plugins, \af[x] commands by Yanfly's Message Core plugin or even the \f[x] escape of the MoreEscapeCodes plugin by Shaz, have all failed.
The best result I've got is that the face does change, but in a glitchy, glaring manner where the many other faces briefly pop in before only the selected face bust appears.
At this point, I've spent over 30 hours experimenting with trying to get this to work. It's been excruciatingly frustrating.
We wrote a message to the original author almost a week ago but so far we didn't hear anything back, not even any acknowledgement. So I have to act under the assumption that we won't either, and somehow get this fixed without the author's help.
I've come to the conclusion that the only solution is through editing the original plugin code, since using different text messages based on conditional checks of what the character has equipped aren't a viable option - there are too many variants for all the different actors, which would essentially multiply every dialogue x 30, since different armors should yield different bust graphics.
Fortunately, the terms allow for that.
TOS:
3. You are allowed to edit the code.
Unfortunatey, I don't have any meaningful javascript experience.
I think I've isolated the specific part of the code that I think handles the selection of the face:
(I've split it up a little. The original code was just one endlessly long single line. While the coder allows editing, it's certainly not encouraged and there are no code annotations whatsoever)
var duration=array[1]===undefined?Imported.Irina_VisualNovelBusts.BustClearDuration:parseInt(array[1])||0;
sprite.clear(duration)}else{Imported.Irina_VisualNovelBusts.Window_Base_processEscapeCharacter.call(this,code,textState)}};
Window_Base.prototype.obtainVNBustMsgEscapeString=function(t){var e=/^\[(.*?)\]/.exec(t.text.slice(t.index));
if(e){t.index+=e[0].length;
return String(e[0].slice(1,e[0].length-1))}else{return""}};
Imported.Irina_VisualNovelBusts.Window_Message_initMembers=Window_Message.prototype.initMembers;
Window_Message.prototype.initMembers=function(){Imported.Irina_VisualNovelBusts.Window_Message_initMembers.call(this);
this.createMessageBustSprites()};
Window_Message.prototype.createMessageBustSprites=function(){this._messageBodyBustSprite=new Sprite_VisualNovelBust(0);
this.addChildToBack(this._messageBodyBustSprite)};
Window_Message.prototype.isUsingFaceBust=function(){
if($gameMessage.faceName().match(/\[BUST\]/i))return true;
if($gameMessage.allText().match(/\\BUST\[(\d+)\]/i)||$gameMessage.allText().match(/\x1bBUST\[(\d+)\]/i))return true;
return false};
Imported.Irina_VisualNovelBusts.Window_Message_loadMessageFace=Window_Message.prototype.loadMessageFace;
Window_Message.prototype.loadMessageFace=function(){if(this.isUsingFaceBust()){
this._faceBitmap=ImageManager.reserveFace("",0,this._imageReservationId)}
else{Imported.Irina_VisualNovelBusts.Window_Message_loadMessageFace.call(this)}};
Imported.Irina_VisualNovelBusts.Window_Message_drawMessageFace=Window_Message.prototype.drawMessageFace;
Window_Message.prototype.drawMessageFace=function(){
if(!this.isUsingFaceBust()){Imported.Irina_VisualNovelBusts.Window_Message_drawMessageFace.call(this)}};
Window_Message.prototype.refreshMessageBustSprite=function(){if(!this.isUsingFaceBust())return;
var t=$gameMessage.allText();
if(t.match(/\\BUST\[(\d+)\]/i)||t.match(/\x1bBUST\[(\d+)\]/i)){var e=parseInt(RegExp.$1).clamp(0,10);
if(e>0){var a=$bust(e);
if(a){a.loadBitmap("face",$gameMessage.faceName())}}
else{this.makeMessageWindowBust($gameMessage.faceName())}}
else{this.makeMessageWindowBust($gameMessage.faceName())}};
Window_Message.prototype.makeMessageWindowBust=function(t){
this._messageBodyBustSprite.x=Imported.Irina_VisualNovelBusts.BustDefaults[0].ScreenX.call(this);
this._messageBodyBustSprite.y=Imported.Irina_VisualNovelBusts.BustDefaults[0].ScreenY.call(this);
this._messageBodyBustSprite.loadBitmap("face",t)};
Imported.Irina_VisualNovelBusts.Window_Message_newLineX=Window_Message.prototype.newLineX;
Window_Message.prototype.newLineX=function(){var t=$gameMessage.allText();
if(t.match(/\\BUST\[(\d+)\]/i)||t.match(/\x1bBUST\[(\d+)\]/i)){var e=parseInt(RegExp.$1);
if(e>0){return 0}
else{return Imported.Irina_VisualNovelBusts.Window_Message_newLineX.call(this)}}
else{return Imported.Irina_VisualNovelBusts.Window_Message_newLineX.call(this)}};
The way that it works is that the script uses tags in the face name to decide what operations to do.
So: ThisIsMyFace[BUST][Exp5x2] tells the plugin that it consists of 2 rows of 5 expressions each and that it should automatically display as Bust(which will make it automatically display in Bust[0] location).
What I'd like to do is introduce a line of code in the script before this happens, that also reads the Face's name and if it detects the tag (ActorX) or something like that whereby X is any number between 1-99, it switches the face.png file in the message with the face.png file of ActorX entirely. Both the face and the facename need to be switched for the Actor's as if I had assigned that Actor's face in the RPGMV editor itself, so that the VisualNovelBusts plugin behaves correctly.
So that, with the new code, I can use ThisIsMyFace(Actor1)[BUST][Exp5x2] as message face and it will not use the face & name in the message window, but instead straight up use the one currently used by Actor1.
You'd be doing me a tremendous favor by helping me get this done, because at this point, I'm just utterly exhausted by this plugin.
--------------------------------------------------------------------------------------------
Update 1:
I've searched around and come up with this attempt to change the face:
Window_Message.prototype.checkActorFace=function(){
if ($gameMessage.faceName().match(/Actor/gi))return true
};
Window_Message.prototype.ActorFaceNumber=function(){
if (this.checkActorFace()){
var ActorId=$gameMessage.faceName().match(/Actor(\d+)/gi)};
if ($gameMessage.faceName() != $gameActors.actor(ActorId).faceName()) {
$gameMessage.setFaceImage(actor.faceName(ActorId), actor.faceIndex(0))
}
};
Downloads / Referenced Files
Log in, then follow the RPG Maker Developers Group to see these download links.
Log in to downloadCreator 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.
Replies (0)
No replies yet.
Topic Summary
Loading summary...