Project One - continued

Status: unfinished, released

 

Technical information:

LOADER:

The loader consists of two seperate routines. The first one is the introduction sequence that fades pictures in and out and displays some text while waiting for the button. After this is called, the routine that calls it is disabled and the memory used by the images is reclaimed for use by the titles and game.

The second part is the loader itself. It recieves a "file ID number" and proceeds to load that file to the correct address and depack it, whilst animating some graphics and playing a 16kHz module.

The "PLEASE WAIT" sprites are 16x16 4bpp bitmap and the backdrop is a 256x90 4bpp bitmap. Low colour depths were selected in order to keep the memory footprint down as the loader is always resident in memory.

Music is stored safely away in the ROM area, so doesn't use any main ram.

TOM:Tom's job here is to wobble the bitmap... this is done with a GPU interupt in the object list, calling a routine that modifies the active object list, giving the backdrop bitmap a new x-position. Neat! No shifting of graphics required!

JERRY: Jerry is driving the audio. The sound is a 4 channel 16kHz module.

68000: This is doing the decrunching. Yes, it's slow, but that is because we used Pack-Ice. The final game would have used ARJ or LZ and would have depacked *much* quicker.

Trivia: Found the Easter Egg? ;-)

Title Screen:

The background image of the planet and the FujiFighter is a 340x186 16bit bitmap image, however the large "PROJECT ONE" banner is a whopping 1664x138 8bit bitmap image.

If you wait long enough an animated Jagpad will display, explaining all the keys required in the game. Pressing "SELECT" will bring up the game options.

TOM: Tom is animating the distorter at the top yet again (as per the loader)

JERRY: Jerry is driving the audio. The sound is a 4 channel 16kHz module.

68000: This is handling all the input/movement. There isn't much going on really (It's all smoke and mirrors) so the 68k is more than capable of handling this.

THE GAME ENGINE:

Fluid 50 (PAL)/60 (NTSC) frames per second refresh with zero frame drops during gameplay (when waves are shut down correctly, unlike in the released demo!)

Dual layer animated tilemap:

Top Layer - consists of 4 seperate tilemaps to provide animation.

Physical map size: 12x7 tiles (384*224 pixel area)
Virtual map size: 660*14 tiles (21120*448 pixel area)

Bottom Layer.

480x512 4bpp repeating image. The starfield is plotted onto this bitmap to add several more layers of depth.

Enemy Sprite System:

5 completely independant thread driven enemy waves which can consist of:

  • up to 8 enemies per wavethread.
  • sizes from 16x16 up to 64x32, in 4bpp, animated.
  • animation chain contains "normal", "shooting", "hit" and "destroyed" sequences which are automatically triggered by the animation engine based on enemy type.
  • individual waves for each enemy, or all following the same wave (delayed start).

1 special wavethread for multi purpose objects:

  • only one object in this thread.
  • sized 16x16, in 16bpp, animated.
  • special flag set when hit - can be used for "boss projectyle" or "bonus pickup".

Bullet System:

  • 50 Maximum independant bullets tracking on screen at once.
  • Bullet size: 4x4 in 8bpp.
  • Bullet bitmap: defined at bullet generation (allows animation, etc)
  • New bullets spawned at: (X, Y, X-Velocity, Y-Velocity, Owner) gives great flexibility in use.

Wave System:

  • Entirely script driven wave processor for easy level construction.
  • Waves are triggered by the map position as you progress.
  • Several wave types:
    • "WAVE" - standard enemy wave
    • "SAVE" - checkpoint
    • "SAMP" - trigger sample playback
    • "KILL" - kill all enemies on screen
    • "BOSS" - put game into Boss Fight mode (Stop scrolling)

Enemy System:

  • Database driven.
  • Flexible enemy construction containing type data for each enemy
  • Literally millions of possible combinations.

Audio:

  • 4 channel 16kHz Module playback.
  • 4 channel 16kHz Sample playback (Used for in-game speech and SFX)
  • All audio data stored in ROM to increase available RAM.

TOM: Tom is doing the main gruntwork here. It only has a tiny 4k of scratchram, but over 95% of the main game code is in there frantically crunching away to give us the required 50/60fps. It is responsible for:

  • Animating everything on screen (basically, if its an object then TOM handles it's update)
  • Driving the bullet engine (Bullet height sorting (For the OP), movement and bullet injection)
  • Processing smartbombs
  • Colision detection (All object to object, and bullet to object collisions processed EACH FRAME)
  • Ship updates and Parallax tracking control
  • 3D starfield update on the parallax layer
  • Map Tile updates (all map objects, every frame)
  • All this comes in at exactly 3.94k! PHEW!

JERRY: Jerry is bashing away at the music and the sound effects, hopelessly stalling the bus whilst doing so..... oh flare.. why oh why oh why didnt you give it more local ram????? ;-)

68000: Housekeeping. Basically its the reigns holding the speed freak Tom in check, making sure things happen when they should. Oh, and it reads the Jagpad :P

PAL/50Hz:

The PAL screen is taller than the NTSC screen. Rather than have huge black borders, we moved it up and added a nice Project One logo at the bottom for PAL only.

Trivia:

It takes over 7 minutes to scroll through the map @ 50fps, equating to around 10 minutes to play through the level if you don't die & kill the bosses reasonably quickly.

The total size of all .s files for Project One is 1,103k, including 3,965 lines of commented code for the loader, 4,131 for the titles and 13,144 for the game engine.

There are 9240 tiles on the level equating to almost 9.5 million pixels of map data.

The total size of source graphics is over 2Mb.

Several alternative sets of samples were recorded. Mrs CJ chose the final set.