83 /* above snowline? */ |
83 /* above snowline? */ |
84 if (_opt.landscape == LT_ARCTIC && GetTileZ(tile) > GetSnowLine()) { |
84 if (_opt.landscape == LT_ARCTIC && GetTileZ(tile) > GetSnowLine()) { |
85 SetTreeGroundDensity(tile, TREE_GROUND_SNOW_DESERT, 3); |
85 SetTreeGroundDensity(tile, TREE_GROUND_SNOW_DESERT, 3); |
86 SetTreeCounter(tile, (TreeGround)GB(r, 24, 3)); |
86 SetTreeCounter(tile, (TreeGround)GB(r, 24, 3)); |
87 } else { |
87 } else { |
88 SetTreeGroundDensity(tile, (TreeGround)GB(r, 28, 1), 0); |
88 SetTreeGroundDensity(tile, (TreeGround)GB(r, 28, 1), 3); |
89 SetTreeCounter(tile, (TreeGround)GB(r, 24, 4)); |
89 SetTreeCounter(tile, (TreeGround)GB(r, 24, 4)); |
90 } |
90 } |
91 } |
91 } |
92 } |
92 } |
93 |
93 |
344 if (treetype == TREE_INVALID) treetype = TREE_CACTUS; |
344 if (treetype == TREE_INVALID) treetype = TREE_CACTUS; |
345 } |
345 } |
346 |
346 |
347 growth = _game_mode == GM_EDITOR ? 3 : 0; |
347 growth = _game_mode == GM_EDITOR ? 3 : 0; |
348 switch (GetClearGround(tile)) { |
348 switch (GetClearGround(tile)) { |
349 case CLEAR_ROUGH: MakeTree(tile, treetype, 0, growth, TREE_GROUND_ROUGH, 0); break; |
349 case CLEAR_ROUGH: MakeTree(tile, treetype, 0, growth, TREE_GROUND_ROUGH, 3); break; |
350 case CLEAR_SNOW: MakeTree(tile, treetype, 0, growth, TREE_GROUND_SNOW_DESERT, GetClearDensity(tile)); break; |
350 case CLEAR_SNOW: |
351 default: MakeTree(tile, treetype, 0, growth, TREE_GROUND_GRASS, 0); break; |
351 case CLEAR_DESERT: MakeTree(tile, treetype, 0, growth, TREE_GROUND_SNOW_DESERT, GetClearDensity(tile)); break; |
|
352 default: MakeTree(tile, treetype, 0, growth, TREE_GROUND_GRASS, GetClearDensity(tile)); break; |
352 } |
353 } |
353 MarkTileDirtyByTile(tile); |
354 MarkTileDirtyByTile(tile); |
354 |
355 |
355 if (_game_mode == GM_EDITOR && IS_INT_INSIDE(treetype, TREE_RAINFOREST, TREE_CACTUS)) |
356 if (_game_mode == GM_EDITOR && IS_INT_INSIDE(treetype, TREE_RAINFOREST, TREE_CACTUS)) |
356 SetTropicZone(tile, TROPICZONE_RAINFOREST); |
357 SetTropicZone(tile, TROPICZONE_RAINFOREST); |
383 const PalSpriteID *s; |
384 const PalSpriteID *s; |
384 const TreePos* d; |
385 const TreePos* d; |
385 byte z; |
386 byte z; |
386 |
387 |
387 switch (GetTreeGround(ti->tile)) { |
388 switch (GetTreeGround(ti->tile)) { |
388 case TREE_GROUND_GRASS: DrawClearLandTile(ti, 3); break; |
389 case TREE_GROUND_GRASS: DrawClearLandTile(ti, GetTreeDensity(ti->tile)); break; |
389 case TREE_GROUND_ROUGH: DrawHillyLandTile(ti); break; |
390 case TREE_GROUND_ROUGH: DrawHillyLandTile(ti); break; |
390 default: DrawGroundSprite(_tree_sprites_1[GetTreeDensity(ti->tile)] + _tileh_to_sprite[ti->tileh], PAL_NONE); break; |
391 default: DrawGroundSprite(_tree_sprites_1[GetTreeDensity(ti->tile)] + _tileh_to_sprite[ti->tileh], PAL_NONE); break; |
391 } |
392 } |
392 |
393 |
393 DrawClearLandFence(ti); |
394 DrawClearLandFence(ti); |
508 { |
509 { |
509 TreeType tt = GetTreeType(tile); |
510 TreeType tt = GetTreeType(tile); |
510 |
511 |
511 if (IS_INT_INSIDE(tt, TREE_RAINFOREST, TREE_CACTUS)) { |
512 if (IS_INT_INSIDE(tt, TREE_RAINFOREST, TREE_CACTUS)) { |
512 td->str = STR_280F_RAINFOREST; |
513 td->str = STR_280F_RAINFOREST; |
513 } else if (tt == TREE_CACTUS) { |
|
514 td->str = STR_2810_CACTUS_PLANTS; |
|
515 } else { |
514 } else { |
516 td->str = STR_280E_TREES; |
515 td->str = tt == TREE_CACTUS ? STR_2810_CACTUS_PLANTS : STR_280E_TREES; |
517 } |
516 } |
518 |
517 |
519 td->owner = GetTileOwner(tile); |
518 td->owner = GetTileOwner(tile); |
520 } |
519 } |
521 |
520 |
555 { |
554 { |
556 int k = GetTileZ(tile) - GetSnowLine() + TILE_HEIGHT; |
555 int k = GetTileZ(tile) - GetSnowLine() + TILE_HEIGHT; |
557 |
556 |
558 if (k < 0) { |
557 if (k < 0) { |
559 if (GetTreeGround(tile) != TREE_GROUND_SNOW_DESERT) return; |
558 if (GetTreeGround(tile) != TREE_GROUND_SNOW_DESERT) return; |
560 SetTreeGroundDensity(tile, TREE_GROUND_GRASS, 0); |
559 SetTreeGroundDensity(tile, TREE_GROUND_GRASS, 3); |
561 } else { |
560 } else { |
562 uint density = min((uint)k / TILE_HEIGHT, 3); |
561 uint density = min((uint)k / TILE_HEIGHT, 3); |
563 |
562 |
564 if (GetTreeGround(tile) != TREE_GROUND_SNOW_DESERT || |
563 if (GetTreeGround(tile) != TREE_GROUND_SNOW_DESERT || |
565 GetTreeDensity(tile) != density) { |
564 GetTreeDensity(tile) != density) { |
584 case LT_ARCTIC: TileLoopTreesAlps(tile); break; |
583 case LT_ARCTIC: TileLoopTreesAlps(tile); break; |
585 } |
584 } |
586 |
585 |
587 TileLoopClearHelper(tile); |
586 TileLoopClearHelper(tile); |
588 |
587 |
|
588 uint treeCounter = GetTreeCounter(tile); |
|
589 |
|
590 /* Handle growth of grass at every 8th processings, like it's done for grass */ |
|
591 if ((treeCounter & 7) == 7 && GetTreeGround(tile) == TREE_GROUND_GRASS) { |
|
592 uint density = GetTreeDensity(tile); |
|
593 if (density < 3) { |
|
594 SetTreeGroundDensity(tile, TREE_GROUND_GRASS, density + 1); |
|
595 MarkTileDirtyByTile(tile); |
|
596 } |
|
597 } |
589 if (GetTreeCounter(tile) < 15) { |
598 if (GetTreeCounter(tile) < 15) { |
590 AddTreeCounter(tile, 1); |
599 AddTreeCounter(tile, 1); |
591 return; |
600 return; |
592 } |
601 } |
593 SetTreeCounter(tile, 0); |
602 SetTreeCounter(tile, 0); |
620 if (!IsTileType(tile, MP_CLEAR) || IsBridgeAbove(tile)) return; |
629 if (!IsTileType(tile, MP_CLEAR) || IsBridgeAbove(tile)) return; |
621 |
630 |
622 switch (GetClearGround(tile)) { |
631 switch (GetClearGround(tile)) { |
623 case CLEAR_GRASS: |
632 case CLEAR_GRASS: |
624 if (GetClearDensity(tile) != 3) return; |
633 if (GetClearDensity(tile) != 3) return; |
625 MakeTree(tile, treetype, 0, 0, TREE_GROUND_GRASS, 0); |
634 MakeTree(tile, treetype, 0, 0, TREE_GROUND_GRASS, 3); |
626 break; |
635 break; |
627 |
636 |
628 case CLEAR_ROUGH: MakeTree(tile, treetype, 0, 0, TREE_GROUND_ROUGH, 0); break; |
637 case CLEAR_ROUGH: MakeTree(tile, treetype, 0, 0, TREE_GROUND_ROUGH, 3); break; |
629 case CLEAR_SNOW: MakeTree(tile, treetype, 0, 0, TREE_GROUND_SNOW_DESERT, GetClearDensity(tile)); break; |
638 case CLEAR_DESERT: return; // Cacti don't spread |
|
639 case CLEAR_SNOW: MakeTree(tile, treetype, 0, 0, TREE_GROUND_SNOW_DESERT, GetClearDensity(tile)); break; |
630 default: return; |
640 default: return; |
631 } |
641 } |
632 break; |
642 break; |
633 } |
643 } |
634 |
644 |
644 AddTreeCount(tile, -1); |
654 AddTreeCount(tile, -1); |
645 SetTreeGrowth(tile, 3); |
655 SetTreeGrowth(tile, 3); |
646 } else { |
656 } else { |
647 /* just one tree, change type into MP_CLEAR */ |
657 /* just one tree, change type into MP_CLEAR */ |
648 switch (GetTreeGround(tile)) { |
658 switch (GetTreeGround(tile)) { |
649 case TREE_GROUND_GRASS: MakeClear(tile, CLEAR_GRASS, 3); break; |
659 case TREE_GROUND_GRASS: MakeClear(tile, CLEAR_GRASS, GetTreeDensity(tile)); break; |
650 case TREE_GROUND_ROUGH: MakeClear(tile, CLEAR_ROUGH, 3); break; |
660 case TREE_GROUND_ROUGH: MakeClear(tile, CLEAR_ROUGH, 3); break; |
651 default: MakeClear(tile, CLEAR_SNOW, GetTreeDensity(tile)); break; |
661 default: // snow or desert |
|
662 MakeClear(tile, _opt.landscape == LT_TROPIC ? CLEAR_DESERT : CLEAR_SNOW, GetTreeDensity(tile)); |
|
663 break; |
652 } |
664 } |
653 } |
665 } |
654 break; |
666 break; |
655 |
667 |
656 default: |
668 default: |
673 (r = Random(), tile = RandomTileSeed(r), GetTropicZone(tile) == TROPICZONE_RAINFOREST) && |
685 (r = Random(), tile = RandomTileSeed(r), GetTropicZone(tile) == TROPICZONE_RAINFOREST) && |
674 IsTileType(tile, MP_CLEAR) && |
686 IsTileType(tile, MP_CLEAR) && |
675 !IsBridgeAbove(tile) && |
687 !IsBridgeAbove(tile) && |
676 (ct = GetClearGround(tile), ct == CLEAR_GRASS || ct == CLEAR_ROUGH) && |
688 (ct = GetClearGround(tile), ct == CLEAR_GRASS || ct == CLEAR_ROUGH) && |
677 (tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TREE_INVALID) { |
689 (tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TREE_INVALID) { |
678 MakeTree(tile, tree, 0, 0, ct == CLEAR_ROUGH ? TREE_GROUND_ROUGH : TREE_GROUND_GRASS, 0); |
690 MakeTree(tile, tree, 0, 0, ct == CLEAR_ROUGH ? TREE_GROUND_ROUGH : TREE_GROUND_GRASS, GetClearDensity(tile)); |
679 } |
691 } |
680 |
692 |
681 /* byte underflow */ |
693 /* byte underflow */ |
682 if (--_trees_tick_ctr != 0) return; |
694 if (--_trees_tick_ctr != 0) return; |
683 |
695 |
687 if (IsTileType(tile, MP_CLEAR) && |
699 if (IsTileType(tile, MP_CLEAR) && |
688 !IsBridgeAbove(tile) && |
700 !IsBridgeAbove(tile) && |
689 (ct = GetClearGround(tile), ct == CLEAR_GRASS || ct == CLEAR_ROUGH || ct == CLEAR_SNOW) && |
701 (ct = GetClearGround(tile), ct == CLEAR_GRASS || ct == CLEAR_ROUGH || ct == CLEAR_SNOW) && |
690 (tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TREE_INVALID) { |
702 (tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TREE_INVALID) { |
691 switch (ct) { |
703 switch (ct) { |
692 case CLEAR_GRASS: MakeTree(tile, tree, 0, 0, TREE_GROUND_GRASS, 0); break; |
704 case CLEAR_GRASS: MakeTree(tile, tree, 0, 0, TREE_GROUND_GRASS, GetClearDensity(tile)); break; |
693 case CLEAR_ROUGH: MakeTree(tile, tree, 0, 0, TREE_GROUND_ROUGH, 0); break; |
705 case CLEAR_ROUGH: MakeTree(tile, tree, 0, 0, TREE_GROUND_ROUGH, 3); break; |
694 default: MakeTree(tile, tree, 0, 0, TREE_GROUND_SNOW_DESERT, GetClearDensity(tile)); break; |
706 default: MakeTree(tile, tree, 0, 0, TREE_GROUND_SNOW_DESERT, GetClearDensity(tile)); break; |
695 } |
707 } |
696 } |
708 } |
697 } |
709 } |
698 |
710 |