This Jumpman level editor is a complete solution for creating new levels for this all-time-classic game.
Open Omnivore and choose File -> New -> Jumpman Level
and you’ll see a
very simple level definition. You can add to that by clicking one of the
draw icons in the toolbar and drawing in the main window. By clicking on
the arrow icon in the toolbar you can select existing items and drag them
around; you can cut, copy and paste the selected items, and more. Change
the level settings like the level name and number of bullets in the right
hand panel.
Tips:
Girders can be placed at any position, but note that Jumpman can only fearlessly navigate the horizontal girders and ramps that are sloped up or down by one pixel per block. Ramps that slope up more than that can be (carefully) climbed, but down-slopes of more than one pixel will trip up and kill poor Jumpman. It’s not recommended to use more than one pixel slope up or down, but I have left the feature in the editor just in case someone comes up with a use for it.
Ladders can only be placed at even pixel columns (as measured from the left
side), and are further limited in that only 12 unique columns can be used.
Ladders can be placed above and below one another in the same column
without counting against the 12 column limit. The number of columns of
ladders is shown in the Level Data
window.
Downropes can likewise only be placed at even pixel columns, and are
limited to 6 unique column positions. As with ladders, multiple downropes
can be placed in the same column without counting against that limit. The
number of downropes is also shown in the Level Data
window.
Upropes are not limited in either pixel columns or number of unique column positions, so knock yourself out.
The object of the game is to collect bombs, so be sure to place at least one bomb or the level will end immediately when you try to play it. When you place bombs, you’ll notice a grid that appears in the main window. Thick red borders between each grid cell denotes invalid bomb locations, so place bombs only where they don’t touch any of the red cell borders. (Due to a speed optimization in the code, the game can crash when Jumpman collects a bomb that is touching any part of the red shaded area.) Only one bomb may be placed per grid square.
Finally, you must set Jumpman’s respawn position by selecting the the Jumpman figure icon on the toolbar. Place the white square at the desired location. Typically, Jumpman will be placed on a girder, but other starting positions are possible. If the bottom of the square overlaps a girder, Jumpman will climb up. Note that Jumpman must not fall more than one pixel; more than that results in death.
To playtest your level: choose File -> Save As
, give it a filename with
the .atr
extension, and run it in your favorite emulator. You can also
set up Omnivore to run an emulator directly when you press F5; go to the
Disk Image -> Emulators -> Edit Emulators...
entry to set up the
emulator for your platform.
For more complicated levels, Jumpman has a feature where it will draw new
items or erase existing ones when you collect a bomb. To create a level
using this feature, use the Trigger Painting
panel to select one of the
bombs (they are listed by their x and y coordinates). The level will fade
into the background and you can paint more items in the main window.
Everything you draw (or erase) here will only get triggered when Jumpman
collects that bomb. You can even cascade triggers by adding more bombs and
selecting the new bombs in the trigger painting panel. Bombs will be
indented to show the parent/child relationship when there are multiple
levels of nesting. Select the Main Level
entry to paint on the normal
level definition.
Omnivore now has in integrated MAC/65 compatible assembler that recognizes specific keywords in your assembly code and puts them in the correct spots in your Jumpman level definition.
You will need to edit the assembly source with your favorite text editor
and then use the Jumpman -> Custom Code...
menu item to add the source
file to your level. After that it will remember the file when you load the
level again. Be sure the source code is in the same directory as the .atr
image. If you move the .atr file to a new place, be sure to copy your
assembly file as well.
The assembler recognizes certain labels in your assembly code. If any start
with trigger
, those labels will be available as targets for peanut
collection. You can right click on peanuts and set their trigger function
to any of those in the list.
There are special vectors that Omnivore knows about; see the section in the Jumpman Reverse Engineering Notes.
If you give your code any of those labels:
then Omnivore will put the vector for your subroutine in the right place in the level definition so that your routine gets automatically called. See the reverse engineering notes for more details on what each of the labels means.
There’s also one last special label: gameloop
. If you define this in
your code, it will take over the non-VBI main game loop. If you don’t
define it, Omnivore will put the standard game loop at $2860. The game loop
is responsible for fading in jumpman at the beginning of a level and
monitoring end-of-game conditions. Only a few examples of a custom game
loop exist Glover’s original levels, so this is not a commonly used feature
at all.
If you’re interested in exploring the assembly code in Jumpman, you’ll want to use the standard Jumpman disk image and then get the Omnivore metadata file that provides the comments.
Note that Omnivore recognizes a Jumpman disk image and loads right into the
level editor. To use the hex editor, you’ll need to use the menu option
Window -> New View of Jumpman -> In Hex Editor Window
In the documentation for the game, you are described as running around defusing bombs by touching them. We started calling them peanuts in our documentation because Kevin called them that in his youth, and so we wouldn’t get flagged and placed on NSA watchlists because our email traffic contained hundreds of references to bombs. We hope the Planter’s people are less invasive.
peanut:
The bombs from the original manual; what you’re collecting to advance to the next level
harvest:
The act of colliding with a peanut and removing it from the level
trigger function:
A pointer to a routine that will run when that particular peanut is harvested. This is not the same as trigger painting described below.
trigger painting:
A pointer to an entry in the trigger painting table that draws or erases level elements when the peanut is harvested. Note that this is entirely separate from the trigger function above. A peanut may have one, both, or neither defined.
A list of supported file types that can be created by Omnivore.
Choosing an item in this list will open up a new tab in the current window showing a new blank template of the selected file format.
Available templates include:
Open a file using a file select dialog box.
This submenu contain a list of the files most recently loaded or saved.
You can limit the number of items to remember in the General tab of the Preferences dialog.
Insert binary data at the cursor
The data from the loaded file will overwrite data starting at the cursor, so it’s not inserted in the text editor sense where space is created in the existing data.
Save the file, overwriting the previously saved version
Save the file to a new filename, leaving the originally loaded unchanged on disk.
Save the current view as an image (if possible with this editor)
Reverts the file to the last saved version on disk
This throws away any edits and is not undoable.
Choose options for printing
Preview the pages to be printed
Print the current view to a printer
Create an Atari 8-bit executable from a set of segments.
Opens a dialog window providing a list of segments to be added to the new executable and a starting address at which the Atari will begin executing the program on completion of the load.
Create an Atari 8-bit boot disk from a set of segments.
Opens a dialog window providing a list of segments to be added to the boot disk and a starting address at which the Atari will begin executing the program after reading all the sectors written to disk.
This creates a smaller-than-normal ATR image with a custom bootloader. Any sectors beyond the number fo sectors required to create the image are not included in the image.
Quit the program
Undo the last action
Actions that modify data are undoable; some that modify the metadata are but movement commands are not stored in the undo list, so for example cursor moves or changes to selection regions are not undoable.
Redo the last operation that was undone. See Undo.
Cut and remove the current selection
Copy the current selection
Paste from the clipboard
Select all drawing elements in the main level
Clear all selections
Invert the selection; that is: select everything that is currently unselected and unselect those that were selected.
Flips the selected items top to bottom.
This calculates the bounding box of just the selected items and uses that to find the centerline about which to flip.
Flips the selected items left to right.
This calculates the bounding box of just the selected items and uses that to find the centerline about which to flip.
Open a window to change program settings and defaults.
This list sets the color encoding standard for all bitmapped graphics of the disk image. Currently supported are:
Changes the color palette to ANTIC Powerup Colors
Open a window to choose the color palette from the available colors of the ANTIC processor.
Toggle whether differences to the `Baseline Data`_ are highlighted or not.
Open a font selection window to choose the font and size used to display the values in the hex grid and the disassembly text.
Toggles whether or not the named extra pane is shown or hidden in the current window.
Changes the view in the entire window to a new editing task. The files in the current task are not lost, it’s just a way to edit different types of files while using the same top level window on the desktop.
This submenu contains a list of all Jumpman levels in the disk image. Selecting one of these items will change the display to edit that level.
Note that no changes are lost when switching levels; they remain in memory and your edits will be restored when switching back to a previously editing level. However, no changes for any level are saved on disk until using the Save or Save As commands.
Remove any trigger function from the selected peanut(s).
Set a trigger function for the selected peanut(s).
If you have used the custom code option, have compiled your code using the
built-in assembler, and your code has labels that start with trigger
,
these will show up in the list that appears when you invoke this action.
Otherwise, you can specify the hex address of a subroutine.
Add an assembly source file to this level (and compile it)
This is used to provide custom actions or even game loops, beyond what is already built-in with trigger painting. There are special labels that are recognized by the assembler and used in the appropriate places:
- vbi1
- vbi2
- vbi3
- vbi4
- dead_begin
- dead_at_bottom
- dead_falling
- gameloop
- out_of_lives
- level_complete
- collect_callback
See our reverse engineering notes for more details.
Recompile the assembly source code.
This is a manual action, currently the program doesn’t know when the file has changed. Making this process more automatic is a planned future enhancement.
Run the current emulator using the current emulator.
The current emulator is shown in the Emulators sub-menu.
This submenu contains a list of the known emulators and a checkbox to indicate the current emulator.
Open up a window to define a reference to an external emulator
Omnivore can run the disk image in any emulator that is capable of being started from a command line. It spawns a separate process and feeds the emulator a path to the disk image along with any necessary command line arguments that you have to specify when setting up the emulator in this window.
Make changes to the current list of emulators.
This opens a window with a list of the currently defined emulators to make changes to existing emulators or add/delete any already defined.
The currently specified emulator in the Emulators list will be set as the system default and remembered for subsequent editing sessions.
This menu contains a list of all documents open in the current session, across all windows and tabs. Selecting an item in this list will switch the view to that document, using the editor that was being used the last time it was edited.
This menu will contain a list of all editors that can modify this file. Selecting an item in this list will add a new view into this file using the selected editor. For instance, you can have a map editor and a hex editor on the same file; they point to the same data and modifying data in one window will show up in the other window.
Open a new, blank Omnivore window that can be used to load new files or to provide a second view on a currently loaded file.
Display window with version number and author info
Display the user guide in a new window
Open the log directory in the desktop file manager program.
The log directory will contain debug logs (if enabled) and other files, most of which are generally only useful for developers or to get more information to send to the developers in the event of a problem.
Displays a window that can be used to turn on debugging of particular parts of the program.
The log levels shown initially are the default log levels for each logger.
Using the Filter
text entry box, you can enter a string or a comma
separated list of strings that will be used to select which loggers get
switched to DEBUG mode. Everything else gets set to its default state,
usually either INFO or WARNING.
The string is not a regular expression, but will match partial strings.
Open the wxPython Widget Inspector
Raise an exception to test the error reporter