tree_cmd.c
changeset 3079 d6541c027250
parent 3076 9584f34a83dc
child 3144 426b825578f9
equal deleted inserted replaced
3078:ae74442bd058 3079:d6541c027250
    40 static void PlaceTree(TileIndex tile, uint32 r)
    40 static void PlaceTree(TileIndex tile, uint32 r)
    41 {
    41 {
    42 	TreeType tree = GetRandomTreeType(tile, GB(r, 24, 8));
    42 	TreeType tree = GetRandomTreeType(tile, GB(r, 24, 8));
    43 
    43 
    44 	if (tree != TR_INVALID) {
    44 	if (tree != TR_INVALID) {
    45 		SetTileType(tile, MP_TREES);
    45 		MakeTree(tile, tree, GB(r, 22, 2), min(GB(r, 16, 3), 6), TR_GRASS, 0);
    46 		SetTreeType(tile, tree);
       
    47 		SetFenceSE(tile, 0);
       
    48 		SetFenceSW(tile, 0);
       
    49 		SetTreeCount(tile, GB(r, 22, 2));
       
    50 		SetTreeGrowth(tile, min(GB(r, 16, 3), 6));
       
    51 
    46 
    52 		// above snowline?
    47 		// above snowline?
    53 		if (_opt.landscape == LT_HILLY && GetTileZ(tile) > _opt.snow_line) {
    48 		if (_opt.landscape == LT_HILLY && GetTileZ(tile) > _opt.snow_line) {
    54 			SetTreeGroundDensity(tile, TR_SNOW_DESERT, 3);
    49 			SetTreeGroundDensity(tile, TR_SNOW_DESERT, 3);
    55 			SetTreeCounter(tile, GB(r, 24, 3));
    50 			SetTreeCounter(tile, GB(r, 24, 3));
   187 						default: break;
   182 						default: break;
   188 					}
   183 					}
   189 
   184 
   190 					if (flags & DC_EXEC) {
   185 					if (flags & DC_EXEC) {
   191 						TreeType treetype;
   186 						TreeType treetype;
       
   187 						uint growth;
   192 
   188 
   193 						if (_game_mode != GM_EDITOR && _current_player < MAX_PLAYERS) {
   189 						if (_game_mode != GM_EDITOR && _current_player < MAX_PLAYERS) {
   194 							Town *t = ClosestTownFromTile(tile, _patches.dist_local_authority);
   190 							Town *t = ClosestTownFromTile(tile, _patches.dist_local_authority);
   195 							if (t != NULL)
   191 							if (t != NULL)
   196 								ChangeTownRating(t, RATING_TREE_UP_STEP, RATING_TREE_MAXIMUM);
   192 								ChangeTownRating(t, RATING_TREE_UP_STEP, RATING_TREE_MAXIMUM);
   200 						if (treetype == TR_INVALID) {
   196 						if (treetype == TR_INVALID) {
   201 							treetype = GetRandomTreeType(tile, GB(Random(), 24, 8));
   197 							treetype = GetRandomTreeType(tile, GB(Random(), 24, 8));
   202 							if (treetype == TR_INVALID) treetype = TR_CACTUS;
   198 							if (treetype == TR_INVALID) treetype = TR_CACTUS;
   203 						}
   199 						}
   204 
   200 
       
   201 						growth = _game_mode == GM_EDITOR ? 3 : 0;
   205 						switch (GetClearGround(tile)) {
   202 						switch (GetClearGround(tile)) {
   206 							case CL_ROUGH: SetTreeGroundDensity(tile, TR_ROUGH, 0); break;
   203 							case CL_ROUGH: MakeTree(tile, treetype, 0, growth, TR_ROUGH, 0); break;
   207 							case CL_SNOW:  SetTreeGroundDensity(tile, TR_SNOW_DESERT, GetClearDensity(tile)); break;
   204 							case CL_SNOW:  MakeTree(tile, treetype, 0, growth, TR_SNOW_DESERT, GetClearDensity(tile)); break;
   208 							default:       SetTreeGroundDensity(tile, TR_GRASS, 0); break;
   205 							default:       MakeTree(tile, treetype, 0, growth, TR_GRASS, 0); break;
   209 						}
   206 						}
   210 						SetTreeCounter(tile, 0);
       
   211 
       
   212 						SetTileType(tile, MP_TREES);
       
   213 						SetTreeType(tile, treetype);
       
   214 						SetFenceSE(tile, 0);
       
   215 						SetFenceSW(tile, 0);
       
   216 						SetTreeCount(tile, 0);
       
   217 						SetTreeGrowth(tile, _game_mode == GM_EDITOR ? 3 : 0);
       
   218 						MarkTileDirtyByTile(tile);
   207 						MarkTileDirtyByTile(tile);
   219 
   208 
   220 						if (_game_mode == GM_EDITOR && IS_INT_INSIDE(treetype, TR_RAINFOREST, TR_CACTUS))
   209 						if (_game_mode == GM_EDITOR && IS_INT_INSIDE(treetype, TR_RAINFOREST, TR_CACTUS))
   221 							SetMapExtraBits(tile, 2);
   210 							SetMapExtraBits(tile, 2);
   222 					}
   211 					}
   482 						if (!IsTileType(tile, MP_CLEAR)) return;
   471 						if (!IsTileType(tile, MP_CLEAR)) return;
   483 
   472 
   484 						switch (GetClearGround(tile)) {
   473 						switch (GetClearGround(tile)) {
   485 							case CL_GRASS:
   474 							case CL_GRASS:
   486 								if (GetClearDensity(tile) != 3) return;
   475 								if (GetClearDensity(tile) != 3) return;
   487 								SetTreeGroundDensity(tile, TR_GRASS, 0);
   476 								MakeTree(tile, treetype, 0, 0, TR_GRASS, 0);
   488 								break;
   477 								break;
   489 
   478 
   490 							case CL_ROUGH: SetTreeGroundDensity(tile, TR_ROUGH, 0); break;
   479 							case CL_ROUGH: MakeTree(tile, treetype, 0, 0, TR_ROUGH, 0); break;
   491 							case CL_SNOW:  SetTreeGroundDensity(tile, TR_SNOW_DESERT, GetClearDensity(tile)); break;
   480 							case CL_SNOW:  MakeTree(tile, treetype, 0, 0, TR_SNOW_DESERT, GetClearDensity(tile)); break;
   492 							default: return;
   481 							default: return;
   493 						}
   482 						}
   494 						SetTreeCounter(tile, 0);
       
   495 
       
   496 						SetTileType(tile, MP_TREES);
       
   497 						SetTreeType(tile, treetype);
       
   498 						SetFenceSE(tile, 0);
       
   499 						SetFenceSW(tile, 0);
       
   500 						SetTreeCount(tile, 0);
       
   501 						SetTreeGrowth(tile, 0);
       
   502 						break;
   483 						break;
   503 					}
   484 					}
   504 
   485 
   505 					default:
   486 					default:
   506 						return;
   487 						return;
   542 	if (_opt.landscape == LT_DESERT &&
   523 	if (_opt.landscape == LT_DESERT &&
   543 			(r = Random(), tile = RandomTileSeed(r), GetMapExtraBits(tile) == 2) &&
   524 			(r = Random(), tile = RandomTileSeed(r), GetMapExtraBits(tile) == 2) &&
   544 			IsTileType(tile, MP_CLEAR) &&
   525 			IsTileType(tile, MP_CLEAR) &&
   545 			(ct = GetClearGround(tile), ct == CL_GRASS || ct == CL_ROUGH) &&
   526 			(ct = GetClearGround(tile), ct == CL_GRASS || ct == CL_ROUGH) &&
   546 			(tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TR_INVALID) {
   527 			(tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TR_INVALID) {
   547 		SetTileType(tile, MP_TREES);
   528 		MakeTree(tile, tree, 0, 0, ct == CL_ROUGH ? TR_ROUGH : TR_GRASS, 0);
   548 		SetTreeGroundDensity(tile, ct == CL_ROUGH ? TR_ROUGH : TR_GRASS, 0);
       
   549 		SetTreeCounter(tile, 0);
       
   550 		SetTreeType(tile, tree);
       
   551 		SetTreeCount(tile, 0);
       
   552 		SetTreeGrowth(tile, 0);
       
   553 	}
   529 	}
   554 
   530 
   555 	// byte underflow
   531 	// byte underflow
   556 	if (--_trees_tick_ctr != 0) return;
   532 	if (--_trees_tick_ctr != 0) return;
   557 
   533 
   560 	tile = TILE_MASK(r);
   536 	tile = TILE_MASK(r);
   561 	if (IsTileType(tile, MP_CLEAR) &&
   537 	if (IsTileType(tile, MP_CLEAR) &&
   562 			(ct = GetClearGround(tile), ct == CL_GRASS || ct == CL_ROUGH || ct == CL_SNOW) &&
   538 			(ct = GetClearGround(tile), ct == CL_GRASS || ct == CL_ROUGH || ct == CL_SNOW) &&
   563 			(tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TR_INVALID) {
   539 			(tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TR_INVALID) {
   564 		switch (ct) {
   540 		switch (ct) {
   565 			case CL_GRASS: SetTreeGroundDensity(tile, TR_GRASS, 0); break;
   541 			case CL_GRASS: MakeTree(tile, tree, 0, 0, TR_GRASS, 0); break;
   566 			case CL_ROUGH: SetTreeGroundDensity(tile, TR_ROUGH, 0); break;
   542 			case CL_ROUGH: MakeTree(tile, tree, 0, 0, TR_ROUGH, 0); break;
   567 			default:       SetTreeGroundDensity(tile, TR_SNOW_DESERT, GetClearDensity(tile)); break;
   543 			default:       MakeTree(tile, tree, 0, 0, TR_SNOW_DESERT, GetClearDensity(tile)); break;
   568 		}
   544 		}
   569 		SetTreeCounter(tile, 0);
       
   570 		SetTileType(tile, MP_TREES);
       
   571 		SetTreeType(tile, tree);
       
   572 		SetTreeCount(tile, 0);
       
   573 		SetTreeGrowth(tile, 0);
       
   574 	}
   545 	}
   575 }
   546 }
   576 
   547 
   577 static void ClickTile_Trees(TileIndex tile)
   548 static void ClickTile_Trees(TileIndex tile)
   578 {
   549 {