BNJEdit - Bump & Jump Level Editor Windows port Written by Michael Hayes linktr.ee/intylab Date Of Last Modification: October 7, 2021 __________ "What is this?" This is a graphical application written in Python using Tkinter. It allows you to create a copy of the Intellivision Bump & Jump ROM image with a custom set of 32 levels. __________ What is included: readme.txt - what you are reading now bnjedit.py - the program itself config.py - a configuration file that you can tweak bnjedit.bat - the script to launch BNJEdit temp.bat - a script that is automatically generated and executed hackfile.cfg - a keyboard hackfile that I use with jzIntv intycolors.cfg - an alternate Intellivision color scheme dbscript.txt - a script to automate the jzIntv debugger when enabled jzintv.exe - the emulator used to test your custom levels bin2rom.exe - a utility to generate a .rom image file rom2bin.exe - a utility to generate .bin and .cfg files if necessary assets/ - a subfolder containing all the images used by BNJEdit images/ - the default subfolder that will contain your ROM image. This folder should already contain the file bnjhack.cfg, where your work is saved to. __________ Setup: A. Install Python. Go to python.org and download the latest version. You need Python 3.7 or greater. IMPORTANT! As soon as you begin installation, check the box at the bottom of the first window to add Python to your PATH. The box is unchecked by default. B. Create a folder called "projects" on your Home folder, "C:\". C. Unzip bnjedit.zip from this "projects" folder. It will create a subfolder called "bnjedit\" and copy everything into there. D. You should have your own copy of the Intellivision Bump & Jump ROM image with the extension .bin, .itv, or .int. These are all the same; they contain the game's raw binary data. Copy only this file WITHOUT the accompanying .cfg file into "projects\bnjedit\images\". I. If your ROM image is in .rom format, then use jzIntv's rom2bin utility to create a .bin and .cfg file. Delete the .cfg file and move the .bin file into the "images\" subfolder. II. The reason you don't want to overwrite the .cfg file in the "images\" subfolder is that BNJEdit reads this file at startup and generates internal lists based on the sequence of the lines in the "[macro]" section. These lists are vital to BNJEdit while it is running. The existing .cfg file is in a format that BNJEdit depends upon. E. Rename the copied ROM image file to "bnjhack.bin". BNJEdit will use this file, along with bnjhack.cfg, to create "bnjhack.rom" for you. F. You also need your own copy of GROM.BIN and EXEC.BIN. Copy those files into "C:\projects\bnjedit\". __________ How to use: Enter "C:\projects\bnjedit\bnjedit.bat" in the Run prompt. A window will appear with a set of controls on the right, a "Rooms" pane in the middle, and a "Level" pane on the left. There are scrollbars for the two panes, but at the onset, only the Rooms pane will be larger than the window. First, let's get familiar with the command buttons. In case you're wondering, I designed the color scheme to be somewhat consistent with the box image. A. If you click on the "Instructions" button, a series of six pop-up windows will briefly tell you what to do. B. The "Save" button is "greyed-out" until you make a change. When you do click on it, your work will be saved to "images\bnjhack.cfg". C. You can back up the bnjhack.cfg file to "bnjhack.cfg~" by clicking on the "Backup" button. BNJEdit will close and reopen again. Your work is automatically saved. D. The "Make .rom" button briefly closes BNJEdit and creates the file bnjhack.rom in the "images\" subfolder, which you can then run on any emulator you like. You will be given an opportunity to either save your work or cancel, if you have unsaved work. E. With the "Play .rom" button, you can playtest your levels in jzIntv. This also temporarily closes BNJEdit while you play, and prompts you to save your work if need be. F. The "About" button pops up a window with the program name, author's name, and Date Of Last Modification. G. Finally, the "Quit" button closes BNJEdit. Once again, you are prompted to save your work if necessary. In the bottom right corner are a few more controls. A. The "Music Fix" option adds additional lines to bnjhack.cfg if the box is checked. This slightly tweaks the in-game music to be more consistent with the arcade version of Bump & Jump. B. Below that is the Level selector. When you change levels, you will notice a change in some of the rooms' colors. This is consistent with the game. C. Finally, you can see how many rooms are in use. There is space in the ROM for 1,798 rooms. In the beginning, there are 32 rooms already in use: the End Room for each level. I. Before you get too excited, bear in mind that's spread out among 32 levels. That's an average of just over 56 rooms per level, including the End Room for each level. Moving a little to the left, we have the Rooms pane. This contains the 21 rooms defined in the ROM. Sorry, I don't have any plans to add functionality to change these rooms. A. When you hover over a room image, it will highlight, so you can easily see which room you are selecting. B. Click on that room to add it to the Level pane. That brings us to the Level pane, which is taking up the left half of the window and is off-white in color. A. At the top is the End Room. B. Just below that is the text "Insert below". This is the Insertion Point. When a new room is added, it appears just below this point. C. Below that are any rooms that you added from the Rooms pane, with a few parameter controls. I. First, if you have not already done so, select a room from the Rooms pane and click on it. II. To the right of each room, barring the End Room, are: a. "N/R/!". The slider next to it can be set to one of three positions. From right to left, these are: i. "!": The Water Hazard warning sign appears when the player enters this room. ii. "R" (Restart point): The player starts from the last room marked as a Restart point after losing a life. iii. "N" (Neither): neither of the above. b. The duration counter. The six "skinny" rooms, barring the one with a boulder in lieu of a left guard rail, use the duration count to determine their length, with a range of 1-63. The remaining rooms use this count to determine how many times to repeat that room, with a range of 0-63. III. There is a little extra space to accomodate the "skinny rooms." If you right-click on the blank canvas, a pop-up window appears with options to either move the Insertion Point or delete that room. You cannot delete the End Room, but you can move the Insertion Point beneath it again by right-clicking on the room itself. When you are satisfied with your work, click on the "Save" button, and then test the level by clicking on the "Make .rom" button followed by the "Play .rom" button. If the level plays as you want it to, move on to the next level. If you want to take a break, I suggest you click on the "Backup" button before clicking on the "Quit" button to end off. __________ FAQ "Will there be an option to change the actual rooms in the future?" That's not a feature I'm considering. I think there's enough room for creative talent to design exciting new levels just with the existing rooms as they are defined in the original game ROM. "Can't you display the full length of each room?" I probably can, but I left that out for three reasons. First, I would have to repeatedly allocate/deallocate memory for up to 64 instances of the same image, which would make the code even more convoluted than it already is. That's not to mention resizing the current room, resizing the canvas, and moving everything below that room, including the Insertion Point if necessary. Second, BNJEdit would potentially require a huge amount of memory which I'm not certain would be available in PIDE. Finally, resizing the room to display it so many times is actually visually worse for the end user than to have to look at the Duration counter. "Why does this require Python 3.7 and above?" Some of the techniques I'm using depend on Python 3 to begin with. I have no interest in maintaining compatibility with legacy versions of Python. As for 3.7, this is the first version of Python that maintains ordered Dictionaries. Although BNJEdit should work with its nested Dictionary objects unordered, I make no such guarantee. "I heard there was an Easter egg." Sort of. Try restoring the bundled backup file. __________ License stuff There is no license or warranty of any kind. I offer this package as a tool rather than a product. You are free to do whatever you want with this tool, keeping in mind that the Bump & Jump ROM image, overlay image, box image, and instruction manual are all copyrighted material, which is why: you must supply those files yourself, and you should not distribute those files in a bundle with BNJEdit. The standard precaution applies that use of this tool is at your own risk. As it is free, I release this tool for your use with the understanding that neither I nor Midnight Blue International, LLC are responsible for any detrimental effects to you or your device as a result of its use, either direct or indirect. Rather than ask for any monetary donation, I would like to see your completed level packs. Just send me your bnjhack.cfg file, which does not contain any copyrighted material. If I consider including your level pack in a future compilation, I will reach out to you for your consent first. __________ EOF