The biggest drawback of this struct is that Industry is 48!! bits, this makes the total map into 160 bits which is just HUGE. Working on it to decrease its size.
#include <stdio.h> #define MAPSIZEX 1024 #define MAPSIZEY 1024 typedef unsigned char uint8; typedef unsigned short uint16; typedef unsigned long uint32; /* splitting original uint8 type:5 into type and amount will need a rewrite of the tile processing for ground structs. Either that, or we use the original layout: uint8 type:5; uint8 counter:2; */ typedef struct ground_t { uint8 type:4; // bare band, grass, snow, desert, rocks, etc. uint8 amount:2; // amount of snow, grass uint8 counter:2; // update counter } ground_t; // 8 bits typedef struct water_t { uint8 type:3; // water/coast/canal /* I think part:4 was here because of ship docks, but that is moved to depots_t now. So it is not needed. I can however see future in another struct like: uint8 special:2; which would put ice onto the graphic water etc. for higher situated water (eg. lakes) uint8 part:4; // for the canal locks */ /* 3/5 bits free */ } water_t; // 8 bits typedef struct bridge_t { /* Tron suggested a uint8 index; that indexes into an array, which based on this index gets the right image needed. This would replace the, below, 4 different packed variables and code with one and a static const array. road/rail-type is not needed, it is stored on the tile above */ uint8 type:4; // type of bridge, e.g. wooden, concrete, tubular uint8 dir:2; // direction, we want to allow more than just two in the future 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 } bridge_t; // 8 bits typedef struct support_t { // Blathijs needs to detail this uint8 type:4; // different types of support, also depending on year /* 4 bits free */ } support_t; // 8 bits typedef struct industry_t { uint16 type; // type of the industry (graphics) uint8 index; // index into industries array uint8 sound:1; // sound-effect generated uint8 built:1; // under construction uint8 counter:3;// counstruction counter uint8 stage:2; // stage of construction uint8 animation;// animation states of industry (6 bits, some toyland 8 bits) /* 9 bits free */ } industry_t; // 48 bits typedef struct station_t { uint16 index; // index of the station uint16 part:12; // type of station, increase from :7 to accomodate more graphics uint16 track_type:4;// rail, electric rail, monorail, trams, maglev ... } station_t; // 32 bits typedef struct checkpoint_t { uint16 dir:1; // direction uint16 type:1; // road or rail if we want road checkpoints later on uint16 track_type:4; // rail, electric rail, monorail, trams, maglev ... /* 10 bits free */ } checkpoint_t; // 16 bits typedef struct depot_t { uint8 dir:2; // direction uint8 type:4; // road, rail, water uint8 section:4; // part of the depot (ship depots) uint8 track_type:4; // rail, electric rail, monorail, trams, maglev ... /* 2 bits free */ } depot_t; // 16 bits //This might end up in the support_t stuff one day typedef struct tunnel_t { uint8 type:2; // road or rail uint8 dir:2; // direction uint8 track_type:4; // well .. you got the point } tunnel_t; // 8 bits typedef struct canal_t { uint8 dir:1; // direction of locks uint8 type:3; // canal or lock or water uint8 part:3; // part of the lock uint8 status; // REAL locks sometime, we need status of the doors/lift /* 1 bit free */ } canal_t; // 16 bits typedef struct signal_t { 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;// semaphore uint8 status:2; // status of the signal (red, green, orange?) } signal_t; // 8 bits typedef struct track_t { uint16 tracks:13; // which tracks are present uint16 track_type:3; // what type of track (should be 4?) signal_t signal[2]; // signals on the tile (2x 8 bits) } track_t; // 32 bits typedef struct tram_t { // empty currently uint8 nothing; } tram_t; typedef struct road_t { uint8 type:3; // type of the road-underground grass, snow, paved, streetlight uint8 pieces; // roads which are present on a tile /* 5 bits free */ } road_t; // 16 bits typedef struct roadnrail_t { //this is for diagonal roads, if we wanna have //road and rail side-by-side uint8 trackbits; // 0 - horizontal, 1 - vertical uint8 roadpieces; // roads present on a tile signal_t signal; // only one signal can be here uint8 road_owner; // owner of the road (track owner is in Tile) } roadnrail_t; // 32 bits typedef struct crossing_t { uint8 road_owner; // owner of the road (track owner is in Tile) uint8 dir:2; // do we want to be more flexible in the future uint8 lights:1; // crossing lights on/off uint8 type:3; // type of crossing, grass, snow, paved, streetlights uint8 track_type:4; // rail-types /* 6 bits free */ } crossing_t; // 24 bits typedef struct lift_t { uint8 pos:7; // position of the lift uint8 moving:1; // is it moving? uint8 dest:6; // final positions of lift divided by 6 /* 2 bits free */ } lift_t; // 16 bits typedef struct town_t { uint8 type; // town building type uint8 stage:2; // stage of construction uint8 counter:3; // construction counter lift_t lift; // lift /* 3 bits free */ } town_t; // 32 bits typedef struct trees_t { uint8 type; // type of trees uint8 counter:4; // update counter uint8 count:2; // number of trees uint8 growth:3; // growth status uint8 hedge_SW:3; // hedges on SW border uint8 hedge_SE:3; // hedges on SE border /* 1 bit free */ } trees_t; // 24 bits typedef struct fields_t { uint8 type:4; // type of farm-fields uint8 counter:2; // update counter for fields uint8 hedge_SW:3; // hedges on SW border uint8 hedge_SE:3; // hedges on SE border /* 4 bits free */ } fields_t; // 16 bits typedef struct unmovable_t { uint8 type; // unmoveables like transmitter, lighthouse, HQ } unmovable_t; // 8 bits typedef struct Tile { struct Tile *next; // 32/64 bits // IS THIS REALLY NEEDED????? // 1. tileh // 2. altitude of a given corner // is more then enough to get any tile's information // Or we could also do: // 1. z (height) of a given corner // 2. bitpacked altitude of all 4 corners with only 1, 0 (0, same level, 1 higher) uint8 altitude_N; //NO_BP // 8 uint8 altitude_S; //NO_BP // 8 uint8 altitude_E; //NO_BP // 8 uint8 altitude_W; //NO_BP // 8 uint8 owner; // 8 uint8 groundtype:3; // \___ 8 uint8 buildtype:5; // / union { ground_t ground; // 8 water_t water; // 7 (+1 8) bridge_t bridge; // 7 (+1 8) support_t support; // 4 (+4 8) } surface; // 8 union { industry_t industry; // 39 (+9 48) station_t station; // 30 (+2 32) checkpoint_t checkpoint; // 6 (+2 8) depot_t depot; // 6 (+2 8) tunnel_t tunnel; // 7 (+1 8) canal_t canal; // 13 (+3 16) track_t track; // 32 tram_t tram; // - road_t road; // 10 (+6 16) crossing_t crossing; // 12 (+4 16) town_t town; // 27 (+5 32) trees_t trees; // 17 (+7 24) fields_t fields; // 16 unmovable_t unmovable; // 16 } build; // 32 } Tile; Tile _map[MAPSIZEX][MAPSIZEY]; int main ( void ) { printf("Tile (total): %d (Mapsize %dx%d %dKB)\n",sizeof(_map[0][0])*8, MAPSIZEX, MAPSIZEY, sizeof(_map)/1024); printf("|-- ground:\t %d\n",sizeof(_map[0][0].surface)*8); printf("|-- build:\t%d\n",sizeof(_map[0][0].build)*8); printf("-----------------------------------\n"); printf("Ground:\t\t %d\n",sizeof(ground_t)*8); printf("Water:\t\t %d\n",sizeof(water_t)*8); printf("Bridge:\t\t %d\n",sizeof(bridge_t)*8); printf("Support:\t %d\n",sizeof(support_t)*8); printf("-----------------------------------\n"); printf("Industry\t%d\n",sizeof(industry_t)*8); printf("Station\t\t%d\n",sizeof(station_t)*8); printf("Checkpoint\t%d\n",sizeof(checkpoint_t)*8); printf("Depot\t\t%d\n",sizeof(depot_t)*8); printf("Tunnel\t\t %d\n",sizeof(tunnel_t)*8); printf("Canal:\t\t%d\n",sizeof(canal_t)*8); printf("Tracks\t\t%d\n",sizeof(track_t)*8); printf("Trams\t\t %d\n",sizeof(tram_t)*8); printf("Road:\t\t%d\n",sizeof(road_t)*8); printf("Crossing:\t%d\n",sizeof(crossing_t)*8); printf("Town:\t\t%d\n",sizeof(town_t)*8); printf("Trees:\t\t%d\n",sizeof(trees_t)*8); printf("Fields:\t\t%d\n",sizeof(fields_t)*8); printf("Unmovable:\t %d\n",sizeof(unmovable_t)*8); return 0; }