summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tree.h11
-rw-r--r--tree_cmd.c55
2 files changed, 24 insertions, 42 deletions
diff --git a/tree.h b/tree.h
index 943fcacf1..10ca11f05 100644
--- a/tree.h
+++ b/tree.h
@@ -56,4 +56,15 @@ static inline void AddTreeCounter(TileIndex t, int a) { _m[t].m2 += a; }
static inline uint GetTreeCounter(TileIndex t) { return GB(_m[t].m2, 0, 4); }
static inline void SetTreeCounter(TileIndex t, uint c) { SB(_m[t].m2, 0, 4, c); }
+
+static inline void MakeTree(TileIndex t, TreeType type, uint count, uint growth, TreeGround ground, uint density)
+{
+ SetTileType(t, MP_TREES);
+ SetTileOwner(t, OWNER_NONE);
+ _m[t].m2 = density << 6 | ground << 4 | 0;
+ _m[t].m3 = type;
+ _m[t].m4 = 0 << 5 | 0 << 2;
+ _m[t].m5 = count << 6 | growth;
+}
+
#endif
diff --git a/tree_cmd.c b/tree_cmd.c
index 49a2245a8..0aeef3db0 100644
--- a/tree_cmd.c
+++ b/tree_cmd.c
@@ -42,12 +42,7 @@ static void PlaceTree(TileIndex tile, uint32 r)
TreeType tree = GetRandomTreeType(tile, GB(r, 24, 8));
if (tree != TR_INVALID) {
- SetTileType(tile, MP_TREES);
- SetTreeType(tile, tree);
- SetFenceSE(tile, 0);
- SetFenceSW(tile, 0);
- SetTreeCount(tile, GB(r, 22, 2));
- SetTreeGrowth(tile, min(GB(r, 16, 3), 6));
+ MakeTree(tile, tree, GB(r, 22, 2), min(GB(r, 16, 3), 6), TR_GRASS, 0);
// above snowline?
if (_opt.landscape == LT_HILLY && GetTileZ(tile) > _opt.snow_line) {
@@ -189,6 +184,7 @@ int32 CmdPlantTree(int ex, int ey, uint32 flags, uint32 p1, uint32 p2)
if (flags & DC_EXEC) {
TreeType treetype;
+ uint growth;
if (_game_mode != GM_EDITOR && _current_player < MAX_PLAYERS) {
Town *t = ClosestTownFromTile(tile, _patches.dist_local_authority);
@@ -202,19 +198,12 @@ int32 CmdPlantTree(int ex, int ey, uint32 flags, uint32 p1, uint32 p2)
if (treetype == TR_INVALID) treetype = TR_CACTUS;
}
+ growth = _game_mode == GM_EDITOR ? 3 : 0;
switch (GetClearGround(tile)) {
- case CL_ROUGH: SetTreeGroundDensity(tile, TR_ROUGH, 0); break;
- case CL_SNOW: SetTreeGroundDensity(tile, TR_SNOW_DESERT, GetClearDensity(tile)); break;
- default: SetTreeGroundDensity(tile, TR_GRASS, 0); break;
+ case CL_ROUGH: MakeTree(tile, treetype, 0, growth, TR_ROUGH, 0); break;
+ case CL_SNOW: MakeTree(tile, treetype, 0, growth, TR_SNOW_DESERT, GetClearDensity(tile)); break;
+ default: MakeTree(tile, treetype, 0, growth, TR_GRASS, 0); break;
}
- SetTreeCounter(tile, 0);
-
- SetTileType(tile, MP_TREES);
- SetTreeType(tile, treetype);
- SetFenceSE(tile, 0);
- SetFenceSW(tile, 0);
- SetTreeCount(tile, 0);
- SetTreeGrowth(tile, _game_mode == GM_EDITOR ? 3 : 0);
MarkTileDirtyByTile(tile);
if (_game_mode == GM_EDITOR && IS_INT_INSIDE(treetype, TR_RAINFOREST, TR_CACTUS))
@@ -484,21 +473,13 @@ static void TileLoop_Trees(TileIndex tile)
switch (GetClearGround(tile)) {
case CL_GRASS:
if (GetClearDensity(tile) != 3) return;
- SetTreeGroundDensity(tile, TR_GRASS, 0);
+ MakeTree(tile, treetype, 0, 0, TR_GRASS, 0);
break;
- case CL_ROUGH: SetTreeGroundDensity(tile, TR_ROUGH, 0); break;
- case CL_SNOW: SetTreeGroundDensity(tile, TR_SNOW_DESERT, GetClearDensity(tile)); break;
+ case CL_ROUGH: MakeTree(tile, treetype, 0, 0, TR_ROUGH, 0); break;
+ case CL_SNOW: MakeTree(tile, treetype, 0, 0, TR_SNOW_DESERT, GetClearDensity(tile)); break;
default: return;
}
- SetTreeCounter(tile, 0);
-
- SetTileType(tile, MP_TREES);
- SetTreeType(tile, treetype);
- SetFenceSE(tile, 0);
- SetFenceSW(tile, 0);
- SetTreeCount(tile, 0);
- SetTreeGrowth(tile, 0);
break;
}
@@ -544,12 +525,7 @@ void OnTick_Trees(void)
IsTileType(tile, MP_CLEAR) &&
(ct = GetClearGround(tile), ct == CL_GRASS || ct == CL_ROUGH) &&
(tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TR_INVALID) {
- SetTileType(tile, MP_TREES);
- SetTreeGroundDensity(tile, ct == CL_ROUGH ? TR_ROUGH : TR_GRASS, 0);
- SetTreeCounter(tile, 0);
- SetTreeType(tile, tree);
- SetTreeCount(tile, 0);
- SetTreeGrowth(tile, 0);
+ MakeTree(tile, tree, 0, 0, ct == CL_ROUGH ? TR_ROUGH : TR_GRASS, 0);
}
// byte underflow
@@ -562,15 +538,10 @@ void OnTick_Trees(void)
(ct = GetClearGround(tile), ct == CL_GRASS || ct == CL_ROUGH || ct == CL_SNOW) &&
(tree = GetRandomTreeType(tile, GB(r, 24, 8))) != TR_INVALID) {
switch (ct) {
- case CL_GRASS: SetTreeGroundDensity(tile, TR_GRASS, 0); break;
- case CL_ROUGH: SetTreeGroundDensity(tile, TR_ROUGH, 0); break;
- default: SetTreeGroundDensity(tile, TR_SNOW_DESERT, GetClearDensity(tile)); break;
+ case CL_GRASS: MakeTree(tile, tree, 0, 0, TR_GRASS, 0); break;
+ case CL_ROUGH: MakeTree(tile, tree, 0, 0, TR_ROUGH, 0); break;
+ default: MakeTree(tile, tree, 0, 0, TR_SNOW_DESERT, GetClearDensity(tile)); break;
}
- SetTreeCounter(tile, 0);
- SetTileType(tile, MP_TREES);
- SetTreeType(tile, tree);
- SetTreeCount(tile, 0);
- SetTreeGrowth(tile, 0);
}
}