1
0
Fork 0

(svn r2739) -Fix(?): Change the fence algorithm so it removes fences when no farm tile is adjacent

release/0.4.5
tron 2005-07-28 19:23:19 +00:00
parent 64ac1a6414
commit 177fa1d163
1 changed files with 19 additions and 42 deletions

View File

@ -570,88 +570,65 @@ static void AnimateTile_Clear(TileIndex tile)
void TileLoopClearHelper(TileIndex tile) void TileLoopClearHelper(TileIndex tile)
{ {
byte img_1; byte self;
byte img_2; byte neighbour;
static const byte img_by_map5[] = { 0, 0, 0, 2, 1, 1, 0, 0 };
TileIndex dirty = INVALID_TILE; TileIndex dirty = INVALID_TILE;
switch (GetTileType(tile)) { switch (GetTileType(tile)) {
case MP_CLEAR: case MP_CLEAR:
img_1 = img_by_map5[(_m[tile].m5 & 0x1C) >> 2]; self = (GB(_m[tile].m5, 0, 5) == 15);
break;
case MP_TREES:
if ((_m[tile].m2 & 0x30) == 0x20)
img_1 = 1;
else
img_1 = 0;
break; break;
default: default:
img_1 = 0; self = 0;
break; break;
} }
switch (GetTileType(TILE_ADDXY(tile, 1, 0))) { switch (GetTileType(TILE_ADDXY(tile, 1, 0))) {
case MP_CLEAR: case MP_CLEAR:
img_2 = img_by_map5[(_m[TILE_ADDXY(tile, 1, 0)].m5 & 0x1C) >> 2]; neighbour = (GB(_m[TILE_ADDXY(tile, 1, 0)].m5, 0, 5) == 15);
break;
case MP_TREES:
if ((_m[TILE_ADDXY(tile, 1, 0)].m2 & 0x30) == 0x20)
img_2 = 1;
else
img_2 = 0;
break; break;
default: default:
img_2 = 0; neighbour = 0;
break; break;
} }
if ((_m[tile].m4 & 0xE0) == 0) { if (GB(_m[tile].m4, 5, 3) == 0) {
if ((img_1 & 2) != (img_2 & 2)) { if (self != neighbour) {
_m[tile].m4 |= 3 << 5; SB(_m[tile].m4, 5, 3, 3);
dirty = tile; dirty = tile;
} }
} else { } else {
if (img_1 == 1 && img_2 == 1) { if (self == 0 && neighbour == 0) {
_m[tile].m4 &= ~(3 << 5); SB(_m[tile].m4, 5, 3, 0);
dirty = tile; dirty = tile;
} }
} }
switch (GetTileType(TILE_ADDXY(tile, 0, 1))) { switch (GetTileType(TILE_ADDXY(tile, 0, 1))) {
case MP_CLEAR: case MP_CLEAR:
img_2 = img_by_map5[(_m[TILE_ADDXY(tile, 0, 1)].m5 & 0x1C) >> 2]; neighbour = (GB(_m[TILE_ADDXY(tile, 0, 1)].m5, 0, 5) == 15);
break;
case MP_TREES:
if ((_m[TILE_ADDXY(tile, 0, 1)].m2 & 0x30) == 0x20)
img_2 = 1;
else
img_2 = 0;
break; break;
default: default:
img_2 = 0; neighbour = 0;
break; break;
} }
if ((_m[tile].m4 & 0x1C) == 0) { if (GB(_m[tile].m4, 2, 3) == 0) {
if ((img_1 & 2) != (img_2 & 2)) { if (self != neighbour) {
_m[tile].m4 |= 3 << 2; SB(_m[tile].m4, 2, 3, 3);
dirty = tile; dirty = tile;
} }
} else { } else {
if (img_1 == 1 && img_2 == 1) { if (self == 0 && neighbour == 0) {
_m[tile].m4 &= ~(3 << 2); SB(_m[tile].m4, 2, 3, 0);
dirty = tile; dirty = tile;
} }
} }
if (dirty != INVALID_TILE) if (dirty != INVALID_TILE) MarkTileDirtyByTile(dirty);
MarkTileDirtyByTile(dirty);
} }