The StatusMenuCore (v 1.1.1)

Discussion in 'JS Plugin Releases (RMMV)' started by JahwsUF, Oct 31, 2015.

  1. JahwsUF

    JahwsUF Veteran Veteran

    Messages:
    65
    Likes Received:
    102
    Location:
    USA
    First Language:
    English
    StatusMenuCore - v1.1.1
    by JahwsUF
     
    (Change in version syntax:  the old v 1.03 was meant as 1.0.3.)
     
    Tired of the plain, vanilla Status menu that came with the game?  Wish you could show more parameters to your game's players, or provide a little lore?  Well, wish no longer, for a solution is here - the StatusMenuCore.  Sit down and buckle up for a moment, 'cause we're in for a ride - this thing's got a lot of content and flexibility.
     
    Want a quick and dirty intro / sales pitch?  Start here!

    [​IMG]
     
     
    As they say, a picture is worth a 1000 words - this is only a part of the power of this plugin.  A few other tastes:
     
     
    [​IMG]
     
     
    Don't worry - that giant picture you saw on the side is optional.  This plugin autodetects a lot of things and restructures its windows accordingly for near-optimal design.
     
     
    [​IMG]
     
     
    Scared you'll need a high-resolution mod for this plugin?  Don't worry; it auto-scales all the output data based on your resolution settings or lack thereof!  However, it does check for limitations.  Too much output on the parameter page causes it to drop the equipment listing.
     
     
    [​IMG]
     
     
    You might have noticed a minor menu at the top with some other options.  How about some character backstory?
     
    Wait, is that a scroll indicator at the bottom?
     
    There's even more flexibility than these four images might indicate - more details are mentioned in the other spoiler section.  The nickname detail is one of those editable options.
     
     
    If you want a detailed guide into the belly of the beast, this path may be the better option.  Seriously though, buckle in and take a deep breath.  There's a lot to explain.
     
     
    OK.  Let's start from the basics and focus on one feature at a time.  The original motivation for this plugin came from the lack of customization on the Status page's parameters.  We all know that there are a lot of parameters behind the scenes... why not show 'em?
     
    [​IMG]
     
     
    You'll note that in this screenshot, I've kept the original 6 parameters, but also listed 8 that were never seen before!  There's even a space in the left column!  With this plugin, you have full control over which parameters are and are not shown to the player... and the power to arrange them in up to 3 columns.  Obviously, 3 columns isn't the best on the game's original resolution.  But before we go down that rabbit hole, how do we set this?
     
     
    [​IMG]
     
    Above you can see a screenshot of me editing the parameter listings that correspond to the image above.  Specify the parameter abbrevation, and the plugin can grab it.  If someone makes additional parameters, this plugin can still grab them provided they are given such an abbreviation.  Not all parameters have in-database text, so you'll need to provide some text, like you see there for "target rate."  Last, the majority of hidden parameters are percent-based.
     
    There are parameters later on that control how many parameters are in each of the three columns.  If the third column has no stats, it never appears, leaving two columns.  Blank entries (as seen above) provide spaces in the parameter page for visual organization.  There's a lot of flexibility provided to customize this page; you just have to tinker with it.
     
    OK.  So back to that thing about "at this resolution."  That was one of the other motivating factors for this plugin - a lot of the built-in menus... don't scale well if you boost the game resolution.  This plugin makes sure that's never a worry on the Status screens.  (Oh gosh, that's plural, and you've probably noticed the top of the previous images... don't worry, we'll get there.)
     
     
    [​IMG]
     
     
    Even if you leave the old parameter settings exactly the same, note how the old status window is arranged - things are spaced out, rather than being all on the left.  This is Good .  And you already saw the earlier images - the much more informative screen looks pretty well balanced, right?  With more screen real estate, we can do a lot more and show more.
     
    OK, so a few tweaks that you've probably noticed compared to the "vanilla" status page.  There's a menu now where the name, nickname, and class used to be.  I had to reclaim that space for the menu, so they got moved down beside the profile image... which triggered some other reorganization.  To save space, by default I've put the name and nickname together on one line and condensed all the EXP information into a single bar.  The one thing you lose with this plugin (in its present form, at least) is access to your total, cumulative EXP totals.  That EXP bar there shows you how much you've progressed to the next level, as well as how much EXP you'll need to do so, but nothing about your sum total EXP.  However, dropping that makes everything else fit.  And I mean everything.  So, I think it's worth it.
     
    Oh yeah!  There's that menu thing up there!  Let's hop to it!
     
    [​IMG]
     
    OK, let's get you a different mug to look at.  Got equipment items that raise or lower a character's defense against the elements?  Let's make that data a little clearer with its own screen!  This screen is auto-generated from your game's database, and you can easily tell it to ignore select elements.  To keep things simple, I've left this page on full-automatic mode otherwise, though you can control how many elements appear per column.  No spacing though.  The elements are listed from top to bottom within the left-most column first, then each column thereafter.  (So, top-to-bottom, then left-to-right.)
     
    Oh, and don't worry, this page scales too.  It's generally the emptiest page of the new Status menu option unless you've got lots of elements to display.  Also, you can set the plugin to drop this page outright if you don't like it, but I think it's a useful resource.
     
    Onto tab #3!
     
    [​IMG]
     
    What's this?  A character with backstory?  In a GAME!?  What do you think this is, mister, an RPG... oh wait.  So yeah!  You may have noticed the removal of the profile text from the parameter screen and that you hadn't seen it until now.  That's because it gets its very own page.  You may also note that the database's profile textbox only gives you two lines to work with... but that's more than two lines up there!
     
    Extended profiles!  And not just that, switchable profiles!  I'm a bit of a madman and went balls-to-the-walls on this thing.  First off, the basic profile extension.  This one's for a different character you'll see in a sec.  Place this in a character's Note box within the database, and it'll link straight into this page.
    <profile>Alec originally mistook her for a spy, having found herwandering in the woods behind his manor. No one knowsfrom where she hails, as her accent and garments areextremely unusual.Despite her history, she is clearly a sweet and compassionate individual. However, she is clueless when it comes to pop culture references and most idioms. She has been quickly improving at thiswith the party's help, however.</profile>In case that's not clear enough, here's a screenie:
     
    [​IMG]
     
     
    Want this to be replaced at a later point?  If some big plot point happens to be tied to a switch, you can use that to have the profile information changed!

    <profile switch: 2>A whole new profile!</profile>When database control switch #2 is toggled on, this profile takes control!  If multiple switches corresponding to profiles are "on", the highest-up profile switch in the Note box wins.  That's the rule.
     
    So, that's a lot of data, right?  Could there possibly be any more?
     
    Oh come on, who am I kidding.  Of course there's more.  The reason I hid the screenshot linked to that profile?  The big reveal:
     
    [​IMG]
     
     
    Want some baller design in your game, and got screenspace to burn?  Why not add a character's portrait?  Doesn't that look so pretty?  I still squee over this screenie from time to time!  Since there's no more reason to show the Actor's face - I mean, we've got a freaking full body shot in view already - let's reclaim some screenspace and get even more compact.  Those old HP/MP bars are technically redundant anyway, though they did use space and provide color splash.  Why not let our portrait be the "splash" instead?
     
    Oh, may I direct your attention to the bottom of that screenie?  Note the arrow... like it wants us to scroll?
     
    [​IMG]
     
     
    Yeah, it does that.  Automatically, and you don't have to lift a finger to enable it.  Besides, you have to lift the finger in getting the text arranged right, and we all know how frustrating that is.
     
    OK, so what all goes into this page?  Before I show the tag data, let me point out that this character design is from the Cover Art Characters Pack - Actor 1_2, in particular.  Bearing that in mind...

    <portrait: Package1_2><portrait anti-buffer: 100><portrait scale: 1.2><portrait offset: 100, 0><profile>Alec originally mistook her for a spy, having found herwandering in the woods behind his manor. No one knowsfrom where she hails, as her accent and garments areextremely unusual.<hr>Despite her history, she is clearly a sweet and compassionate individual. However, she is clueless when it comes to pop culture references and most idioms. She has been quickly improving at thiswith the party's help, however.Despite her usual proclivity to drift, she seemssatisfied having joined the party long-term. Whather reason is, however, is known to her alone.</profile>The portrait is in img/pictures/, with a *.png suffix.  The "anti-buffer" tag reclaims transparency from the image - it's important on other tabs for its effects on automatic layouts, without making you edit the image.  Want a horizontal line in your profile text?  That's the <hr> tag in there.
     
    Lest you think that the character portraits are only used on the profile page, let me point out that such an interpretation is one valid option.  You can leave it as such.  Or, you could leave this default behavior in place:
     
    [​IMG]
     
    (Stifling more squee, stifling more squee...)  As you can clearly see here, the portrait can be enabled on all the Status pages!  The alternate header is permanently attached to use of the portrait, so do keep that in mind if you use this option.  (We don't want those pesky HP and MP bars getting in our pretty Actor's way, now do we?)
     
    If, for some reason, you let any of the pages (Parameters or Resistances, even) grow too long, scrolling will be activated on those pages.  As you can see, the portrait stays in the same position, even as you scroll.  Can't mess up that art, now can we?
     
    Odds + ends:

    • There's a lot of tag data you can use for powerful artistic expression, and a lot of fine-tuned control available to you within the plugin's options. 
       
    • You don't have to put the nickname with the Actor's name everywhere - that's an option. 

      If you drop the nickname, it will appear on the Profile page instead as the first line of the profile - that'll be its only appearance in the Status then. 

      You can also change how the nickname is added to the Actor's name in the options.
       
    • Want to scroll faster?  It's an option.  Want to prevent the header information from scrolling with the rest of each page?  That's an option too.
       
    • Want to remove any of the sub-menu options?  You can do that via the options.  Heck, you can add options as well - though explaining that is better left to another time.  (I've done a ton of design work to make the process as simple as possible.)
       
    • This plugin does not require Yanfly's Core Engine plugin.  That being stated, it will search for it and utilize any relevant selected options from that plugin if you do have it.  Yanfly's Engine is an inspiration, and I wanted to ensure compatibility.
     
    Don't worry - if you get hit by the classic "tl;dr" effect from the above spoiler sections, I've given text documentation for all the parameters within the plugin, as well as a small help section.  It's probably not perfect, but hopefully it's at least a big help. 
     
    If you want to view all the screenshots as an album, here's a link to the Imgur album.  I've already annotated the images in a manner that should line up with the in-depth "spoiler" section above.  It's probably a better way to sift through the images than the restrictions of a forum posting allow, as well.
     
    Downloads and Use:
     
    Sold on it yet, or interested in giving it a spin in your project?  I've attached v1.0 v1.1.1 to this posting, but in case of future changes, check out my Bitbucket repository.  I've put the code there for safekeeping.  On that site, for some reason they like labeling the download button as "Raw."  Probably some weird developer thing.
     
    Commercial use?  Personal use?  Check and check.  I made this because I wanted to and I know it'd be a huge help.  Credit would be highly appreciated, but it's totally free for use.  I'm not a very legal person, so let's just go with that MIT free-use license thing if you want to get super-formal and have lawyers pushing you to get everything checked out.  If you've read this whole thing, I'm sure my casual tone's been oozing through all the text, so you can probably see that I'm nice and laid back.  All this being said, don't claim credit for the plugin itself.  I made this, and even if it gets edited, acknowledgement of the original authoring and base for whatever comes is only proper.
     
    Uh, and to go with that license mentioned... © 2015 JahwsUF.  Assume the standard text of the license's term applies for any legal matters.  (Note that the copyright + author name is a part of said license.)
     
    Credit and Thanks:
    • A big thanks to Yanfly for their Core Engine and other plugins.  Studying that and its interactions with the main game scripts really helped me to learn everything necessary to write this plugin, as well as attain a proper understanding of Javascript.  (I'm much more accustomed to Java and C++ - I'm a programmer / programming instructor IRL.)  There's also the "minor" matter of working in high-resolution for many of the images above, and the ability to switch back and forth.  Totally enabled by that Core Engine of his.  This plugin wouldn't have been nearly as versatile or stable without the testing abilities provided by that thing.
       
    • I'd also like to thank ksart for her original question about using actor portraits.  I knew I needed to do something with the profile page, and while it wasn't immediate, that gave me the inspiration to incorporate this beautiful feature into this plugin.  It really sells it and makes it shine, and I doubt it'd have come across as well without the interest.  Remembering the question also gave me the motivation to allow the portrait to be used on all pages at the end, rather than just the profile page where I'd have originally left it.  And the results look amazing.
       
    • Thanks also to RetroNutcase for their inquiries into updating profiles and scrolling profiles.  While I did have interest in the updating profile problem, this helped increase my motivation into solving the problem.  However, I had originally been completely against the idea of scrolling.  That question changed my mind, and it turns out to have been a lot less crazy than I thought.  Thank you for the suggestion, dude(tte?).
       
    • Thanks to wrigty12 for pointing out a compatibility issue with DMV's Param Distribution plugin.  I hadn't thought about other plugins wanting to directly refresh the parameter page, and it turned out to be a simple fix + hotwiring on my end to enable this.  It may affect efficiency/optimization a bit, but I can confirm that there is no longer any conflict with that plugin as of v1.01.  Additional thanks for the "Resistance Classification" idea that was added in v1.02; it definitely adds more substance to what I felt was the weakest page.
       
    • Thanks to laaghisce for the hours and conversations that led to tracking down a huge bug with the tiniest of sources.  Developers, always initialize your variables.  I missed one.
       
    • Thanks to Yami-chan for working with me and/or putting up with me in determining a fix for one of the critical components necessary for word-wrap compatibility.  I'm not sure if it's updated in her plugins as of yet, but I've managed to attain word-wrapping compatibility with both her plugin and Yanfly's Message Core word wrapping when a hotfix is applied for each.  I've notified each of the relevant code, though it may not be incorporated into their plugins at this time.  Check the User FAQ for hotfix details in the meantime.
    Changelog

    • v 1.1.1  (Nov 21st, 2015)

      After starting work on the advanced portrait options, it turns out I accidentally left a major bug or two in Actor portrait support.  The "anti-buffer" settings were completely bugged; that's now remedied.  Also, actor portraits' offset settings now change internal page boundaries as they always should have; this should make the "anti-buffer" a lot less necessary than before when working with Portraits.

      Secondly, it turns out that advanced portrait support wasn't necessarily going to be as crazy complicated as I once thought; I figured out a way to reuse certain parameters as defaults for portraits that remain adjustable.  This functionality is included in this version of the plugin now, rather than as an extension.  The tag structure?

      <portrait "filename" switch: s scale: z offset: x, y antibuffer: b> Note that the quotes around the filename are required for this version of the portrait tag, and that the filename must come immediately after portrait as well.  Past that, switch is required and the others are optional.  switch = 0 will redefine the default portrait, should you want its settings to not follow the global default settings.

      Examples:

      Code:
      <portrait "Package1_2" switch: 0 scale: 1.2 offset: 100, 0 antibuffer: 0> 
      The above tag would specify the portrait as seen in the image below, without using any default global scale, offset or anti-buffer settings.

      [​IMG]

      Alternatively...

      Code:
      <portrait "Package1_2" switch:0><portrait anti-buffer: 0><portrait scale: 1.2><portrait offset: 100, 0>
      In this case, the anti-buffer, scale, and offset are set by the individual tags since they weren't set directly on the portrait-switch tag itself.
      Please note that to accommodate the new functionality, I've restructured how portraits are stored and retrieved internally within the plugin's code.  There's a custom object that stores all portrait data together in one clump now, rather than four or so separate methods for the different components; this should be more convenient for use in the long run.  Apologies if this breaks any custom modifications you may have made; if it's an issue, shoot me a message and I should be able to point you in the right direction very quickly.
       
    • v 1.1.0  (Nov 21st, 2015)

      (version syntax change implemented here)

      I've finally caught up on some of my to-do lists for this plugin, which means some nice goodies for everyone!

      Special news! 

      I've made the first plugin extension for the StatusMenuCore.  You can use this "Bonus Page" plugin as a second Parameters page - it has the same level of customization as the new version of the original.  (More on that below.)  You can use this to have full control of all resistances on a unified page, or to split up parameters and resistances into whatever haphazard patterns your heart may desire.  Combine them any way you want; up to 48 parameters or resistances can be set within the options.

      Please note that the extension's bonus page goes by the name of "JAH_Window_Status_ParamsBonus" - you'll need that for the "Page # Window" option to insert it within the StatusMenuCore's options so that it actually appears.

      I've tried to write the StatusMenu_BonusPage plugin in a way that will require as little editing as possible should you want to make extra copies in order to have three or four fully customizable pages of this sort.  Please read the plugin's help and documentation for details - there are a few key edits that will unfortunately be required.

      The changelog:

      Biggest change first:  resistances can now be fully integrated in the Parameters page!  See the spoiler below for more details.

      If you insert "elementRate(1)" as a "parameter symbol" within the plugin, the Parameter page can show that element's resistance data!  (Here, element 1, usually "Fire".)  The new thing - if you leave "Parameter # as %" blank, it will fully default to the standard elemental settings, allowing use of categorization and color on the Parameter page for resistances!

      You can also do this with "stateRate(4)", which would then display your fourth state's resistance data.  (Here, element 4 - usually "Poison".)  States now have settings just like elements for resistances.

      To see how I implement the settings, check out this screenshot:

      [​IMG]

      Given that, now for the parameter page!

      [​IMG]

      Yep!  The resistance categorization features are now fully integrated with the Parameter page if you want that sort of thing!
      The second-biggest change - there's a brand new "State Resistances" page available for you to use!

      [​IMG]
      This one is automatically managed in the same manner as the old Elemental Resistances page to which many of you may be accustomed.  It has its own version of the same settings, too; they can be customized independently, aside from one detail - the resistance categorization definitions are shared for both, to promote consistency and cut down on plugin options.

      Other changes?

      A new tag - this is a simple version of portrait switching that functions identically to the "profile switch" feature, but for portraits.  Note that the other settings of the portrait cannot be customized at this time, so you'll want to use pretty similar images for now.  (A much improved and less problematic version was implemented in 1.1.1, so use that instead.)

      Due to unexpected demand, I've added an option to remove the EXP bar from the Status windows entirely.  Independently, you can also remove the "Level #" information.  Should you remove both, the plugin will reclaim that space (a single line) from each page's header.
       
    • v 1.03  (retroactively labeled 1.0.3)

      Restructured the internal workings of the Profile page; word-wrapping operations will no longer be broken by this plugin while still preserving a well-defined boundary that doesn't overlap portraits.  Note that any such plugin not supporting a proper custom Window_Base.prototype.calcTextHeight will not be compatible with scrolling, however.

      That being stated, I've identified hotfixes for two known popular word-wrapping plugins, which will be listed for now in the User FAQ as they belong with their respective plugins, not within this plugin.
       
    • v 1.02

      Fixed a few problem bugs that escaped my Q&A - thanks again to laaghisce for helping me find the root of the issue.

      The TP bar is back as an option for the non-portrait header for those who want it.  (I've set it to detect Yanfly's setting by default, if available, though it can be manually set.)  You can also choose to add a line break after it (or not) for aesthetics, which will stretch the header if you do so.

      New feature:  Resistance classifications!  See below for more info!

      New options have been added for the Resistances tab - you can have the resistance levels classified via color and/or text category to get the point across to your players more quickly!  Both can be disabled by a single plugin option a piece.

      [​IMG]

      Hmm, I seem to have slipped up on the text there.  (That purple-ish "Weak" should be a "Resist.")

      Or, for those who like percents:

      [​IMG]

      In selecting your custom colors for Resistance classification, you can use a system color ID - one of the 32 colors defined in the bottom-right of /img/system/Window.png - or you can directly specify a color in hexadecimal notation.  Both #000000 and 0x000000 formats are supported.

      Hmm... I'm starting to wonder if I should center up the Resistance names when using text categories.

      Also, the implementation of this feature is rather quick-n-dirty at the moment.  Things are done reasonably well, but I didn't provide much of any avenue to facilitate plugin extensions for this feature.  I'm aware that elemental reflection and absorption plugins exist, but they usually seem to operate in manners this plugin cannot detect by default; I'd like to allow avenues to more easily integrate those behaviors into this page for their developers if desired.  (At the very least, it'd take less hotwiring on anyone's part after I restructure the design a bit.)  I'll work on this in the meantime and get it up with the next update, most likely.

      Anyway, happy customizing!
       
    • v 1.01:  Fixed known compatibility issue with plugins that need to directly refresh the parameters of the Status screen.
    Notes

    Coming soon to a plugin near you:

    I've been putting in some work since 1.1.1, as I realized a few things that are going to necessitate a v 2.0.0.  To make it worth this change, I've figured out a few new features that'll be coming soon.  Rather than speak straight off about it, check out the images in the spoiler.

    [​IMG]

    Leave it to me to find a way to make things even fancier.  With resistances merging into the parameter page, it was bothering me that there was no way to provide a text header for sets of parameters.  Well, I thought through things and found a reasonable enough solution... and not just that.  When a row has a blank in one of its columns, the page can be set to reclaim that space and recenter entries in that row, leading to the two-column appearance of the bottom parameter set.  (Those are columns 1 + 2 recentered, as column 3 is empty on those rows.)

    An example with the bonus page:

    [​IMG]

    Same kind of visual impact + effect here.  Worth note; I've made integrating the Bonus Pages into the core plugin a lot easier than in 1.1.  It should be possible to import a single version of the plugin multiple times to create multiple pages now!  (I'm going to test this next.)  Just be sure that the first bonus page has ID 1, the second ID 2, etc.
    I'm reserving the next two posts - one to add a standard FAQ, 'cause goodness knows that this post has gone on long enough, and one to add a developer guide/FAQ.  You'll note the name is StatusMenuCore, and I've written and designed this with the intent to facilitate others in developing their own extensions and modifications if they so desire.
     


     
    A minor note about the files below:
     
    "JAH_StatusMenuCore.zip" is version 1.0.3.  I'm leaving it there partly because I like the current download count, but also just in case there are any unforeseen compatibility issues.  I know 1.0.3 is very stable, and there's little harm leaving it here for now.
     
    The newest version is listed below as JAH_StatusMenuCore v 1.1.1.zip.JAH_StatusMenuCore.zip

    JAH_StatusMenu_BonusPage v 1.0.0.zip

    JAH_StatusMenuCore v 1.1.1.zip
     

    Attached Files:

    Last edited by a moderator: Nov 24, 2015
    #1
  2. JahwsUF

    JahwsUF Veteran Veteran

    Messages:
    65
    Likes Received:
    102
    Location:
    USA
    First Language:
    English
    Standard user FAQ

    • Does this plugin work with Yanfly's Equipment Core?  Are duplicate slots shown with their equipment?

      I haven't ultra-thoroughly tested, but I easily got a character to show their two identical rings on the parameter page.  This plugin should has no known compatibility issues with that mod.

       
    • I want to get rid of some of the tabs and just use the Parameter page.  Is that possible?

      Absolutely; while you can't get rid of the small Menu-like window at the top, you can easily throw the other two pages away if you'd prefer.  Fernyfer555 made a small post about it below that's worth checking out.

      The short of it?  If you remove either entry for a "Page" in those options, the menu option immediately disappears from your game.

       
    • Hey, where'd the equipment list go?  I asked the plugin to show it, but it's not visible!

      Make sure that your window has enough space to show everything.  The pages automatically hide the equipment column if there's not enough space to show it.  (That space includes a bit of visual padding to prevent a super-cluttered look - I went through a lot of pains to promote good aesthetics.)
       
      You can adjust how big each column looks with these settings:
       
      [​IMG]
       
      Column Text Width = the width allotted to each parameter's name.
      Column Value Width = the space allotted to the values.
       
      Shortly below these, there's also "Equip Column Width", which is pretty high by default in case you like long item names.  Definitely shrink that to taste as well.
       
      Changing these values to something smaller will give the page more space to work with.  Also, the parameter page can scroll if you need it to do so.  Past that, you may want a higher resolution setting, or something that globally shrinks the system's font size so that you need less width.

       
    • Does this plugin work with other plugins that use custom stats?

      Actually, yes.  I designed this plugin with the future in mind, and one of my original plans was to develop a plugin that provided additional parameters for use.  I picked StatusMenuCore first to ensure they'd be visible, you see.

      As it turns out, Bobstah has written that other plugin (Bobstah's Custom Stats) and provided for entirely new parameters to exist within the system - and they get abbreviations.  As a result, my plugin works perfectly with his - he's got a post later on in this topic showcasing this directly.

       
    • Does the profile text utilize escape codes?

      The only code it uses at present is <hr> for horizontal lines; that was admittedly a relative late "throw it in" idea I had.  For future releases, I'm wiling to look at additional escape codes to support; as long as they don't make things too crazy to code and implement in the page, it should be possible to add more codes.

       
    • I want to use a plugin that adds elements to the Status screen.  How should I do that?

      As my mod straight-up replaces the Status scene and all of its windows, you should import any such plugin after StatusMenuCore.

      (A great example of this would be DMV's Param Distribution plugin.)

       
    • Does this plugin have any dependencies or requirements?

      No.  This plugin doesn't rely upon a single other plugin.  It will self-adapt to Yanfly's Core Engine if you have that installed, though.
       
    • Can I put elemental or state resistances on the parameters page?

      Actually, it is possible to do.  Rather than using a three-letter symbol, place the following in the symbol spot:

      elementRate(elementID)where elementID = 1 for Fire (by default), etc.

      Similarly, you can use

      stateRate(stateID)where stateID = 4 for Poison (by default), etc.

      As of v 1.1.0, these will also be affected by their respective Resistance page settings, depending on your use of the options.
       
    Known Issues and Incompatibilities

    • (FixedThis plugin is presently known to be incompatible with the DMV stat-distribution plugin.
       
    • (Requires Hotfix)  Yami's Word Wrap plugin.

      In order for the profile page to properly detect scrolling height, you'll need to add the following code to her plugin.

      At the top of the plugin, immediately after the top comment and before the (function() { line...

      Code:
      var Yami = Yami || {};  // We need a namespace object for storage.
      Later on, within the main body of the plugin (within the outer function block):

      Code:
      	Yami.Window_Base_calcTextHeight = Window_Base.prototype.calcTextHeight;		// Prototype!	Window_Base.prototype.calcTextHeight = function(textState, all) {		var state = JSON.parse(JSON.stringify(textState));  // Clones the text state.  Yay, references.		var text = state.text;				var origIndex = state.index;				var wrapState = this._yamiWordWrap;				var fontSize = this.contents.fontSize;		var breakState = this._breakWord;				if(!wrapState)			return Yami.Window_Base_calcTextHeight.call(this, textState, all);				var adjustments = 0;				var maxFontSize = fontSize;		while (state.index < state.text.length) {			if(state.text.charAt(state.index) == '\n')			{				state.x = state.left;				state.y += maxFontSize + 8;				maxFontSize = this.contents.fontSize;				state.index++;								if(!all)				{					state.text = text;					state.index = origIndex;					state.x = state.left;										this.contents.fontSize = fontSize;										return Yami.Window_Base_calcTextHeight.call(this, state, false);				}			}			else if(state.text.charAt(state.index) == '\f')			{				state.index++;								if(!all)				{					state.text = text;					state.index = origIndex;					state.x = state.left;										this.contents.fontSize = fontSize;										return Yami.Window_Base_calcTextHeight.call(this, state, false);				}			}			else if (state.text.charAt(state.index) === '\x1b') {				state.index++;				if(state.text.charAt(state.index) == '{')				{                    this.makeFontBigger();										if(maxFontSize < this.contents.fontsize)						maxFontSize = this.contents.fontsize;				}				else if (state.text.charAt(state.index) === '}') {						this.makeFontSmaller();				}								state.index++;			}			else			{				if (this.needWrap(state)) {					text = text.slice(0, state.index + (breakState ? 1 : 0) + adjustments) + "\n" + text.slice(state.index + 1 + adjustments);					state.x = state.left;					state.y += maxFontSize + 8;										maxFontSize = this.contents.fontSize;										if(!all)					{						state.text = text;						state.index = origIndex;						//state.x = state.left;												this.contents.fontSize = fontSize;											return Yami.Window_Base_calcTextHeight.call(this, state, false);					}										if(breakState)						adjustments++;  // Due to printing every character.				}				else					state.x += this.textWidth(state.text[state.index]);  // Spaces.									state.index++;			}		}		state.text = text;		state.index = origIndex;		state.x = state.left;				this.contents.fontSize = fontSize;		return Yami.Window_Base_calcTextHeight.call(this, state, true);    };
       
    • (Requires Hotfix)  Yanfly's Message Core (word-wrapping functionality)

      In order for the profile page to properly detect scrolling height, you'll need to add the following code to the Message Core plugin:

      Code:
      Yanfly.Message.Window_Base_calcTextHeight = Window_Base.prototype.calcTextHeight;Window_Base.prototype.calcTextHeight = function(textState, all) {		var state = JSON.parse(JSON.stringify(textState));  // Clones the text state.  Yay, references.		var text = state.text;				var origIndex = state.index;				var wrapState = this._wordWrap;				var fontSize = this.contents.fontSize;				if(!wrapState)			return Yanfly.Message.Window_Base_calcTextHeight.call(this, textState, all);				var maxFontSize = fontSize;		while (state.index < state.text.length) {			if(state.text.charAt(state.index) == '\n')			{				state.x = state.left;				state.y += maxFontSize + 8;				maxFontSize = this.contents.fontSize;				state.index++;								if(!all)				{					state.text = text;					state.index = origIndex;					state.x = state.left;										this.contents.fontSize = fontSize;										return Yanfly.Message.Window_Base_calcTextHeight.call(this, state, false);				}			}			else if(state.text.charAt(state.index) == '\f')			{				state.index++;								if(!all)				{					state.text = text;					state.index = origIndex;					state.x = state.left;										this.contents.fontSize = fontSize;										return Yanfly.Message.Window_Base_calcTextHeight.call(this, state, false);				}			}			else if (state.text.charAt(state.index) === '\x1b') {				state.index++;				if(state.text.charAt(state.index) == '{')				{                    this.makeFontBigger();										if(maxFontSize < this.contents.fontsize)						maxFontSize = this.contents.fontsize;				}				else if (state.text.charAt(state.index) === '}') {						this.makeFontSmaller();				}								state.index++;			}			else			{				if (this.checkWordWrap(state)) {					text = text.slice(0, state.index) + "\n" + text.slice(state.index + 1);					state.x = state.left;					state.y += maxFontSize + 8;										maxFontSize = this.contents.fontSize;										if(!all)					{						state.text = text;						state.index = origIndex;						//state.x = state.left;												this.contents.fontSize = fontSize;											return Yanfly.Message.Window_Base_calcTextHeight.call(this, state, false);					}				}				else					state.x += this.textWidth(state.text[state.index]);  // Spaces.									state.index++;			}		}		state.text = text;		state.index = origIndex;		state.x = state.left;				this.contents.fontSize = fontSize;		return Yanfly.Message.Window_Base_calcTextHeight.call(this, state, true);    };
     
    Last edited by a moderator: Nov 22, 2015
    #2
    Cvrtis and SpacemanFive like this.
  3. JahwsUF

    JahwsUF Veteran Veteran

    Messages:
    65
    Likes Received:
    102
    Location:
    USA
    First Language:
    English
    Developer Guide

    OK, so I did quite a few things to make this work.  First and foremost, before proceeding - it is ideal that you have a good understanding of object-oriented development.  This code uses inheritance and abuses the way that it works in Javascript.

    The core class for subwindows:  JAH_Window_Status_Base

    This class is the base of all Status windows that this plugin will recognize.  Should you desire to implement a new Window, derive a new class from this one.  It's got a ton of pre-built methods to help you out, and reliance upon them will save you time and effort.

    The core method you care about:  JAH_Window_Status_Base.prototype.drawPageBlock.  Override this to draw all the data, text, etc that you desire as content for your custom page.  The header and portrait are taken care of for you automatically.  If you want to permanently block the portrait, or enable it permanently, you'll need to override JAH_Window_Status_Base.prototype.isPortraitMode.

    If you want scrolling support, be sure to override the JAH_Window_Status_Base.prototype.getLineCount method as appropriate.  If set to the # of lines, it'll handle the header scrolling for you as appropriate and provide the line offset for your first line as a parameter to drawPageBlock.  Line 0 means you should draw the first line, while lineIndex -1 means that your line #2 should be the first line.  (Sometimes named instead as lineOffset.)

    If you don't want any scrolling on your own custom subwindows, simply don't override the JAH_Window_Status_Base.prototype.getLineCount method.  Oh, and ignore that lineIndex variable, since it'll always be the same value then.

    Past that, know that this._actor refers to the present actor.  This base class will automatically update the actor being referenced for you if the player changes that while the window is up, which should require zero additional effort on your part.
    Portrait manipulation

    If you want to extend the portrait functionality of this plugin, there's a very critical method that you could write a plugin to replace:  JAH_Window_Status_Base.prototype.getActorPortraitName.  The plugin uses that function to determine what picture to load.  By the way, as this is Javascript, you can literally replace the method itself in a plugin, allowing your changes to affect all of StatusMenuCore.

    Additional methods of interest:

    • JAH_Window_Status_Base.prototype.getActorPortraitScale if the scale might change from portrait to portrait.
    • JAH_Window_Status_Base.prototype.getActorPortraitOffsets if the offset should be portrait-dependent.
    • JAH_Window_Status_Base.prototype.getActorPortraitBorderAdjustment if the transparency border adjustment needs tweaking specific to each portrait.
    Remember, since this is Javascript, you can literally replace these functions with new ones to allow for increased portrait functionality.

    Profile manipulation



    This one is possibly the simplest of them all to manage.  You have exactly one method to worry about:  JAH_Window_Status_Profile.prototype.getExtendedActorProfile.  If you configure this with an alternate profile-changing strategy and replace the function within the original class appropriately, the changes should take full effect within the original Profile subwindow without issue.



    Other odds and ends

    While it's always possible that I've overlooked something, literally anything else I could think of is automatically managed by other aspects of the plugin.  Know that this plugin does overwrite the original Scene_Status class, throwing it out the window, so do keep this in mind if you were using that class in something else or trying to connect with it.

    All control within the Status submenu is handled by the menu itself - JAH_Window_Status_PageSelect.  Scrolling commands and Actor change commands (page up, page down) are delegated from this window manually on my part of the code.  The design is such that you'll have great difficulty transferring general control within a page/subwindow.

    Loading the windows is done by eval, allowing the plugin to configure the menu itself.

    Admittedly, I haven't done heavy optimization work, so if you find ways to improve the performance, let me know!  Also, I haven't done any direct testing on mobile, though I did lookup whether or not many functions I used were at least available on mobile.

    FAQ

    • OK, so how does that Status sub-menu thing work?  I want to add a special, non-page related option to it, but I'm getting errors.

      I gave a fairly thorough run-down to someone experiencing this problem in this post, after the initial update text.  (Yay, ninja edits!)  I'll put a simplified version of that below in a spoiler.

      The gist of it - the Status screen has its own sub-menu in the JAH_Window_Status_PageSelect class. 

      To simplify its operations, I pulled an interesting little trick.  You see, in designing the class, I made a simple assumption - that all the "commands" added to the window's menu would actually be windows.  The system doesn't actually check whether or not they're strings when added through that method - it's all in how they're interpreted upon receipt.

      The sub-menu retrieves the relevant information later on in its update function.  On an update, it guesses that a different page has probably been selected, looks up what Window it needs to show, and then immediately shows it.  But, if you add a command that isn't a window, this will immediately crash.

      The solution?  Add some code into that method (or replace it, if doing a power plugin extension) that checks for your commands first, intercepts them, and then allows the regular ol' pages to be updated if it's a page selection instead.
       
     
    Last edited by a moderator: Nov 1, 2015
    #3
    Cvrtis and SpacemanFive like this.
  4. jonthefox

    jonthefox Veteran Veteran

    Messages:
    1,290
    Likes Received:
    450
    Location:
    NYC
    Oh my god.  You sir are a gentleman and a scholar.  Let the customization begin!
     
    #4
  5. ksart

    ksart Artist Veteran

    Messages:
    152
    Likes Received:
    185
    First Language:
    English
    Primarily Uses:
    N/A
    This ended up so beautiful! I can't wait to start using it. :)
     
    #5
  6. djDarkX

    djDarkX Retro & Remastered Music Guru Veteran

    Messages:
    2,699
    Likes Received:
    1,887
    Location:
    Currently unsure...
    First Language:
    Music
    Primarily Uses:
    RMMV
    Okay then, quick question.  Will the equipment shown also show the other slots created by Yanfly's Equip Core?
     
    #6
  7. wrigty12

    wrigty12 Veteran Veteran

    Messages:
    533
    Likes Received:
    76
    First Language:
    English
    I really want to use this plugin! It looks amazing!!

    However, there is one conflict with another plugin I have found.

    I am using DMV Param Distribute (Link Here). It displays a small window over the status window that allows you to add points to parameters, upgrading them as sorts. However, when I go to add a point to a parameter, it gives me a "TypeError: Cannot read property 'refresh' of undefined". According to the console, the errors are appearing in the DMV script at 688:40 and 660:14. I have a feeling your plugin doesn't allow for the parameters to refresh in the status window?

    If you can fix this compatibility in your script, that would be amazing :D
     
    #7
  8. JahwsUF

    JahwsUF Veteran Veteran

    Messages:
    65
    Likes Received:
    102
    Location:
    USA
    First Language:
    English
    While I haven't done super-thorough testing, I've easily had a character equipped with two identical rings show those two identical rings on the status page.

    The equipment listing is accessed in such a way that it should automatically tie into other plugins, so until found otherwise, it should be supported automatically.
     
    #8
    djDarkX likes this.
  9. djDarkX

    djDarkX Retro & Remastered Music Guru Veteran

    Messages:
    2,699
    Likes Received:
    1,887
    Location:
    Currently unsure...
    First Language:
    Music
    Primarily Uses:
    RMMV
    Sold.  I'll be grabbing this and checking it now.  Thanks for this rather nice plugin!
     
    #9
  10. JahwsUF

    JahwsUF Veteran Veteran

    Messages:
    65
    Likes Received:
    102
    Location:
    USA
    First Language:
    English
    OK, I think I see where the heart of the problem lies, at least based on where you've stated the errors are.

    Before proceeding - you were able to toggle that "Distribute" open and make a selection before it crashed, correct?  If so, it surprises me, but I think it's fixable!  It'll take a fair bit of manual re-routing on my end to accomplish, but nothing too crazy.
     
    #10
    wrigty12 likes this.
  11. White Dragon

    White Dragon Villager Member

    Messages:
    10
    Likes Received:
    1
    Location:
    Germany
    First Language:
    German
    That's exactly what I was looking for, thank you very much!
     
    #11
  12. Fernyfer775

    Fernyfer775 Veteran Veteran

    Messages:
    1,297
    Likes Received:
    798
    First Language:
    English
    *Wipes tear from eye* This is beautiful...
     
    #12
  13. Prescott

    Prescott argggghhh Veteran

    Messages:
    445
    Likes Received:
    288
    Location:
    USA
    First Language:
    English
    Primarily Uses:
    RMMV
    How can I get rid of the Resistances and Profile tabs and just have the stats one be slightly taller.

    I know that sort of defeats the purpose but I really like the way this looks, and I don't need the other two for the way our game is going.

    Sorry if it's too much work, but it would be much appreciated :)
     
    #13
  14. wrigty12

    wrigty12 Veteran Veteran

    Messages:
    533
    Likes Received:
    76
    First Language:
    English
    Yes, I was able to open the tab. Once I clicked on an arrow to increase/decrease the value, THAT is when the error popped up.
     
    #14
  15. Fernyfer775

    Fernyfer775 Veteran Veteran

    Messages:
    1,297
    Likes Received:
    798
    First Language:
    English
    @ReddElite:

    To remove resistance and profile tabs, you just delete those parts in the settings.

    If you only want one page, then delete the stuff under page 2 name/page 2 window, etc.

    lookeee.png

    To alter the height and whatnot of the stats you do want to show, change those settings here:

    lookie.png
     
    #15
    blakwhiteknight and Prescott like this.
  16. DavidFoxfire

    DavidFoxfire Veteran Veteran

    Messages:
    224
    Likes Received:
    44
    Location:
    St. Louis, MO
    This plug-in really fills a need.  One Question:  Can you put excape codes in the Profile text, or is it just plain vanilla?
     
    #16
  17. Gabihime

    Gabihime Villager Member

    Messages:
    15
    Likes Received:
    7
    First Language:
    English
    Very much looking forward to using this, particularly with the chance to use the full portraits and the lore. Thanks so much for providing so much customization. It's exactly what I was hoping for in a status menu.
     
    #17
  18. Helyx

    Helyx Villager Member

    Messages:
    20
    Likes Received:
    2
    First Language:
    French
    #18
  19. Iliketea

    Iliketea Tea lover Veteran

    Messages:
    848
    Likes Received:
    932
    Location:
    Germany
    First Language:
    German
    Please let me proclaim my absolute and undying love for you and this gorgeous, genius and absolutly great plugin!
     
    #19
  20. JahwsUF

    JahwsUF Veteran Veteran

    Messages:
    65
    Likes Received:
    102
    Location:
    USA
    First Language:
    English
    The only escape code at present is <hr>.  I'm totally willing to add more, as long as they're not too crazy to implement.  They kind of require deliberate processing on my end in the Profile page code, you see.  Let me know what you'd like and I'll see if it's reasonable to implement.
     
    #20

Share This Page