SakeTami
badkittygames
badkittygames

patreon


Welcome to My World

(This blog post was supposed to go up on Thursday but NoMoshing is big dummy dum dum and didn't do it)

Hey everyone, Conash here! With the recent public release of Harem  Collector v0.46, I thought now might be a good opportunity to talk about  the new modding feature we have! Though this is more going to be a,  “How we added it” sorta blog post rather than “How to make them”, for  that information I would advise checking out the mod section of our  forums (found here) or to join our discord via the link under the ‘Follow Us’ section to find advice or ask questions. Now then, on with the show!

To begin with, it’d probably be good to start with what prompted me  to want to get into this. I was already pretty familiar with a lot of  the way that RPG Maker stores it’s data files. Heck, the fact that we  have the lite releases is because there’s only one file that you have to  change to update the game, and we’ve already had a few fans modding  their own games with stuff like Cazador’s oldschool Faceset mod, Romeo and Moonblack’s Cerulean+Wiki tan mod, or Omegon’s Extra Hard Mode mod.  What really got the ball rolling is I was chatting with a good friend  of mine who was thinking of trying their hand at making a mod that would  add in an often requested sex scene of that we aren’t planning to add  in ourselves. I was inspired to give fans the means not only to make  thier own mods but for other players to install them, as a legitimate  option in the game.

Any of you who’ve worked with RPG Maker  probably have a bit of an idea as to how this wasn’t exactly going to be  an easy road, especially those of you who have made scripts in Ruby  before. The original plan that I had wasn’t too hard to implement after I  did some digging, cross referencing the ‘Index’ they include with the  software alongside some scripts we have and a few google searches to  learn a few of the various command options you have with the ‘File’  class, but I found what I needed. You see, RPG Maker has a custom made  ‘Load Data’ function built into it, based off of some pre-existing  functions in Ruby that accomplish something similar. This not only  allows it to read data from it’s specially encrypted data, but  prioritizes it. This is all well and good for standard play, but I need  it so that even when players have an encrypted data set it will sometimes  load non-encrypted data stored elsewhere. Not wanting to really divide  too deep into how the ‘load_data’ function worked, I instead opted to  create a function that would have it so that anytime it tried to load,  say, ‘Data/Map003.rvdata2’ it’d first add ‘Mods/’ to the start of it, so  if it found a file at ‘Mods/Data/Map003.rvdata2’ it’d load that one  instead. This method would work great for Cazador’s mod since that’s  exactly what was needed for a graphical mod, and it’s work fine for  Romeo and Moonblack’s mod as it was basically built to function this  way, but since our game is still in development this function alone  wouldn’t be enough.

See, if we take Omegon’s Extra Hard Mode as an example, that mod  works by changing how the invisible Hard Mode status works, but with  every release of the game we usually add in more status effects so if  the game was set to load his file instead of the in-game file it’d risk  breaking the game for every release after the mod was made. The same  thing would happen for Common Event data, Enemy data, Item data, various  things like that, something with a bit more nuance was needed. Now,  I’ve got a bit of experience not only working with third party scripts  but also making some third party scripts of my own for other games, and  for those of you unaware we generally try to setup our codes to make use  of ‘tags’. ‘Tags’ are various unique text that you add to something  that will create a special interaction with the code we made that way  the game developer doesn’t need to have their own resident Conash to  custom build every little programming thing, so I decided the best way  to go about this was to integrate that into here. This is easy enough  for Items, Enemies, Actors, and most of the databases, the modder in  question will add a ‘<Modded>’ tag into the ‘note’ section (one of  the few times that I will praise Enterbrain for their forward thinking  as that section is a godsend for us third party programmers), I then  setup my code so that when it’s loading in these databases it will check  for a ‘Mods/Data/Enemies/’ folder, create an array of all the files in  there, load them up one by one so long as they have ‘.rvdata2’ in their  name, and check every entry, if it includes the ‘<Modded>’ tag  then it’s to replace the base database, determined by the above  paragraph, then it replaces the base database’s entry with this  ‘<Modded>’ version. I did worry this might cause some slowdown,  but it only runs this once when it starts the game and it should only  cause slow down if you’ve got a lot of mods installed. There was however  a bit of a snag with this problem, see there are three databases which  don’t have a note section. The Animation database, the Troop database,  and the Common Events database. Eventually I settled on a way to add  tags to these anyways, by either including ‘<Modded>’ in the name  of the animation, or by going to the common event/first page of the  Troop in question and making the first line of it be a comment that only  says ‘<Modded>’. Not the prettiest or most intuitive methods but  it functionally accomplishes the same thing. One nice advantage of this  more complex modding method though is that it’s also future proofing  itself a bit, while I worry that some modders may find it cumbersome to  create mods that go into the ‘Mods/Data/CommonEvents/’ folder, this  method allows my code to know what the data is to be used for based on  the folder it’s in while also allowing the modder to name it say  ‘ChimeiTranslated’ or something both so that it doesn’t overwrite their  ‘3DSexScene’ Common event data and so that if they ever want to  uninstall the mod they know exactly what file does what. This method  took me awhile longer to figure out since I had to get all the pieces  moving right, but I am happy with how it came out.

Another little modding issue that came up, Maps. See, because of the  nature of how the data in RPG Maker maps are stored you can’t exactly  just add ‘<Modded>’ and expect it to translate nicely, there’s so  many different types of data stored in Maps that I was left with leaving  them with the more simple modding that I described before, but that  wasn’t exactly going to be satisfactory because several players had  expressed interest in making their own custom maps that weren’t in the  game already. One noteable example of this is HorseHater who’s working  on a custom dungeon where you bring all of the Iron Waifu champions and  get to interact with them, I’ve gotten to see a bit of it and highly  recommend you keep an eye out for it in the forums! Getting back on  track though, there are two major issues that arise with this in that  you’d have to coordinate with others what map data you’d be replacing as  to not make two mods that try to use say Map950 to store their custom  data, but also RPG Maker offloads a lot of the data for all  maps into the ‘MapInfo’ file, which means you’d run into the exact same  issue that Omegon was having if you want your map to be functional. This  is where Map Packs come into play. See, I had this idea where I’d allow  the game to store a string that it’d then use to intercept the process  of grabbing map data, this would allow modders to say edit an existing  map to have a specific script call to load in the name of their map  pack, and then transfer the player to one of the maps in it, and then  give them a way to return to the base game when done. As long as the  player included all the relevant map files and the MapInfo file from  when they made the maps this would all be simple right? Well, the first  problem is setting up a way for players to enter your Map Pack. They  could edit an existing map but that would pose some risks of stepping on  the toes of other modders, needing to update their chosen map if we  change it later, or various other things, so I wanted to have a way to  work into the base game a way to access these Map Packs so that the  modder wouldn’t be required to create their own front-door if  you would. That’s when I remembered the code machine. You see, when you  enter a name into the code machine, with how we have it working it  stores whatever you enter as a string, with that knowledge I set it up  so that if you entered ‘Map Pack’ as a code, it then asks for a second  code, using this it will load the player into Map001 inside the folder  of whatever map pack you entered there! I also set it up so that the  player will be blind, in the event the modder needed to move you  somewhere else or they didn’t like my little back-door entrance so they  wanted to send you back for you to enter some other way.

Everything is good with map packs now right? Not exactly, the next issue would be Self switches. Self switches are used a lot  in RPG Maker, and are a fundamental tool used for controlling event  data to make sure things work properly. See, if I left things at this  stage it would open a lot of potential bugs with self switches. How you  might be asking? Well, even though it looks like self switches are  connected to the events that reference them, they aren’t, at least not  directly. Self Switches are all stored independently in the game data,  the game just stores each switch in a unique location based on the ID of  the map that called for it, the Event it’s associated with, and if it’s  switch A, B, C, or D. The thing with Map Packs is they would allow a  theoretical infinite number of events that are on different maps sharing  the same Map ID and have the same event ID, making it so that if you  got unlucky these map packs could start stepping on either one another’s  toes or worry about conflicts with the base game. The fix to this one  however was easy, I added it in so that if the string where it stores  your Map Pack ID has a string in it, that’s also used to determine where  it stores the Self Switch, now you’d not only need to have the same Map  ID, Event ID, but also the same folder name for the Map Pack, but by  that point one set of MapInfo data is already going to have to overwrite  the other so I think we’re safe at this point. I have also additionally  added in the ability to include ‘Enemy’ data inside Map Packs, this is  so that you can have unique enemies for a custom made dungeon that only  appear inside the map pack. We ran into a few issues with that though,  namely since we used the Yanfly Battle system it turns out that there  was some code there that added in extra enemy data that’s not in a base  file whenever you loaded the game, and this extra data was required  to not crash the game whenever the enemies attacked. The fix to that  issue was to just load in this extra data both when loading in the new  enemy data, and when returning to the old enemy data when the player  returns to the base game. Man, if you ever try to add modding into your  own RPG Maker VX Ace game for some reason, if you hit this point you’ll  probably find that the most important command throughout all of this is  the ‘File.file?’ command to make sure that there’s a file at the  location you’re looking at before you try to load in data that doesn’t exist.

This may all seem fairly comprehensive to all of you, but there was  one last point that I sorta glossed over throughout all of this, script  modding. Script modding is a bit different, see while most files in the ‘Data’ folder are handled by the ‘DataManager’, the ‘DataManger’ itself is apart  of the script data. What actually determines the script data being  loaded is a combination of the .ini file and some of the secret code  Enterbrain doesn’t let us see, heck viewing said secret code would even  break the Terms of Service so I don’t advice any of you go looking for  it either. Still, this leaves me in a bit of a bind because script are a  huge part of how the game runs, and not allowing modding in for them  would close off a large segment of options to modders. For now though,  I’ve managed to get it into the 0.46.4 release so that if you include  either some ‘.rvdata2’ or even a ‘.txt’ file inside the  ‘Mods/Data/Scripts/’ folder that the game will run it both when you  start a new game and when you load an existing game, this won’t be able  to replace any existing script data sadly, as it seems to either hold  that data on a higher level or constantly reads it in again overwriting  any changes you tried to make. I have also talked with Romeo some more,  and I’ve got another addition, ‘Map Scripts’ as I like to call them  which will basically serve the same role only they’ll be loaded in every  time you change to a different screen in RPG Maker (this distinction is  mainly to handle load times while still giving people who like to mess  with this stuff a wide range of options), which will help open a few  more doors, but sadly I’m afraid that at this time I’m unable to add in  the full functionality that script modding would need. I’ll keep looking  for how to add in the few bits of script based functionality that are  missing in, but I wouldn’t hold your breathe since I’ve hit multiple  dead ends on this matter.

But yeah, hope that my rambling didn’t devolve into incoherent  nonsense and that a few of you at least enjoyed listening to me gush  about programming and how I am totally super smart. Either way, I’ll see  you all later (hopefully when I actually get to detailing out what the  Yamamaya redesign entailed >.<).


More Creators