Difference between revisions of "Renegade"

From CPCWiki - THE Amstrad CPC encyclopedia!
Jump to: navigation, search
(Technical)
(Technical)
Line 14: Line 14:
  
 
== Technical ==
 
== 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 upside down in memory.
 
* Sprites are stored as mode 0 with pen 0 as transparent.
 
* Sprites are stored as mode 0 with pen 0 as transparent.
* Sprites are flipped by code in realtime (e.g. the facing right sprite is a flip of the facing left sprite).
+
* 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.).
* Sprites are stored in multiple parts and are composed during drawing. Each part has an x,y offset, width and height based on the sprite's coordinates. Therefore heads, bodies and legs are separate. This allows re-use for all characters and enemies.
+
* 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.
* Sprites are stored as follows:
+
* Sprite pixel data is stored as follows:
  
1 byte normal (to write to mode 0 screen), followed by 1 byte with pixels swapped, then this repeats.
+
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 will remain more constant.
+
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.
  
* Supports 128K RAM. All levels are loaded at once. Each level takes &1000 bytes. There are 4 stored in 1 16KB page.
+
* Characters are sorted by their y position each frame. They are then draw in increasing y coordinate order.
* 2048 bytes for tile graphics. These are defined per-level. These are copied from &31e0 in 4 parts. There are 128 possible tiles. Runtime ranges: &e600-&e800, &ee00-&f000, &f600-&f800, &fe00-&ffff.
+
* Tiles 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.
+
* "Macro tile map" uses 64 bytes. Each byte is 4 tiles wide and 9 tiles tall. Macro tile map's runtime location is at &BF90. Data at 9600 defines actual tiles to use.
+
  
* Sprites for all levels are loaded at once and use ~13KB. They are located at &4a80-&7fff in main ram.
+
=== Levels ===
* 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.
+
* 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.
  
* Map is 128 tiles wide and 18 tiles tall, but not all map width 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, down to 0.
+
=== 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 ==
 
== Video ==

Revision as of 07:33, 17 February 2019

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