Jetpack is a classic DOS-based platform game released in 1993.
This blog is a chronicle of the development of the long-awaited sequel, Jetpack 2.
Please register to be notified about the progress of Jetpack 2!
Working hard this week and I got a few more great submissions. I’ve done some tweaking to the tileset and there’s finally a game preview below!
Note: I’ve extended the contest to March 20th to give people more time to submit themes.
Game Preview
A level with the new tileset
New v2 – Demonstrating the faux-3D effect, tile enhancements, background, and various tiles in action
Themes
It recently occurred to me that I could swap out a few tiles and give the game a totally different look without much more work. I generate the curved & stone-wrapped tiles in code, so with only 5 tile swaps most levels can be completely rethemed:
A rough example of a castle/outdoor theme
It gives a level a whole new feel, doesn’t it?
If you want to make a theme, just redo the following 5 tiles: background tile, ladder, brick, hard brick, stone
And optionally these 5 tiles: steel panel, gold panel, column, vines, & fence
A few things will stay the same: gems, treasure, switches, barriers, and items.
There’s a 90×90 repeating background that will apply to the whole level. Other backgrounds are the standard 30×30 tile size and can be placed behind any other tile.
The theme could be anything: candyland, nature, castle, etc. In the editor I’ll have an option to preview different themes. This won’t be like jswitch, the theme will stay with the level. Then in the game we can group levels into missions by theme.
See all the submissions on the Retrofit Updates page. If you have content to submit, refer to the rules on the contest page, and send your work to the business email here. If you don’t want your entries to be shown in the blog, or if you want to use an alias, just let me know in your email.
This week the contest is slowing down, but we’ve still gotten some great graphics, songs, and sounds. We’re also starting to get some good beginner levels, keep them coming! I posted a new level 1 & 2 that I made, which are good examples.
Level Changes
I’m considering breaking the levels into groups of 10-20 (a “mission” or “zone”), and giving those groups a common theme. This may mean restyling all the levels in a certain theme like jungle or city. This is a quick change that involves automatically replacing 10 or so tiles with new custom “theme” tiles. My first goal is getting this previewable to see how well it works, and so people can contribute to the themes.
I’m going to do away with the concept of “lives”, you will have infinite lives and the extra life statues will turn into achievements. One achievement will be getting the statue for each level, another will be getting all the treasure in each level. For the new achievements system most levels will need a few changes:
Each level should have exactly ONE gold statue, which should be hard to get relative to the level difficulty
Each level should have some treasure which is trickier to get than the gems
All treasure in a level must be gettable – no more decorative treasure that can’t be reached
Don’t send in these changes yet, because there will probably be others coming up.
I’m keeping around 50 levels from the original Jetpack. These levels are the ones I put in the “maybe” category. Let me know if there are any in this group that you think should definitely make it to the final game.
Music Splashes
I think we could use some short 3-5 second music splashes for game events: a few for winning a level, possibly a few for dying, and 1 for during the level preview – a quiet song, little melody (maybe just percussion), so it doesn’t clash with the level music that will follow it. These types of things are pretty cheap to get online, but if anyone wants to try their hand at it, these are small enough to just be mp3.
Chosen Graphics
Here my working copy of the graphics I’ve chosen so far. All these are subject to change and tweaking!
Here’s a nice door concept by Juan G.
And some characters from Eric F.
And some levels: juang_2.zip – perfect beginner levels! ericf_4.zip
Feb 22nd
A jetman from Silas C.:
And another from Juan D.:
While these are cool, I’m looking for a different design for the new jetman. Either something metallic or something like this.
A new level 1 & 2 by me. We could use some more beginner levels after these. Try to make the learning quick & intuitive, and just a small part of the overall level: me_1.zip
Feb 25th
A work-in-progress song by Saga Musix:
Saga: Robot Hunt
A jetman from Joe C.:
New levels: axem_2.zip josephc_1.zip levels from the original jetpack alpha!
BTW the level “Wizard” was inspired by the game “Wizard” on the C64 – I highly recommend it. josephc_2.zip some tutorial ideas saga_5.zip great easy level!
See all the submissions on the Retrofit Updates page. If you have content to submit, refer to the rules on the contest page, and send your work to the business email here. If you don’t want your entries to be shown in the blog, or if you want to use an alias, just let me know in your email.
It’s slow work reviewing good quality levels, and there are a lot of great ones in here so reviewing them took many hours!
I reviewed 241 levels and put 69 in the final round. These include:
adamd – Good variety and great visuals (with the limited tile palette). Favorite: d-m-ship
alexw – Some great variety and ideas in these. Favorite: artee001
benj – Magnificently tricky riddle
bens – Some fun ideas here. Favorite: beehive
bent – There are some great levels here. I like the way you use enemies to reveal secrets, like the insubstantial tiles.
brienb – These are some sadistic levels! Favorite: lotto/ohoh
ericf – Some good hard levels and clever game mechanics. Favorite: E1
jasonw – A deceptively tricky level.
joec – Some wicked hard levels, but a couple good easy ones too. Favorite: Shrine
joes – These have great playability, and a perfect progression from easy to difficult. Favorite: ventuz05
jonasr – Some really cool ideas here. Favorite: wer12
juang – These have a few cool new ideas, and are a lot of fun. Favorite: bcmissil
nickr – Good level. Could be interesting to offer an extra life for an extra trip across.
saga – Great intricate designs, but most are way too hard. Favorite: where
sebm – All crazy hard, at least for me. Favorite: switches
sn – Some very hard levels. Favorite: easy7
Learning Curve Needed
We badly need easy levels, and easy means super easy. The casual game crowd needs a very gentle introduction. I tried to do this somewhat in the original first 5 levels but it wasn’t nearly enough. My wife can’t even beat my original level 0 – it failed to be a good introduction to the game, except to experienced gamers. People were just looking around and learning about jumping when the trackbot killed them. Then they were getting fuel and learning how to fly when the trackbot killed them. As soon as they learned how to fly to avoid the trackbot, the spikes killed them. We need a much more gradual learning curve, and we need to make the harder parts of a level optional (eg, containing treasure only). Don’t assume the person playing these levels has EVER played an action game.
If you think an easy level can’t be challenging, think about how you would teach all these things in one level:
understanding the game goal
becoming comfortable with basic movement
sensing danger
jumping small gaps, then large gaps
flying, then flying with control, then flying level
learning to conserve fuel, and to monitor your fuel level
learning to read clues that there may be traps, and thinking before acting when there are traps
learning that missiles move in a predictable pattern
learning how smart the trackbot is
learning each special tile function
using teleporters, then being aware of and predicting enemy teleportation, then using invincibility while teleporting
learning what switches do, then how to use them, and enemy-triggered switches
learning that phasing is possible, then where and how to phase
learning to move quickly through purple doors, then through multiple doors
learning not to destroy crates you may need
phasing up, then phasing while jumping, then phasing while flying up, then phasing while flying level
learning how to use enemies to your advantage
These should be taught over 10-20 levels, with lots of fun stuff mixed in. I don’t like tutorials. The best way to teach these things it to show them in actual use, without the player being in danger.
Some examples:
* learning to move quickly through purple doors
On the first encounter with a purple door, put it on ice. The player will slide through before they know what happened.
* learning not to destroy crates you may need
Put gold above crates initially, not essential items like gems or switches.
Game Changes
Playing through all these levels has led me to some conclusions about changes that will affect gameplay. I can’t adjust difficulty by changing the monsters’ speed relative to the player because it screws up a lot of game mechanics. Maybe I’ll just leave in the game speed adjustment via +/-. How do you beat hard levels, do you find the slowdown useful?
Some of these may require tweaking your levels in the beta (don’t bother changing anything yet):
faint outline where barriers will be
smaller collision area for spikes & spear
no getting stuck on corners when jumping
jump or step close to a spear will set it off, then you can move past slowly
make phasing while jumping easier – only phase when at the middle of a tile
show a faint outline when jetman is behind bricks
flitzer light shows future movement
maybe a button which reveals hidden paths
placeable invincibility cloak
There will be automatic visual enhancements to levels, including:
replace repeating columns with a solid column
replace stacked ice stone with icy stone wall
automatic edge finding + enhancement
sag physical floor of sludge pool
And I want to add these options when saving a level:
frequency of bonus items
longer description
music selection
par completion time
This week’s entries
Feb 12th
A full tileset replacement from Joseph S.:
Love that extra life! Anyone want to make a character out of that shape?
Feb 13th
We have some sound effects! These are by Saga Musix:
See all the submissions on the Retrofit Updates page. If you have content to submit, refer to the rules on the contest page, and send your work to the business email here. If you don’t want your entries to be shown in the blog, or if you want to use an alias, just let me know in your email.
We are getting some very cool contributions via the contest, thanks to everyone who is participating! If you have content to submit, refer to the rules on the contest page, and send your work to the business email here. If you don’t want your entries to be shown in the blog, or if you want to use an alias, just let me know in your email. The odds of picking up some cash are still good, and as always, if even a single sprite you submit is used, you’ll get a free copy of Jetpack.
Music
Our first week has seen some awesome music. My favorite is from Saga Musix
I always thought trance or an ambient techno would be a good fit for Jetpack. We need music that doesn’t overpower the gameplay, for 3 different level types/moods: light adventure, mysterious puzzle, and challenging action. I’ll let the level authors choose which song should go with their level after the levels & music are chosen.
Music should be about 4 minutes long to avoid restarting during a typical level. If you have a short song, you can just add some looping to your patterns to stretch it out. I need .MOD format music with a max of 10 channels for performance reasons. I’m using Flod for mod playback, it supports 3 or 5 octaves and the following effects:
I’ve also gotten some great graphic entries. Eric F. has made some great contributions, including an interesting take on the bat.
For the graphics, leave the backgrounds transparent, and feel free to send in a larger size, or add frames if you think they are needed – I will do any necessary conversions. I’m also open to any new ideas you might have.
Because animating takes a lot of work, I’ve decided to choose certain characters in the next couple weeks. Once a character is chosen, no further designs will be accepted, so the creator can finish the animation without worrying about his/her time being wasted. This is especially important for the main Jetman, since he has several frames.
Levels
There have been tons of levels submitted that I haven’t had time to review yet. From what I’ve seen, I think we have a lot of hard levels, and could probably use some more on the clever puzzle side, and some on the easy side. We want to appeal mainly to casual gamers – for hardcore gamers there will be a difficulty level that speeds up the enemies. It occurred to me that it may help to know my favorites, so here they are:
70: Work Those Leg Muscles – my all time favorite, varied tests of skill
40: The Gauntlet – like an obstacle course, a feeling that you’re being tested
30: Mission Possible – a feeling of a mission in an exotic location
04: The Complex – a feeling of escaping, or intruding into a fortification
12: Fuel Shortage – not sure why I like this one, maybe just the simplicity
50: Montezuma’s Revenge – has a jungle feeling
90: The Volcano – original use of devices, you have to find a way to penetrate the structure
Analyzing these selections, they have a few things in common: There’s a feeling of adventure within the level, each level has distinct sections, you can easily form your own story behind the level, and you have a feeling of outsmarting & conquering something big at the end. They are all tricky without being too frustrating – I’d say a couple of these are close to the limit of how hard a level should be in a casual game.
More Features
Time is tight on this project, and I haven’t planned any gameplay enhancements, but it would be nice to have a couple of new things. There may or may not make it into the final release, but here are a few I’m considering:
multi-tile scenic objects on the background wall – brickwork, shackles, tapestries, windows, etc
a new enemy
a new gameplay/puzzle element
some physics effects
All the public entries this week are below.
Feb 5th
Here’s our first submission, some sweet tunes from coda:
Some simple graphics from Eric F.:
More levels by Eric F.: ericf_2.zip
A cool teleporter concept from Eric F.:
Feb 10th
Lots of contributions today!
Another level by Saga Musix: saga_3.zip
A pack of levels by Sebastian M.: sebm_1.zip
A pack of levels by Joe S.: joes_1.zip
A tight robot by Eric F.:
Some new bat graphics by Henry F.:
I’ve set a goal to release the new web playable Jetpack in March. To get all the programming done in the next month will take a lot of work, not to mention the graphics, music, sounds, and extra levels. If you’ve been following this blog, you know this is an indie release with a shoestring budget, and I can’t afford to hire an artist. So instead, I’ve decided to blow it all on a contest! This will give everyone in the Jetpack fan community a chance to contribute to the new Jetpack, and will help to reward some of the great work that’s being donated.
Calling All Artists, Musicians, SFX Wizards, and Level Designers
I already have a few volunteer Jetpack fans doing some great work, but we need a lot more. You can contribute any of the following resources for the final release:
Graphics: Use this template and replace the old blocky graphics with new ones that are closer to the style of modern flash games. Just leave the backgrounds transparent.
Sound Effects: Record your own replacements for the sound effects here. There’s no remastering these, since my masters are 8 bit 8000hz mono VOC. I need 256bit 44khz stereo mp3. Feel no obligation to stay close to the originals!
Music: I need MOD format music, 50k-150k per song, in styles to suit different types of levels. You must be the copyright holder. I recommend MilkyTracker or ModPlug Tracker. Note the exact format we can support is still up in the air.
Levels: I’d like to put a lot of new levels in the release. Send me your creations that you consider to be the cream of the crop. Currently the only way to create levels is with the DOS version of Jetpack
New creations are great, and if you have any past work to which you still hold the copyright, that will work too. I’ll use the best parts out of what I receive, as long as it meets my quality standards.
A total of $200 will go to the 6 people who create the most content chosen for use in Jetpack.
The top 2 will receive $50.00
4 runners-up will receive $25.00
In addition EVERYONE who submits work used in Jetpack will receive:
A FREE premium/deluxe/platinum edition of Jetpack
Your name in the credits of the game
Get Started!
The contest ends on March 20th. Send in your creations as often as you like, the sooner the better. With your permission, I’ll place your entries in a members-only section of the blog for members to vote & comment on. Until I get a submission form set up, you can submit your work to the business email here.
Also, please help spread the word about this contest to any gaming groups or forums you’re on!
* The “Content” refers to any submitted work, data, or content, or any number of parts of such Content.
* You must be the copyright holder of the submitted Content, with the ability to transfer copyright ownership of the Content.
* By sending Content to Adept Software, you grant Adept Software the unlimited royalty-free license to use, modify, publish, and sell the Content as part of a game.
* While votes may be encouraged from users, Adept Software will be the sole judge of the winners of the contest.
* Winners are solely responsible for all taxes and/or fees that may be incurred.
* Adept Software reserves the right to alter the rules of this contest at any time.
BY SUBMITTING AN ENTRY, YOU WARRANT AND REPRESENT THAT IT: (A) IS YOUR OWN ORIGINAL WORK, (B) DOES NOT CONTAIN, INCORPORATE OR REFERENCE ANYTHING THAT IS OWNED BY ANY THIRD PARTY OR ENTITY OR WOULD REQUIRE THE CONSENT OF ANY THIRD PARTY OR ENTITY IN ANY JURISDICTION, (C) DOES NOT INFRINGE UPON THE COPYRIGHTS, TRADEMARKS, RIGHTS OF PRIVACY, PUBLICITY OR OTHER INTELLECTUAL PROPERTY OR OTHER RIGHTS OF ANY PERSON OR ENTITY, AND (D) THAT PUBLICATION OF THE WORK WILL NOT INFRINGE ON THE RIGHTS OF ANY THIRD PARTY. ANY SUCH ENTRANT WILL INDEMNIFY AND HOLD HARMLESS, SPONSOR FROM ANY CLAIMS TO THE CONTRARY. Contest void where prohibited or restricted by law and subject to all applicable federal, state, local and municipal laws and regulations.
Instead of just releasing a small retro port as a milestone on the way to Jetpack 2, I suddenly realized with so much work done, taking a bit more work I could make a full game release out of it. Announcing the March 2010 release of a brand new & enhanced, web playable Jetpack!
From the press release:
Jetpack is a classic game from the MSDOS era (1993). Jetpack was the #1 top seller for its publisher out of 70 titles, and since its re-release as freeware in 1995 it has been downloaded over 1 million times from AdeptSoftware.com. Many people have fond memories of the family-friendly brand. The old DOS version of Jetpack continues to receive 2000+ downloads per month from our site, despite requiring DOSBox to run in new versions of Windows. The re-release of Jetpack to the web platform will add high res graphics, new levels, remastered sounds, realistic physics, and a pixelated “retro mode”, as well as a level editor integrated into the level repository at JetpackHQ.com.
Adept Software was founded in 1997 and incorporated in 2004. Past projects range from development applications (PLC, Nautilus) to dating & social networking services (CyberSoulmate, NetRelate, ConnectMate). Our current focus is on web playable video games, specifically reviving classic retro games.
The title of this game will just be “Jetpack”, like the original. As for Jetpack 2, the plan is for a release near the end of this year. I’m pulling the retro mode out of Jetpack 2 – it will only exist in Jetpack 1. The gameplay of Jetpack 2 will be significantly different, so you’ll want to play them both.
It’s great to be working toward a goal that’s so close! We’ll be staying true to the original gameplay, but with your help there will be several enhancements:
New high res graphics & sound effects
Music!
New levels!
Difficulty levels. Finally my mom will be able to play.
Improvements to controls and physics
Shiny new info panels & end level stats
The author & background story for each original level, including the official hintbook text
Web playable, embeddable, and downloadable versions
Retro mode with the original, old school graphics and sounds
I say “with your help”, because I’m going to need help creating new graphics, music, sounds, and levels. More on that coming soon.
In the good old days of Jetpack 1, things were much simpler. Input from the keyboard or joystick was translated directly into action.
It was along the lines of:
if(key[right arrow]) speedx += 10;
sprite.posx += speedx;
Sometimes I miss the old days… The new path from input to action now looks like:
set up key bindings from default or configuration data
for each human player, translate input into commands based on bindings table; “right arrow” becomes “move right”
send commands to each player’s controlled entity
each entity processes commands through its state machine(s); if we’re on the ground, “move right” becomes “run right”
active states run actions – in this case, the “run right” state applies horizontal force to the entity’s physical body
the graphical representation of the physical body is updated
The new process is certainly more powerful, but requires somewhere around 1000x more effort to write. Below lies the implementation of the above process, the control tech demo. You can use the arrows to control all the various entities, and [square backets] or the mouse to switch entities. Your entity’s active state machines are displayed in the debug line at the bottom.
One of the nice things about this newfangled control system is that it meshes very well with the AI, which only needs to supply a command list to an entity, and not worry about the implementation details. You can see this in action when you launch a guided missile – it will follow the mouse cursor using a generic AI “chase” algorithm. This release also incorporates various other enhancements, including the launcher from a previous post.
Jetpack 2 Engine Status
I meant to have this demo out a month ago, but I opened up the Pandora’s Box of AS3 code optimization and fell in. This had to be done at some point, so I’m glad its mostly out of the way. On the plus side, I found several optimizations that doubled the frame rate of the game engine – there will be a big post on this later. The engine is pretty close to basic playability now, and I’ll be releasing a special retro version of Jetpack in March.
Personal Stuff
My gallbladder surgery was successful, but I’m only feeling about 25% better. I think it was worth it, but it looks like that wasn’t the cure-all I was hoping for. Thanks to all the well-wishers!
Very shortly I’ll be releasing the next tech demo, on controlling entities with state machines. Before I wrap that up, here’s an update on the progress since the last demo:
What’s Done
faux-3D depth: What a headache. I spent days banging my head against different methods of faux-3D depth sorting in 2D, until I finally realized the problem: it’s impossible. Depth in 3D is not sequential, and approximating it cannot be done perfectly using a back-to-front rendering system without some big hacks. So I adjusted the tiles to be slightly less 3D, and I think it’s just as good with no sacrifice in speed.
control: input bindings, command queues, state machines, actions
animated effects: “tween” style
created entities: ball, spring, missile, retro jetman
What’s To Come
I had hoped to get pre-alpha relase 1 done by December 31st, but my work needs me for extra time this month. When its done, this first official release should be a roughly playable “retro-mode” of a few levels, using the original graphics. I also have gall bladder surgery scheduled in early January. Hopefully that will cure or at least help with my chronic fatigue.
Since this blog could potentially have many SWF examples on a single page, I have to consider effect of having them load and run all at once, both on the browser and on my bandwidth. Users will not always want to see every SWF, so ideally a “click to start” intro would precede the loading of each example.
I tried this with just an image: when it was clicked, it would hide itself and embed the SWF where the image had been. Unfortunately, the SWF was not focused and would have to be clicked again, and Firefox has a flaw that does not always allow javascript to focus a SWF . Therefore the nice and simple image idea had to give way to a whole separate SWF as a launcher for the examples. The launcher is always running, but it’s small and the frame rate is low and it doesn’t do too much. Once the launcher is clicked it loads the example SWF and bumps up the frame rate to the proper level. Of course, since this is Actionscript, what takes a sentence to write took 2 days to implement.
This is a form of preloader, and I’ve gotten confused a few times when thinking about this, so I’ll document it here. It also helped me to refer back to my post on preloaders.
preloader via separate swf
displays “click to start” and waits – this can be bypassed via an argument to the swf
loads the main swf while updating progress
sets the new framerate, activates the main swf, and goes away
preloader embedded in main swf
the preloader is on frame 1 of the timeline, and begins to execute while the rest of the timeline loads
large assets are embedded in later frames
the preloader passes control to the main program once the swf fully loads
For Jetpack, I’m going to attempt a combination of the 2 methods, so the user experience will be as follows:
The game window will instantly show loading progress (preloader swf)
The preloader will fade away, revealing a Jetpack level in demo playback (main swf preloader)
While the demo game runs, a status bar will show progress as the rest of the assets (mp3 music) load
(At this point, an in-game ad could be shown, but the income from those is not impressive and I’d rather not clutter up the game.)
When loading is complete, the main menu will fade into view
There are some other advantages to using a launcher swf that I can think of:
When users embed the launcher swf on their own websites, it will always load the latest version of Jetpack from JetpackHQ.
I’ll have full stats on who is playing and where.
Security against game reskinning is improved, by having the launcher and the main swf validate eachother.
Getting the launcher just right took some struggling with Actionscript, but the result works great. It’s only 2k, and can serve just about any swf file (on the same server). I was able to find a way to read the target framerate from the loaded swf and set that before launching it. You can also read the width & height, but I know no way of resizing the SWF at runtime without using javascript. I’ve attached the source code to this project at the bottom of this post. Here’s a sample:
function Startup()
{
// ARGS - launch='', now=0/1
var args = stage.loaderInfo.parameters;
if(args.launch!=undefined) launch_swf_path = args.launch;
if(args.now!=undefined) wait_for_click = !int(args.now);
if(!launch_swf_path) Fail("usage: launcher.swf?launch=abc.swf&now=0");
if(wait_for_click)
{
Show_WaitForClick();
stage.addEventListener(MouseEvent.CLICK, StartLaunch);
}
else StartLaunch();
}
//--------------------------------------
function Shutdown()
{
root.Shutdown();
root = null;
System.gc();
}
//------------------------------------------------------------------------------
function StartLaunch(event:MouseEvent=null)
{
if(wait_for_click)
{
stage.removeEventListener(MouseEvent.CLICK, StartLaunch);
Hide_WaitForClick();
}
Show_Preloader();
loader = new Loader();
loader.contentLoaderInfo.addEventListener(Event.COMPLETE, CheckReady_Hack);
stage.addEventListener(Event.ENTER_FRAME, CheckReady_Hack);
loader.load(new URLRequest(launch_swf_path));
}
//--------------------------------------
function CheckReady_Hack(event:Event)
{
// in certain cases when not waiting for click, complete/init fires but loaderInfo.frameRate
// is not accessible. misinformation from the official ActionScript docs: "When the loaderInfo
// object dispatches the init event, you can access all properties of the loaderInfo object"
if(event.type==Event.COMPLETE)
{
ready_hack = true;
loader.contentLoaderInfo.removeEventListener(Event.COMPLETE, CheckReady_Hack);
}
if(event.type==Event.ENTER_FRAME)
{
if(!ready_hack) return;
stage.removeEventListener(Event.ENTER_FRAME, CheckReady_Hack);
Launch();
}
}
//--------------------------------------
function Launch()
{
Hide_Preloader();
var swf:DisplayObject = loader.content;
// frameRate, width, height are only available before unload()
stage.frameRate = swf.loaderInfo.frameRate;
loader.unload();
loader = null;
// clear the stage
while(stage.numChildren) stage.removeChildAt(0);
// launch the loaded swf
stage.addChild(swf);
Shutdown();
}