Last modified on 17 February 2019, at 07:33

Renegade

Revision as of 07:33, 17 February 2019 by Arnoldemu (Talk | contribs) (Technical)

Renegade is a 1987 game programmed by the same programmer as Gryzor.

Pictures

Renegade Level 1
Renegade Level 2
Renegade Level 3
Renegade Level 4


Technical

General

  • The game is designed to run in 64KB of memory. Therefore they made decisions to make this possible. Even so, the game is one of the best on CPC
  • With 64KB one level at a time is loaded. With 128KB all 4 levels are loaded.
  • The game doesn't use hardware scrolling and uses a reduced screen and heavily uses the invisible areas of both screens to store code and data.

Sprites

  • Sprites are stored upside down in memory.
  • Sprites are stored as mode 0 with pen 0 as transparent.
  • Sprites are stored facing right only and flipped by code in realtime (e.g. the facing left sprite is a mirror of the facing right sprite.).
  • Characters are stored as multiple sprite parts and are composed during drawing. Each part has a signed x and y offset relative to the base x,y position of the feet on screen and a width and height. Therefore heads, bodies and legs are separate. This allows re-use for all characters and enemies.
  • Sprite pixel data is stored as follows:

1 byte like normal (same as mode 0 screen bytes), followed by 1 byte with pixels swapped, this repeats.

It is believed this is done so that drawing a sprite facing left, and drawing a sprite facing right will take the same cpu time and so that the frame rate is more consistent.

  • Characters are sorted by their y position each frame. They are then draw in increasing y coordinate order.

Levels

  • Each level takes &1000 bytes. There are 4 stored in 1 16KB page. The data is copied to &3000->&3fff before then being copied to other locations in RAM.
  • Each level's data is prefixed with "JCB Overlay xxxx" where x is the level number. e.g. "JCB Overlay 0000".
  • Map is 128 tiles wide and 18 tiles tall. But not all map space is used. The remainder is garbage. In reality, Level 1,2,3 are 80 tiles wide. Level 4 is 112 tiles wide.
  • Each level has it's own palette of 16 colours. The palette for level 1 is at &87b3, level 2 is &87c3, level 3 is &87d3, level 4 is at &87e3. The palette is stored backwards with pen 15 first, then 14 all the way down to 0.
  • "Macro tile map" uses 64 bytes. It is stored at offset +0x01a0 from the start of the level's data. Each byte is a macro tile id. Each macro tile is 4 tiles wide and 9 tiles tall. The data is copied to &BF90 and this is where the runtime uses it from.
  • The tile ids per macro block are stored at offset +0x09e0 from the start of the level's data. The data is encoded as 7 bits per tile all put together. It is decoded to &31a0 overwriting the level data. This is copied to &9600-&9720,&9e00-&9f20,&a600-&a720,&ae00-&af20. The runtime uses the data from &9600. The ids are stored pre-multiplied by 2.


Tiles

  • 2048 bytes for tile graphics. These are defined per-level. These are stored at +&1e0 from the level data. They are copied from &31e0 in 4 parts. There are 128 possible tiles. Runtime ranges: &e600-&e800, &ee00-&f000, &f600-&f800, &fe00-&ffff.
  • Tile graphics are 4 pixels wide and 8 pixels tall. Each tile's graphics uses 16 bytes. Tiles are stored uncompressed, left-right and top to bottom.

Sprites

  • Sprites for all levels are loaded at once and use ~13KB. They are located at &4a80-&7fff in main ram.

Video

{{#ev:youtube|Fc8GDlw2nys|450}}

Links