summaryrefslogtreecommitdiff
path: root/src/object_cmd.cpp
diff options
context:
space:
mode:
authorrubidium <rubidium@openttd.org>2010-08-28 19:00:21 +0000
committerrubidium <rubidium@openttd.org>2010-08-28 19:00:21 +0000
commit3e67b4fe5fd94d181e44d8291d389868cd86182b (patch)
tree0a68b6b4b63fcf3545294ea006a546ba49d5b859 /src/object_cmd.cpp
parentd4403cb64937bbce065b1c84faa207194fd19262 (diff)
downloadopenttd-3e67b4fe5fd94d181e44d8291d389868cd86182b.tar.xz
(svn r20667) -Codechange: implement the autoslope callback for objects
Diffstat (limited to 'src/object_cmd.cpp')
-rw-r--r--src/object_cmd.cpp22
1 files changed, 21 insertions, 1 deletions
diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp
index aabf30c0c..d16cfeb78 100644
--- a/src/object_cmd.cpp
+++ b/src/object_cmd.cpp
@@ -621,7 +621,27 @@ static CommandCost TerraformTile_Object(TileIndex tile, DoCommandFlag flags, uin
CommandCost ret = CheckTileOwnership(tile);
if (ret.Succeeded()) return CommandCost();
} else if (AutoslopeEnabled() && type != OBJECT_TRANSMITTER && type != OBJECT_LIGHTHOUSE) {
- if (!IsSteepSlope(tileh_new) && (z_new + GetSlopeMaxZ(tileh_new) == GetTileMaxZ(tile))) return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_FOUNDATION]);
+ /* Behaviour:
+ * - Both new and old slope must not be steep.
+ * - TileMaxZ must not be changed.
+ * - Allow autoslope by default.
+ * - Disallow autoslope if callback succeeds and returns non-zero.
+ */
+ Slope tileh_old = GetTileSlope(tile, NULL);
+ /* TileMaxZ must not be changed. Slopes must not be steep. */
+ if (!IsSteepSlope(tileh_old) && !IsSteepSlope(tileh_new) && (GetTileMaxZ(tile) == z_new + GetSlopeMaxZ(tileh_new))) {
+ const ObjectSpec *spec = ObjectSpec::Get(type);
+
+ /* Call callback 'disable autosloping for objects'. */
+ if (HasBit(spec->callback_mask, CBM_OBJ_AUTOSLOPE)) {
+ /* If the callback fails, allow autoslope. */
+ uint16 res = GetObjectCallback(CBID_OBJECT_AUTOSLOPE, 0, 0, spec, Object::GetByTile(tile), tile);
+ if ((res == 0) || (res == CALLBACK_FAILED)) return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_FOUNDATION]);
+ } else if (spec->enabled) {
+ /* allow autoslope */
+ return CommandCost(EXPENSES_CONSTRUCTION, _price[PR_BUILD_FOUNDATION]);
+ }
+ }
}
return DoCommand(tile, 0, 0, flags, CMD_LANDSCAPE_CLEAR);