MapRewriteTron2

An interesting idea by Tron, where he states that only a GroundTile needs the groundstuff. This way only the ground-tiles use 128 bits, all others 96. The only downside is that the union-structs are restricted to 6 bytes max, and there can be only 16 of them. We already had trouble stuffing 'this junk' into 7 bytes, but 6 will just pretty much kill off any future expansion ideas. (Darkvater)

#include <stdio.h>

typedef unsigned char  uint8;
typedef unsigned short uint16;
typedef unsigned int   uint32;

typedef struct Ground {
	uint16 height:4;
	uint16 N:3; // height_N = (height << 3) + N
	uint16 W:3; // height_W = (height << 3) + W
	uint16 S:3; // height_S = (height << 3) + S
	uint16 E:3; // height_E = (height << 3) + E
	uint16 ground:12; // type of ground: grass (1/3, 2/3, 3/3), desert (1/4, ...), snowt (1/4, ...), water (for every possible slope combination), fields
	uint16 counter:4;
} Ground;

typedef struct Tile {
	struct Tile* next;
	union { // 6 bytes per type maximum

		struct {
			uint16 index; // index into industries array
			uint8 type; // type of the industry (graphics)
			uint8 animation; // animation states of industry
			uint8 sound:1; // sound-effect generated
			uint8 built:1; // under construction
			uint8 counter:3; // counstruction counter
			uint8 stage:2; // stage of construction
		} industry;

		struct {
			uint16 index; // index of the station
			uint16 part:12; // type of station, increase from :7 to accomodate more graphics
			uint16 track_type:3; // rail, electric rail, monorail, trams, maglev ...
		} station;

		struct { // perhaps eleminate this and handle in orders (go to tileindex)
			uint8 track_type:4; // rail, electric rail, monorail, trams, maglev ...
			uint8 dir:1;        // direction
			uint8 type:1;       // road or rail if we want road checkpoints later on (should this be in track_type?)
		} checkpoint; /* 48 bits */

		struct {
			uint8 track_type:3; // rail, electric rail, monorail, trams, maglev ...
			uint8 type:4;       // road, rail, water
			uint8 section:4;    // part of the depot (ship depots)
			uint8 dir:2;        // direction
		} depot;

		struct {
			uint16 tracks:10; // which tracks are present
			uint16 fences:4; // fences for tracks (full-detail)
			uint16 slope_direction:2; // direction the track inclines
			uint8 steepness:2; // steepness of the slope
			uint8 track_type:3; // what type of track
			uint8 height_lower:3; // height = (height_upper << 3) + height_lower
			uint8 basis; // 0 = nothing (see ground), diverse bridges, tunnel entrance, ...
			struct {
				uint8 present:2; // what signals are found (1 left, 1 right, 2, none)
				uint8 type:3; // type of signals/presignals, maybe advanced later on
				uint8 semaphore:1; // ???
				uint8 status:2; // status of the signal (red, green, orange?)
			} signal[2];
		} rail;

		struct {
			uint8 basis; // 0 = nothing (see ground), diverse bridges, tunnel entrance, ...
			uint8 slope_direction:2; // direction the track inclines
			uint8 steepness:2; // steepness of the slope
			uint8 N:1; // availible directions
			uint8 W:1;
			uint8 S:1;
			uint8 E:1;
			uint8 height_lower:3; // height = (height_upper << 3) + height_lower
		} road;

		struct {
			uint8 road_owner; // owner of the road (track owner is in Tile)
			uint8 track_type:4; // rail-types
			uint8 direction:2;
			uint8 closed:1;
		} crossing;

		struct {
			uint16 index;
			uint16 pos:7; // position of the lift
			uint16 dest:7; // final positions of lift
			uint16 type:11; // building building type
			uint16 stage:2; // counstruction counter
			uint16 counter:3; // stage of construction
		} town;

		struct {
			uint8 type[4];
			uint8 growth0:4;
			uint8 growth1:4;
			uint8 growth2:4;
			uint8 growth3:4;
		} trees;

		struct {
			uint16 hedge_NE:4;
			uint16 hedge_NW:4;
			uint16 hedge_SW:4;
			uint16 hedge_SE:4;
		} field;

		struct {
			uint8 type; // unmoveables like transmitter, lighthouse, HQ
		} unmovable;
	};
	uint8 owner;
	uint8 type:4;
	uint8 height_upper:4;
} Tile;

Ground _ground[256][256];
Tile _map[256][256];
Tile _pool[1024]; // just random numbers

Ground ground;
Tile tile;

int main(void)
{
	printf("ground       %d\n", sizeof(ground));
	printf("tile         %d\n", sizeof(tile));
	printf("+-industry   %d\n", sizeof(tile.industry));
	printf("+-station    %d\n", sizeof(tile.station));
	printf("+-checkpoint %d\n", sizeof(tile.checkpoint));
	printf("+-depot      %d\n", sizeof(tile.depot));
	printf("+-rail       %d\n", sizeof(tile.rail));
	printf("+-road       %d\n", sizeof(tile.road));
	printf("+-crossing   %d\n", sizeof(tile.crossing));
	printf("+-town       %d\n", sizeof(tile.town));
	printf("+-trees      %d\n", sizeof(tile.trees));
	printf("+-field      %d\n", sizeof(tile.field));
	printf("+-unmovable  %d\n", sizeof(tile.unmovable));
	return 0;
}