src/tree_cmd.cpp
branchnoai
changeset 9718 f82a4facea8b
parent 9703 d2a6acdbd665
child 9722 ebf0ece7d8f6
equal deleted inserted replaced
9717:2c27f9be3fb9 9718:f82a4facea8b
    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