summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authordP <dp@dpointer.org>2021-09-25 14:39:40 +0300
committerGitHub <noreply@github.com>2021-09-25 13:39:40 +0200
commit39662aabefa851a153b66571a50fd4b78b83ced1 (patch)
tree9498197df55f57c9abb28234dd336f82f5b627bb
parent66c7d9b8ed9df8de1fc1e5b6c83808683bc6bbd2 (diff)
downloadopenttd-39662aabefa851a153b66571a50fd4b78b83ced1.tar.xz
Add: allow gamescripts to build neutral objects (#9568)
-rw-r--r--src/command.cpp2
-rw-r--r--src/object_cmd.cpp2
-rw-r--r--src/script/api/CMakeLists.txt4
-rw-r--r--src/script/api/ai_changelog.hpp2
-rw-r--r--src/script/api/game_changelog.hpp2
-rw-r--r--src/script/api/script_objecttype.cpp45
-rw-r--r--src/script/api/script_objecttype.hpp57
-rw-r--r--src/script/api/script_objecttypelist.cpp23
-rw-r--r--src/script/api/script_objecttypelist.hpp26
9 files changed, 161 insertions, 2 deletions
diff --git a/src/command.cpp b/src/command.cpp
index 91cb12a28..7d1a72dec 100644
--- a/src/command.cpp
+++ b/src/command.cpp
@@ -225,7 +225,7 @@ static const Command _command_proc_table[] = {
DEF_CMD(CmdBuildSingleSignal, CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_SIGNALS
DEF_CMD(CmdRemoveSingleSignal, CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_SIGNALS
DEF_CMD(CmdTerraformLand, CMD_ALL_TILES | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_TERRAFORM_LAND
- DEF_CMD(CmdBuildObject, CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_OBJECT
+ DEF_CMD(CmdBuildObject, CMD_DEITY | CMD_NO_WATER | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_OBJECT
DEF_CMD(CmdBuildTunnel, CMD_DEITY | CMD_AUTO, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_BUILD_TUNNEL
DEF_CMD(CmdRemoveFromRailStation, 0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_REMOVE_FROM_RAIL_STATION
DEF_CMD(CmdConvertRail, 0, CMDT_LANDSCAPE_CONSTRUCTION), // CMD_CONVERT_RAILD
diff --git a/src/object_cmd.cpp b/src/object_cmd.cpp
index dc517dc5f..14645f93d 100644
--- a/src/object_cmd.cpp
+++ b/src/object_cmd.cpp
@@ -349,7 +349,7 @@ CommandCost CmdBuildObject(TileIndex tile, DoCommandFlag flags, uint32 p1, uint3
}
if (flags & DC_EXEC) {
- BuildObject(type, tile, _current_company, nullptr, view);
+ BuildObject(type, tile, _current_company == OWNER_DEITY ? OWNER_NONE : _current_company, nullptr, view);
/* Make sure the HQ starts at the right size. */
if (type == OBJECT_HQ) UpdateCompanyHQ(tile, hq_score);
diff --git a/src/script/api/CMakeLists.txt b/src/script/api/CMakeLists.txt
index a6390e2bb..b7e0e3014 100644
--- a/src/script/api/CMakeLists.txt
+++ b/src/script/api/CMakeLists.txt
@@ -182,6 +182,8 @@ add_files(
script_newgrf.hpp
script_news.hpp
script_object.hpp
+ script_objecttype.hpp
+ script_objecttypelist.hpp
script_order.hpp
script_priorityqueue.hpp
script_rail.hpp
@@ -250,6 +252,8 @@ add_files(
script_newgrf.cpp
script_news.cpp
script_object.cpp
+ script_objecttype.cpp
+ script_objecttypelist.cpp
script_order.cpp
script_priorityqueue.cpp
script_rail.cpp
diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp
index f977168e4..c1ea5e152 100644
--- a/src/script/api/ai_changelog.hpp
+++ b/src/script/api/ai_changelog.hpp
@@ -26,6 +26,8 @@
* \li AITile::IsSeaTile
* \li AITile::IsRiverTile
* \li AITile::BT_CLEAR_WATER
+ * \li AIObjectTypeList
+ * \li AIObjectType
*
* \b 1.11.0
*
diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp
index 8eab8956e..741d3f56d 100644
--- a/src/script/api/game_changelog.hpp
+++ b/src/script/api/game_changelog.hpp
@@ -25,6 +25,8 @@
* \li GSTile::IsSeaTile
* \li GSTile::IsRiverTile
* \li GSTile::BT_CLEAR_WATER
+ * \li GSObjectTypeList
+ * \li GSObjectType
*
* \b 1.11.0
*
diff --git a/src/script/api/script_objecttype.cpp b/src/script/api/script_objecttype.cpp
new file mode 100644
index 000000000..27519a664
--- /dev/null
+++ b/src/script/api/script_objecttype.cpp
@@ -0,0 +1,45 @@
+/*
+ * This file is part of OpenTTD.
+ * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** @file script_objecttype.cpp Implementation of ScriptObjectType. */
+
+#include "../../stdafx.h"
+
+#include "script_objecttype.hpp"
+
+#include "script_error.hpp"
+#include "script_map.hpp"
+
+#include "../../safeguards.h"
+
+/* static */ bool ScriptObjectType::IsValidObjectType(ObjectType object_type)
+{
+ if (object_type >= NUM_OBJECTS) return false;
+ return ObjectSpec::Get(object_type)->IsEverAvailable();
+}
+
+/* static */ char *ScriptObjectType::GetName(ObjectType object_type)
+{
+ EnforcePrecondition(nullptr, IsValidObjectType(object_type));
+
+ return GetString(ObjectSpec::Get(object_type)->name);
+}
+
+/* static */ uint8 ScriptObjectType::GetViews(ObjectType object_type)
+{
+ EnforcePrecondition(0, IsValidObjectType(object_type));
+
+ return ObjectSpec::Get(object_type)->views;
+}
+
+/* static */ bool ScriptObjectType::BuildObject(ObjectType object_type, uint8 view, TileIndex tile)
+{
+ EnforcePrecondition(false, IsValidObjectType(object_type));
+ EnforcePrecondition(false, ScriptMap::IsValidTile(tile));
+
+ return ScriptObject::DoCommand(tile, object_type, view, CMD_BUILD_OBJECT);
+}
diff --git a/src/script/api/script_objecttype.hpp b/src/script/api/script_objecttype.hpp
new file mode 100644
index 000000000..d3f5d4a51
--- /dev/null
+++ b/src/script/api/script_objecttype.hpp
@@ -0,0 +1,57 @@
+/*
+ * This file is part of OpenTTD.
+ * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** @file script_objecttype.hpp Everything to query and build industries. */
+
+#ifndef SCRIPT_OBJECTTYPE_HPP
+#define SCRIPT_OBJECTTYPE_HPP
+
+#include "script_list.hpp"
+
+#include "../../newgrf_object.h"
+
+/**
+ * Class that handles all object-type related functions.
+ * @api ai game
+ */
+class ScriptObjectType : public ScriptObject {
+public:
+ /**
+ * Checks whether the given object-type is valid.
+ * @param object_type The type to check.
+ * @return True if and only if the object-type is valid.
+ */
+ static bool IsValidObjectType(ObjectType object_type);
+
+ /**
+ * Get the name of an object-type.
+ * @param object_type The type to get the name for.
+ * @pre IsValidObjectType(object_type).
+ * @return The name of an object.
+ */
+ static char *GetName(ObjectType object_type);
+
+ /**
+ * Get the number of views for an object-type.
+ * @param object_type The type to get the number of views for.
+ * @pre IsValidObjectType(object_type).
+ * @return The number of views for an object.
+ */
+ static uint8 GetViews(ObjectType object_type);
+
+ /**
+ * Build an object of the specified type.
+ * @param object_type The type of the object to build.
+ * @param view The view for teh object.
+ * @param tile The tile to build the object on.
+ * @pre IsValidObjectType(object_type).
+ * @return True if the object was successfully build.
+ */
+ static bool BuildObject(ObjectType object_type, uint8 view, TileIndex tile);
+};
+
+#endif /* SCRIPT_OBJECTTYPE_HPP */
diff --git a/src/script/api/script_objecttypelist.cpp b/src/script/api/script_objecttypelist.cpp
new file mode 100644
index 000000000..0086260b2
--- /dev/null
+++ b/src/script/api/script_objecttypelist.cpp
@@ -0,0 +1,23 @@
+/*
+ * This file is part of OpenTTD.
+ * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** @file script_objecttypelist.cpp Implementation of ScriptObjectTypeList. */
+
+#include "../../stdafx.h"
+#include "script_objecttypelist.hpp"
+#include "../../newgrf_object.h"
+
+#include "../../safeguards.h"
+
+ScriptObjectTypeList::ScriptObjectTypeList()
+{
+ for (int i = 0; i < NUM_OBJECTS; i++) {
+ const ObjectSpec *spec = ObjectSpec::Get(i);
+ if (!spec->IsEverAvailable()) continue;
+ this->AddItem(i);
+ }
+}
diff --git a/src/script/api/script_objecttypelist.hpp b/src/script/api/script_objecttypelist.hpp
new file mode 100644
index 000000000..0276838e8
--- /dev/null
+++ b/src/script/api/script_objecttypelist.hpp
@@ -0,0 +1,26 @@
+/*
+ * This file is part of OpenTTD.
+ * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
+ * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+/** @file script_objecttypelist.hpp List all available object types. */
+
+#ifndef SCRIPT_OBJECTTYPELIST_HPP
+#define SCRIPT_OBJECTTYPELIST_HPP
+
+#include "script_objecttype.hpp"
+
+/**
+ * Creates a list of valid object types.
+ * @api ai game
+ * @ingroup ScriptList
+ */
+class ScriptObjectTypeList : public ScriptList {
+public:
+ ScriptObjectTypeList();
+};
+
+
+#endif /* SCRIPT_OBJECTTYPELIST_HPP */