summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuXarick <43006711+SamuXarick@users.noreply.github.com>2021-09-14 21:06:55 +0100
committerGitHub <noreply@github.com>2021-09-14 22:06:55 +0200
commit37de87812994be72399a9588473ece1c514397c0 (patch)
treeb450411376890b3ac8310dcca2f5b9bad3ca830f
parentc6035158ca9df31d12ba28acf2037ff7d5aeb248 (diff)
downloadopenttd-37de87812994be72399a9588473ece1c514397c0.tar.xz
Feature: [AI/GS] Missing water related functions and objects (#8390)
-rw-r--r--regression/regression/main.nut42
-rw-r--r--regression/regression/result.txt291
-rw-r--r--src/script/api/ai_changelog.hpp5
-rw-r--r--src/script/api/game_changelog.hpp5
-rw-r--r--src/script/api/script_marine.cpp2
-rw-r--r--src/script/api/script_marine.hpp2
-rw-r--r--src/script/api/script_tile.cpp15
-rw-r--r--src/script/api/script_tile.hpp18
8 files changed, 319 insertions, 61 deletions
diff --git a/regression/regression/main.nut b/regression/regression/main.nut
index ffb0856dd..f32c70861 100644
--- a/regression/regression/main.nut
+++ b/regression/regression/main.nut
@@ -547,6 +547,8 @@ function Regression::Prices()
print(" BT_DOCK: " + AIMarine.GetBuildCost(AIMarine.BT_DOCK));
print(" BT_DEPOT: " + AIMarine.GetBuildCost(AIMarine.BT_DEPOT));
print(" BT_BUOY: " + AIMarine.GetBuildCost(AIMarine.BT_BUOY));
+ print(" BT_LOCK: " + AIMarine.GetBuildCost(AIMarine.BT_LOCK));
+ print(" BT_CANAL: " + AIMarine.GetBuildCost(AIMarine.BT_CANAL));
print(" -Tile-");
print(" BT_FOUNDATION: " + AITile.GetBuildCost(AITile.BT_FOUNDATION));
print(" BT_TERRAFORM: " + AITile.GetBuildCost(AITile.BT_TERRAFORM));
@@ -556,6 +558,7 @@ function Regression::Prices()
print(" BT_CLEAR_ROCKY: " + AITile.GetBuildCost(AITile.BT_CLEAR_ROCKY));
print(" BT_CLEAR_FIELDS: " + AITile.GetBuildCost(AITile.BT_CLEAR_FIELDS));
print(" BT_CLEAR_HOUSE: " + AITile.GetBuildCost(AITile.BT_CLEAR_HOUSE));
+ print(" BT_CLEAR_WATER: " + AITile.GetBuildCost(AITile.BT_CLEAR_WATER));
}
function cost_callback(old_path, new_tile, new_direction, self) { if (old_path == null) return 0; return old_path.GetCost() + 1; }
@@ -919,6 +922,9 @@ function Regression::Marine()
print(" BuildWaterDepot(): " + AIMarine.BuildWaterDepot(28479, 28480));
print(" BuildDock(): " + AIMarine.BuildDock(29253, AIStation.STATION_JOIN_ADJACENT));
+ print(" BuildBuoy(): " + AIMarine.BuildBuoy(28481));
+ print(" BuildLock(): " + AIMarine.BuildLock(28487));
+ print(" BuildCanal(): " + AIMarine.BuildCanal(28744));
}
function Regression::Order()
@@ -1470,9 +1476,41 @@ function Regression::TileList()
print(" " + i + " => " + list.GetValue(i));
}
- list.AddRectangle(54421 - 256 * 2, 256 * 2 + 54421 + 8);
+ list.AddRectangle(0x6F3F, 0x7248);
list.Valuate(AITile.IsWaterTile);
- print(" Water(): done");
+ print(" IsWaterTile(): done");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list.Valuate(AITile.IsSeaTile);
+ print(" IsSeaTile(): done");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list.Valuate(AITile.IsRiverTile);
+ print(" IsRiverTile() done");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list.Valuate(AIMarine.IsCanalTile);
+ print(" IsCanalTile() done");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list.Valuate(AITile.IsCoastTile);
+ print(" IsCoastTile() done");
print(" Count(): " + list.Count());
print(" ListDump:");
for (local i = list.Begin(); !list.IsEnd(); i = list.Next()) {
diff --git a/regression/regression/result.txt b/regression/regression/result.txt
index f2d42cc86..69322b1d2 100644
--- a/regression/regression/result.txt
+++ b/regression/regression/result.txt
@@ -7365,6 +7365,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetBankBalance(): 1999959285
BuildWaterDepot(): true
BuildDock(): true
+ BuildBuoy(): true
+ BuildLock(): true
+ BuildCanal(): true
--Prices--
-Rail-
@@ -7391,6 +7394,8 @@ ERROR: IsEnd() is invalid as Begin() is never called
BT_DOCK: 262
BT_DEPOT: 525
BT_BUOY: 262
+ BT_LOCK: 5625
+ BT_CANAL: 3750
-Tile-
BT_FOUNDATION: 187
BT_TERRAFORM: 187
@@ -7400,6 +7405,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
BT_CLEAR_ROCKY: 150
BT_CLEAR_FIELDS: 375
BT_CLEAR_HOUSE: 1200
+ BT_CLEAR_WATER: 7500
--Rail--
IsRailTile(): false
@@ -8450,54 +8456,221 @@ ERROR: IsEnd() is invalid as Begin() is never called
KeepValue(1): done
Count(): 0
ListDump:
- Water(): done
- Count(): 45
+ IsWaterTile(): done
+ Count(): 40
+ ListDump:
+ 29251 => 1
+ 29250 => 1
+ 29249 => 1
+ 29248 => 1
+ 29247 => 1
+ 28996 => 1
+ 28995 => 1
+ 28994 => 1
+ 28993 => 1
+ 28992 => 1
+ 28991 => 1
+ 28744 => 1
+ 28741 => 1
+ 28740 => 1
+ 28739 => 1
+ 28738 => 1
+ 28737 => 1
+ 28736 => 1
+ 28735 => 1
+ 28488 => 1
+ 28487 => 1
+ 28486 => 1
+ 28485 => 1
+ 28484 => 1
+ 28483 => 1
+ 28482 => 1
+ 28480 => 1
+ 28479 => 1
+ 29256 => 0
+ 29255 => 0
+ 29254 => 0
+ 29253 => 0
+ 29252 => 0
+ 29000 => 0
+ 28999 => 0
+ 28998 => 0
+ 28997 => 0
+ 28743 => 0
+ 28742 => 0
+ 28481 => 0
+ IsSeaTile(): done
+ Count(): 40
+ ListDump:
+ 29251 => 1
+ 29250 => 1
+ 29249 => 1
+ 29248 => 1
+ 29247 => 1
+ 28996 => 1
+ 28995 => 1
+ 28994 => 1
+ 28993 => 1
+ 28992 => 1
+ 28991 => 1
+ 28741 => 1
+ 28740 => 1
+ 28739 => 1
+ 28738 => 1
+ 28737 => 1
+ 28736 => 1
+ 28735 => 1
+ 28485 => 1
+ 28484 => 1
+ 28483 => 1
+ 28482 => 1
+ 29256 => 0
+ 29255 => 0
+ 29254 => 0
+ 29253 => 0
+ 29252 => 0
+ 29000 => 0
+ 28999 => 0
+ 28998 => 0
+ 28997 => 0
+ 28744 => 0
+ 28743 => 0
+ 28742 => 0
+ 28488 => 0
+ 28487 => 0
+ 28486 => 0
+ 28481 => 0
+ 28480 => 0
+ 28479 => 0
+ IsRiverTile() done
+ Count(): 40
ListDump:
- 54941 => 1
- 54940 => 1
- 54939 => 1
- 54938 => 1
- 54937 => 1
- 54936 => 1
- 54935 => 1
- 54934 => 1
- 54933 => 1
- 54685 => 1
- 54684 => 1
- 54683 => 1
- 54682 => 1
- 54681 => 1
- 54680 => 1
- 54679 => 1
- 54678 => 1
- 54677 => 1
- 54429 => 1
- 54428 => 1
- 54427 => 1
- 54426 => 1
- 54425 => 1
- 54424 => 1
- 54423 => 1
- 54422 => 1
- 54421 => 1
- 54173 => 1
- 54172 => 1
- 54171 => 1
- 54170 => 1
- 54169 => 1
- 54168 => 0
- 54167 => 0
- 54166 => 0
- 54165 => 0
- 53917 => 0
- 53916 => 0
- 53915 => 0
- 53914 => 0
- 53913 => 0
- 53912 => 0
- 53911 => 0
- 53910 => 0
- 53909 => 0
+ 29256 => 0
+ 29255 => 0
+ 29254 => 0
+ 29253 => 0
+ 29252 => 0
+ 29251 => 0
+ 29250 => 0
+ 29249 => 0
+ 29248 => 0
+ 29247 => 0
+ 29000 => 0
+ 28999 => 0
+ 28998 => 0
+ 28997 => 0
+ 28996 => 0
+ 28995 => 0
+ 28994 => 0
+ 28993 => 0
+ 28992 => 0
+ 28991 => 0
+ 28744 => 0
+ 28743 => 0
+ 28742 => 0
+ 28741 => 0
+ 28740 => 0
+ 28739 => 0
+ 28738 => 0
+ 28737 => 0
+ 28736 => 0
+ 28735 => 0
+ 28488 => 0
+ 28487 => 0
+ 28486 => 0
+ 28485 => 0
+ 28484 => 0
+ 28483 => 0
+ 28482 => 0
+ 28481 => 0
+ 28480 => 0
+ 28479 => 0
+ IsCanalTile() done
+ Count(): 40
+ ListDump:
+ 28744 => 1
+ 29256 => 0
+ 29255 => 0
+ 29254 => 0
+ 29253 => 0
+ 29252 => 0
+ 29251 => 0
+ 29250 => 0
+ 29249 => 0
+ 29248 => 0
+ 29247 => 0
+ 29000 => 0
+ 28999 => 0
+ 28998 => 0
+ 28997 => 0
+ 28996 => 0
+ 28995 => 0
+ 28994 => 0
+ 28993 => 0
+ 28992 => 0
+ 28991 => 0
+ 28743 => 0
+ 28742 => 0
+ 28741 => 0
+ 28740 => 0
+ 28739 => 0
+ 28738 => 0
+ 28737 => 0
+ 28736 => 0
+ 28735 => 0
+ 28488 => 0
+ 28487 => 0
+ 28486 => 0
+ 28485 => 0
+ 28484 => 0
+ 28483 => 0
+ 28482 => 0
+ 28481 => 0
+ 28480 => 0
+ 28479 => 0
+ IsCoastTile() done
+ Count(): 40
+ ListDump:
+ 28998 => 1
+ 28997 => 1
+ 28743 => 1
+ 28742 => 1
+ 29256 => 0
+ 29255 => 0
+ 29254 => 0
+ 29253 => 0
+ 29252 => 0
+ 29251 => 0
+ 29250 => 0
+ 29249 => 0
+ 29248 => 0
+ 29247 => 0
+ 29000 => 0
+ 28999 => 0
+ 28996 => 0
+ 28995 => 0
+ 28994 => 0
+ 28993 => 0
+ 28992 => 0
+ 28991 => 0
+ 28744 => 0
+ 28741 => 0
+ 28740 => 0
+ 28739 => 0
+ 28738 => 0
+ 28737 => 0
+ 28736 => 0
+ 28735 => 0
+ 28488 => 0
+ 28487 => 0
+ 28486 => 0
+ 28485 => 0
+ 28484 => 0
+ 28483 => 0
+ 28482 => 0
+ 28481 => 0
+ 28480 => 0
+ 28479 => 0
--TileList_IndustryAccepting--
Count(): 47
@@ -9099,12 +9272,12 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetLocation(): 33417
GetEngineType(): 153
GetUnitNumber(): 1
- GetAge(): 0
+ GetAge(): 1
GetMaxAge(): 5490
- GetAgeLeft(): 5490
+ GetAgeLeft(): 5489
GetCurrentSpeed(): 7
GetRunningCost(): 421
- GetProfitThisYear(): 0
+ GetProfitThisYear(): -1
GetProfitLastYear(): 0
GetCurrentValue(): 5947
GetVehicleType(): 1
@@ -9114,7 +9287,7 @@ ERROR: IsEnd() is invalid as Begin() is never called
IsInDepot(): false
GetNumWagons(): 1
GetWagonEngineType(): 153
- GetWagonAge(): 0
+ GetWagonAge(): 1
GetLength(): 8
GetOwner(): 1
BuildVehicle(): 14
@@ -9139,9 +9312,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
GetNumWagons(): 3
GetLength(): 24
GetWagonEngineType(): 9
- GetWagonAge(): 1
+ GetWagonAge(): 0
GetWagonEngineType(): 27
- GetWagonAge(): 1
+ GetWagonAge(): 0
GetWagonEngineType(): 27
GetWagonAge(): 0
GetWagonEngineType(): 65535
@@ -9187,11 +9360,11 @@ ERROR: IsEnd() is invalid as Begin() is never called
14 => 1
12 => 1
Age ListDump:
- 17 => 1
- 16 => 1
- 14 => 1
13 => 1
12 => 1
+ 17 => 0
+ 16 => 0
+ 14 => 0
MaxAge ListDump:
16 => 10980
14 => 10980
@@ -9199,9 +9372,9 @@ ERROR: IsEnd() is invalid as Begin() is never called
13 => 5490
12 => 5490
AgeLeft ListDump:
- 16 => 10979
- 14 => 10979
- 17 => 7319
+ 16 => 10980
+ 14 => 10980
+ 17 => 7320
13 => 5489
12 => 5489
CurrentSpeed ListDump:
diff --git a/src/script/api/ai_changelog.hpp b/src/script/api/ai_changelog.hpp
index e5699a7d4..f977168e4 100644
--- a/src/script/api/ai_changelog.hpp
+++ b/src/script/api/ai_changelog.hpp
@@ -21,6 +21,11 @@
* \li AINewGRF
* \li AINewGRFList
* \li AIGroup::GetNumVehicles
+ * \li AIMarine::BT_LOCK
+ * \li AIMarine::BT_CANAL
+ * \li AITile::IsSeaTile
+ * \li AITile::IsRiverTile
+ * \li AITile::BT_CLEAR_WATER
*
* \b 1.11.0
*
diff --git a/src/script/api/game_changelog.hpp b/src/script/api/game_changelog.hpp
index d3efea919..8eab8956e 100644
--- a/src/script/api/game_changelog.hpp
+++ b/src/script/api/game_changelog.hpp
@@ -20,6 +20,11 @@
* API additions:
* \li GSNewGRF
* \li GSNewGRFList
+ * \li GSMarine::BT_LOCK
+ * \li GSMarine::BT_CANAL
+ * \li GSTile::IsSeaTile
+ * \li GSTile::IsRiverTile
+ * \li GSTile::BT_CLEAR_WATER
*
* \b 1.11.0
*
diff --git a/src/script/api/script_marine.cpp b/src/script/api/script_marine.cpp
index c63add8fa..16f0228db 100644
--- a/src/script/api/script_marine.cpp
+++ b/src/script/api/script_marine.cpp
@@ -167,6 +167,8 @@
case BT_DOCK: return ::GetPrice(PR_BUILD_STATION_DOCK, 1, nullptr);
case BT_DEPOT: return ::GetPrice(PR_BUILD_DEPOT_SHIP, 1, nullptr);
case BT_BUOY: return ::GetPrice(PR_BUILD_WAYPOINT_BUOY, 1, nullptr);
+ case BT_LOCK: return ::GetPrice(PR_BUILD_LOCK, 1, nullptr);
+ case BT_CANAL: return ::GetPrice(PR_BUILD_CANAL, 1, nullptr);
default: return -1;
}
}
diff --git a/src/script/api/script_marine.hpp b/src/script/api/script_marine.hpp
index 324ed8f3e..b3ba02210 100644
--- a/src/script/api/script_marine.hpp
+++ b/src/script/api/script_marine.hpp
@@ -36,6 +36,8 @@ public:
BT_DOCK, ///< Build a dock
BT_DEPOT, ///< Build a ship depot
BT_BUOY, ///< Build a buoy
+ BT_LOCK, ///< Build a lock
+ BT_CANAL, ///< Build a canal
};
/**
diff --git a/src/script/api/script_tile.cpp b/src/script/api/script_tile.cpp
index 360b32c02..90411a7f7 100644
--- a/src/script/api/script_tile.cpp
+++ b/src/script/api/script_tile.cpp
@@ -58,6 +58,20 @@
return true;
}
+/* static */ bool ScriptTile::IsSeaTile(TileIndex tile)
+{
+ if (!::IsValidTile(tile)) return false;
+
+ return ::IsTileType(tile, MP_WATER) && ::IsSea(tile);
+}
+
+/* static */ bool ScriptTile::IsRiverTile(TileIndex tile)
+{
+ if (!::IsValidTile(tile)) return false;
+
+ return ::IsTileType(tile, MP_WATER) && ::IsRiver(tile);
+}
+
/* static */ bool ScriptTile::IsWaterTile(TileIndex tile)
{
if (!::IsValidTile(tile)) return false;
@@ -320,6 +334,7 @@
case BT_CLEAR_ROCKY: return ::GetPrice(PR_CLEAR_ROCKS, 1, nullptr);
case BT_CLEAR_FIELDS: return ::GetPrice(PR_CLEAR_FIELDS, 1, nullptr);
case BT_CLEAR_HOUSE: return ::GetPrice(PR_CLEAR_HOUSE, 1, nullptr);
+ case BT_CLEAR_WATER: return ::GetPrice(PR_CLEAR_WATER, 1, nullptr);
default: return -1;
}
}
diff --git a/src/script/api/script_tile.hpp b/src/script/api/script_tile.hpp
index 423044b21..4ee12c691 100644
--- a/src/script/api/script_tile.hpp
+++ b/src/script/api/script_tile.hpp
@@ -119,6 +119,7 @@ public:
BT_CLEAR_ROCKY, ///< Clear a tile with rocks
BT_CLEAR_FIELDS, ///< Clear a tile with farm fields
BT_CLEAR_HOUSE, ///< Clear a tile with a house
+ BT_CLEAR_WATER, ///< Clear a tile with either river or sea
};
/**
@@ -159,10 +160,27 @@ public:
static bool IsBuildableRectangle(TileIndex tile, uint width, uint height);
/**
+ * Checks whether the given tile is actually a sea tile.
+ * @param tile The tile to check on.
+ * @pre ScriptMap::IsValidTile(tile).
+ * @return True if and only if the tile is a sea tile.
+ */
+ static bool IsSeaTile(TileIndex tile);
+
+ /**
+ * Checks whether the given tile is actually a river tile.
+ * @param tile The tile to check on.
+ * @pre ScriptMap::IsValidTile(tile).
+ * @return True if and only if the tile is a river tile.
+ */
+ static bool IsRiverTile(TileIndex tile);
+
+ /**
* Checks whether the given tile is actually a water tile.
* @param tile The tile to check on.
* @pre ScriptMap::IsValidTile(tile).
* @return True if and only if the tile is a water tile.
+ * @note Returns false when a buoy is on the tile.
*/
static bool IsWaterTile(TileIndex tile);