A downloadable tool

Download NowName your own price

This plugin is supported on both RPG Maker MV and MZ.

When we create a game, we usually create a whole new world rich in lore and details, and want to make it all available to the players, so that they can understand every single detail we develop. However, just dumping it all in lengthy dialogues usually bore and scare most of the players, who will simply give up on your world. 

A common alternative used by many AAA games is to minimize dialogue and exposition, and provide additional details through in-game books.

This plugin aims to provide just that for your game: a book menu where the player can read up additional lore when he feels up to it. You can place books throughout your game, providing a bit more of context for hungry players as they progress, and keeping exposition to a minimum.

Features

  • Creates a main menu command gathering books the player discovers throughout your world, letting them read whenever they want;
  • Allows the dev to call a detached window and show the contents of a book outside the menu;
  • Input your game books into the engine using either the Plugin Manager or an external JSON file;
  • Compatibility with multilanguage plugins that uses multiple external files for text;
  • Allows the dev to setup background images for both scenes separately, with options to use different images for each window or a single image for everything;
  • Allows you to include inline images along with the book text. The image can be used with its original size, or proportionally resized through a special escape code.
  • Use inline trailing images to give a nice finishing touch to your books!
  • Scroll book text by cliking (PC) or touching (mobile) the arrows or swyping up and down;

Plugin Usage

There's a bunch of parameters that allows you to customize each of the scenes (the detached book window and the book menu). The plugin's help section describe most which are not self explanatory, try taking a look there if you feel lost.

A few important notes:

  • You have to set up your books before you can call them inside your game. There's two ways of doing that: inside the Plugin Manager itself or using external JSON files. The plugin can only work with one of this methods at a time, so you need to chose which one you want at the "DataSource Type" parameter. I'll enclose the instructions for each case in spoiler tags below to make it more readable;
  • This plugin does not implement wordwrap, as it is widely available with a bunch of free plugins out there. I won't be reinventing the wheel, so I highly recommend using one of those. I, for instance, use Yanfly's Message Core;
  • This plugin creates almost everything it uses, so it is unlikely that any compatibility issues arises. Anyway, I've tested it out with most of Yanfly's plugins and found no issues;
  • I don't know how many around here go through the trouble of using multi language plugins like me, but I've built this plugin to make those people lives easier. You can set it up so that it reads the books data directly from one of your JSON language files, and just reference the key tag of each book in the plugin commands. The plugin will take care of using placeholders to make sure the right language is used. I've tested it out with Iavra's Localization Core, but it should work with any plugin of this kind if there are JSON files involved;

Known Issues

  • If you're using another plugin to provide wordwrap, it may be disrupted when using inline images. It happens because in order to allow inline images I have to break down book input, and I treat each text and image section separately. So, the wordwrap tag included at the beginning of the text is lost when there's one or more inline images. The workaround for that is to simply manually include a wordwrap tag after an inline image tag if you're going to continue the book's text.
    For example, using Yanfly's wordwrap tag: '<WordWrap>Initial text.%img("Sword")<WordWrap>Text after image.'
  • If using the Plugin Manager as source and a book text is left empty the game can break if you try to access the book. As I see no use on loading a book without any text, I'm not planning on failsafe that for now.
StatusReleased
CategoryTool
Rating
Rated 5.0 out of 5 stars
(6 total ratings)
Authortaaspider
TagsRPG Maker

Download

Download NowName your own price

Click download now to get access to the following files:

TAA_BookMenu_CompatLunaEngine.js v1.0.0 52 kB
TAA_BookMenu v1.7.0 234 kB

Development log

View all posts

Comments

Log in with itch.io to leave a comment.

(2 edits)

Hi there!

GameFont doesn't seem to bring the font set in Main Font Filename on the game settings (in MZ). Is there a workaround to specify a custom font (in the game's font folder) for the book text?

Thanks for the great plugin!

(2 edits)

I tried adding gamefont.css from the demo and declaring it in the index.html of my project, and add my custom font there. The font now appears on the book scenes, but only the second time they are loaded, for some reason ^^u

Ah, sorry! If anyone is having this issue there is a disclaimer about using rmmz-mainfont for MZ in this forum thread: https://forums.rpgmakerweb.com/index.php?threads/taa_bookmenu-v1-6-7.127880/

Hi! Very useful plugin, much appreciated. I was wondering if you could add a Show Book Menu plugin command?

Alternatively, is there a script call I can use to call the main book menu, without having to give the player that option directly in the menu?

Hello!

Although there is no plugin command for this, you can work this out with a simple script call:
SceneManager.push(Scene_BookMenu)

Thank you!

(1 edit)

Hello! I am very fond of the plugin you made. May I ask you a question about plugin command?

How does "LibraryData TextUpdate key Replace index" actually works? So here is how it goes right now. I'm using plugin manager as Datasource. I'm making a little cookbook, which shows a part of its contents at first, and updates afterwards. I filled "text" part for initial contents, and put updated full cookbook on the number 1 of variable text list.

I made an event that runs "LibraryData TextUpdate Cookbook Replace 1",  but it just deleted whole book's content. Where did I fumbled? Maybe I should have used \v[1] or something?

EDIT: Well, nevermind. Solved it myself.

Hello there!

Sorry for the long silence... I have been going crazy with my dayjob, not much time left for coding lately =(

Glad to know you managed to work it out!

Just a reference if anyone else stumbles upon your question: the "Replace" command will remove all currently visible text from the book, and make visible only the text index you point out on the command. If the index you provide has no text, then the book will be shown empty in the text window. However, if what you want is to add another chunk of text to be shown (instead of replacing all of it), you should use the "LibraryData TextUpdate key Add index" instead!

Just keep in mind that the provided index must have a text assigned for it in your datasource, be it an external JSON file or the Plugin Manager. If the index does not exist or has no text, the plugin will simply assume there is nothing to display.

Hello! I just found out something. If I use DKTools localization with VisuStella Message Core for <WordWrap> and put it in a JSON Dedicated File to localizate it, it won't work. The text will be just empty.
I tried without localization tag {example}, and it will work, and other plugins or HUD elements will work with the two plugins.

Is there something that can be done, or checked?
Many thanks!

Hey there.

It's been a while since I last worked with this plugin, and even more time since I last reviewed this specific part of the code. However, by reading DKTools page on their plugin and taking a quick look at my code, I think you might need just a small change to get it working.

From what I gathered, DKTools use tags with a single pair of {} around it to replace the texts... right? Does it work with json files for each language set?

First, you need to make sure you have objects defined in each language file with the same structure as a single dedicated external json file for book data. This is important, as that is what the plugin will actually use to find the correct text to use. You are getting an empty text because the plugin didn't find any data for the given tag.

Second, set TAA_BookMenu 'Localization Escape Code' to {{key}} (with two pairs, and no '#' at the beginning as is its default). That because my plugin will replace the {key} with the object path for each component of the scenes (categories, titles, book texts, and so on). For example, it will process the tag and replace it with "{library.books.BookTitle1.title}" to get to the "Book Title 1" title text ({key} will be replaced by library.books.BookTitle1.title, so it will then run the tag {library.books.BookTitle1.title} through the localization plugin to find the correct language text for it).

Hope this is of any help!

Thanks for the reply.

The thing is, I don't have any problem to draw the text from the {key} tag. If I don't use <WordWrap>, the text will be replaced without any problem. But, obv., I need to wrap my text, and when I use <WordWrap> from VisuStella, the text will be "erased", it just won't show any text.
I don't understande why it's that, but from what I understand, it could be some incompatibility with VisuStella?
Eventually if more information are needed, I can provide it.

Many thanks!

It may probably be an incompatibility issue. Since VisuStella's plugins are obfuscated I can't do much about it unfortunately =/

Have you tried the wordwrap feature without the localization plugin?
It may be an incompatibility of combining all three plugins as well.

So, I can say that:

With normal text and Visu Wrap enabled, the text will be displayed normally
Localizated text and Visu Wrap disabled, the text will be displayed normally (not wrapped though, one line only)
Localizated text and Visu Wrap enabled,  the text didn't show up like said

Does maybe this info help to understand? I hope ^^"

Well... that seems to be a compatibility issue between the three plugins. No idea what could be causing this though hehe ^^"

I'm unable to work on my plugins for the next few weeks, but I'll try to replicate it when I can, and see if there is anything I can do on my side.

Like I wrote in a comment yesterday, I did find some bugs around the localization feature. I managed to get it fully working and published version 1.7.0 with the updates.

I also run some tests combining Visustella's Message Core and DK Tools Localization plugins, and have confirmed that the wordwrap feature works perfectly with this combination of plugins.

Be sure to check the "Compatibility Warnings" inside the plugin help section, as I've added some important notes on how things must be configured for proper compatibility with DK Localization plugin.

It took a while for me to get time to look into this, but I hope it was not too late! =)

Hello Man!

I have some troubles with ur plugin. It doesn't use my GameFont.

I was trying to do it in ur demo project and where it's perfectly works, but in my poject no. I think it's because i use the 1.7.0. version of RPG Maker MZ core.

Can u please help me.

Hi there!

The demo, unfortunately, is not 100% reliable for MZ reference, as I use a sort of a "hack" to have a single demo for both versions.

However, I just run a test with MZ 1.7.0 with a pure MZ project (loaded with some of my plugins only), and I was successfuly able to change fonts registered in the core database (as indicated in the image below). So if you use the engine's font customization features you should be able to use your custom font with the plugin. Keep in mind that the default "Game Font" refers to the Main Font and Number Font files specified in this menu (if I'm not mistaken).

Hi! Did you ever manage to find a workaround for this

this plugin was exactly what i needed for my mz project, but for some reason whenever i set a book to be learned using the plugin commands, or if they are already learned because of "hide unread books" being disabled, the book shows up twice in the list? I only have 1 book right now but no matter what i do i can't seem to get it to only show up once in the list, even if i have it hidden by default and then interact with an event once that marks the book as learned, it still shows up twice

(+1)

Hello!

I've tried replicating the issue on my test project with no success. I've tested a few different settings and nothing resulted in the behavior you described, there is always a single book entry here.

Can you share your settings?
Are you using the Plugin Manager or an external JSON file as source?

If it were possible for you to share link to a test project with the issue present it would also make it a lot easier to troubleshoot.

Hello! Your plugin is really cool, but i have one problem. I use plugin manager as source and books are not displayed in in-game menu. And the names of books and categories can includ only one word. I use cyrillic alphabet, maybe this is the problem? Thanks in advance!

(+1)

Hi there!

Is the List Window "hide unread books" enabled? If so, books will only be displayed after you mark them as read with plugin commands.

In theory, using the cyrillic (or any other type of alphabet) should not be a problem. I have never tested it though, so I would not rule out this possibility completely. The plugin has no restriction to using book titles or categories containing multiple words. The only thing is that when using the plugin manager as source the plugin automatically trim out blank spaces to convert the title in the book key to be referenced in plugin commands. For example, if you name your book "Это тест" (used google translate here hehe), when using a plugin command to read it you would call it "Этотест" (that applies on both MV and MZ). The title displayed on the menu is the one with blank spaces, you just need to remove them for the plugin to locate it.

Let me know if this solves your issues. If not, I may need your help setting up a test project replicating them so I can take a look. I checked on my sample project and was unable to find anything (using western alphabet though).

Thank you very much,  you helped me a lot! Yes, the problem was in "hide unread books". Thank you again, for your help and for this very cool plugin. Have a nice day! :)

Glad it worked out! :D

First of all, great plugin. We are loving it!

I would need some help with adding the IAVRA plugin though.

I have adapted the JSON method with the Localization type, but I can't get it to work.


My JSON file are in a extra folder (root/lang/books.json)

And I also set it in the Plugin parameters.
Do you have any ideas about it?

Thanks!

Hello!

There's two ways you can make Iavra's localization plugin work with TAA_BookMenu. The first one is to create a books.json file (or use the Plugin Manager) and set each book field as a localization key (Iavra's plugin uses #{{key}} by default, if I'm not mistaken). But that means you'll basically duplicate the entire library in yet another file.

The second way is the built-in integration I did with both plugins. To use it, set the datasource type to "Localization File" and point the file to one of your localization files. Then simply put the whole books.json structure inside your localization file (and have it on each language file with the same structure). Be sure to set the Localization Escape Code to the same key used by Iavra's plugin. And that's it!
Basically, you won't need the books.json, because its contents will be replicated into each language file (don't translate the object keys, just the texts).

I'm not sure if my explanation wasn't a bit confusing, so let me know if you still have questions.

Hello Taaspider!

A quick question, have you used Luna Engine with this plugin?

Hello there!

I have not. To be honest, I'm not familiar with the Luna Engine. I'll look into it, but I have to warn you it will take some time, as I currently have a lot of bug fixes and plugin compatibility requests piled up on my backlog. I'll get back to you as soon as I have looked into it.

Hello!
Thanks for the quick response! I will try some tests too, and if i get something i will reach you! 

I'm not sure if i'm doing something wrong or if i'm just blind, but the Plugin doesn't seem be working on my end.

For Reference, i'm using RPGMaker MZ.

As far as i can see from the Parameters the Books Menu should be enabled by default. However no matter what i do it doesn't appear at all.

I also tried to make a simple book and open it with the read command and nothing happened again.

Is there something i'm missing?

Hello!

Ok... are you setting up books using an external JSON file, or the Plugin Manager?
Make sure the proper option is selected in the parameter "DataSource Type".

For the book menu entry to be automatically included in the main menu, be sure to set "Auto Place Command" is set to true. Also, if the "Hide Unread Books" within the "Menu List Window Config" settings is set to "true", books won't be listed until a plugin command is issued to mark is as read (learn book, for example).

If you're using the Plugin Manager as source for your books, the book title is automatically converted to the book key by eliminating blank spaces. So, for example, the book "Test Book Number 1" would have a key "TestBookNumber1". This key is what you need to reference when issueing the read command:

Make sure your book key is correctly referenced in the plugin command.

If none of that solves your issue, I'm gonna need to ask you to setup a simple test project, zip it and send me a download link so I can take a look on what's going on =/

Issue is fixed.

Turns out the Word wrap plugin i used was not made for MZ so it couldn't load.

Thanks for the help though.

Is there a way that you can add the ability to add an icon next to the Book menu title? I am using Visustella Main Menu core and the Book menu looks a little out of place not having an icon next to the name. Any help would be appreciated!

Hello!

You mean the menu item that leads to the actual book menu, right?

I think you can probably use Visustella's plugin for that. Just disable the "Auto Plance Command" parameter on BookMenu and use Visustella's method instead. Then you can use their plugin to select an icon and keep the same visual pattern for all entries.

(1 edit)

mind if you can tell me what the javascript command for it is?
I really wanna try to add that into my game for sure. But well I am sorta dumb on how to properly use it with visustella main menu core lol

Hello!
You mean to command to trigger the Book Menu?

You can use the command SceneManager.push(Scene_BookMenu)
There's detailed instructions for everything at the plugin help section, including a few integration tips (inclusing Visustella's Main Menu). Be sure to give it a read! :)

Hello, I just want to ask. Could you consider adding auto word wrap feature for this plugin?

 VisuStella Message Core seems to be the only plugin that could work for word wrapping the text in this plugin (for MZ), the others only works for normal message windows. 

Unfortunately for some reason I can't use VisuStella Message Core, so I'm having a hard time to manually put line breaks here and there then play the game just to see the result.

Thank you

Hello there!

I don't have plans to add word wrap into the plugin itself, but I do like the idea of implementing my own messaging plugin including it (and ensure it is compatible with all my plugins). I've added it to my backlog with a higher priority, but I can't promise a release date (have been having little time to code, unfrotunately). But you can work on your game expecting a compatible word wrap function will come soon! :)

Ah glad to gear that! Thank you very much. Looking forward to it! :)

Hello !

I'm having a weird issue with inline images. When I playtest the game inside RPGM, everything  works without problems, but after deploying the game, the inline images won't appear...

Do you have an idea of what could be causing this and how to fix it ?

Hello!

Which version of BookMenu are you using?

Also... which deployment type? Is it Android / Web deployment?

The plugin checks if the image exists before loading it into the screen. If it doesn't find the image, it skips this steps instead of crashing. However, there was a bug on older versions where this check would never work for Android / Web deployments. This was fixed on 1.6.0, if my memory serves me well.

Another possible reason is the required image was not exported. If you export your game with the option to remove unused files checked, the default exporting engine does not consider BookMenu inline images (as they are dinamically loaded by the game). There's three ways of working around this issue:

  1. Not marking this option on export.
  2. Enabling this feature, then manually copying inline images to your deployed project.
  3. Running your game in test mode and issuing the $gameSystem.createExportDummy() script cal, which will create a dummy map and dummy event which will ensure all inline images are referenced by an event. Then export your game removing unused files as usual. Check the help file on how to use this command.

Woops, my bad ! It was fixed upon downloading the 1.6.1, I was checking the wrong file xD

Yep, everything is working ! Thanks for the help, and thanks for the awesome plugin you made !!! :D

Where EXACTLY is the bandits' outpost? It's just that the task says that it is located somewhere in the northern part of Walwood (that's just such a location in the game there is only Waldwood, although probably the author of the game forgot to put "d" there) that's just that I found only a goblin camp and a bandit farm in this northern part, but no bandit outpost in this northern part I didn't find any more parts (more precisely, the passages to the following locations) and I only know the outpost of the bandits that is located in the southeast (you know what I mean), but that's just closed and I won't even miss everything in it, only the task from Frida to take a letter from her to those bandits and that's all.

The outpost if the farm in the north ^^ Sorry if it's not clear enough ^^
and yeah, seems like I made a small mistake there, thanks for noticing it ! I'll fix it !

Ok

Hello I'm having an issue getting books I created in the book.json to appear

Now they are there and they work, I call it with Plugin>Read and it shows up, everything looks good. But when I access the menu and select my section I changed imputiom what ever it was, to PlayerHelpBooks and the books I read show up there.

But.... When I open the Category, and soon as I  select the name of the book. It loads the text for a 1/2 second, then disappears with just a background?

And It locks me into that menu. So what am I missing?

I called the book with this Plugin Command.

Inside Event:
"Plugin Command: LibraryData learn book GatheringTools"
"Text Popup: You found an old book about organizing tools more efficiently."
And then Made a Varaible to store each book name. Just to reference it when they collect it "You found \V[113], in this old chest"

And it pops up in the menu, but soon as I select it it disappears.
Using the latest Steam>RPGM MZ

Hello!

I changed a bit of code on version 1.6.1 to prevent this behavior when background images are not correctly set... I tested this a bit, but something may have slipped unnoticed. Are you using version 1.6.1, right?

If yes, can you setup a test project for me with the issue present?
You can send me a download link here, or send me a private message on facebook or the official RM forums.

With that I can check exactly how your parameters are set, reproduce the issue and debug to discover what is going on.

(5 edits)

Sorry it took me so long to respond, yes the issue is still present after updating the plugin. I'll try to setup a test and link it. I'll edit this post in a while.

Edit: Ok this is weird. I made a test project, it works fine.

Does it have to be high/Low in the list? And is it compatible with these plugins. I really need 5 of them.


Ok I found out what was causing this issue, it's the

CGMZ_ToastManager.js it crashed the Boo Menu.
Turning it off, all is ok. So just letting you know. I might have to find a alternative if it's not an easy fix on my end.

Here is the link, in case you need to check something.
https://www.caspergaming.com/plugins/cgmz/toastmanager/


Edit off topic, you do a lot of plugin stuff. How would one go about toggling a custom Menu I made in Hud Maker Ultra?
I mean I know i can just flip a switch, but I want to be able for the player to press [Tab] or [Q] to show hide this menu.

It's all rigged to show when the switch is on, I just bot sure how to toggle it. But thanks, have a great weekend.

Hi there!

Oh boy... I had made a patch for compatibility with CGMZ_ToastManager in previous versions, but I completely forgot to double check that after 1.6.1 changes. I'll take a look after work, it's probably an easy fix.

As for the off topic question... if all you want is to have a key input to toggle the switch, it should be quite simple actually. Just create a new "plugin" with the following code (untested), changing <number> to your switch number:

Input.keyMapper[9] = 'tab';
var alias_sceneMap_updateScene = Scene_Map.prototype.updateScene;
Scene_Map.prototype.updateScene = function(){
   alias_sceneMap_updateScene.call(this);
   if(!SceneManager.isSceneChanging() && Input.isTriggered('tab')){
       $gameSwitches.setValue(<number>, !$gameSwitches.value(<number>));
   }
}

This should work for the map scene. If you need that to work on battle as well we would need to add a bit more of code.

Dude thanks so much. It was driving me nuts trying to get it working.
I am  dumb when it comes to code, but love creating.

(1 edit)

Is it possible to call more than 1? I tried this.

Never Mind, I fixed it lol.

Input.keyMapper[9] = 'tab';

Input.keyMapper[80] = 'p';

var alias_sceneMap_updateScene = Scene_Map.prototype.updateScene;

Scene_Map.prototype.updateScene = function(){

   alias_sceneMap_updateScene.call(this);

   if(!SceneManager.isSceneChanging() && Input.isTriggered('tab')){

       $gameSwitches.setValue(1, !$gameSwitches.value(1));

   }

   if(!SceneManager.isSceneChanging() && Input.isTriggered('p')){

       $gameSwitches.setValue(2, !$gameSwitches.value(2));

   }

}


Just got to figure out how to call a sound, looking up tutorials.

Hello again!

So... can you send me that test project (or at least the plugins.js file)? :|

I'm unable to replicate the error. I have an MZ test project with all my plugins, I added ToastManager there and run some tests, but everything is working fine here. I'm thinking that there may be a specific set of parameters triggering the error...

(1 edit)

Ok, let me try linking it. Slow upload speed.

My project is to big, it'll take forever. I'll try to help the best I can to explain it. It only glitches out while this plugin is active. And it's at it's default settings.

If it's disabled, it works fine, but if it's on the text just disappears. And you get locked in the menu.

I'm going to see if there is a way to compress the game to upload, if I can.

So I just made sure it was updated, bot the Plugin and Core, still does it. Is it possible I'm adding the books to the players library wrong?


Nah, you're using the plugin commands right. You're using MV's commands, but should work fine too. Also, I've seen this behavior you describe on past versions and it would regardless of how many or which books were available for the player. If it is what I think it is, there may be a combination of parameters for BookMenu causing some kind of scenario I didn't foresee (probably related to background image settings).

Can you send me the plugins.js file from your project (it's inside the js folder)? It stores all your plugin parameter settings. With that I can copy all your BookMenu settings into my test project.

Also, run your project, then press F12 (usually, if it doesn't work press F8) to open the console. If there is any error already there, print it and paste it here for me. If there's nohing on console, run this set of commands and send me the output after accessing the book menu, but before selecting any book:

SceneManager._scene._bgStackSize
SceneManager._scene.children

Then select a book and have the error occur. If any errors pop up in the console, send them to me. Also, run the following commands and send the output as well:

SceneManager._scene._bgStackSize
SceneManager._scene.children
SceneManager._scene._textWindow._bookKey

$dataBooks._books["<BOOK KEY>"].customBgMode
$dataBooks._books["<BOOK KEY>"].customBg

For the last two commands, replace <BOOK KEY> with whatever is returned by the third command (the one ending with _bookKey).

I hope that helps me find out what's going on. I tried all the parameter values I thought could cause this, but it's all working on my test project. There may be something else that I'm missing.

A demo would be nice for this... anyway, thank you for your work!

(+1)

Well, there is a demo... just download my sample project: https://taaspider.itch.io/sample-demo-project

Oh, sorry, didn't noticed that. Thank you!