diff --git a/src/tree_cmd.cpp b/src/tree_cmd.cpp --- a/src/tree_cmd.cpp +++ b/src/tree_cmd.cpp @@ -375,12 +375,25 @@ CommandCost CmdPlantTree(TileIndex tile, continue; } /* FALL THROUGH */ - case MP_CLEAR: + case MP_CLEAR: { if (IsBridgeAbove(tile)) { msg = STR_ERROR_SITE_UNSUITABLE; continue; } + TreeType treetype = (TreeType)tree_to_plant; + /* Be a bit picky about which trees go where. */ + if (_settings_game.game_creation.landscape == LT_TROPIC && treetype != TREE_INVALID && ( + /* No cacti outside the desert */ + (treetype == TREE_CACTUS && GetTropicZone(tile) != TROPICZONE_DESERT) || + /* No rain forest trees outside the rain forest, except in the editor mode where it makes those tiles rain forest tile */ + (IsInsideMM(treetype, TREE_RAINFOREST, TREE_CACTUS) && GetTropicZone(tile) != TROPICZONE_RAINFOREST && _game_mode != GM_EDITOR) || + /* And no subtropical trees in the desert/rain forest */ + (IsInsideMM(treetype, TREE_SUB_TROPICAL, TREE_TOYLAND) && GetTropicZone(tile) != TROPICZONE_NORMAL))) { + msg = STR_ERROR_TREE_WRONG_TERRAIN_FOR_TREE_TYPE; + continue; + } + if (IsTileType(tile, MP_CLEAR)) { /* Remove fields or rocks. Note that the ground will get barrened */ switch (GetRawClearGround(tile)) { @@ -402,7 +415,6 @@ CommandCost CmdPlantTree(TileIndex tile, } if (flags & DC_EXEC) { - TreeType treetype = (TreeType)tree_to_plant; if (treetype == TREE_INVALID) { treetype = GetRandomTreeType(tile, GB(Random(), 24, 8)); if (treetype == TREE_INVALID) treetype = TREE_CACTUS; @@ -413,11 +425,12 @@ CommandCost CmdPlantTree(TileIndex tile, MarkTileDirtyByTile(tile); /* When planting rainforest-trees, set tropiczone to rainforest in editor. */ - if (_game_mode == GM_EDITOR && IsInsideMM(treetype, TREE_RAINFOREST, TREE_CACTUS)) + if (_game_mode == GM_EDITOR && IsInsideMM(treetype, TREE_RAINFOREST, TREE_CACTUS)) { SetTropicZone(tile, TROPICZONE_RAINFOREST); + } } cost.AddCost(_price[PR_BUILD_TREES]); - break; + } break; default: msg = STR_ERROR_SITE_UNSUITABLE;