1
0
Fork 0

(svn r1779) Make the map generation code slightly more readable

release/0.4.5
tron 2005-02-03 20:52:12 +00:00
parent f42e8ac3d2
commit 5e1364daeb
1 changed files with 82 additions and 79 deletions

View File

@ -487,21 +487,15 @@ void InitializeLandscape(uint log_x, uint log_y)
void ConvertGroundTilesIntoWaterTiles(void) void ConvertGroundTilesIntoWaterTiles(void)
{ {
uint tile = 0; TileIndex tile = 0;
int h; int h;
while(true) { for (tile = 0; tile < MapSize(); ++tile) {
if (IsTileType(tile, MP_CLEAR) && GetTileSlope(tile, &h) == 0 && h == 0) { if (IsTileType(tile, MP_CLEAR) && GetTileSlope(tile, &h) == 0 && h == 0) {
SetTileType(tile, MP_WATER); SetTileType(tile, MP_WATER);
_map5[tile] = 0; _map5[tile] = 0;
_map_owner[tile] = OWNER_WATER; _map_owner[tile] = OWNER_WATER;
} }
tile++;
if (TileX(tile) == MapMaxX()) {
tile += TILE_XY(-(int)MapMaxX(), 1);
if (TileY(tile) == MapMaxY())
break;
}
} }
} }
@ -511,9 +505,12 @@ static const byte _genterrain_tbl_2[5] = { 0, 0, 0, 0, 33 };
static void GenerateTerrain(int type, int flag) static void GenerateTerrain(int type, int flag)
{ {
uint32 r; uint32 r;
uint x,y; uint x;
int w,h; uint y;
byte *p,*tile; uint w;
uint h;
const byte *p;
byte *tile;
byte direction; byte direction;
r = Random(); r = Random();
@ -526,10 +523,14 @@ static void GenerateTerrain(int type, int flag)
if (x < 2 || y < 2) if (x < 2 || y < 2)
return; return;
direction = (byte)(r >> 22) & 3; direction = (r >> 22) & 3;
w = p[2]; if (direction & 1) {
h = p[1]; w = p[1];
if (direction & 1) { w = p[1]; h = p[2]; } h = p[2];
} else {
w = p[2];
h = p[1];
}
p += 8; p += 8;
if (flag & 4) { if (flag & 4) {
@ -562,54 +563,66 @@ static void GenerateTerrain(int type, int flag)
if (y + h >= MapMaxY() - 1) if (y + h >= MapMaxY() - 1)
return; return;
tile = &_map_type_and_height[TILE_XY(x,y)]; tile = &_map_type_and_height[TILE_XY(x, y)];
if (direction == 0) { switch (direction) {
do { case 0:
int w_cur = w;
byte *tile_cur = tile;
do { do {
if (*p >= *tile_cur) *tile_cur = *p; byte *tile_cur = tile;
p++; uint w_cur;
tile_cur++;
} while (--w_cur != 0); for (w_cur = w; w_cur != 0; --w_cur) {
tile += TILE_XY(0,1); if (*p >= *tile_cur) *tile_cur = *p;
} while (--h != 0); p++;
} else if (direction == 1) { tile_cur++;
do { }
int h_cur = h; tile += TILE_XY(0, 1);
byte *tile_cur = tile; } while (--h != 0);
break;
case 1:
do { do {
if (*p >= *tile_cur) *tile_cur = *p; byte *tile_cur = tile;
p++; uint h_cur;
tile_cur+=TILE_XY(0,1);
} while (--h_cur != 0); for (h_cur = h; h_cur != 0; --h_cur) {
tile++; if (*p >= *tile_cur) *tile_cur = *p;
} while (--w != 0); p++;
} else if (direction == 2) { tile_cur += TILE_XY(0, 1);
tile += w - 1; }
do { tile++;
int w_cur = w; } while (--w != 0);
byte *tile_cur = tile; break;
case 2:
tile += TILE_XY(w - 1, 0);
do { do {
if (*p >= *tile_cur) *tile_cur = *p; byte *tile_cur = tile;
p++; uint w_cur;
tile_cur--;
} while (--w_cur != 0); for (w_cur = w; w_cur != 0; --w_cur) {
tile += TILE_XY(0,1); if (*p >= *tile_cur) *tile_cur = *p;
} while (--h != 0); p++;
} else { tile_cur--;
tile += (h - 1) * TILE_XY(0,1); }
do { tile += TILE_XY(0, 1);
int h_cur = h; } while (--h != 0);
byte *tile_cur = tile; break;
case 3:
tile += TILE_XY(0, h - 1);
do { do {
if (*p >= *tile_cur) *tile_cur = *p; byte *tile_cur = tile;
p++; uint h_cur;
tile_cur-=TILE_XY(0,1);
} while (--h_cur != 0); for (h_cur = h; h_cur != 0; --h_cur) {
tile++; if (*p >= *tile_cur) *tile_cur = *p;
} while (--w != 0); p++;
tile_cur -= TILE_XY(0, 1);
} while (--h_cur != 0);
tile++;
} while (--w != 0);
break;
} }
} }
@ -618,9 +631,9 @@ static void GenerateTerrain(int type, int flag)
static void CreateDesertOrRainForest(void) static void CreateDesertOrRainForest(void)
{ {
uint tile; TileIndex tile;
const TileIndexDiffC *data; const TileIndexDiffC *data;
int i; uint i;
for (tile = 0; tile != MapSize(); ++tile) { for (tile = 0; tile != MapSize(); ++tile) {
for (data = _make_desert_or_rainforest_data; for (data = _make_desert_or_rainforest_data;
@ -632,7 +645,7 @@ static void CreateDesertOrRainForest(void)
SetMapExtraBits(tile, 1); SetMapExtraBits(tile, 1);
} }
for(i=0; i!=256; i++) for (i = 0; i != 256; i++)
RunTileLoop(); RunTileLoop();
for (tile = 0; tile != MapSize(); ++tile) { for (tile = 0; tile != MapSize(); ++tile) {
@ -648,45 +661,35 @@ static void CreateDesertOrRainForest(void)
void GenerateLandscape(void) void GenerateLandscape(void)
{ {
int i,flag; uint i;
uint flag;
uint32 r; uint32 r;
if (_opt.landscape == LT_HILLY) { if (_opt.landscape == LT_HILLY) {
i = ScaleByMapSize((Random() & 0x7F) + 950); for (i = ScaleByMapSize((Random() & 0x7F) + 950); i != 0; --i)
do {
GenerateTerrain(2, 0); GenerateTerrain(2, 0);
} while (--i);
r = Random(); r = Random();
flag = (r & 3) | 4; flag = (r & 3) | 4;
i = ScaleByMapSize(((r >> 16) & 0x7F) + 450); for (i = ScaleByMapSize(((r >> 16) & 0x7F) + 450); i != 0; --i)
do {
GenerateTerrain(4, flag); GenerateTerrain(4, flag);
} while (--i);
} else if (_opt.landscape == LT_DESERT) { } else if (_opt.landscape == LT_DESERT) {
i = ScaleByMapSize((Random()&0x7F) + 170); for (i = ScaleByMapSize((Random()&0x7F) + 170); i != 0; --i)
do {
GenerateTerrain(0, 0); GenerateTerrain(0, 0);
} while (--i);
r = Random(); r = Random();
flag = (r & 3) | 4; flag = (r & 3) | 4;
i = ScaleByMapSize(((r >> 16) & 0xFF) + 1700); for (i = ScaleByMapSize(((r >> 16) & 0xFF) + 1700); i != 0; --i)
do {
GenerateTerrain(0, flag); GenerateTerrain(0, flag);
} while (--i);
flag ^= 2; flag ^= 2;
i = ScaleByMapSize((Random() & 0x7F) + 410); for (i = ScaleByMapSize((Random() & 0x7F) + 410); i != 0; --i)
do {
GenerateTerrain(3, flag); GenerateTerrain(3, flag);
} while (--i);
} else { } else {
i = ScaleByMapSize((Random() & 0x7F) + (3 - _opt.diff.quantity_sea_lakes) * 256 + 100); i = ScaleByMapSize((Random() & 0x7F) + (3 - _opt.diff.quantity_sea_lakes) * 256 + 100);
do { for (; i != 0; --i)
GenerateTerrain(_opt.diff.terrain_type, 0); GenerateTerrain(_opt.diff.terrain_type, 0);
} while (--i);
} }
ConvertGroundTilesIntoWaterTiles(); ConvertGroundTilesIntoWaterTiles();