Jumpman Level Editor

Overview

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:

  • Only one bomb per grid square
  • Use ramps that slope up or down by only one pixel per block

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.

Advanced Levels With Custom Code

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:

  • vbi1
  • vbi2
  • vbi3
  • vbi4
  • dead_begin
  • dead_at_bottom
  • dead_falling
  • out_of_lives
  • level_complete
  • collect_callback

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.

Disassembly

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

A Note on Terminology

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.

File Menu

New

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:

  • Apple DOS 3.3 (140K) AUTOBRUN image
  • Apple DOS 3.3 (140K) blank image
  • Atari DOS 2 DD (180K) blank image
  • Atari DOS 2 ED (130K) blank image
  • Atari DOS 2 SD (90K) blank image
  • Atari DOS 2.0S SD (90K) system disk
  • Atari DOS 2.5 ED (130K) system disk
  • Getaway Map
  • Jumpman Level
  • template://no-json.dsk

Open

Open a file using a file select dialog box.

Open Recent

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 File

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

Save the file, overwriting the previously saved version

Save As

Save the file to a new filename, leaving the originally loaded unchanged on disk.

Save Segment As

Jumpman Level Tester ATR (.atr)

Raw Data (.dat)

Save As Image

Save the current view as an image (if possible with this editor)

Revert

Reverts the file to the last saved version on disk

This throws away any edits and is not undoable.

Page Setup

Choose options for printing

Print

Print the current view to a printer

Export as XEX

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.

Export as Boot Disk

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

Quit the program

Edit Menu

Undo

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

Redo the last operation that was undone. See Undo.

Cut

Cut and remove the current selection

Copy

Copy the current selection

Paste

Paste from the clipboard

Select All

Select all drawing elements in the main level

Select None

Clear all selections

Invert Selection

Invert the selection; that is: select everything that is currently unselected and unselect those that were selected.

Flip Selection Vertically

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.

Flip Selection Horizontally

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.

Preferences

Open a window to change program settings and defaults.

View Menu

Colors

This list sets the color encoding standard for all bitmapped graphics of the disk image. Currently supported are:

  • NTSC
  • PAL

ANTIC Powerup Colors

Changes the color palette to ANTIC Powerup Colors

Use ANTIC Colors

Open a window to choose the color palette from the available colors of the ANTIC processor.

Show Baseline Differences

Toggle whether differences to the `Baseline Data`_ are highlighted or not.

Text Font

Open a font selection window to choose the font and size used to display the values in the hex grid and the disassembly text.

Pane Visibility:

Toggles whether or not the named extra pane is shown or hidden in the current window.

Current Task:

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.

Jumpman Menu

Edit Level

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.

Clear Trigger Function

Remove any trigger function from the selected peanut(s).

Set Trigger Function

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.

Custom Code

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 Code

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.

Disk Image Menu

Run Emulator

Run the current emulator using the current emulator.

The current emulator is shown in the Emulators sub-menu.

Emulators

This submenu contains a list of the known emulators and a checkbox to indicate the current emulator.

Add New 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.

Edit Emulators

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.

Set Current as System Default

The currently specified emulator in the Emulators list will be set as the system default and remembered for subsequent editing sessions.

Documents Menu

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.

Window Menu

New View In

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.

New 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.

Help Menu

About

Display window with version number and author info

User Guide

Display the user guide in a new window

Open Log Directory in File Manager

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.

Show Debug Log

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.

More Debugging

Widget Inspector

Open the wxPython Widget Inspector

Raise Exception

Raise an exception to test the error reporter