568 /* unused */ |
568 /* unused */ |
569 } |
569 } |
570 |
570 |
571 void TileLoopClearHelper(TileIndex tile) |
571 void TileLoopClearHelper(TileIndex tile) |
572 { |
572 { |
573 byte img_1; |
573 byte self; |
574 byte img_2; |
574 byte neighbour; |
575 static const byte img_by_map5[] = { 0, 0, 0, 2, 1, 1, 0, 0 }; |
|
576 TileIndex dirty = INVALID_TILE; |
575 TileIndex dirty = INVALID_TILE; |
577 |
576 |
578 switch (GetTileType(tile)) { |
577 switch (GetTileType(tile)) { |
579 case MP_CLEAR: |
578 case MP_CLEAR: |
580 img_1 = img_by_map5[(_m[tile].m5 & 0x1C) >> 2]; |
579 self = (GB(_m[tile].m5, 0, 5) == 15); |
581 break; |
580 break; |
582 |
581 |
583 case MP_TREES: |
|
584 if ((_m[tile].m2 & 0x30) == 0x20) |
|
585 img_1 = 1; |
|
586 else |
|
587 img_1 = 0; |
|
588 break; |
|
589 |
|
590 default: |
582 default: |
591 img_1 = 0; |
583 self = 0; |
592 break; |
584 break; |
593 } |
585 } |
594 |
586 |
595 switch (GetTileType(TILE_ADDXY(tile, 1, 0))) { |
587 switch (GetTileType(TILE_ADDXY(tile, 1, 0))) { |
596 case MP_CLEAR: |
588 case MP_CLEAR: |
597 img_2 = img_by_map5[(_m[TILE_ADDXY(tile, 1, 0)].m5 & 0x1C) >> 2]; |
589 neighbour = (GB(_m[TILE_ADDXY(tile, 1, 0)].m5, 0, 5) == 15); |
598 break; |
590 break; |
599 |
591 |
600 case MP_TREES: |
592 default: |
601 if ((_m[TILE_ADDXY(tile, 1, 0)].m2 & 0x30) == 0x20) |
593 neighbour = 0; |
602 img_2 = 1; |
|
603 else |
|
604 img_2 = 0; |
|
605 break; |
594 break; |
606 |
595 } |
607 default: |
596 |
608 img_2 = 0; |
597 if (GB(_m[tile].m4, 5, 3) == 0) { |
609 break; |
598 if (self != neighbour) { |
610 } |
599 SB(_m[tile].m4, 5, 3, 3); |
611 |
|
612 if ((_m[tile].m4 & 0xE0) == 0) { |
|
613 if ((img_1 & 2) != (img_2 & 2)) { |
|
614 _m[tile].m4 |= 3 << 5; |
|
615 dirty = tile; |
600 dirty = tile; |
616 } |
601 } |
617 } else { |
602 } else { |
618 if (img_1 == 1 && img_2 == 1) { |
603 if (self == 0 && neighbour == 0) { |
619 _m[tile].m4 &= ~(3 << 5); |
604 SB(_m[tile].m4, 5, 3, 0); |
620 dirty = tile; |
605 dirty = tile; |
621 } |
606 } |
622 } |
607 } |
623 |
608 |
624 switch (GetTileType(TILE_ADDXY(tile, 0, 1))) { |
609 switch (GetTileType(TILE_ADDXY(tile, 0, 1))) { |
625 case MP_CLEAR: |
610 case MP_CLEAR: |
626 img_2 = img_by_map5[(_m[TILE_ADDXY(tile, 0, 1)].m5 & 0x1C) >> 2]; |
611 neighbour = (GB(_m[TILE_ADDXY(tile, 0, 1)].m5, 0, 5) == 15); |
627 break; |
612 break; |
628 |
613 |
629 case MP_TREES: |
614 default: |
630 if ((_m[TILE_ADDXY(tile, 0, 1)].m2 & 0x30) == 0x20) |
615 neighbour = 0; |
631 img_2 = 1; |
|
632 else |
|
633 img_2 = 0; |
|
634 break; |
616 break; |
635 |
617 } |
636 default: |
618 |
637 img_2 = 0; |
619 if (GB(_m[tile].m4, 2, 3) == 0) { |
638 break; |
620 if (self != neighbour) { |
639 } |
621 SB(_m[tile].m4, 2, 3, 3); |
640 |
|
641 if ((_m[tile].m4 & 0x1C) == 0) { |
|
642 if ((img_1 & 2) != (img_2 & 2)) { |
|
643 _m[tile].m4 |= 3 << 2; |
|
644 dirty = tile; |
622 dirty = tile; |
645 } |
623 } |
646 } else { |
624 } else { |
647 if (img_1 == 1 && img_2 == 1) { |
625 if (self == 0 && neighbour == 0) { |
648 _m[tile].m4 &= ~(3 << 2); |
626 SB(_m[tile].m4, 2, 3, 0); |
649 dirty = tile; |
627 dirty = tile; |
650 } |
628 } |
651 } |
629 } |
652 |
630 |
653 if (dirty != INVALID_TILE) |
631 if (dirty != INVALID_TILE) MarkTileDirtyByTile(dirty); |
654 MarkTileDirtyByTile(dirty); |
|
655 } |
632 } |
656 |
633 |
657 |
634 |
658 /* convert into snowy tiles */ |
635 /* convert into snowy tiles */ |
659 static void TileLoopClearAlps(TileIndex tile) |
636 static void TileLoopClearAlps(TileIndex tile) |