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 { |