Aja’s Guide to compiling the VLDCs
In this guide I’ll explain what I did to compile VLDC1 in a single ROM, including every step and the obstacles I found as well as the mistakes I made. The point of this is to help you to organize everything to avoid messing everything up if you want to compile another VLDC, or if you need to compile unrelated levels in a single ROM.
Before we get started though, you need to know, compiling over 50 levels requires a lot of patience, time and testing, so if you think you will give up halfway don’t even get started.
1. Play the levels
The first thing I did was getting all the entries from this thread
. At first, there were 3 missing levels; K.T.B. found two of them later but the other one was lost in history. As a small note, that thread probably won’t help you unless you are compiling VLDC3 because it’s the only VLDC hosted there aside from 1. For other VLDCs you can download all the entries here
. That aside, I patched every patch into a clean ROM and put all the patched ROMs into the same folder, separated from the patches, this was so I could access them more easily. If you’re using FLIPS, you can place your clean ROM in the same folder where you will put all the patched ROMs, the process is faster this way.
Once all the ROMs where patched, I played all the levels. I did this before complicating anything so I would get familiar with the levels and if I messed something up (and I did because I’m a human, and so you will), I’d notice more easily. While I was playing the levels, I was also keeping a log of everything, and each time I beat one I noted in a txt file the following:
IPS Name | In-game level name | Author | Score | Theme | # of exits
For example, the first level I played was “Dark Core” by Kphoenix (because it was the first one alphabetically), so when I logged it, it looked like this:
1LVLv0.5 | Dark Core | KPhoenix | 82/100 | Cave/Dark/Water | 1
The ROM name and in game name where to determine the final level of the level in the compilation. The purpose of logging the author’s name is self-explanatory. The score was so I could rank the entries and decide which levels should go in the best or worst worlds. The theme was so I could chose the submap themes depending on which environments were the most presents. The number of exists was just so I could know if I had to use a yellow or red tile in the overworld and to know the total number of exits in the hack.
This was just the initial log though; I made several changes in the structure later. In the end that log became the level credits file. I removed the IPS name and in game names and instead I used the final level name. I also added a field which detailed if the level had Yoshi Coins or not, and I separated the levels by worlds. The final file looked like this:
Name | Author | Score | #Exits | Cointains YC?
So for Dark Core, the final log said:
Dark Core | KPhoenix | 82/100 | 1 | No
In retrospect, it was unnecessary to log the IPS and in-game names, especially because a lot of in-game names were “Yoshi’s Island 1”. It would have been better to determine the final level name based on those two and this post
2. Extract everything
Once I played all the levels, I opened them all the ROMs in Lunar Magic and, one by one extracted every level, sublevel, map16 page, EXGFX, palette (for levels that edited the palette but didn’t use the custom palette option) and wrote down the message boxes texts in a txt file. Some entries were locked, so I had to use Recover Lunar Magic
to unlock them first.
To make everything easier I named every file using this format: I first gave it a number which represented the ROM I got it from, (the first ROM I opened would get a 01, the second one a 02 and so on), then a dash and another number which represented the level/message box/etc. number. For example: KPhoenix used levels 105, CB and FF, one map16 page and two message boxes (he didn’t actually use them, but the text was there so I extracted it); he also edited the palettes but didn’t use a custom palette so I had to extract it too. The files I extracted from that ROM were:
01.map16 (map16 page)
01-1.txt (first message box text)
01-2.txt (second message box text)
01-105.mwl (level 105)
01-105.pal (palette from level 105)
01-CB.mwl (level CB)
01-FF.mwl (level FF)
Since levels FF and CB used the same palette as 105 I didn’t extract it. Also, I didn’t log the map16 page numbers. If a level used more than one map16 page I’d just add a -2 next to it, then -3 and so on. This is what the folder looked like:
As you can see, this naming system was very helpful since it kept everything together. I didn’t include the ExGFX file in this list, instead I put them directly into the hack’s ExGFX folder, but this only caused a lot of confusions when I actually inserted the levels.
Speaking of ExGFX, take in mind that not all the entries with custom graphics use them. Some entries might have edited the original GFX file, so it’s important that you check the in-level graphics with the 8x8 tile editor in Lunar Magic. It’s easier to notice if you know the original tilesets and spritesets, if the same level uses a spiny and a thwomp it means the graphics were edited.
Something I didn’t realize when I extracted everything is that map16 page 2 is tileset specific. This means if the level uses sublevels with different tilesets, the contents of that page may change, so check that page for every sublevel. It’s also possible that some people edit the original pages 0 and 1 those pages are also tileset specific.
One last thing for extracting levels is that even if most entries just use level 105 since it’s the first one that appears when you open Lunar Magic, not every entry will do this. For example, Dark Hacker’s level: “Prison Escape” was level 10A in his ROM, level 105 was an entirely different level, if I was not careful I could have inserted the wrong level in the compilation. This is why it’s important to play and know the levels beforehand.
3. Insert everything
After I extracted all the mwl files, map16 pages, palettes, message box texts, ExGFX files, I inserted everything in the same ROM. In VLDC1 most entries used level 105 for the main level and 106, 107, 108, etc. for the sublevels, map16 page 3 and secondary exits 0, 1, 2, 3 and so on…Obviously I had to remap a lot of things.
First, for the levels I inserted them in order that means I started with level 1 for the first main level, then level 2 for the next one and you can see where this is going (actually, I used level 105 for the first level I inserted because it had a GTFO at the top and I thought it would be funny to greet anyone who opened the ROM with that, but I would have used level 1 if it wasn’t there). For the sublevels I started with 25 and continued from there. For example, level 1 in VLDC1 is “Land of Darkness” by dotsarcool, it uses sublevel 27 because I already used 25 and 26 for Dark Core. Then level 2 is “A Land Lost in Dust” by spigmike, it uses sublevels 28 and 29.
For map16 pages, I started filling the pages in order, starting from page 3 because page 2 is tileset specific. I basically inserted the tiles where I could, so if I already started page 5 but I still had space in page 3 I’d insert the tiles in page 3; however, I always respected the order and positioning of the tiles because it was easier to remap that way. And speaking of remapping, I had to do this a lot. Fortunately Lunar Magic has a feature that allows you to do this quickly: you must go into the edit menu, then select “remap direct map16”, you’ll get this window.
And then you have to write this;
Where XXX is the first map tile used in the original level, YYY is the last tile used in the original level and ZZZ is the first tile where you inserted the map16 page. For example, if the original author used the whole page 3 and you inserted everything in page 5 you have to write:
Most of the time, my remaps were more complex than that, so here’s a more realistic example. Image the level author used tiles from 31A to 344, and then I inserted them in page 6 starting from 68A because that’s where I had space, then I have to write this:
However, if the author didn’t use tiles 345 to 3FF in their level, I can make it simpler and just write:
The result will be the same because tiles the other involved tiles weren’t used in the level so they won’t be remapped. You probably understand how it works by now.
For BG remapping, you have to open the BG editor window and press the remap button. The process is the same.
For ExGFX, I simply inserted them and edited the numbers in super GFX bypass. I had already named the ExGFX files before I started inserting everything (tip: don’t do this), so I had some trouble to track them down, I had to check the original ROM and check which of my ExGFX files matched the ones in the original.
Secondary exits were probably the messiest part of this. This is because Lunar Magic will automatically replaces any secondary entrances when you insert a level if said level has a secondary exit that matches the number as one in your ROM, for example, if A Land Lost in Dust uses secondary entrance 1, but I’m already using that exit in Land of Darkness, Lunar Magic will move that secondary entrance to A land lost in Dust, but the pipe or door leading to secondary exit 1 in Land of Darkness will stay there...so you can see why this is a problem.
To avoid this I used the top secondary entrances first, starting from 1FF, then 1FE, 1FD and so on because they were less commonly used, I also replaced a lot of secondary entrances with the midway entrance for levels that didn’t use it (mostly sublevels). Even with this method, I still had problems, but I had far less trouble than what I would had if I had used the top secondary entrances. I didn’t get to use entrance 1CB, but if you get there you should skip it, because that’s the entrance in Yoshi’s Island 1 that shoots Mario from the diagonal pipe, and mot entries that use level 105 didn’t bother removing it. One last thing about secondary entrances is that I always had the option to move the secondary entrances when transferring the level deactivated:
This is because I didn’t want the entrances from the original SMW levels to be in the compilation levels, since it could become confusing.
And this is pretty much everything about inserting stuff. I don’t think I need to teach you how to insert palettes. After this I tested the level to make sure everything worked correctly. I do want to point out one thing though, when inserting a level I always had the level ROM and the compilation ROM open so I could check back and forth that every door and pipe leaded where I need to.
Custom music wasn’t allowed in VLDC1, so I didn’t had to worry about that, however it was in VLDC3, unfortunately, there is no way to extract it from the ROM, and even if there was it wouldn’t work with addmusic K. The best thing you can do is try to recognize it or ask in the forums. Once you know the name of the song you will find it easily, it’s probably still up there in the music section. Also, some VLDCs allowed specific patches and sprites, so you will have to insert them in your ROM. if the contest allowed the fastROM patch, you’ll have to insert it with Lunar Magic before you do anything else.
4. Making the compilation
So everything has been extracted and inserted into one ROM and tested. Every exit leads where it’s supposed to, every map16 tile is placed correctly and acts as it’s supposed to be. Is it over yet? Well, no. The next step is adding everything needed so it looks like and actual hack and not a random compilation of levels. Don’t worry; the most tedious part is already done.
When I got to this point, I published the first VLDC1 patch during the winter 2016 C3. Shortly after, I made a submap list based on the most common level themes plus a best and worse world and I asked for volunteers to make the submaps and opinions on several aspects of the compilation. Two people volunteered to make submaps: Koopster and Nin. Nin actually sent me all six submaps and a hub map, but I declined them because they were too simplistic. Koopster made two submaps: the hub and the forest world. In the end I ended up using two of Nin’s submaps, the two submaps made by koopster and I made the three remaining ones. The reason why I asked for volunteers was because I wanted to make it feel more like a collaboration rather than just one guy compiling everything, but with only two people volunteering and me having to design three submaps, maybe it wasn’t a good idea.
At first, I wanted to include a world X that would be revealed after every exit had been found and it would lead to FPZero’s level “Flight of the Yoshi”, but I scrapped that idea because the level has always been available so it would be pointless to make unlockable and use whole submap just for one level. In the end I put the level in the best world next to the winning level.
I didn’t use the main map in VLDC1 except for the hub, but that’s only because I didn’t need more than six worlds. If you need more than that you can probably fit up to 4 worlds plus a small hub in the main map. I suggest not using the main map for the best and worst world though. Also, if you’re going to compile VLDC6 I suggest not adding a worst world since that contest didn’t use numerical score because it didn’t want rank the entries; a best world with the six finalist entries would be fine though.
One of the biggest issues with VLDC1 were the switch palaces. There was a yellow switch palace in “?” (yes, that’s the name of the level) a green switch palace in “Pleasant Hills”, another green switch palace in “Shining forest”, yet another green switch palace in “Flight of the Yoshi” and a Black switch palace in the level with the same name. If it had been one switch of each color it would have been easier, but with three green switches placed in three different levels that were meant to be pressed to be cleared as part of the level design there was an issue. There were also switch blocks placed in several levels, some were revealed, some were not. If I used the same green switch for all three levels then pressing one would ruin half of the design of the other two.
My solution was to use this patch
to make the blue and red switches spawn capes, and recolor them, this way I ended up with a green switch, a light green switch and a dark green switch. I left the switch palace blocks in the other levels untouched since they were placed either as decorations or powerup blocks and were never meant to interact with the switches of the other entries. As for the black switch palace, I used this block
and edited it with the help of LX5 to simulate a switch palace effect. Since the black switch never activated any blocks there was no problem on that end.
Now, this only worked because there were only four switches (not counting the black one). If there had been more than four switches, I would have had in insert an extra switch palace with objectool. I don’t know how many switches there were in the other VLDCs, but VLDC3 and 4 had rules against using too many exits stating that switch palaces counted as exits, so I think at least VLDC2 will probably have more than four switches.
Other than the fixes I mentioned, I inserted several patches in the compilation. Extended “Extended OW level names”
, One file, One player
were used in VLDC7, so I used them here as well, and you should use them too. I couldn’t find a way to make the hack keep track of the levels you’ve cleared, but if you can find one you should do it.
I also inserted Counterbreak
, because a lot of level could be broken is the player enters with Yoshi or a cape (something the authors obviously didn’t think of since they didn’t make their levels assuming they would be compiled together eight years later), Custom Mario Palettes
because some levels changed Mario’s palette and Time Up Fix
, suggested by WhiteYoshiEgg. I also made a hex edit so the music in the overworld wouldn’t stop after a boss battle. Depending on the levels in the contest, you might also have to use these or other patches.
Finally, I did was the credits level, which consists in Mario riding a platform with the names on the right. I took the letters from the original credits (the original file was in 2BPP, so I had to paste them in a 4PBB file). Since each map16 tile can contain two 16x8 letters or 4 8x8 letters I had to do a new map16 tile for every word:
The colors are the same as in this thread
. Some of these people changed their names since the contest, but I used their 2008 names for the credits and overworld levels.
5. A note on bugs and editing the levels
Normally, you shouldn’t, but there are some exceptions.
In VLDC1 a few levels had pipes leading to level 0, not because they weren’t linked to a screen exit, but because they were too close to the screen border, in cases like these I added an exit to the next screen to avoid the players getting trapped into an endless bonus room. In one level: “Watchout…above and below” by Delmaru, the exit was unreachable because the autoscroll stopped before the goal point, so I put a goal sphere where the autoscroll ended.
You might think it’s questionable to fix things like these and that every level has to be left completely intact regardless of its bugs, because it’s the author’s fault if they didn’t test their levels correctly and we shouldn’t fix their levels for them. But think about this: would you like the players to be forced to kill themselves when they reach the end of a level? Or worse, would you like them to be trapped in an endless bonus room because they took the wrong pipe? Normally I’d agree it’s wrong to edit the levels like that, but removing level-breaking issues like these is a top priority and this is also your responsibility as the compilator. If you see something like this, you should fix it even if it involves slightly modifying e level. Try to keep the level modifications to a minimum though.
It’s possible that the ASM hacks inserted by Lunar Magic or by you may fix some of these. For example, when you set the secondary exits in it’s possible that Lunar Magic might fix the starting camera position. Similarly, slowdowns might be fixed in the VLDCs that allowed the use of fastROM, if the author didn’t use it in their level. Unless these bugs played a vital role in the levels, don’t bother about de-fixing them, it’s probably more trouble than it’s worth. If you find any other bugs or glitches that don’t break the level or the hack, leave them as they are.
Another situation where you might have to edit the levels is when it’s too hard or long. VLDC7 and 8 added a goal sphere at the beginning of levels like that. I didn’t do this for VLDC1 because there is no reward for clearing all the levels, so allowing the players to just clear from the start was pointless.
And that’s everything I did to compile VLDC1. I hope this helped you. If you have any questions or need any help don’t hesitate to ask.
Thanks for reading.