MapRewrite
#include <stdio.h>
#define MAPSIZEX 1024
#define MAPSIZEY 1024

typedef signed char int8;
typedef unsigned char uint8;
typedef unsigned short uint16;
typedef unsigned long uint32;

//#define PACK // uncomment at will

#ifdef PACK
#pragma pack(push, 1)
#endif

// Maybe the numbers should be changed later on but I'll dig into this later.
enum Transport_Types {
  // WARNING!
  // Be sure to code as such that changing one (or more) of these numbers don't break the code!
  TT_ROAD   = 0,
  TT_RAIL   = 1,
  TT_ERAIL  = 2,
  TT_MONO   = 3,
  TT_MAGLV  = 4,
  TT_TRAM   = 5,
  TT_WATER  = 14,
  TT_AIR    = 15,
};

/* This layout allow vertical walls to exist. between tiles
 * North corner altitude = altitude*4 + height_N
 * total altitude range 0 - 68                    
 */
typedef struct Height_t {
  uint16 altitude:4;    // height of tile
  uint16 height_N:3;    // offset of North corner from height
  uint16 height_E:3;    // offset of East corner from height
  uint16 height_W:3;    // offset of West corner from height
  uint16 height_S:3;    // offset of South corner from height
  /* 0 unused bits */
} Height_t; /* 16 bits */

/********************** Surface Tile types ********************/
/* just a basic ground tile */
typedef struct Ground_t {
  uint8 ground_type:4;  // grass, desert, rocks, snow ..
  uint8 amount:2;       // amount of grass, desert and stuff.
  uint8 counter:2;      // update counter
  /* 8 unused bits */
} Ground_t; /* 16 bits */

/* foundation tile 
*/
typedef struct Foundation_t {
  uint8 type:4;         // uses 3 bits now, could be more in the future
  uint8 ground_type:4;  // backup of Ground_t.ground_type to grow back farms, etc.
  /* 8 unused bits */
} Foundation_t; /* 16 bits */


typedef struct Water_t {
  uint8 type:4;         // water/coast/canal
  uint8 shores:4;       // cache for which edge is a shore/water
  /* 8 unused bits */
} Water_t; /* 16 bits */

typedef struct Bridge_t {
  uint8 type:4;         // type of bridge, e.g. wooden, concrete, tubular
  uint8 part:4;         // hmm, donnu what this is supposed to be??
  uint8 dir:3;          // direction of bridge
  uint8 section:1;      // is it a middle part, or a "endcap"? endcaps will not be needed for cliffs maybe
  uint8 ending:1;       // northern/southern end of bridge
  /* 3 unused bits */
} Bridge_t; /* 16 bits */

/* Blathijs needs to detail this */
typedef struct Support_t {
  uint8 type;           // different types of support, also depending on year
  uint8 reserved;       // whatever we need to put there
  /* 0 unused bits */
} Support_t; /* 16 bits */

/* here come all things that are underground, for example tunnels,
   underground stations and the like */
typedef struct Underground_t {
  uint8 type:8;         // something
  /* 8 unused bits */
} Underground_t; /* 16 bits */


/********************** Build Tile types **********************/
typedef struct Industry_t {
  uint16 gfx;           // index into industries array
  uint8 type;           // type of the industry (graphics)
  uint8 animation;      // animation states of industry (6 bits, some toyland 8 bits)
  uint8 sound:1;        // sound-effect generated
  uint8 built:1;        // under construction
  uint8 counter:3;      // counstruction counter
  uint8 stage:2;        // stage of construction
  /* 9 unused bits */
} Industry_t; /* 48 bits */

typedef struct Stop_t {
  uint8 status;           // status of the RV stop
  /* here we store which of the two bays is in use, if there is a vehicle driving
     around in the stop and the like. maybe we can merge the slots in there. */
  uint8 slotA:4;          // TTL of the first slot
  uint8 slotB:4;          // TTL of the second stot
  /* 0 unused bits */
} Stop_t; /* 16 bits */

typedef struct Station_t {
  uint16 index;           // index of the station
  uint16 gfx:12;          // type of station (graphics)
  uint16 transport_type:4;// rail, electric rail, monorail, trams, maglev ...
  union {
    Stop_t stop;          // this clarifies the status of a stop (16 bits)
    /* in case we put other things here for different station types (as identified
       by transport_type), they should be a maximum of 16 bits in lengh */
  } status;
  /* 0 unused bits */
} Station_t ; /* 48 bits */

typedef struct Checkpoint_t {
  uint16 index;           // index of the checkpoint (allowing checkpoints to spawn across tiles)
  uint8 gfx;              // type of checkpoint (graphics)
  uint8 dir:2;            // direction, unused for buoys
  uint8 transport_type:4; // road/rail/water(buoys)
  /* 18 unused bits */
} Checkpoint_t; /* 48 bits */

typedef struct Depot_t {
  uint8 part;             // part of the depot (ship depots, large train depots .. )
  uint8 transport_type:4; // road/rail/water
  uint8 dir:2;            // direction (facing of opening)
  /* 34 unused bits */
} Depot_t; /* 48 bits */

/* REAL locks sometime, we need status of the doors/lift, which will be placed here.
   Someone just has to code the graphics and the system in the program */
typedef struct Locks_t {
  uint8 status;           // locks status open/closed, etc.
  uint8 dir:2;            // direction of locks
  uint8 type:3;           // Sea or in-land locks ???
  uint8 part:3;           // part of the lock
  /* 32 unused bits */
} Locks_t; /* 48 bits */

typedef struct Track_t {
  uint8 transport_type:4; // type of transport to be used train/bus/tram, etc.
  uint8 ground_fence:1;   // is the ground fence for this part present?
  uint8 reserved:1;       // this part of track is reserved
  /* signal part */
  uint8 sig_status1:2;    // red / green / yellow / blue one way
  uint8 sig_status2:2;    // the other way
  uint8 sig_present:2;    // which directions are found
  uint8 sig_type:3;       // presignals, normal signals, new types ...
  uint8 sig_semaphore:1;  // signal or semaphores
  /* 0 unused bits */
} Track_t; /* 16 bits */

/* All road and rail types go here */
typedef struct Transport_t {
  uint8 pieces;           // what bits of transport are present (8 bits for road)
  //the "other half" is either the southern or the western part of the tile
  uint8 second_owner;     // who owns the "other half" of a 'doubly-built' tile?
  struct Track_t track_info[2];  // track information as layout, signal, etc. (2x16 bits)
} Transport_t; /* 48 bits */

typedef struct Lift_t {
  uint8 pos:7;            // position of the lift
  uint8 moving:1;         // is the lift moving or not?
  uint8 dest:6;           // final position of lift
  /* 2 unused bits */
} Lift_t; /* 16 bits */

typedef struct Town_t {
  struct Lift_t lift;     // lift (16 bits)
  uint16 index:11;        // index to which town a building belongs to
  uint16 stage:2;         // stage of construction
  uint16 counter:3;       // construction counter
  uint8 gfx;              // town building type (graphics)
  /* 8 unused bits */
} Town_t; /* 48 bits */

typedef struct Hedge_t {
  uint8 hedge_SW:4;       // hedge-type on SW border
  uint8 hedge_SE:4;       // hedge-type on SE border
  uint8 hedge_NE:4;       // hedge-type on NE border
  uint8 hedge_NW:4;       // hedge-type on NW border
  /* 0 unused bits */
} Hedge_t; /* 16 bits */

typedef struct Trees_t {
  uint8 type;             // type of trees
  uint8 counter:4;        // update counter
  uint8 count:2;          // number of trees
  /* 2 unused bits */
  struct Hedge_t hedge;   // type of hedge for wild-reverse (16 bits)
  uint16 growthA:3;       // growth status of tree A
  uint16 growthB:3;       // growth status of tree B
  uint16 growthC:3;       // growth status of tree C
  uint16 growthD:3;       // growth status of tree D
  /* 4 unused bits */
} Trees_t; /* 48 bits */

typedef struct Fields_t {
  struct Hedge_t hedge;   // type of hedge for farmfields (16 bits)
  uint8 type:4;           // type of farm-fields
  uint8 counter:2;        // update counter for fields
  /* 26 unused bits */
} Fields_t; /* 48 bits */

typedef struct Unmovable_t {
  uint8 type;             // unmoveables like transmitter, lighthouse, HQ
  /* 40 unused bits */
} Unmovable_t; /* 48 bits */

/********************** _map Tile struct **********************/
typedef struct Tile {
  struct Tile *next;      // pointer to bridge/tunnel, etc. 32/64 bits arch dep.
  Height_t height;        // altitude information
  uint8 owner;            // owner of a tile, 255 no-owner ??
  uint8 surface_class:3;  // class of a surface  on a tile. Directs to surface_t union
  uint8 build_class:5;    // class of a building on a tile. Directs to build_t union
  union {
    Ground_t ground;          // basic ground type
    Foundation_t foundation;  // underground for roads/trams as paved street, etc.
    Water_t water;            // water, coast, canals
    Bridge_t bridge;          // bridge type, section, directoin, etc.
    Support_t support;        // Blathijs needs to detail this
    Underground_t underground;// all underground stuff
  } surface;  /* 16 bits */

  union {
    Industry_t industry;      // industry tiles
    Station_t station;        // station tiles
    Checkpoint_t checkpoint;  // checkpoint tiles
    Depot_t depot;            // depot tiles, road/train but also ship depots
    Locks_t locks;            // locks for canals
    Transport_t transport;    // all kinds of roads, and rail, incl. tram
    Town_t town;              // town (houses, offices) tiles
    Trees_t trees;            // tree tile types
    Fields_t fields;          // farm fields tile types
    Unmovable_t unmovable;
  } build; /* 48 bits */
  /* 0 unused bits */
} Tile; /* 128 bits */
#ifdef PACK
#pragma pack(pop)
#endif

Tile _map[MAPSIZEX][MAPSIZEY];

int main ( void ) {
  printf("Tile\n");
  printf("|-- *next:          %3d\n", sizeof(_map[0][0].next)*8);
  printf("|-- height:         %3d\n", sizeof(_map[0][0].height)*8);
  printf("|-- owner:          %3d\n", sizeof(_map[0][0].owner)*8);
  printf("|-- class:            8\n");
  printf("|-- surface:        %3d\n",sizeof(_map[0][0].surface)*8);
  printf("    |-- barren:          %3d\n",sizeof(_map[0][0].surface.ground)*8);
  printf("    |-- foundation:      %3d\n",sizeof(_map[0][0].surface.foundation)*8);
  printf("    |-- water:           %3d\n",sizeof(_map[0][0].surface.water)*8);
  printf("    |-- bridge:          %3d\n",sizeof(_map[0][0].surface.bridge)*8);
  printf("    |-- support:         %3d\n",sizeof(_map[0][0].surface.support)*8);
  printf("    |-- underground:     %3d\n",sizeof(_map[0][0].surface.underground)*8);
  printf("|-- build:          %3d\n",sizeof(_map[0][0].build)*8);
  printf("    |-- industry         %3d\n",sizeof(_map[0][0].build.industry)*8);
  printf("    |-- station          %3d\n",sizeof(_map[0][0].build.station)*8);
  printf("    |-- checkpoint       %3d\n",sizeof(_map[0][0].build.checkpoint)*8);
  printf("    |-- depot            %3d\n",sizeof(_map[0][0].build.depot)*8);
  printf("    |-- locks:           %3d\n",sizeof(_map[0][0].build.locks)*8);
  printf("    |-- transport:   %3d\n",sizeof(_map[0][0].build.transport)*8);
  printf("        |-- trackinfo:      %3d\n",sizeof(_map[0][0].build.transport.track_info[0]) * 8);
  printf("        |-- trackinfo:      %3d\n",sizeof(_map[0][0].build.transport.track_info[1]) * 8);
  printf("    |-- town:            %3d\n",sizeof(_map[0][0].build.town)*8);
  printf("        |-- lift            %3d\n",sizeof(_map[0][0].build.town.lift)*8);
  printf("    |-- trees:           %3d\n",sizeof(_map[0][0].build.trees)*8);
  printf("        |-- hedges          %3d\n", sizeof(_map[0][0].build.trees.hedge)*8);
  printf("    |-- fields:          %3d\n",sizeof(_map[0][0].build.fields)*8);
  printf("        |-- hedges          %3d\n", sizeof(_map[0][0].build.fields.hedge)*8);
  printf("    |-- unmovable:       %3d\n\n",sizeof(_map[0][0].build.unmovable)*8);
  printf("Tile (total size):  %3d (Mapsize %dx%d %dKB)\n",sizeof(_map[0][0])*8, MAPSIZEX, MAPSIZEY, sizeof(_map)/1024);
  printf("Compr. (50/%3d):               %2.1f%%\n", sizeof(_map[0][0])*8, 5000.0/(sizeof(_map[0][0])*8));
  printf("Compr. without *next(50/%3d):  %2.1f%%\n", (sizeof(_map[0][0])-sizeof(_map[0][0].next))*8, 5000.0/((sizeof(_map[0][0])-sizeof(_map[0][0].next))*8));
  printf("--The higher value the better the compression.\n");
  printf("Old-Tile (total):   %3.0f (Mapsize %dx%d %.0fKB)\n", 6.25*8, MAPSIZEX, MAPSIZEY, (6.25*MAPSIZEX*MAPSIZEY)/1024);
  return 0;
}