summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorglx <glx@openttd.org>2019-03-08 19:52:22 +0100
committerPeterN <peter@fuzzle.org>2019-03-24 15:28:48 +0000
commitf8e6cd10ef8161fbaa95a847a794e475d6aeb60e (patch)
tree734b37097034e180161ec9a6b003c2c465d151f9
parentd54b6ac09b6fe88c09f7886739fe9c05f16b8222 (diff)
downloadopenttd-f8e6cd10ef8161fbaa95a847a794e475d6aeb60e.tar.xz
Add: script API functions for build with refit feature
-rw-r--r--bin/ai/regression/tst_regression/main.nut13
-rw-r--r--bin/ai/regression/tst_regression/result.txt14
-rw-r--r--src/script/api/ai/ai_vehicle.hpp.sq2
-rw-r--r--src/script/api/game/game_vehicle.hpp.sq2
-rw-r--r--src/script/api/script_vehicle.cpp29
-rw-r--r--src/script/api/script_vehicle.hpp40
6 files changed, 96 insertions, 4 deletions
diff --git a/bin/ai/regression/tst_regression/main.nut b/bin/ai/regression/tst_regression/main.nut
index 7315f33f8..baece09d0 100644
--- a/bin/ai/regression/tst_regression/main.nut
+++ b/bin/ai/regression/tst_regression/main.nut
@@ -1704,6 +1704,19 @@ function Regression::Vehicle()
print(" GetWagonEngineType(): " + AIVehicle.GetWagonEngineType(17 3));
print(" GetWagonAge(): " + AIVehicle.GetWagonAge(17, 3));
+ print(" --Refit--");
+ print(" GetBuildWithRefitCapacity(): " + AIVehicle.GetBuildWithRefitCapacity(28479, 211, 255));
+ print(" GetBuildWithRefitCapacity(): " + AIVehicle.GetBuildWithRefitCapacity(28479, 211, 0));
+ print(" GetBuildWithRefitCapacity(): " + AIVehicle.GetBuildWithRefitCapacity(28479, 211, 9));
+ print(" BuildVehicleWithRefit(): " + AIVehicle.BuildVehicleWithRefit(28479, 211, 9));
+ print(" GetCapacity(): " + AIVehicle.GetCapacity(20, 9));
+ print(" GetCapacity(): " + AIVehicle.GetCapacity(20, 5));
+ print(" GetRefitCapacity(): " + AIVehicle.GetRefitCapacity(20, 5));
+ print(" RefitVehicle(): " + AIVehicle.RefitVehicle(20, 5));
+ print(" GetCapacity(): " + AIVehicle.GetCapacity(20, 9));
+ print(" GetCapacity(): " + AIVehicle.GetCapacity(20, 5));
+ print(" SellVehicle(): " + AIVehicle.SellVehicle(20));
+
print(" --Errors--");
print(" RefitVehicle(): " + AIVehicle.RefitVehicle(12, 0));
print(" GetLastErrorString(): " + AIError.GetLastErrorString());
diff --git a/bin/ai/regression/tst_regression/result.txt b/bin/ai/regression/tst_regression/result.txt
index e93b2e234..cda888d29 100644
--- a/bin/ai/regression/tst_regression/result.txt
+++ b/bin/ai/regression/tst_regression/result.txt
@@ -9128,6 +9128,18 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetWagonAge(): 0
GetWagonEngineType(): 65535
GetWagonAge(): -1
+ --Refit--
+ GetBuildWithRefitCapacity(): -1
+ GetBuildWithRefitCapacity(): 0
+ GetBuildWithRefitCapacity(): 160
+ BuildVehicleWithRefit(): 20
+ GetCapacity(): 160
+ GetCapacity(): 0
+ GetRefitCapacity(): 160
+ RefitVehicle(): true
+ GetCapacity(): 0
+ GetCapacity(): 160
+ SellVehicle(): true
--Errors--
RefitVehicle(): false
GetLastErrorString(): ERR_VEHICLE_NOT_IN_DEPOT
@@ -9175,7 +9187,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
13 => 5489
12 => 5489
CurrentSpeed ListDump:
- 12 => 21
+ 12 => 27
17 => 0
16 => 0
14 => 0
diff --git a/src/script/api/ai/ai_vehicle.hpp.sq b/src/script/api/ai/ai_vehicle.hpp.sq
index 0eb21ed67..dbd0096ad 100644
--- a/src/script/api/ai/ai_vehicle.hpp.sq
+++ b/src/script/api/ai/ai_vehicle.hpp.sq
@@ -122,6 +122,8 @@ void SQAIVehicle_Register(Squirrel *engine)
SQAIVehicle.DefSQStaticMethod(engine, &ScriptVehicle::IsInDepot, "IsInDepot", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &ScriptVehicle::IsStoppedInDepot, "IsStoppedInDepot", 2, ".i");
SQAIVehicle.DefSQStaticMethod(engine, &ScriptVehicle::BuildVehicle, "BuildVehicle", 3, ".ii");
+ SQAIVehicle.DefSQStaticMethod(engine, &ScriptVehicle::BuildVehicleWithRefit, "BuildVehicleWithRefit", 4, ".iii");
+ SQAIVehicle.DefSQStaticMethod(engine, &ScriptVehicle::GetBuildWithRefitCapacity, "GetBuildWithRefitCapacity", 4, ".iii");
SQAIVehicle.DefSQStaticMethod(engine, &ScriptVehicle::CloneVehicle, "CloneVehicle", 4, ".iib");
SQAIVehicle.DefSQStaticMethod(engine, &ScriptVehicle::MoveWagon, "MoveWagon", 5, ".iiii");
SQAIVehicle.DefSQStaticMethod(engine, &ScriptVehicle::MoveWagonChain, "MoveWagonChain", 5, ".iiii");
diff --git a/src/script/api/game/game_vehicle.hpp.sq b/src/script/api/game/game_vehicle.hpp.sq
index 3dc9fe67a..15a007046 100644
--- a/src/script/api/game/game_vehicle.hpp.sq
+++ b/src/script/api/game/game_vehicle.hpp.sq
@@ -123,6 +123,8 @@ void SQGSVehicle_Register(Squirrel *engine)
SQGSVehicle.DefSQStaticMethod(engine, &ScriptVehicle::IsInDepot, "IsInDepot", 2, ".i");
SQGSVehicle.DefSQStaticMethod(engine, &ScriptVehicle::IsStoppedInDepot, "IsStoppedInDepot", 2, ".i");
SQGSVehicle.DefSQStaticMethod(engine, &ScriptVehicle::BuildVehicle, "BuildVehicle", 3, ".ii");
+ SQGSVehicle.DefSQStaticMethod(engine, &ScriptVehicle::BuildVehicleWithRefit, "BuildVehicleWithRefit", 4, ".iii");
+ SQGSVehicle.DefSQStaticMethod(engine, &ScriptVehicle::GetBuildWithRefitCapacity, "GetBuildWithRefitCapacity", 4, ".iii");
SQGSVehicle.DefSQStaticMethod(engine, &ScriptVehicle::CloneVehicle, "CloneVehicle", 4, ".iib");
SQGSVehicle.DefSQStaticMethod(engine, &ScriptVehicle::MoveWagon, "MoveWagon", 5, ".iiii");
SQGSVehicle.DefSQStaticMethod(engine, &ScriptVehicle::MoveWagonChain, "MoveWagonChain", 5, ".iiii");
diff --git a/src/script/api/script_vehicle.cpp b/src/script/api/script_vehicle.cpp
index ca05ec58f..46fae0a91 100644
--- a/src/script/api/script_vehicle.cpp
+++ b/src/script/api/script_vehicle.cpp
@@ -61,21 +61,44 @@
return v->IsGroundVehicle() ? v->GetGroundVehicleCache()->cached_total_length : -1;
}
-/* static */ VehicleID ScriptVehicle::BuildVehicle(TileIndex depot, EngineID engine_id)
+/* static */ VehicleID ScriptVehicle::_BuildVehicleInternal(TileIndex depot, EngineID engine_id, CargoID cargo)
{
- EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
+ EnforcePrecondition(VEHICLE_INVALID, ScriptObject::GetCompany() != OWNER_DEITY);
EnforcePrecondition(VEHICLE_INVALID, ScriptEngine::IsBuildable(engine_id));
+ EnforcePrecondition(VEHICLE_INVALID, cargo == CT_INVALID || ScriptCargo::IsValidCargo(cargo));
::VehicleType type = ::Engine::Get(engine_id)->type;
EnforcePreconditionCustomError(VEHICLE_INVALID, !ScriptGameSettings::IsDisabledVehicleType((ScriptVehicle::VehicleType)type), ScriptVehicle::ERR_VEHICLE_BUILD_DISABLED);
- if (!ScriptObject::DoCommand(depot, engine_id | (CT_INVALID << 24), 0, ::GetCmdBuildVeh(type), NULL, &ScriptInstance::DoCommandReturnVehicleID)) return VEHICLE_INVALID;
+ if (!ScriptObject::DoCommand(depot, engine_id | (cargo << 24), 0, ::GetCmdBuildVeh(type), NULL, &ScriptInstance::DoCommandReturnVehicleID)) return VEHICLE_INVALID;
/* In case of test-mode, we return VehicleID 0 */
return 0;
}
+/* static */ VehicleID ScriptVehicle::BuildVehicle(TileIndex depot, EngineID engine_id)
+{
+ return _BuildVehicleInternal(depot, engine_id, CT_INVALID);
+}
+
+/* static */ VehicleID ScriptVehicle::BuildVehicleWithRefit(TileIndex depot, EngineID engine_id, CargoID cargo)
+{
+ EnforcePrecondition(VEHICLE_INVALID, ScriptCargo::IsValidCargo(cargo));
+ return _BuildVehicleInternal(depot, engine_id, cargo);
+}
+
+/* static */ int ScriptVehicle::GetBuildWithRefitCapacity(TileIndex depot, EngineID engine_id, CargoID cargo)
+{
+ if (!ScriptEngine::IsBuildable(engine_id)) return -1;
+ if (!ScriptCargo::IsValidCargo(cargo)) return -1;
+
+ ::VehicleType type = ::Engine::Get(engine_id)->type;
+
+ CommandCost res = ::DoCommand(depot, engine_id | (cargo << 24), 0, DC_QUERY_COST, ::GetCmdBuildVeh(type));
+ return res.Succeeded() ? _returned_refit_capacity : -1;
+}
+
/* static */ VehicleID ScriptVehicle::CloneVehicle(TileIndex depot, VehicleID vehicle_id, bool share_orders)
{
EnforcePrecondition(false, ScriptObject::GetCompany() != OWNER_DEITY);
diff --git a/src/script/api/script_vehicle.hpp b/src/script/api/script_vehicle.hpp
index f6b22c204..d027e1243 100644
--- a/src/script/api/script_vehicle.hpp
+++ b/src/script/api/script_vehicle.hpp
@@ -321,6 +321,41 @@ public:
static VehicleID BuildVehicle(TileIndex depot, EngineID engine_id);
/**
+ * Builds a vehicle with the given engine at the given depot and refits it to the given cargo.
+ * @param depot The depot where the vehicle will be build.
+ * @param engine_id The engine to use for this vehicle.
+ * @param cargo The cargo to refit to.
+ * @pre The tile at depot has a depot that can build the engine and
+ * is owned by you.
+ * @pre ScriptEngine::IsBuildable(engine_id).
+ * @pre ScriptCargo::IsValidCargo(cargo).
+ * @game @pre Valid ScriptCompanyMode active in scope.
+ * @exception ScriptVehicle::ERR_VEHICLE_TOO_MANY
+ * @exception ScriptVehicle::ERR_VEHICLE_BUILD_DISABLED
+ * @exception ScriptVehicle::ERR_VEHICLE_WRONG_DEPOT
+ * @return The VehicleID of the new vehicle, or an invalid VehicleID when
+ * it failed. Check the return value using IsValidVehicle. In test-mode
+ * 0 is returned if it was successful; any other value indicates failure.
+ * @note In Test Mode it means you can't assign orders yet to this vehicle,
+ * as the vehicle isn't really built yet. Build it for real first before
+ * assigning orders.
+ */
+ static VehicleID BuildVehicleWithRefit(TileIndex depot, EngineID engine_id, CargoID cargo);
+
+ /**
+ * Gets the capacity of a vehicle built at the given depot with the given engine and refitted to the given cargo.
+ * @param depot The depot where the vehicle will be build.
+ * @param engine_id The engine to use for this vehicle.
+ * @param cargo The cargo to refit to.
+ * @pre The tile at depot has a depot that can build the engine and
+ * is owned by you.
+ * @pre ScriptEngine::IsBuildable(engine_id).
+ * @pre ScriptCargo::IsValidCargo(cargo).
+ * @return The capacity the vehicle will have when refited.
+ */
+ static int GetBuildWithRefitCapacity(TileIndex depot, EngineID engine_id, CargoID cargo);
+
+ /**
* Clones a vehicle at the given depot, copying or cloning its orders.
* @param depot The depot where the vehicle will be build.
* @param vehicle_id The vehicle to use as example for the new vehicle.
@@ -564,6 +599,11 @@ public:
private:
/**
+ * Internal function used by BuildVehicle(WithRefit).
+ */
+ static VehicleID _BuildVehicleInternal(TileIndex depot, EngineID engine_id, CargoID cargo);
+
+ /**
* Internal function used by SellWagon(Chain).
*/
static bool _SellWagonInternal(VehicleID vehicle_id, int wagon, bool sell_attached_wagons);