Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add: allow gamescripts to build neutral objects #9568

Merged
merged 1 commit into from Sep 25, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
2 changes: 1 addition & 1 deletion src/command.cpp
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion src/object_cmd.cpp
Expand Up @@ -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);
Expand Down
4 changes: 4 additions & 0 deletions src/script/api/CMakeLists.txt
Expand Up @@ -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
Expand Down Expand Up @@ -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
Expand Down
2 changes: 2 additions & 0 deletions src/script/api/ai_changelog.hpp
Expand Up @@ -26,6 +26,8 @@
* \li AITile::IsSeaTile
* \li AITile::IsRiverTile
* \li AITile::BT_CLEAR_WATER
* \li AIObjectTypeList
* \li AIObjectType
*
* \b 1.11.0
*
Expand Down
2 changes: 2 additions & 0 deletions src/script/api/game_changelog.hpp
Expand Up @@ -25,6 +25,8 @@
* \li GSTile::IsSeaTile
* \li GSTile::IsRiverTile
* \li GSTile::BT_CLEAR_WATER
* \li GSObjectTypeList
* \li GSObjectType
*
* \b 1.11.0
*
Expand Down
45 changes: 45 additions & 0 deletions 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);
}
57 changes: 57 additions & 0 deletions 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 */
23 changes: 23 additions & 0 deletions 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);
}
}
26 changes: 26 additions & 0 deletions 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 */