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

pull/155/head
tron 20 years ago
parent 4c2c2c53fe
commit f09807920f

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

Loading…
Cancel
Save