summaryrefslogtreecommitdiff
path: root/bin
diff options
context:
space:
mode:
authortruebrain <truebrain@openttd.org>2009-01-12 17:11:45 +0000
committertruebrain <truebrain@openttd.org>2009-01-12 17:11:45 +0000
commita3dd7506d377b1434f913bd65c019eed52b64b6e (patch)
treeced1a262eb143ad6e64ec02f4a4c89835c0c32fd /bin
parent9294f9616866b9778c22076c19b5a32b4f85f788 (diff)
downloadopenttd-a3dd7506d377b1434f913bd65c019eed52b64b6e.tar.xz
(svn r15027) -Merge: tomatos and bananas left to be, here is NoAI for all to see.
NoAI is an API (a framework) to build your own AIs in. See: http://wiki.openttd.org/wiki/index.php/AI:Main_Page With many thanks to: - glx and Rubidium for their syncing, feedback and hard work - Yexo for his feedback, patches, and AIs which tested the system very deep - Morloth for his feedback and patches - TJIP for hosting a challenge which kept NoAI on track - All AI authors for testing our AI API, and all other people who helped in one way or another -Remove: all old AIs and their cheats/hacks
Diffstat (limited to 'bin')
-rw-r--r--bin/ai/library/graph/aystar/library.nut12
-rw-r--r--bin/ai/library/graph/aystar/main.nut238
-rw-r--r--bin/ai/library/pathfinder/rail/library.nut12
-rw-r--r--bin/ai/library/pathfinder/rail/main.nut389
-rw-r--r--bin/ai/library/pathfinder/road/library.nut12
-rw-r--r--bin/ai/library/pathfinder/road/main.nut363
-rw-r--r--bin/ai/library/queue/binary_heap/library.nut12
-rw-r--r--bin/ai/library/queue/binary_heap/main.nut131
-rw-r--r--bin/ai/library/queue/fibonacci_heap/library.nut12
-rw-r--r--bin/ai/library/queue/fibonacci_heap/main.nut204
-rw-r--r--bin/ai/library/queue/priority_queue/library.nut12
-rw-r--r--bin/ai/library/queue/priority_queue/main.nut115
-rw-r--r--bin/ai/regression/completeness.sh67
-rw-r--r--bin/ai/regression/regression.cfg17
-rw-r--r--bin/ai/regression/regression.nut1761
-rw-r--r--bin/ai/regression/regression.savbin0 -> 97731 bytes
-rw-r--r--bin/ai/regression/regression.txt7824
-rw-r--r--bin/ai/regression/regression_info.nut11
-rw-r--r--bin/ai/regression/require.nut3
-rw-r--r--bin/ai/regression/run.sh49
-rw-r--r--bin/ai/wrightai/info.nut15
-rw-r--r--bin/ai/wrightai/main.nut387
-rw-r--r--bin/scripts/game_start.scr.example2
23 files changed, 11648 insertions, 0 deletions
diff --git a/bin/ai/library/graph/aystar/library.nut b/bin/ai/library/graph/aystar/library.nut
new file mode 100644
index 000000000..522760135
--- /dev/null
+++ b/bin/ai/library/graph/aystar/library.nut
@@ -0,0 +1,12 @@
+/* $Id$ */
+
+class AyStar extends AILibrary {
+ function GetAuthor() { return "OpenTTD NoAI Developers Team"; }
+ function GetName() { return "AyStar"; }
+ function GetDescription() { return "An implementation of AyStar"; }
+ function GetVersion() { return 4; }
+ function GetDate() { return "2008-06-11"; }
+ function CreateInstance() { return "AyStar"; }
+}
+
+RegisterLibrary(AyStar());
diff --git a/bin/ai/library/graph/aystar/main.nut b/bin/ai/library/graph/aystar/main.nut
new file mode 100644
index 000000000..1999eab14
--- /dev/null
+++ b/bin/ai/library/graph/aystar/main.nut
@@ -0,0 +1,238 @@
+/* $Id$ */
+
+/**
+ * An AyStar implementation.
+ * It solves graphs by finding the fastest route from one point to the other.
+ */
+class AyStar
+{
+ _queue_class = import("queue.binary_heap", "", 1);
+ _cost_callback = null;
+ _estimate_callback = null;
+ _neighbours_callback = null;
+ _check_direction_callback = null;
+ _cost_callback_param = null;
+ _estimate_callback_param = null;
+ _neighbours_callback_param = null;
+ _check_direction_callback_param = null;
+ _open = null;
+ _closed = null;
+ _goals = null;
+
+ /**
+ * @param cost_callback A function that returns the cost of a path. It
+ * should accept four parameters, old_path, new_tile, new_direction and
+ * cost_callback_param. old_path is an instance of AyStar.Path, and
+ * new_node is the new node that is added to that path. It should return
+ * the cost of the path including new_node.
+ * @param estimate_callback A function that returns an estimate from a node
+ * to the goal node. It should accept four parameters, tile, direction,
+ * goal_nodes and estimate_callback_param. It should return an estimate to
+ * the cost from the lowest cost between node and any node out of goal_nodes.
+ * Note that this estimate is not allowed to be higher than the real cost
+ * between node and any of goal_nodes. A lower value is fine, however the
+ * closer it is to the real value, the better the performance.
+ * @param neighbours_callback A function that returns all neighbouring nodes
+ * from a given node. It should accept three parameters, current_path, node
+ * and neighbours_callback_param. It should return an array containing all
+ * neighbouring nodes, which are an array in the form [tile, direction].
+ * @param check_direction_callback A function that returns either false or
+ * true. It should accept four parameters, tile, existing_direction,
+ * new_direction and check_direction_callback_param. It should check
+ * if both directions can go together on a single tile.
+ * @param cost_callback_param This parameters will be passed to cost_callback
+ * as fourth parameter. Useful to send is an instance of an object.
+ * @param estimate_callback_param This parameters will be passed to
+ * estimate_callback as fourth parameter. Useful to send is an instance of an
+ * object.
+ * @param neighbours_callback_param This parameters will be passed to
+ * neighbours_callback as third parameter. Useful to send is an instance of
+ * an object.
+ * @param check_direction_callback_param This parameters will be passed to
+ * check_direction_callback as fourth parameter. Useful to send is an
+ * instance of an object.
+ */
+ constructor(cost_callback, estimate_callback, neighbours_callback, check_direction_callback, cost_callback_param = null,
+ estimate_callback_param = null, neighbours_callback_param = null, check_direction_callback_param = null)
+ {
+ if (typeof(cost_callback) != "function") throw("'cost_callback' has to be a function-pointer.");
+ if (typeof(estimate_callback) != "function") throw("'estimate_callback' has to be a function-pointer.");
+ if (typeof(neighbours_callback) != "function") throw("'neighbours_callback' has to be a function-pointer.");
+ if (typeof(check_direction_callback) != "function") throw("'check_direction_callback' has to be a function-pointer.");
+
+ this._cost_callback = cost_callback;
+ this._estimate_callback = estimate_callback;
+ this._neighbours_callback = neighbours_callback;
+ this._check_direction_callback = check_direction_callback;
+ this._cost_callback_param = cost_callback_param;
+ this._estimate_callback_param = estimate_callback_param;
+ this._neighbours_callback_param = neighbours_callback_param;
+ this._check_direction_callback_param = check_direction_callback_param;
+ }
+
+ /**
+ * Initialize a path search between sources and goals.
+ * @param sources The source nodes. This can an array of either [tile, direction]-pairs or AyStar.Path-instances.
+ * @param goals The target tiles. This can be an array of either tiles or [tile, next_tile]-pairs.
+ * @param ignored_tiles An array of tiles that cannot occur in the final path.
+ */
+ function InitializePath(sources, goals, ignored_tiles = []);
+
+ /**
+ * Try to find the path as indicated with InitializePath with the lowest cost.
+ * @param iterations After how many iterations it should abort for a moment.
+ * This value should either be -1 for infinite, or > 0. Any other value
+ * aborts immediatly and will never find a path.
+ * @return A route if one was found, or false if the amount of iterations was
+ * reached, or null if no path was found.
+ * You can call this function over and over as long as it returns false,
+ * which is an indication it is not yet done looking for a route.
+ */
+ function FindPath(iterations);
+};
+
+function AyStar::InitializePath(sources, goals, ignored_tiles = [])
+{
+ if (typeof(sources) != "array" || sources.len() == 0) throw("sources has be a non-empty array.");
+ if (typeof(goals) != "array" || goals.len() == 0) throw("goals has be a non-empty array.");
+
+ this._open = this._queue_class();
+ this._closed = AIList();
+
+ foreach (node in sources) {
+ if (typeof(node) == "array") {
+ if (node[1] <= 0) throw("directional value should never be zero or negative.");
+
+ local new_path = this.Path(null, node[0], node[1], this._cost_callback, this._cost_callback_param);
+ this._open.Insert(new_path, new_path.GetCost() + this._estimate_callback(node[0], node[1], goals, this._estimate_callback_param));
+ } else {
+ this._open.Insert(node, node.GetCost());
+ }
+ }
+
+ this._goals = goals;
+
+ foreach (tile in ignored_tiles) {
+ this._closed.AddItem(tile, ~0);
+ }
+}
+
+function AyStar::FindPath(iterations)
+{
+ if (this._open == null) throw("can't execute over an uninitialized path");
+
+ while (this._open.Count() > 0 && (iterations == -1 || iterations-- > 0)) {
+ /* Get the path with the best score so far */
+ local path = this._open.Pop();
+ local cur_tile = path.GetTile();
+ /* Make sure we didn't already passed it */
+ if (this._closed.HasItem(cur_tile)) {
+ /* If the direction is already on the list, skip this entry */
+ if ((this._closed.GetValue(cur_tile) & path.GetDirection()) != 0) continue;
+
+ /* Scan the path for a possible collision */
+ local scan_path = path.GetParent();
+
+ local mismatch = false;
+ while (scan_path != null) {
+ if (scan_path.GetTile() == cur_tile) {
+ if (!this._check_direction_callback(cur_tile, scan_path.GetDirection(), path.GetDirection(), this._check_direction_callback_param)) {
+ mismatch = true;
+ break;
+ }
+ }
+ scan_path = scan_path.GetParent();
+ }
+ if (mismatch) continue;
+
+ /* Add the new direction */
+ this._closed.SetValue(cur_tile, this._closed.GetValue(cur_tile) | path.GetDirection());
+ } else {
+ /* New entry, make sure we don't check it again */
+ this._closed.AddItem(cur_tile, path.GetDirection());
+ }
+ /* Check if we found the end */
+ foreach (goal in this._goals) {
+ if (typeof(goal) == "array") {
+ if (cur_tile == goal[0]) {
+ local neighbours = this._neighbours_callback(path, cur_tile, this._neighbours_callback_param);
+ foreach (node in neighbours) {
+ if (node[0] == goal[1]) {
+ this._CleanPath();
+ return path;
+ }
+ }
+ continue;
+ }
+ } else {
+ if (cur_tile == goal) {
+ this._CleanPath();
+ return path;
+ }
+ }
+ }
+ /* Scan all neighbours */
+ local neighbours = this._neighbours_callback(path, cur_tile, this._neighbours_callback_param);
+ foreach (node in neighbours) {
+ if (node[1] <= 0) throw("directional value should never be zero or negative.");
+
+ if ((this._closed.GetValue(node[0]) & node[1]) != 0) continue;
+ /* Calculate the new paths and add them to the open list */
+ local new_path = this.Path(path, node[0], node[1], this._cost_callback, this._cost_callback_param);
+ this._open.Insert(new_path, new_path.GetCost() + this._estimate_callback(node[0], node[1], this._goals, this._estimate_callback_param));
+ }
+ }
+
+ if (this._open.Count() > 0) return false;
+ this._CleanPath();
+ return null;
+}
+
+function AyStar::_CleanPath()
+{
+ this._closed = null;
+ this._open = null;
+ this._goals = null;
+}
+
+/**
+ * The path of the AyStar algorithm.
+ * It is reversed, that is, the first entry is more close to the goal-nodes
+ * than his GetParent(). You can walk this list to find the whole path.
+ * The last entry has a GetParent() of null.
+ */
+class AyStar.Path
+{
+ _prev = null;
+ _tile = null;
+ _direction = null;
+ _cost = null;
+
+ constructor(old_path, new_tile, new_direction, cost_callback, cost_callback_param)
+ {
+ this._prev = old_path;
+ this._tile = new_tile;
+ this._direction = new_direction;
+ this._cost = cost_callback(old_path, new_tile, new_direction, cost_callback_param);
+ };
+
+ /**
+ * Return the tile where this (partial-)path ends.
+ */
+ function GetTile() { return this._tile; }
+
+ /**
+ * Return the direction from which we entered the tile in this (partial-)path.
+ */
+ function GetDirection() { return this._direction; }
+
+ /**
+ * Return an instance of this class leading to the previous node.
+ */
+ function GetParent() { return this._prev; }
+
+ /**
+ * Return the cost of this (partial-)path from the beginning up to this node.
+ */
+ function GetCost() { return this._cost; }
+};
diff --git a/bin/ai/library/pathfinder/rail/library.nut b/bin/ai/library/pathfinder/rail/library.nut
new file mode 100644
index 000000000..2d50557e2
--- /dev/null
+++ b/bin/ai/library/pathfinder/rail/library.nut
@@ -0,0 +1,12 @@
+/* $Id$ */
+
+class Rail extends AILibrary {
+ function GetAuthor() { return "OpenTTD NoAI Developers Team"; }
+ function GetName() { return "Rail"; }
+ function GetDescription() { return "An implementation of a rail pathfinder"; }
+ function GetVersion() { return 1; }
+ function GetDate() { return "2008-09-22"; }
+ function CreateInstance() { return "Rail"; }
+}
+
+RegisterLibrary(Rail());
diff --git a/bin/ai/library/pathfinder/rail/main.nut b/bin/ai/library/pathfinder/rail/main.nut
new file mode 100644
index 000000000..ad5a6664e
--- /dev/null
+++ b/bin/ai/library/pathfinder/rail/main.nut
@@ -0,0 +1,389 @@
+/* $Id$ */
+
+/**
+ * A Rail Pathfinder.
+ */
+class Rail
+{
+ _aystar_class = import("graph.aystar", "", 4);
+ _max_cost = null; ///< The maximum cost for a route.
+ _cost_tile = null; ///< The cost for a single tile.
+ _cost_diagonal_tile = null; ///< The cost for a diagonal tile.
+ _cost_turn = null; ///< The cost that is added to _cost_tile if the direction changes.
+ _cost_slope = null; ///< The extra cost if a rail tile is sloped.
+ _cost_bridge_per_tile = null; ///< The cost per tile of a new bridge, this is added to _cost_tile.
+ _cost_tunnel_per_tile = null; ///< The cost per tile of a new tunnel, this is added to _cost_tile.
+ _cost_coast = null; ///< The extra cost for a coast tile.
+ _pathfinder = null; ///< A reference to the used AyStar object.
+ _max_bridge_length = null; ///< The maximum length of a bridge that will be build.
+ _max_tunnel_length = null; ///< The maximum length of a tunnel that will be build.
+
+ cost = null; ///< Used to change the costs.
+ _running = null;
+ _goals = null;
+
+ constructor()
+ {
+ this._max_cost = 10000000;
+ this._cost_tile = 100;
+ this._cost_diagonal_tile = 70;
+ this._cost_turn = 50;
+ this._cost_slope = 100;
+ this._cost_bridge_per_tile = 150;
+ this._cost_tunnel_per_tile = 120;
+ this._cost_coast = 20;
+ this._max_bridge_length = 6;
+ this._max_tunnel_length = 6;
+ this._pathfinder = this._aystar_class(this._Cost, this._Estimate, this._Neighbours, this._CheckDirection, this, this, this, this);
+
+ this.cost = this.Cost(this);
+ this._running = false;
+ }
+
+ /**
+ * Initialize a path search between sources and goals.
+ * @param sources The source tiles.
+ * @param goals The target tiles.
+ * @param ignored_tiles An array of tiles that cannot occur in the final path.
+ * @see AyStar::InitializePath()
+ */
+ function InitializePath(sources, goals, ignored_tiles = []) {
+ local nsources = [];
+
+ foreach (node in sources) {
+ local path = this._pathfinder.Path(null, node[1], 0xFF, this._Cost, this);
+ path = this._pathfinder.Path(path, node[0], 0xFF, this._Cost, this);
+ nsources.push(path);
+ }
+ this._goals = goals;
+ this._pathfinder.InitializePath(nsources, goals, ignored_tiles);
+ }
+
+ /**
+ * Try to find the path as indicated with InitializePath with the lowest cost.
+ * @param iterations After how many iterations it should abort for a moment.
+ * This value should either be -1 for infinite, or > 0. Any other value
+ * aborts immediatly and will never find a path.
+ * @return A route if one was found, or false if the amount of iterations was
+ * reached, or null if no path was found.
+ * You can call this function over and over as long as it returns false,
+ * which is an indication it is not yet done looking for a route.
+ * @see AyStar::FindPath()
+ */
+ function FindPath(iterations);
+};
+
+class Rail.Cost
+{
+ _main = null;
+
+ function _set(idx, val)
+ {
+ if (this._main._running) throw("You are not allowed to change parameters of a running pathfinder.");
+
+ switch (idx) {
+ case "max_cost": this._main._max_cost = val; break;
+ case "tile": this._main._cost_tile = val; break;
+ case "diagonal_tile": this._cost_diagonal_tile = val; break;
+ case "turn": this._main._cost_turn = val; break;
+ case "slope": this._main._cost_slope = val; break;
+ case "bridge_per_tile": this._main._cost_bridge_per_tile = val; break;
+ case "tunnel_per_tile": this._main._cost_tunnel_per_tile = val; break;
+ case "coast": this._main._cost_coast = val; break;
+ case "max_bridge_length": this._main._max_bridge_length = val; break;
+ case "max_tunnel_length": this._main._max_tunnel_length = val; break;
+ default: throw("the index '" + idx + "' does not exist");
+ }
+
+ return val;
+ }
+
+ function _get(idx)
+ {
+ switch (idx) {
+ case "max_cost": return this._main._max_cost;
+ case "tile": return this._main._cost_tile;
+ case "diagonal_tile": return this._cost_diagonal_tile;
+ case "turn": return this._main._cost_turn;
+ case "slope": return this._main._cost_slope;
+ case "bridge_per_tile": return this._main._cost_bridge_per_tile;
+ case "tunnel_per_tile": return this._main._cost_tunnel_per_tile;
+ case "coast": return this._main._cost_coast;
+ case "max_bridge_length": return this._main._max_bridge_length;
+ case "max_tunnel_length": return this._main._max_tunnel_length;
+ default: throw("the index '" + idx + "' does not exist");
+ }
+ }
+
+ constructor(main)
+ {
+ this._main = main;
+ }
+};
+
+function Rail::FindPath(iterations)
+{
+ local test_mode = AITestMode();
+ local ret = this._pathfinder.FindPath(iterations);
+ this._running = (ret == false) ? true : false;
+ if (!this._running && ret != null) {
+ foreach (goal in this._goals) {
+ if (goal[0] == ret.GetTile()) {
+ return this._pathfinder.Path(ret, goal[1], 0, this._Cost, this);
+ }
+ }
+ }
+ return ret;
+}
+
+function Rail::_GetBridgeNumSlopes(end_a, end_b)
+{
+ local slopes = 0;
+ local direction = (end_b - end_a) / AIMap.DistanceManhattan(end_a, end_b);
+ local slope = AITile.GetSlope(end_a);
+ if (!((slope == AITile.SLOPE_NE && direction == 1) || (slope == AITile.SLOPE_SE && direction == -AIMap.GetMapSizeX()) ||
+ (slope == AITile.SLOPE_SW && direction == -1) || (slope == AITile.SLOPE_NW && direction == AIMap.GetMapSizeX()) ||
+ slope == AITile.SLOPE_N || slope == AITile.SLOPE_E || slope == AITile.SLOPE_S || slope == AITile.SLOPE_W)) {
+ slopes++;
+ }
+
+ local slope = AITile.GetSlope(end_b);
+ direction = -direction;
+ if (!((slope == AITile.SLOPE_NE && direction == 1) || (slope == AITile.SLOPE_SE && direction == -AIMap.GetMapSizeX()) ||
+ (slope == AITile.SLOPE_SW && direction == -1) || (slope == AITile.SLOPE_NW && direction == AIMap.GetMapSizeX()) ||
+ slope == AITile.SLOPE_N || slope == AITile.SLOPE_E || slope == AITile.SLOPE_S || slope == AITile.SLOPE_W)) {
+ slopes++;
+ }
+ return slopes;
+}
+
+function Rail::_nonzero(a, b)
+{
+ return a != 0 ? a : b;
+}
+
+function Rail::_Cost(path, new_tile, new_direction, self)
+{
+ /* path == null means this is the first node of a path, so the cost is 0. */
+ if (path == null) return 0;
+
+ local prev_tile = path.GetTile();
+
+ /* If the new tile is a bridge / tunnel tile, check whether we came from the other
+ * end of the bridge / tunnel or if we just entered the bridge / tunnel. */
+ if (AIBridge.IsBridgeTile(new_tile)) {
+ if (AIBridge.GetOtherBridgeEnd(new_tile) != prev_tile) {
+ local cost = path.GetCost() + self._cost_tile;
+ if (path.GetParent() != null && path.GetParent().GetTile() - prev_tile != prev_tile - new_tile) cost += self._cost_turn;
+ return cost;
+ }
+ return path.GetCost() + AIMap.DistanceManhattan(new_tile, prev_tile) * self._cost_tile + self._GetBridgeNumSlopes(new_tile, prev_tile) * self._cost_slope;
+ }
+ if (AITunnel.IsTunnelTile(new_tile)) {
+ if (AITunnel.GetOtherTunnelEnd(new_tile) != prev_tile) {
+ local cost = path.GetCost() + self._cost_tile;
+ if (path.GetParent() != null && path.GetParent().GetTile() - prev_tile != prev_tile - new_tile) cost += self._cost_turn;
+ return cost;
+ }
+ return path.GetCost() + AIMap.DistanceManhattan(new_tile, prev_tile) * self._cost_tile;
+ }
+
+ /* If the two tiles are more then 1 tile apart, the pathfinder wants a bridge or tunnel
+ * to be build. It isn't an existing bridge / tunnel, as that case is already handled. */
+ if (AIMap.DistanceManhattan(new_tile, prev_tile) > 1) {
+ /* Check if we should build a bridge or a tunnel. */
+ local cost = path.GetCost();
+ if (AITunnel.GetOtherTunnelEnd(new_tile) == prev_tile) {
+ cost += AIMap.DistanceManhattan(new_tile, prev_tile) * (self._cost_tile + self._cost_tunnel_per_tile);
+ } else {
+ cost += AIMap.DistanceManhattan(new_tile, prev_tile) * (self._cost_tile + self._cost_bridge_per_tile) + self._GetBridgeNumSlopes(new_tile, prev_tile) * self._cost_slope;
+ }
+ if (path.GetParent() != null && path.GetParent().GetParent() != null &&
+ path.GetParent().GetParent().GetTile() - path.GetParent().GetTile() != max(AIMap.GetTileX(prev_tile) - AIMap.GetTileX(new_tile), AIMap.GetTileY(prev_tile) - AIMap.GetTileY(new_tile)) / AIMap.DistanceManhattan(new_tile, prev_tile)) {
+ cost += self._cost_turn;
+ }
+ return cost;
+ }
+
+ /* Check for a turn. We do this by substracting the TileID of the current
+ * node from the TileID of the previous node and comparing that to the
+ * difference between the tile before the previous node and the node before
+ * that. */
+ local cost = self._cost_tile;
+ if (path.GetParent() != null && AIMap.DistanceManhattan(path.GetParent().GetTile(), prev_tile) == 1 && path.GetParent().GetTile() - prev_tile != prev_tile - new_tile) cost = self._cost_diagonal_tile;
+ if (path.GetParent() != null && path.GetParent().GetParent() != null &&
+ AIMap.DistanceManhattan(new_tile, path.GetParent().GetParent().GetTile()) == 3 &&
+ path.GetParent().GetParent().GetTile() - path.GetParent().GetTile() != prev_tile - new_tile) {
+ cost += self._cost_turn;
+ }
+
+ /* Check if the new tile is a coast tile. */
+ if (AITile.IsCoastTile(new_tile)) {
+ cost += self._cost_coast;
+ }
+
+ /* Check if the last tile was sloped. */
+ if (path.GetParent() != null && !AIBridge.IsBridgeTile(prev_tile) && !AITunnel.IsTunnelTile(prev_tile) &&
+ self._IsSlopedRail(path.GetParent().GetTile(), prev_tile, new_tile)) {
+ cost += self._cost_slope;
+ }
+
+ /* We don't use already existing rail, so the following code is unused. It
+ * assigns if no rail exists along the route. */
+ /*
+ if (path.GetParent() != null && !AIRail.AreTilesConnected(path.GetParent().GetTile(), prev_tile, new_tile)) {
+ cost += self._cost_no_existing_rail;
+ }
+ */
+
+ return path.GetCost() + cost;
+}
+
+function Rail::_Estimate(cur_tile, cur_direction, goal_tiles, self)
+{
+ local min_cost = self._max_cost;
+ /* As estimate we multiply the lowest possible cost for a single tile with
+ * with the minimum number of tiles we need to traverse. */
+ foreach (tile in goal_tiles) {
+ local dx = abs(AIMap.GetTileX(cur_tile) - AIMap.GetTileX(tile[0]));
+ local dy = abs(AIMap.GetTileY(cur_tile) - AIMap.GetTileY(tile[0]));
+ min_cost = min(min_cost, min(dx, dy) * self._cost_diagonal_tile * 2 + (max(dx, dy) - min(dx, dy)) * self._cost_tile);
+ }
+ return min_cost;
+}
+
+function Rail::_Neighbours(path, cur_node, self)
+{
+ if (AITile.HasTransportType(cur_node, AITile.TRANSPORT_RAIL)) return [];
+ /* self._max_cost is the maximum path cost, if we go over it, the path isn't valid. */
+ if (path.GetCost() >= self._max_cost) return [];
+ local tiles = [];
+ local offsets = [AIMap.GetTileIndex(0, 1), AIMap.GetTileIndex(0, -1),
+ AIMap.GetTileIndex(1, 0), AIMap.GetTileIndex(-1, 0)];
+
+ /* Check if the current tile is part of a bridge or tunnel. */
+ if (AIBridge.IsBridgeTile(cur_node) || AITunnel.IsTunnelTile(cur_node)) {
+ /* We don't use existing rails, so neither existing bridges / tunnels. */
+ } else if (path.GetParent() != null && AIMap.DistanceManhattan(cur_node, path.GetParent().GetTile()) > 1) {
+ local other_end = path.GetParent().GetTile();
+ local next_tile = cur_node + (cur_node - other_end) / AIMap.DistanceManhattan(cur_node, other_end);
+ foreach (offset in offsets) {
+ if (AIRail.BuildRail(cur_node, next_tile, next_tile + offset)) {
+ tiles.push([next_tile, self._GetDirection(other_end, cur_node, next_tile, true)]);
+ }
+ }
+ } else {
+ /* Check all tiles adjacent to the current tile. */
+ foreach (offset in offsets) {
+ local next_tile = cur_node + offset;
+ /* Don't turn back */
+ if (path.GetParent() != null && next_tile == path.GetParent().GetTile()) continue;
+ /* Disallow 90 degree turns */
+ if (path.GetParent() != null && path.GetParent().GetParent() != null &&
+ next_tile - cur_node == path.GetParent().GetParent().GetTile() - path.GetParent().GetTile()) continue;
+ /* We add them to the to the neighbours-list if we can build a rail to
+ * them and no rail exists there. */
+ if ((path.GetParent() == null || AIRail.BuildRail(path.GetParent().GetTile(), cur_node, next_tile))) {
+ if (path.GetParent() != null) {
+ tiles.push([next_tile, self._GetDirection(path.GetParent().GetTile(), cur_node, next_tile, false)]);
+ } else {
+ tiles.push([next_tile, self._GetDirection(null, cur_node, next_tile, false)]);
+ }
+ }
+ }
+ if (path.GetParent() != null && path.GetParent().GetParent() != null) {
+ local bridges = self._GetTunnelsBridges(path.GetParent().GetTile(), cur_node, self._GetDirection(path.GetParent().GetParent().GetTile(), path.GetParent().GetTile(), cur_node, true));
+ foreach (tile in bridges) {
+ tiles.push(tile);
+ }
+ }
+ }
+ return tiles;
+}
+
+function Rail::_CheckDirection(tile, existing_direction, new_direction, self)
+{
+ return false;
+}
+
+function Rail::_dir(from, to)
+{
+ if (from - to == 1) return 0;
+ if (from - to == -1) return 1;
+ if (from - to == AIMap.GetMapSizeX()) return 2;
+ if (from - to == -AIMap.GetMapSizeX()) return 3;
+ throw("Shouldn't come here in _dir");
+}
+
+function Rail::_GetDirection(pre_from, from, to, is_bridge)
+{
+ if (is_bridge) {
+ if (from - to == 1) return 1;
+ if (from - to == -1) return 2;
+ if (from - to == AIMap.GetMapSizeX()) return 4;
+ if (from - to == -AIMap.GetMapSizeX()) return 8;
+ }
+ return 1 << (4 + (pre_from == null ? 0 : 4 * this._dir(pre_from, from)) + this._dir(from, to));
+}
+
+/**
+ * Get a list of all bridges and tunnels that can be build from the
+ * current tile. Bridges will only be build starting on non-flat tiles
+ * for performance reasons. Tunnels will only be build if no terraforming
+ * is needed on both ends.
+ */
+function Rail::_GetTunnelsBridges(last_node, cur_node, bridge_dir)
+{
+ local slope = AITile.GetSlope(cur_node);
+ if (slope == AITile.SLOPE_FLAT && AITile.IsBuildable(cur_node + (cur_node - last_node))) return [];
+ local tiles = [];
+
+ for (local i = 2; i < this._max_bridge_length; i++) {
+ local bridge_list = AIBridgeList_Length(i + 1);
+ local target = cur_node + i * (cur_node - last_node);
+ if (!bridge_list.IsEmpty() && AIBridge.BuildBridge(AIVehicle.VEHICLE_RAIL, bridge_list.Begin(), cur_node, target)) {
+ tiles.push([target, bridge_dir]);
+ }
+ }
+
+ if (slope != AITile.SLOPE_SW && slope != AITile.SLOPE_NW && slope != AITile.SLOPE_SE && slope != AITile.SLOPE_NE) return tiles;
+ local other_tunnel_end = AITunnel.GetOtherTunnelEnd(cur_node);
+ if (!AIMap.IsValidTile(other_tunnel_end)) return tiles;
+
+ local tunnel_length = AIMap.DistanceManhattan(cur_node, other_tunnel_end);
+ local prev_tile = cur_node + (cur_node - other_tunnel_end) / tunnel_length;
+ if (AITunnel.GetOtherTunnelEnd(other_tunnel_end) == cur_node && tunnel_length >= 2 &&
+ prev_tile == last_node && tunnel_length < _max_tunnel_length && AITunnel.BuildTunnel(AIVehicle.VEHICLE_RAIL, cur_node)) {
+ tiles.push([other_tunnel_end, bridge_dir]);
+ }
+ return tiles;
+}
+
+function Rail::_IsSlopedRail(start, middle, end)
+{
+ local NW = 0; // Set to true if we want to build a rail to / from the north-west
+ local NE = 0; // Set to true if we want to build a rail to / from the north-east
+ local SW = 0; // Set to true if we want to build a rail to / from the south-west
+ local SE = 0; // Set to true if we want to build a rail to / from the south-east
+
+ if (middle - AIMap.GetMapSizeX() == start || middle - AIMap.GetMapSizeX() == end) NW = 1;
+ if (middle - 1 == start || middle - 1 == end) NE = 1;
+ if (middle + AIMap.GetMapSizeX() == start || middle + AIMap.GetMapSizeX() == end) SE = 1;
+ if (middle + 1 == start || middle + 1 == end) SW = 1;
+
+ /* If there is a turn in the current tile, it can't be sloped. */
+ if ((NW || SE) && (NE || SW)) return false;
+
+ local slope = AITile.GetSlope(middle);
+ /* A rail on a steep slope is always sloped. */
+ if (AITile.IsSteepSlope(slope)) return true;
+
+ /* If only one corner is raised, the rail is sloped. */
+ if (slope == AITile.SLOPE_N || slope == AITile.SLOPE_W) return true;
+ if (slope == AITile.SLOPE_S || slope == AITile.SLOPE_E) return true;
+
+ if (NW && (slope == AITile.SLOPE_NW || slope == AITile.SLOPE_SE)) return true;
+ if (NE && (slope == AITile.SLOPE_NE || slope == AITile.SLOPE_SW)) return true;
+
+ return false;
+}
diff --git a/bin/ai/library/pathfinder/road/library.nut b/bin/ai/library/pathfinder/road/library.nut
new file mode 100644
index 000000000..b3c6f1f54
--- /dev/null
+++ b/bin/ai/library/pathfinder/road/library.nut
@@ -0,0 +1,12 @@
+/* $Id$ */
+
+class Road extends AILibrary {
+ function GetAuthor() { return "OpenTTD NoAI Developers Team"; }
+ function GetName() { return "Road"; }
+ function GetDescription() { return "An implementation of a road pathfinder"; }
+ function GetVersion() { return 3; }
+ function GetDate() { return "2008-06-18"; }
+ function CreateInstance() { return "Road"; }
+}
+
+RegisterLibrary(Road());
diff --git a/bin/ai/library/pathfinder/road/main.nut b/bin/ai/library/pathfinder/road/main.nut
new file mode 100644
index 000000000..b33722369
--- /dev/null
+++ b/bin/ai/library/pathfinder/road/main.nut
@@ -0,0 +1,363 @@
+/* $Id$ */
+
+/**
+ * A Road Pathfinder.
+ * This road pathfinder tries to find a buildable / existing route for
+ * road vehicles. You can changes the costs below using for example
+ * roadpf.cost.turn = 30. Note that it's not allowed to change the cost
+ * between consecutive calls to FindPath. You can change the cost before
+ * the first call to FindPath and after FindPath has returned an actual
+ * route. To use only existing roads, set cost.no_existing_road to
+ * cost.max_cost.
+ */
+class Road
+{
+ _aystar_class = import("graph.aystar", "", 4);
+ _max_cost = null; ///< The maximum cost for a route.
+ _cost_tile = null; ///< The cost for a single tile.
+ _cost_no_existing_road = null; ///< The cost that is added to _cost_tile if no road exists yet.
+ _cost_turn = null; ///< The cost that is added to _cost_tile if the direction changes.
+ _cost_slope = null; ///< The extra cost if a road tile is sloped.
+ _cost_bridge_per_tile = null; ///< The cost per tile of a new bridge, this is added to _cost_tile.
+ _cost_tunnel_per_tile = null; ///< The cost per tile of a new tunnel, this is added to _cost_tile.
+ _cost_coast = null; ///< The extra cost for a coast tile.
+ _pathfinder = null; ///< A reference to the used AyStar object.
+ _max_bridge_length = null; ///< The maximum length of a bridge that will be build.
+ _max_tunnel_length = null; ///< The maximum length of a tunnel that will be build.
+
+ cost = null; ///< Used to change the costs.
+ _running = null;
+
+ constructor()
+ {
+ this._max_cost = 10000000;
+ this._cost_tile = 100;
+ this._cost_no_existing_road = 40;
+ this._cost_turn = 100;
+ this._cost_slope = 200;
+ this._cost_bridge_per_tile = 150;
+ this._cost_tunnel_per_tile = 120;
+ this._cost_coast = 20;
+ this._max_bridge_length = 10;
+ this._max_tunnel_length = 20;
+ this._pathfinder = this._aystar_class(this._Cost, this._Estimate, this._Neighbours, this._CheckDirection, this, this, this, this);
+
+ this.cost = this.Cost(this);
+ this._running = false;
+ }
+
+ /**
+ * Initialize a path search between sources and goals.
+ * @param sources The source tiles.
+ * @param goals The target tiles.
+ * @see AyStar::InitializePath()
+ */
+ function InitializePath(sources, goals) {
+ local nsources = [];
+
+ foreach (node in sources) {
+ nsources.push([node, 0xFF]);
+ }
+ this._pathfinder.InitializePath(nsources, goals);
+ }
+
+ /**
+ * Try to find the path as indicated with InitializePath with the lowest cost.
+ * @param iterations After how many iterations it should abort for a moment.
+ * This value should either be -1 for infinite, or > 0. Any other value
+ * aborts immediatly and will never find a path.
+ * @return A route if one was found, or false if the amount of iterations was
+ * reached, or null if no path was found.
+ * You can call this function over and over as long as it returns false,
+ * which is an indication it is not yet done looking for a route.
+ * @see AyStar::FindPath()
+ */
+ function FindPath(iterations);
+};
+
+class Road.Cost
+{
+ _main = null;
+
+ function _set(idx, val)
+ {
+ if (this._main._running) throw("You are not allowed to change parameters of a running pathfinder.");
+
+ switch (idx) {
+ case "max_cost": this._main._max_cost = val; break;
+ case "tile": this._main._cost_tile = val; break;
+ case "no_existing_road": this._main._cost_no_existing_road = val; break;
+ case "turn": this._main._cost_turn = val; break;
+ case "slope": this._main._cost_slope = val; break;
+ case "bridge_per_tile": this._main._cost_bridge_per_tile = val; break;
+ case "tunnel_per_tile": this._main._cost_tunnel_per_tile = val; break;
+ case "coast": this._main._cost_coast = val; break;
+ case "max_bridge_length": this._main._max_bridge_length = val; break;
+ case "max_tunnel_length": this._main._max_tunnel_length = val; break;
+ default: throw("the index '" + idx + "' does not exist");
+ }
+
+ return val;
+ }
+
+ function _get(idx)
+ {
+ switch (idx) {
+ case "max_cost": return this._main._max_cost;
+ case "tile": return this._main._cost_tile;
+ case "no_existing_road": return this._main._cost_no_existing_road;
+ case "turn": return this._main._cost_turn;
+ case "slope": return this._main._cost_slope;
+ case "bridge_per_tile": return this._main._cost_bridge_per_tile;
+ case "tunnel_per_tile": return this._main._cost_tunnel_per_tile;
+ case "coast": return this._main._cost_coast;
+ case "max_bridge_length": return this._main._max_bridge_length;
+ case "max_tunnel_length": return this._main._max_tunnel_length;
+ default: throw("the index '" + idx + "' does not exist");
+ }
+ }
+
+ constructor(main)
+ {
+ this._main = main;
+ }
+};
+
+function Road::FindPath(iterations)
+{
+ local test_mode = AITestMode();
+ local ret = this._pathfinder.FindPath(iterations);
+ this._running = (ret == false) ? true : false;
+ return ret;
+}
+
+function Road::_GetBridgeNumSlopes(end_a, end_b)
+{
+ local slopes = 0;
+ local direction = (end_b - end_a) / AIMap.DistanceManhattan(end_a, end_b);
+ local slope = AITile.GetSlope(end_a);
+ if (!((slope == AITile.SLOPE_NE && direction == 1) || (slope == AITile.SLOPE_SE && direction == -AIMap.GetMapSizeX()) ||
+ (slope == AITile.SLOPE_SW && direction == -1) || (slope == AITile.SLOPE_NW && direction == AIMap.GetMapSizeX()) ||
+ slope == AITile.SLOPE_N || slope == AITile.SLOPE_E || slope == AITile.SLOPE_S || slope == AITile.SLOPE_W)) {
+ slopes++;
+ }
+
+ local slope = AITile.GetSlope(end_b);
+ direction = -direction;
+ if (!((slope == AITile.SLOPE_NE && direction == 1) || (slope == AITile.SLOPE_SE && direction == -AIMap.GetMapSizeX()) ||
+ (slope == AITile.SLOPE_SW && direction == -1) || (slope == AITile.SLOPE_NW && direction == AIMap.GetMapSizeX()) ||
+ slope == AITile.SLOPE_N || slope == AITile.SLOPE_E || slope == AITile.SLOPE_S || slope == AITile.SLOPE_W)) {
+ slopes++;
+ }
+ return slopes;
+}
+
+function Road::_Cost(path, new_tile, new_direction, self)
+{
+ /* path == null means this is the first node of a path, so the cost is 0. */
+ if (path == null) return 0;
+
+ local prev_tile = path.GetTile();
+
+ /* If the new tile is a bridge / tunnel tile, check whether we came from the other
+ * end of the bridge / tunnel or if we just entered the bridge / tunnel. */
+ if (AIBridge.IsBridgeTile(new_tile)) {
+ if (AIBridge.GetOtherBridgeEnd(new_tile) != prev_tile) return path.GetCost() + self._cost_tile;
+ return path.GetCost() + AIMap.DistanceManhattan(new_tile, prev_tile) * self._cost_tile + self._GetBridgeNumSlopes(new_tile, prev_tile) * self._cost_slope;
+ }
+ if (AITunnel.IsTunnelTile(new_tile)) {
+ if (AITunnel.GetOtherTunnelEnd(new_tile) != prev_tile) return path.GetCost() + self._cost_tile;
+ return path.GetCost() + AIMap.DistanceManhattan(new_tile, prev_tile) * self._cost_tile;
+ }
+
+ /* If the two tiles are more then 1 tile apart, the pathfinder wants a bridge or tunnel
+ * to be build. It isn't an existing bridge / tunnel, as that case is already handled. */
+ if (AIMap.DistanceManhattan(new_tile, prev_tile) > 1) {
+ /* Check if we should build a bridge or a tunnel. */
+ if (AITunnel.GetOtherTunnelEnd(new_tile) == prev_tile) {
+ return path.GetCost() + AIMap.DistanceManhattan(new_tile, prev_tile) * (self._cost_tile + self._cost_tunnel_per_tile);
+ } else {
+ return path.GetCost() + AIMap.DistanceManhattan(new_tile, prev_tile) * (self._cost_tile + self._cost_bridge_per_tile) + self._GetBridgeNumSlopes(new_tile, prev_tile) * self._cost_slope;
+ }
+ }
+
+ /* Check for a turn. We do this by substracting the TileID of the current node from
+ * the TileID of the previous node and comparing that to the difference between the
+ * previous node and the node before that. */
+ local cost = self._cost_tile;
+ if (path.GetParent() != null && (prev_tile - path.GetParent().GetTile()) != (new_tile - prev_tile) &&
+ AIMap.DistanceManhattan(path.GetParent().GetTile(), prev_tile) == 1) {
+ cost += self._cost_turn;
+ }
+
+ /* Check if the new tile is a coast tile. */
+ if (AITile.IsCoastTile(new_tile)) {
+ cost += self._cost_coast;
+ }
+
+ /* Check if the last tile was sloped. */
+ if (path.GetParent() != null && !AIBridge.IsBridgeTile(prev_tile) && !AITunnel.IsTunnelTile(prev_tile) &&
+ self._IsSlopedRoad(path.GetParent().GetTile(), prev_tile, new_tile)) {
+ cost += self._cost_slope;
+ }
+
+ if (!AIRoad.AreRoadTilesConnected(prev_tile, new_tile)) {
+ cost += self._cost_no_existing_road;
+ }
+
+ return path.GetCost() + cost;
+}
+
+function Road::_Estimate(cur_tile, cur_direction, goal_tiles, self)
+{
+ local min_cost = self._max_cost;
+ /* As estimate we multiply the lowest possible cost for a single tile with
+ * with the minimum number of tiles we need to traverse. */
+ foreach (tile in goal_tiles) {
+ min_cost = min(AIMap.DistanceManhattan(cur_tile, tile) * self._cost_tile, min_cost);
+ }
+ return min_cost;
+}
+
+function Road::_Neighbours(path, cur_node, self)
+{
+ /* self._max_cost is the maximum path cost, if we go over it, the path isn't valid. */
+ if (path.GetCost() >= self._max_cost) return [];
+ local tiles = [];
+
+ /* Check if the current tile is part of a bridge or tunnel. */
+ if ((AIBridge.IsBridgeTile(cur_node) || AITunnel.IsTunnelTile(cur_node)) &&
+ AITile.HasTransportType(cur_node, AITile.TRANSPORT_ROAD)) {
+ local other_end = AIBridge.IsBridgeTile(cur_node) ? AIBridge.GetOtherBridgeEnd(cur_node) : AITunnel.GetOtherTunnelEnd(cur_node);
+ local next_tile = cur_node + (cur_node - other_end) / AIMap.DistanceManhattan(cur_node, other_end);
+ if (AIRoad.AreRoadTilesConnected(cur_node, next_tile) || AITile.IsBuildable(next_tile) || AIRoad.IsRoadTile(next_tile)) {
+ tiles.push([next_tile, self._GetDirection(cur_node, next_tile, false)]);
+ }
+ /* The other end of the bridge / tunnel is a neighbour. */
+ tiles.push([other_end, self._GetDirection(next_tile, cur_node, true) << 4]);
+ } else if (path.GetParent() != null && AIMap.DistanceManhattan(cur_node, path.GetParent().GetTile()) > 1) {
+ local other_end = path.GetParent().GetTile();
+ local next_tile = cur_node + (cur_node - other_end) / AIMap.DistanceManhattan(cur_node, other_end);
+ if (AIRoad.AreRoadTilesConnected(cur_node, next_tile) || AIRoad.BuildRoad(cur_node, next_tile)) {
+ tiles.push([next_tile, self._GetDirection(cur_node, next_tile, false)]);
+ }
+ } else {
+ local offsets = [AIMap.GetTileIndex(0, 1), AIMap.GetTileIndex(0, -1),
+ AIMap.GetTileIndex(1, 0), AIMap.GetTileIndex(-1, 0)];
+ /* Check all tiles adjacent to the current tile. */
+ foreach (offset in offsets) {
+ local next_tile = cur_node + offset;
+ /* We add them to the to the neighbours-list if one of the following applies:
+ * 1) There already is a connections between the current tile and the next tile.
+ * 2) We can build a road to the next tile.
+ * 3) The next tile is the entrance of a tunnel / bridge in the correct direction. */
+ if (AIRoad.AreRoadTilesConnected(cur_node, next_tile)) {
+ tiles.push([next_tile, self._GetDirection(cur_node, next_tile, false)]);
+ } else if ((AITile.IsBuildable(next_tile) || AIRoad.IsRoadTile(next_tile)) &&
+ (path.GetParent() == null || AIRoad.CanBuildConnectedRoadPartsHere(cur_node, path.GetParent().GetTile(), next_tile)) &&
+ AIRoad.BuildRoad(cur_node, next_tile)) {
+ tiles.push([next_tile, self._GetDirection(cur_node, next_tile, false)]);
+ } else if (self._CheckTunnelBridge(cur_node, next_tile)) {
+ tiles.push([next_tile, self._GetDirection(cur_node, next_tile, false)]);
+ }
+ }
+ if (path.GetParent() != null) {
+ local bridges = self._GetTunnelsBridges(path.GetParent().GetTile(), cur_node, self._GetDirection(path.GetParent().GetTile(), cur_node, true) << 4);
+ foreach (tile in bridges) {
+ tiles.push(tile);
+ }
+ }
+ }
+ return tiles;
+}
+
+function Road::_CheckDirection(tile, existing_direction, new_direction, self)
+{
+ return false;
+}
+
+function Road::_GetDirection(from, to, is_bridge)
+{
+ if (!is_bridge && AITile.GetSlope(to) == AITile.SLOPE_FLAT) return 0xFF;
+ if (from - to == 1) return 1;
+ if (from - to == -1) return 2;
+ if (from - to == AIMap.GetMapSizeX()) return 4;
+ if (from - to == -AIMap.GetMapSizeX()) return 8;
+}
+
+/**
+ * Get a list of all bridges and tunnels that can be build from the
+ * current tile. Bridges will only be build starting on non-flat tiles
+ * for performance reasons. Tunnels will only be build if no terraforming
+ * is needed on both ends.
+ */
+function Road::_GetTunnelsBridges(last_node, cur_node, bridge_dir)
+{
+ local slope = AITile.GetSlope(cur_node);
+ if (slope == AITile.SLOPE_FLAT) return [];
+ local tiles = [];
+
+ for (local i = 2; i < this._max_bridge_length; i++) {
+ local bridge_list = AIBridgeList_Length(i + 1);
+ local target = cur_node + i * (cur_node - last_node);
+ if (!bridge_list.IsEmpty() && AIBridge.BuildBridge(AIVehicle.VEHICLE_ROAD, bridge_list.Begin(), cur_node, target)) {
+ tiles.push([target, bridge_dir]);
+ }
+ }
+
+ if (slope != AITile.SLOPE_SW && slope != AITile.SLOPE_NW && slope != AITile.SLOPE_SE && slope != AITile.SLOPE_NE) return tiles;
+ local other_tunnel_end = AITunnel.GetOtherTunnelEnd(cur_node);
+ if (!AIMap.IsValidTile(other_tunnel_end)) return tiles;
+
+ local tunnel_length = AIMap.DistanceManhattan(cur_node, other_tunnel_end);
+ local prev_tile = cur_node + (cur_node - other_tunnel_end) / tunnel_length;
+ if (AITunnel.GetOtherTunnelEnd(other_tunnel_end) == cur_node && tunnel_length >= 2 &&
+ prev_tile == last_node && tunnel_length < _max_tunnel_length && AITunnel.BuildTunnel(AIVehicle.VEHICLE_ROAD, cur_node)) {
+ tiles.push([other_tunnel_end, bridge_dir]);
+ }
+ return tiles;
+}
+
+function Road::_IsSlopedRoad(start, middle, end)
+{
+ local NW = 0; //Set to true if we want to build a road to / from the north-west
+ local NE = 0; //Set to true if we want to build a road to / from the north-east
+ local SW = 0; //Set to true if we want to build a road to / from the south-west
+ local SE = 0; //Set to true if we want to build a road to / from the south-east
+
+ if (middle - AIMap.GetMapSizeX() == start || middle - AIMap.GetMapSizeX() == end) NW = 1;
+ if (middle - 1 == start || middle - 1 == end) NE = 1;
+ if (middle + AIMap.GetMapSizeX() == start || middle + AIMap.GetMapSizeX() == end) SE = 1;
+ if (middle + 1 == start || middle + 1 == end) SW = 1;
+
+ /* If there is a turn in the current tile, it can't be sloped. */
+ if ((NW || SE) && (NE || SW)) return false;
+
+ local slope = AITile.GetSlope(middle);
+ /* A road on a steep slope is always sloped. */
+ if (AITile.IsSteepSlope(slope)) return true;
+
+ /* If only one corner is raised, the road is sloped. */
+ if (slope == AITile.SLOPE_N || slope == AITile.SLOPE_W) return true;
+ if (slope == AITile.SLOPE_S || slope == AITile.SLOPE_E) return true;
+
+ if (NW && (slope == AITile.SLOPE_NW || slope == AITile.SLOPE_SE)) return true;
+ if (NE && (slope == AITile.SLOPE_NE || slope == AITile.SLOPE_SW)) return true;
+
+ return false;
+}
+
+function Road::_CheckTunnelBridge(current_tile, new_tile)
+{
+ if (!AIBridge.IsBridgeTile(new_tile) && !AITunnel.IsTunnelTile(new_tile)) return false;
+ local dir = new_tile - current_tile;
+ local other_end = AIBridge.IsBridgeTile(new_tile) ? AIBridge.GetOtherBridgeEnd(new_tile) : AITunnel.GetOtherTunnelEnd(new_tile);
+ local dir2 = other_end - new_tile;
+ if ((dir < 0 && dir2 > 0) || (dir > 0 && dir2 < 0)) return false;
+ dir = abs(dir);
+ dir2 = abs(dir2);
+ if ((dir >= AIMap.GetMapSizeX() && dir2 < AIMap.GetMapSizeX()) ||
+ (dir < AIMap.GetMapSizeX() && dir2 >= AIMap.GetMapSizeX())) return false;
+
+ return true;
+}
diff --git a/bin/ai/library/queue/binary_heap/library.nut b/bin/ai/library/queue/binary_heap/library.nut
new file mode 100644
index 000000000..3a96617a9
--- /dev/null
+++ b/bin/ai/library/queue/binary_heap/library.nut
@@ -0,0 +1,12 @@
+/* $Id$ */
+
+class BinaryHeap extends AILibrary {
+ function GetAuthor() { return "OpenTTD NoAI Developers Team"; }
+ function GetName() { return "Binary Heap"; }
+ function GetDescription() { return "An implementation of a Binary Heap"; }
+ function GetVersion() { return 1; }
+ function GetDate() { return "2008-06-10"; }
+ function CreateInstance() { return "BinaryHeap"; }
+}
+
+RegisterLibrary(BinaryHeap());
diff --git a/bin/ai/library/queue/binary_heap/main.nut b/bin/ai/library/queue/binary_heap/main.nut
new file mode 100644
index 000000000..1bbb3914f
--- /dev/null
+++ b/bin/ai/library/queue/binary_heap/main.nut
@@ -0,0 +1,131 @@
+/* $Id$ */
+
+/**
+ * Binary Heap.
+ * Peek and Pop always return the current lowest value in the list.
+ * Sort is done on insertion and on deletion.
+ */
+class BinaryHeap
+{
+ _queue = null;
+ _count = 0;
+
+ constructor()
+ {
+ _queue = [];
+ }
+
+ /**
+ * Insert a new entry in the list.
+ * The complexity of this operation is O(ln n).
+ * @param item The item to add to the list.
+ * @param priority The priority this item has.
+ */
+ function Insert(item, priority);
+
+ /**
+ * Pop the first entry of the list.
+ * This is always the item with the lowest priority.
+ * The complexity of this operation is O(ln n).
+ * @return The item of the entry with the lowest priority.
+ */
+ function Pop();
+
+ /**
+ * Peek the first entry of the list.
+ * This is always the item with the lowest priority.
+ * The complexity of this operation is O(1).
+ * @return The item of the entry with the lowest priority.
+ */
+ function Peek();
+
+ /**
+ * Get the amount of current items in the list.
+ * The complexity of this operation is O(1).
+ * @return The amount of items currently in the list.
+ */
+ function Count();
+
+ /**
+ * Check if an item exists in the list.
+ * The complexity of this operation is O(n).
+ * @param item The item to check for.
+ * @return True if the item is already in the list.
+ */
+ function Exists(item);
+};
+
+function BinaryHeap::Insert(item, priority)
+{
+ /* Append dummy entry */
+ _queue.append(0);
+ _count++;
+
+ local hole;
+ /* Find the point of insertion */
+ for (hole = _count - 1; hole > 0 && priority <= _queue[hole / 2][1]; hole /= 2)
+ _queue[hole] = _queue[hole / 2];
+ /* Insert new pair */
+ _queue[hole] = [item, priority];
+
+ return true;
+}
+
+function BinaryHeap::Pop()
+{
+ if (_count == 0) return null;
+
+ local node = _queue[0];
+ /* Remove the item from the list by putting the last value on top */
+ _queue[0] = _queue[_count - 1];
+ _queue.pop();
+ _count--;
+ /* Bubble down the last value to correct the tree again */
+ _BubbleDown();
+
+ return node[0];
+}
+
+function BinaryHeap::Peek()
+{
+ if (_count == 0) return null;
+
+ return _queue[0][0];
+}
+
+function BinaryHeap::Count()
+{
+ return _count;
+}
+
+function BinaryHeap::Exists(item)
+{
+ /* Brute-force find the item (there is no faster way, as we don't have the priority number) */
+ foreach (node in _queue) {
+ if (node[0] == item) return true;
+ }
+
+ return false;
+}
+
+
+
+function BinaryHeap::_BubbleDown()
+{
+ if (_count == 0) return;
+
+ local hole = 1;
+ local tmp = _queue[0];
+
+ /* Start switching parent and child until the tree is restored */
+ while (hole * 2 < _count + 1) {
+ local child = hole * 2;
+ if (child != _count && _queue[child][1] <= _queue[child - 1][1]) child++;
+ if (_queue[child - 1][1] > tmp[1]) break;
+
+ _queue[hole - 1] = _queue[child - 1];
+ hole = child;
+ }
+ /* The top value is now at his new place */
+ _queue[hole - 1] = tmp;
+}
diff --git a/bin/ai/library/queue/fibonacci_heap/library.nut b/bin/ai/library/queue/fibonacci_heap/library.nut
new file mode 100644
index 000000000..1ea7260e0
--- /dev/null
+++ b/bin/ai/library/queue/fibonacci_heap/library.nut
@@ -0,0 +1,12 @@
+/* $Id$ */
+
+class FibonacciHeap extends AILibrary {
+ function GetAuthor() { return "OpenTTD NoAI Developers Team"; }
+ function GetName() { return "Fibonacci Heap"; }
+ function GetDescription() { return "An implementation of a Fibonacci Heap"; }
+ function GetVersion() { return 1; }
+ function GetDate() { return "2008-08-22"; }
+ function CreateInstance() { return "FibonacciHeap"; }
+}
+
+RegisterLibrary(FibonacciHeap());
diff --git a/bin/ai/library/queue/fibonacci_heap/main.nut b/bin/ai/library/queue/fibonacci_heap/main.nut
new file mode 100644
index 000000000..7c6b3ece2
--- /dev/null
+++ b/bin/ai/library/queue/fibonacci_heap/main.nut
@@ -0,0 +1,204 @@
+/* $Id$ */
+
+/**
+ * Fibonacci heap.
+ * This heap is heavily optimized for the Insert and Pop functions.
+ * Peek and Pop always return the current lowest value in the list.
+ * Insert is implemented as a lazy insert, as it will simply add the new
+ * node to the root list. Sort is done on every Pop operation.
+ */
+class FibonacciHeap {
+ _min = null;
+ _min_index = 0;
+ _min_priority = 0;
+ _count = 0;
+ _root_list = null;
+
+ /**
+ * Create a new fibonacci heap.
+ * http://en.wikipedia.org/wiki/Fibonacci_heap
+ */
+ constructor() {
+ _count = 0;
+ _min = Node();
+ _min.priority = 0x7FFFFFFF;
+ _min_index = 0;
+ _min_priority = 0x7FFFFFFF;
+ _root_list = [];
+ }
+
+ /**
+ * Insert a new entry in the heap.
+ * The complexity of this operation is O(1).
+ * @param item The item to add to the list.
+ * @param priority The priority this item has.
+ */
+ function Insert(item, priority);
+
+ /**
+ * Pop the first entry of the list.
+ * This is always the item with the lowest priority.
+ * The complexity of this operation is O(ln n).
+ * @return The item of the entry with the lowest priority.
+ */
+ function Pop();
+
+ /**
+ * Peek the first entry of the list.
+ * This is always the item with the lowest priority.
+ * The complexity of this operation is O(1).
+ * @return The item of the entry with the lowest priority.
+ */
+ function Peek();
+
+ /**
+ * Get the amount of current items in the list.
+ * The complexity of this operation is O(1).
+ * @return The amount of items currently in the list.
+ */
+ function Count();
+
+ /**
+ * Check if an item exists in the list.
+ * The complexity of this operation is O(n).
+ * @param item The item to check for.
+ * @return True if the item is already in the list.
+ */
+ function Exists(item);
+};
+
+function FibonacciHeap::Insert(item, priority) {
+ /* Create a new node instance to add to the heap. */
+ local node = Node();
+ /* Changing params is faster than using constructor values */
+ node.item = item;
+ node.priority = priority;
+
+ /* Update the reference to the minimum node if this node has a
+ * smaller priority. */
+ if (_min_priority > priority) {
+ _min = node;
+ _min_index = _root_list.len();
+ _min_priority = priority;
+ }
+
+ _root_list.append(node);
+ _count++;
+}
+
+function FibonacciHeap::Pop() {
+
+ if (_count == 0) return null;
+
+ /* Bring variables from the class scope to this scope explicitly to
+ * optimize variable lookups by Squirrel. */
+ local z = _min;
+ local tmp_root_list = _root_list;
+
+ /* If there are any children, bring them all to the root level. */
+ tmp_root_list.extend(z.child);
+
+ /* Remove the minimum node from the rootList. */
+ tmp_root_list.remove(_min_index);
+ local root_cache = {};
+
+ /* Now we decrease the number of nodes on the root level by
+ * merging nodes which have the same degree. The node with
+ * the lowest priority value will become the parent. */
+ foreach(x in tmp_root_list) {
+ local y;
+
+ /* See if we encountered a node with the same degree already. */
+ while (y = root_cache.rawdelete(x.degree)) {
+ /* Check the priorities. */
+ if (x.priority > y.priority) {
+ local tmp = x;
+ x = y;
+ y = tmp;
+ }
+
+ /* Make y a child of x. */
+ x.child.append(y);
+ x.degree++;
+ }
+
+ root_cache[x.degree] <- x;
+ }
+
+ /* The root_cache contains all the nodes which will form the
+ * new rootList. We reset the priority to the maximum number
+ * for a 32 signed integer to find a new minumum. */
+ tmp_root_list.resize(root_cache.len());
+ local i = 0;
+ local tmp_min_priority = 0x7FFFFFFF;
+
+ /* Now we need to find the new minimum among the root nodes. */
+ foreach (val in root_cache) {
+ if (val.priority < tmp_min_priority) {
+ _min = val;
+ _min_index = i;
+ tmp_min_priority = val.priority;
+ }
+
+ tmp_root_list[i++] = val;
+ }
+
+ /* Update global variables. */
+ _min_priority = tmp_min_priority;
+
+ _count--;
+ return z.item;
+}
+
+function FibonacciHeap::Peek() {
+ if (_count == 0) return null;
+ return _min.item;
+}
+
+function FibonacciHeap::Count() {
+ return _count;
+}
+
+function FibonacciHeap::Exists(item) {
+ return ExistsIn(_root_list, item);
+}
+
+/**
+ * Auxilary function to search through the whole heap.
+ * @param list The list of nodes to look through.
+ * @param item The item to search for.
+ * @return True if the item is found, false otherwise.
+ */
+function FibonacciHeap::ExistsIn(list, item) {
+
+ foreach (val in list) {
+ if (val.item == item) {
+ return true;
+ }
+
+ foreach (c in val.child) {
+ if (ExistsIn(c, item)) {
+ return true;
+ }
+ }
+ }
+
+ /* No luck, item doesn't exists in the tree rooted under list. */
+ return false;
+}
+
+/**
+ * Basic class the fibonacci heap is composed of.
+ */
+class FibonacciHeap.Node {
+ degree = null;
+ child = null;
+
+ item = null;
+ priority = null;
+
+ constructor() {
+ child = [];
+ degree = 0;
+ }
+};
diff --git a/bin/ai/library/queue/priority_queue/library.nut b/bin/ai/library/queue/priority_queue/library.nut
new file mode 100644
index 000000000..a8c615ed1
--- /dev/null
+++ b/bin/ai/library/queue/priority_queue/library.nut
@@ -0,0 +1,12 @@
+/* $Id$ */
+
+class PriorityQueue extends AILibrary {
+ function GetAuthor() { return "OpenTTD NoAI Developers Team"; }
+ function GetName() { return "Priority Queue"; }
+ function GetDescription() { return "An implementation of a Priority Queue"; }
+ function GetVersion() { return 2; }
+ function GetDate() { return "2008-06-10"; }
+ function CreateInstance() { return "PriorityQueue"; }
+}
+
+RegisterLibrary(PriorityQueue());
diff --git a/bin/ai/library/queue/priority_queue/main.nut b/bin/ai/library/queue/priority_queue/main.nut
new file mode 100644
index 000000000..bafc93ac5
--- /dev/null
+++ b/bin/ai/library/queue/priority_queue/main.nut
@@ -0,0 +1,115 @@
+/* $Id$ */
+
+/**
+ * Priority Queue.
+ * Peek and Pop always return the current lowest value in the list.
+ * Sort is done on insertion only.
+ */
+class PriorityQueue
+{
+ _queue = null;
+ _count = 0;
+
+ constructor()
+ {
+ _count = 0;
+ _queue = [];
+ }
+
+ /**
+ * Insert a new entry in the list.
+ * The complexity of this operation is O(n).
+ * @param item The item to add to the list.
+ * @param priority The priority this item has.
+ */
+ function Insert(item, priority);
+
+ /**
+ * Pop the first entry of the list.
+ * This is always the item with the lowest priority.
+ * The complexity of this operation is O(1).
+ * @return The item of the entry with the lowest priority.
+ */
+ function Pop();
+
+ /**
+ * Peek the first entry of the list.
+ * This is always the item with the lowest priority.
+ * The complexity of this operation is O(1).
+ * @return The item of the entry with the lowest priority.
+ */
+ function Peek();
+
+ /**
+ * Get the amount of current items in the list.
+ * The complexity of this operation is O(1).
+ * @return The amount of items currently in the list.
+ */
+ function Count();
+
+ /**
+ * Check if an item exists in the list.
+ * The complexity of this operation is O(n).
+ * @param item The item to check for.
+ * @return True if the item is already in the list.
+ */
+ function Exists(item);
+};
+
+function PriorityQueue::Insert(item, priority)
+{
+ /* Append dummy entry */
+ _queue.append(0);
+ _count++;
+
+ local i;
+ /* Find the point of insertion */
+ for (i = _count - 2; i >= 0; i--) {
+ if (priority > _queue[i][1]) {
+ /* All items bigger move one place to the right */
+ _queue[i + 1] = _queue[i];
+ } else if (item == _queue[i][0]) {
+ /* Same item, ignore insertion */
+ return false;
+ } else {
+ /* Found place to insert at */
+ break;
+ }
+ }
+ /* Insert new pair */
+ _queue[i + 1] = [item, priority];
+
+ return true;
+}
+
+function PriorityQueue::Pop()
+{
+ if (_count == 0) return null;
+
+ local node = _queue.pop();
+ _count--;
+
+ return node[0];
+}
+
+function PriorityQueue::Peek()
+{
+ if (_count == 0) return null;
+
+ return _queue[_count - 1][0];
+}
+
+function PriorityQueue::Count()
+{
+ return _count;
+}
+
+function PriorityQueue::Exists(item)
+{
+ /* Brute-force find the item (there is no faster way, as we don't have the priority number) */
+ foreach (node in _queue) {
+ if (node[0] == item) return true;
+ }
+
+ return false;
+}
diff --git a/bin/ai/regression/completeness.sh b/bin/ai/regression/completeness.sh
new file mode 100644
index 000000000..ad1b4c145
--- /dev/null
+++ b/bin/ai/regression/completeness.sh
@@ -0,0 +1,67 @@
+#!/bin/sh
+
+if ! [ -f ai/regression/regression.nut ]; then
+ echo "Make sure you are in the root of OpenTTD before starting this script."
+ exit 1
+fi
+
+cat ai/regression/regression.nut | tr ';' '\n' | awk '
+/^function/ {
+ for (local in locals) {
+ delete locals[local]
+ }
+ if (match($0, "function Regression::Start") || match($0, "function Regression::Stop")) next
+ locals["this"] = "AIControllerSquirrel"
+}
+
+/local/ {
+ gsub(".*local", "local")
+ if (match($4, "^AI")) {
+ sub("\\(.*", "", $4)
+ locals[$2] = $4
+ }
+}
+
+/Valuate/ {
+ gsub(".*Valuate\\(", "")
+ gsub("\\).*", "")
+ gsub(",.*", "")
+ gsub("\\.", "::")
+ print $0
+}
+
+/\./ {
+ for (local in locals) {
+ if (match($0, local ".")) {
+ fname = substr($0, index($0, local "."))
+ sub("\\(.*", "", fname)
+ sub("\\.", "::", fname)
+ sub(local, locals[local], fname)
+ print fname
+ if (match(locals[local], "List")) {
+ sub(locals[local], "AIAbstractList", fname)
+ print fname
+ }
+ }
+ }
+ # We want to remove everything before the FIRST occurence of AI.
+ # If we do not remove any other occurences of AI from the string
+ # we will remove everything before the LAST occurence of AI, so
+ # do some little magic to make it work the way we want.
+ sub("AI", "AXXXXY")
+ gsub("AI", "AXXXXX")
+ sub(".*AXXXXY", "AI")
+ if (match($0, "^AI") && match($0, ".")) {
+ sub("\\(.*", "", $0)
+ sub("\\.", "::", $0)
+ print $0
+ }
+}
+' | sed 's/ //g' | sort | uniq > tmp.in_regression
+
+grep 'DefSQ.*Method' ../src/ai/api/*.hpp.sq | grep -v 'AIError::' | grep -v 'AIAbstractList::Valuate' | grep -v '::GetClassName' | sed 's/^[^,]*, &//g;s/,[^,]*//g' | sort > tmp.in_api
+
+diff -u tmp.in_regression tmp.in_api | grep -v '^+++' | grep '^+' | sed 's/^+//'
+
+rm -f tmp.in_regression tmp.in_api
+
diff --git a/bin/ai/regression/regression.cfg b/bin/ai/regression/regression.cfg
new file mode 100644
index 000000000..8bdf78c44
--- /dev/null
+++ b/bin/ai/regression/regression.cfg
@@ -0,0 +1,17 @@
+[misc]
+display_opt = SHOW_TOWN_NAMES|SHOW_STATION_NAMES|SHOW_SIGNS|WAYPOINTS
+language = english.lng
+
+[gui]
+autosave = off
+
+[game_creation]
+town_name = english
+
+[ai_players]
+none =
+regression =
+
+[vehicle]
+road_side = right
+plane_speed = 2
diff --git a/bin/ai/regression/regression.nut b/bin/ai/regression/regression.nut
new file mode 100644
index 000000000..768facf9e
--- /dev/null
+++ b/bin/ai/regression/regression.nut
@@ -0,0 +1,1761 @@
+import("queue.priority_queue", "PQ", 2);
+import("queue.binary_heap", "BH", 1);
+import("queue.fibonacci_heap", "FH", 1);
+import("graph.aystar", "AS", 4);
+import("pathfinder.road", "RPF", 3);
+
+class Regression extends AIController {
+ function Start();
+};
+
+
+
+function Regression::TestInit()
+{
+ print("");
+ print("--TestInit--");
+ print(" TickTest: " + this.GetTick());
+ this.Sleep(1);
+ print(" TickTest: " + this.GetTick());
+ print(" SetCommandDelay: " + AIController.SetCommandDelay(1));
+ print(" IsValid(vehicle.plane_speed): " + AIGameSettings.IsValid("vehicle.plane_speed"));
+ print(" vehicle.plane_speed: " + AIGameSettings.GetValue("vehicle.plane_speed"));
+ require("require.nut");
+ print(" min(6, 3): " + min(6, 3));
+ print(" min(3, 6): " + min(3, 6));
+ print(" max(6, 3): " + max(6, 3));
+ print(" max(3, 6): " + max(3, 6));
+
+ print(" AIList Consistency Tests");
+ print("");
+ print(" Value Descending");
+ local list = AIList();
+ list.AddItem( 5, 10);
+ list.AddItem(10, 10);
+ list.AddItem(15, 20);
+ list.AddItem(20, 20);
+ list.AddItem(25, 30);
+ list.AddItem(30, 30);
+ list.AddItem(35, 40);
+ list.AddItem(40, 40);
+
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ list.RemoveItem(i - 10);
+ list.RemoveItem(i - 5);
+ list.RemoveItem(i);
+ print(" " + i);
+ }
+
+ list.AddItem(10, 10);
+ list.AddItem(20, 20);
+ list.AddItem(30, 30);
+ list.AddItem(40, 40);
+
+ print("");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ list.SetValue(i, 2);
+ print(" " + i);
+ }
+ print("");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i);
+ }
+
+ list = AIList();
+ list.Sort(AIAbstractList.SORT_BY_VALUE, true);
+ print("");
+ print(" Value Ascending");
+ list.AddItem( 5, 10);
+ list.AddItem(10, 10);
+ list.AddItem(15, 20);
+ list.AddItem(20, 20);
+ list.AddItem(25, 30);
+ list.AddItem(30, 30);
+ list.AddItem(35, 40);
+ list.AddItem(40, 40);
+
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ list.RemoveItem(i + 10);
+ list.RemoveItem(i + 5);
+ list.RemoveItem(i);
+ print(" " + i);
+ }
+
+ list.AddItem(10, 10);
+ list.AddItem(20, 20);
+ list.AddItem(30, 30);
+ list.AddItem(40, 40);
+
+ print("");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ list.SetValue(i, 50);
+ print(" " + i);
+ }
+ print("");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i);
+ }
+
+ list = AIList();
+ list.Sort(AIAbstractList.SORT_BY_ITEM, false);
+ print("");
+ print(" Item Descending");
+ list.AddItem( 5, 10);
+ list.AddItem(10, 10);
+ list.AddItem(15, 20);
+ list.AddItem(20, 20);
+ list.AddItem(25, 30);
+ list.AddItem(30, 30);
+ list.AddItem(35, 40);
+ list.AddItem(40, 40);
+
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ list.RemoveItem(i - 10);
+ list.RemoveItem(i - 5);
+ list.RemoveItem(i);
+ print(" " + i);
+ }
+
+ list.AddItem(10, 10);
+ list.AddItem(20, 20);
+ list.AddItem(30, 30);
+ list.AddItem(40, 40);
+
+ print("");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ list.SetValue(i, 2);
+ print(" " + i);
+ }
+ print("");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i);
+ }
+
+ list = AIList();
+ list.Sort(AIAbstractList.SORT_BY_ITEM, true);
+ print("");
+ print(" Item Ascending");
+ list.AddItem( 5, 10);
+ list.AddItem(10, 10);
+ list.AddItem(15, 20);
+ list.AddItem(20, 20);
+ list.AddItem(25, 30);
+ list.AddItem(30, 30);
+ list.AddItem(35, 40);
+ list.AddItem(40, 40);
+
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ list.RemoveItem(i + 10);
+ list.RemoveItem(i + 5);
+ list.RemoveItem(i);
+ print(" " + i);
+ }
+
+ list.AddItem(10, 10);
+ list.AddItem(20, 20);
+ list.AddItem(30, 30);
+ list.AddItem(40, 40);
+
+ print("");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ list.SetValue(i, 50);
+ print(" " + i);
+ }
+ print("");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i);
+ }
+
+ list.Clear();
+ foreach (idx, val in list) {
+ print(" " + idx);
+ }
+}
+
+function Regression::Std()
+{
+ print("");
+ print("--Std--");
+ print(" abs(-21): " + abs(-21));
+ print(" abs( 21): " + abs(21));
+}
+
+function Regression::Base()
+{
+ print("");
+ print("--AIBase--");
+ print(" Rand(): " + AIBase.Rand());
+ print(" Rand(): " + AIBase.Rand());
+ print(" Rand(): " + AIBase.Rand());
+ print(" RandRange(0): " + AIBase.RandRange(0));
+ print(" RandRange(0): " + AIBase.RandRange(0));
+ print(" RandRange(0): " + AIBase.RandRange(0));
+ print(" RandRange(1): " + AIBase.RandRange(1));
+ print(" RandRange(1): " + AIBase.RandRange(1));
+ print(" RandRange(1): " + AIBase.RandRange(1));
+ print(" RandRange(2): " + AIBase.RandRange(2));
+ print(" RandRange(2): " + AIBase.RandRange(2));
+ print(" RandRange(2): " + AIBase.RandRange(2));
+ print(" RandRange(9): " + AIBase.RandRange(9));
+ print(" RandRange(9): " + AIBase.RandRange(9));
+ print(" RandRange(9): " + AIBase.RandRange(9));
+ print(" Chance(1, 2): " + AIBase.Chance(1, 2));
+ print(" Chance(1, 2): " + AIBase.Chance(1, 2));
+ print(" Chance(1, 2): " + AIBase.Chance(1, 2));
+
+ AIRoad.SetCurrentRoadType(AIRoad.ROADTYPE_ROAD);
+}
+
+function Regression::Airport()
+{
+ print("");
+ print("--AIAirport--");
+
+ print(" IsHangarTile(): " + AIAirport.IsHangarTile(32116));
+ print(" IsAirportTile(): " + AIAirport.IsAirportTile(32116));
+ print(" GetHangarOfAirport(): " + AIAirport.GetHangarOfAirport(32116));
+ print(" GetAirportType(): " + AIAirport.GetAirportType(32116));
+
+ for (local i = -1; i < 10; i++) {
+ print(" IsValidAirportType(" + i + "): " + AIAirport.IsValidAirportType(i));
+ print(" AirportAvailable(" + i + "): " + AIAirport.AirportAvailable(i));
+ print(" GetAirportWidth(" + i + "): " + AIAirport.GetAirportWidth(i));
+ print(" GetAirportHeight(" + i + "): " + AIAirport.GetAirportHeight(i));
+ print(" GetAirportCoverageRadius(" + i + "): " + AIAirport.GetAirportCoverageRadius(i));
+ }
+
+ print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
+ print(" BuildAirport(): " + AIAirport.BuildAirport(32116, 0, true));
+ print(" IsHangarTile(): " + AIAirport.IsHangarTile(32116));
+ print(" IsAirportTile(): " + AIAirport.IsAirportTile(32116));
+ print(" GetAirportType(): " + AIAirport.GetAirportType(32119));
+ print(" GetHangarOfAirport(): " + AIAirport.GetHangarOfAirport(32116));
+ print(" IsHangarTile(): " + AIAirport.IsHangarTile(32119));
+ print(" IsAirportTile(): " + AIAirport.IsAirportTile(32119));
+ print(" GetAirportType(): " + AIAirport.GetAirportType(32119));
+ print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
+
+ print(" RemoveAirport(): " + AIAirport.RemoveAirport(32118));
+ print(" IsHangarTile(): " + AIAirport.IsHangarTile(32119));
+ print(" IsAirportTile(): " + AIAirport.IsAirportTile(32119));
+ print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
+ print(" BuildAirport(): " + AIAirport.BuildAirport(32116, 0, true));
+}
+
+function Regression::Bridge()
+{
+ local j = 0;
+
+ print("");
+ print("--Bridge--");
+ for (local i = -1; i < 14; i++) {
+ if (AIBridge.IsValidBridge(i)) j++;
+ print(" Bridge " + i);
+ print(" IsValidBridge(): " + AIBridge.IsValidBridge(i));
+ print(" GetName(): " + AIBridge.GetName(i));
+ print(" GetMaxSpeed(): " + AIBridge.GetMaxSpeed(i));
+ print(" GetPrice(): " + AIBridge.GetPrice(i, 5));
+ print(" GetMaxLength(): " + AIBridge.GetMaxLength(i));
+ print(" GetMinLength(): " + AIBridge.GetMinLength(i));
+ print(" GetYearAvailable(): " + AIBridge.GetYearAvailable(i));
+ }
+ print(" Valid Bridges: " + j);
+
+ print(" IsBridgeTile(): " + AIBridge.IsBridgeTile(33160));
+ print(" RemoveBridge(): " + AIBridge.RemoveBridge(33155));
+ print(" GetLastErrorString(): " + AIError.GetLastErrorString());
+ print(" GetOtherBridgeEnd(): " + AIBridge.GetOtherBridgeEnd(33160));
+ print(" BuildBridge(): " + AIBridge.BuildBridge(AIVehicle.VEHICLE_ROAD, 5, 33160, 33155));
+ print(" IsBridgeTile(): " + AIBridge.IsBridgeTile(33160));
+ print(" IsBridgeTile(): " + AIBridge.IsBridgeTile(33155));
+ print(" GetOtherBridgeEnd(): " + AIBridge.GetOtherBridgeEnd(33160));
+ print(" BuildBridge(): " + AIBridge.BuildBridge(AIVehicle.VEHICLE_ROAD, 5, 33160, 33155));
+ print(" GetLastErrorString(): " + AIError.GetLastErrorString());
+ print(" RemoveBridge(): " + AIBridge.RemoveBridge(33155));
+ print(" IsBridgeTile(): " + AIBridge.IsBridgeTile(33160));
+}
+
+function Regression::BridgeList()
+{
+ local list = AIBridgeList();
+
+ print("");
+ print("--BridgeList--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AIBridge.GetMaxSpeed);
+ print(" MaxSpeed ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIBridge.GetPrice, 5);
+ print(" Price ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIBridge.GetMaxLength);
+ print(" MaxLength ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIBridge.GetMinLength);
+ print(" MinLength ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIBridge.GetYearAvailable);
+ print(" YearAvailable ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list = AIBridgeList_Length(14);
+
+ print("");
+ print("--BridgeList_Length--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AIBridge.GetMaxSpeed);
+ print(" MaxSpeed ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIBridge.GetPrice, 14);
+ print(" Price ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+}
+
+function Regression::Cargo()
+{
+ print("");
+ print("--AICargo--");
+ for (local i = -1; i < 15; i++) {
+ print(" Cargo " + i);
+ print(" IsValidCargo(): " + AICargo.IsValidCargo(i));
+ print(" GetCargoLabel(): '" + AICargo.GetCargoLabel(i)+ "'");
+ print(" IsFreight(): " + AICargo.IsFreight(i));
+ print(" HasCargoClass(): " + AICargo.HasCargoClass(i, AICargo.CC_PASSENGERS));
+ print(" GetTownEffect(): " + AICargo.GetTownEffect(i));
+ print(" GetCargoIncome(0, 0): " + AICargo.GetCargoIncome(i, 0, 0));
+ print(" GetCargoIncome(10, 10): " + AICargo.GetCargoIncome(i, 10, 10));
+ print(" GetCargoIncome(100, 10): " + AICargo.GetCargoIncome(i, 100, 10));
+ print(" GetCargoIncome(10, 100): " + AICargo.GetCargoIncome(i, 10, 100));
+ }
+}
+
+function Regression::CargoList()
+{
+ local list = AICargoList();
+
+ print("");
+ print("--CargoList--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AICargo.IsFreight);
+ print(" IsFreight ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list.Valuate(AICargo.GetCargoIncome, 100, 100);
+ print(" CargoIncomes(100, 100) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list = AICargoList_IndustryAccepting(8);
+ print("");
+ print("--CargoList_IndustryAccepting--");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i);
+ }
+
+ list = AICargoList_IndustryProducing(4);
+ print("");
+ print("--CargoList_IndustryProducing--");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i);
+ }
+}
+
+function Regression::Company()
+{
+ print("");
+ print("--Company--");
+
+ /* Test AIXXXMode() in scopes */
+ {
+ local test = AITestMode();
+ print(" SetName(): " + AICompany.SetName("Regression"));
+ print(" SetName(): " + AICompany.SetName("Regression"));
+ {
+ local exec = AIExecMode();
+ print(" SetName(): " + AICompany.SetName("Regression"));
+ print(" SetName(): " + AICompany.SetName("Regression"));
+ print(" GetLastErrorString(): " + AIError.GetLastErrorString());
+ }
+ }
+
+ print(" GetName(): " + AICompany.GetName(AICompany.MY_COMPANY));
+ print(" GetPresidentName(): " + AICompany.GetPresidentName(AICompany.MY_COMPANY));
+ print(" SetPresidentName(): " + AICompany.SetPresidentName("Regression AI"));
+ print(" GetPresidentName(): " + AICompany.GetPresidentName(AICompany.MY_COMPANY));
+ print(" GetCompanyValue(): " + AICompany.GetCompanyValue(AICompany.MY_COMPANY));
+ print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
+ print(" GetName(): " + AICompany.GetName(240));
+ print(" GetLoanAmount(): " + AICompany.GetLoanAmount());
+ print(" GetMaxLoanAmount(): " + AICompany.GetMaxLoanAmount());
+ print(" GetLoanInterval(): " + AICompany.GetLoanInterval());
+ print(" SetLoanAmount(1): " + AICompany.SetLoanAmount(1));
+ print(" SetLoanAmount(100): " + AICompany.SetLoanAmount(100));
+ print(" SetLoanAmount(10000): " + AICompany.SetLoanAmount(10000));
+ print(" GetLastErrorString(): " + AIError.GetLastErrorString());
+ print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
+ print(" GetLoanAmount(): " + AICompany.GetLoanAmount());
+ print(" SetMinimumLoanAmount(31337): " + AICompany.SetMinimumLoanAmount(31337));
+ print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
+ print(" GetLoanAmount(): " + AICompany.GetLoanAmount());
+ print(" SetLoanAmount(10000): " + AICompany.SetLoanAmount(AICompany.GetMaxLoanAmount()));
+ print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
+ print(" GetLoanAmount(): " + AICompany.GetLoanAmount());
+ print(" GetCompanyHQ(): " + AICompany.GetCompanyHQ(AICompany.MY_COMPANY));
+ print(" BuildCompanyHQ(): " + AICompany.BuildCompanyHQ(AIMap.GetTileIndex(127, 129)));
+ print(" GetCompanyHQ(): " + AICompany.GetCompanyHQ(AICompany.MY_COMPANY));
+ print(" BuildCompanyHQ(): " + AICompany.BuildCompanyHQ(AIMap.GetTileIndex(129, 129)));
+ print(" GetCompanyHQ(): " + AICompany.GetCompanyHQ(AICompany.MY_COMPANY));
+ print(" BuildCompanyHQ(): " + AICompany.BuildCompanyHQ(AIMap.GetTileIndex(129, 128)));
+ print(" GetLastErrorString(): " + AIError.GetLastErrorString());
+ print(" GetAutoRenewStatus(); " + AICompany.GetAutoRenewStatus(AICompany.MY_COMPANY));
+ print(" SetAutoRenewStatus(true); " + AICompany.SetAutoRenewStatus(true));
+ print(" GetAutoRenewStatus(); " + AICompany.GetAutoRenewStatus(AICompany.MY_COMPANY));
+ print(" SetAutoRenewStatus(true); " + AICompany.SetAutoRenewStatus(true));
+ print(" SetAutoRenewStatus(false); " + AICompany.SetAutoRenewStatus(false));
+ print(" GetAutoRenewMonths(); " + AICompany.GetAutoRenewMonths(AICompany.MY_COMPANY));
+ print(" SetAutoRenewMonths(-12); " + AICompany.SetAutoRenewMonths(-12));
+ print(" GetAutoRenewMonths(); " + AICompany.GetAutoRenewMonths(AICompany.MY_COMPANY));
+ print(" SetAutoRenewMonths(-12); " + AICompany.SetAutoRenewMonths(-12));
+ print(" SetAutoRenewMonths(6); " + AICompany.SetAutoRenewMonths(6));
+ print(" GetAutoRenewMoney(); " + AICompany.GetAutoRenewMoney(AICompany.MY_COMPANY));
+ print(" SetAutoRenewMoney(200000); " + AICompany.SetAutoRenewMoney(200000));
+ print(" GetAutoRenewMoney(); " + AICompany.GetAutoRenewMoney(AICompany.MY_COMPANY));
+ print(" SetAutoRenewMoney(200000); " + AICompany.SetAutoRenewMoney(200000));
+ print(" SetAutoRenewMoney(100000); " + AICompany.SetAutoRenewMoney(100000));
+}
+
+function Regression::Engine()
+{
+ local j = 0;
+
+ print("");
+ print("--Engine--");
+ for (local i = -1; i < 257; i++) {
+ if (AIEngine.IsValidEngine(i)) j++;
+ print(" Engine " + i);
+ print(" IsValidEngine(): " + AIEngine.IsValidEngine(i));
+ print(" GetName(): " + AIEngine.GetName(i));
+ print(" GetCargoType(): " + AIEngine.GetCargoType(i));
+ print(" CanRefitCargo(): " + AIEngine.CanRefitCargo(i, 1));
+ print(" GetCapacity(): " + AIEngine.GetCapacity(i));
+ print(" GetReliability(): " + AIEngine.GetReliability(i));
+ print(" GetMaxSpeed(): " + AIEngine.GetMaxSpeed(i));
+ print(" GetPrice(): " + AIEngine.GetPrice(i));
+ print(" GetMaxAge(): " + AIEngine.GetMaxAge(i));
+ print(" GetRunningCost(): " + AIEngine.GetRunningCost(i));
+ print(" GetVehicleType(): " + AIEngine.GetVehicleType(i));
+ print(" GetRailType(): " + AIEngine.GetRailType(i));
+ print(" GetRoadType(): " + AIEngine.GetRoadType(i));
+ print(" GetPlaneType(): " + AIEngine.GetPlaneType(i));
+ }
+ print(" Valid Engines: " + j);
+}
+
+function Regression::EngineList()
+{
+ local list = AIEngineList(AIVehicle.VEHICLE_ROAD);
+
+ print("");
+ print("--EngineList--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AIEngine.GetCargoType);
+ print(" CargoType ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIEngine.GetCapacity);
+ print(" Capacity ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIEngine.GetReliability);
+ print(" Reliability ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIEngine.GetMaxSpeed);
+ print(" MaxSpeed ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIEngine.GetPrice);
+ print(" Price ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+}
+
+function cost_callback(old_path, new_tile, new_direction, self) { if (old_path == null) return 0; return old_path.GetCost() + 1; }
+function estimate_callback(tile, direction, goals, self) { return goals[0] - tile; }
+function neighbours_callback(path, cur_tile, self) { return [[cur_tile + 1, 1]]; }
+function check_direction_callback(tile, existing_direction, new_direction, self) { return false; }
+
+function Regression::Graph()
+{
+ print("--AyStar--");
+ print(" Fastest path:");
+ local as = AS(cost_callback, estimate_callback, neighbours_callback, check_direction_callback);
+
+ local path = false;
+ as.InitializePath([[1, 1]], [10]);
+ while (path == false) path = as.FindPath(5);
+
+ while (path != null) {
+ print(" Tile " + path.GetTile());
+ path = path.GetParent();
+ }
+}
+
+function Regression::Group()
+{
+ print ("");
+ print("--Group--");
+ print(" SetAutoReplace(): " + AIGroup.SetAutoReplace(AIGroup.ALL_GROUP, 116, 117));
+ print(" GetEngineReplacement(): " + AIGroup.GetEngineReplacement(AIGroup.ALL_GROUP, 116));
+ print(" GetNumEngines(): " + AIGroup.GetNumEngines(AIGroup.ALL_GROUP, 116));
+ print(" AIRoad.BuildRoadDepot(): " + AIRoad.BuildRoadDepot(10000, 10001));
+ local vehicle = AIVehicle.BuildVehicle(10000, 116);
+ print(" AIVehicle.BuildVehicle(): " + vehicle);
+ print(" GetNumEngines(): " + AIGroup.GetNumEngines(AIGroup.ALL_GROUP, 116));
+ local group = AIGroup.CreateGroup(AIVehicle.VEHICLE_ROAD);
+ print(" CreateGroup(): " + group);
+ print(" MoveVehicle(): " + AIGroup.MoveVehicle(group, vehicle));
+ print(" GetNumEngines(): " + AIGroup.GetNumEngines(group, 116));
+ print(" GetNumEngines(): " + AIGroup.GetNumEngines(AIGroup.ALL_GROUP, 116));
+ print(" GetNumEngines(): " + AIGroup.GetNumEngines(AIGroup.DEFAULT_GROUP, 116));
+ print(" GetName(): " + AIGroup.GetName(0));
+ print(" GetName(): " + AIGroup.GetName(1));
+ print(" AIVehicle.SellVehicle(): " + AIVehicle.SellVehicle(vehicle));
+ print(" AITile.DemolishTile(): " + AITile.DemolishTile(10000));
+ print(" HasWagonRemoval(): " + AIGroup.HasWagonRemoval());
+ print(" EnableWagonRemoval(): " + AIGroup.EnableWagonRemoval(true));
+ print(" HasWagonRemoval(): " + AIGroup.HasWagonRemoval());
+ print(" EnableWagonRemoval(): " + AIGroup.EnableWagonRemoval(false));
+ print(" EnableWagonRemoval(): " + AIGroup.EnableWagonRemoval(false));
+ print(" HasWagonRemoval(): " + AIGroup.HasWagonRemoval());
+}
+
+function Regression::Industry()
+{
+ local j = 0;
+
+ print("");
+ print("--Industry--");
+ print(" GetMaxIndustryID(): " + AIIndustry.GetMaxIndustryID());
+ print(" GetIndustryCount(): " + AIIndustry.GetIndustryCount());
+ for (local i = -1; i < AIIndustry.GetMaxIndustryID() + 1; i++) {
+ if (AIIndustry.IsValidIndustry(i)) j++;
+ print(" Industry " + i);
+ print(" IsValidIndustry(): " + AIIndustry.IsValidIndustry(i));
+ print(" GetName(): " + AIIndustry.GetName(i));
+ print(" GetLocation(): " + AIIndustry.GetLocation(i));
+ print(" GetProduction(): " + AIIndustry.GetProduction(i, 1));
+ print(" IsCargoAccepted(): " + AIIndustry.IsCargoAccepted(i, 1));
+
+ local cargo_list = AICargoList();
+ for (local j = cargo_list.Begin(); cargo_list.HasNext(); j = cargo_list.Next()) {
+ if (AIIndustry.GetProduction(i, j) > 0) {
+ print(" GetLastMonthProduction(): " + AIIndustry.GetLastMonthProduction(i, j));
+ print(" GetLastMonthTransported(): " + AIIndustry.GetLastMonthTransported(i, j));
+ print(" GetStockpiledCargo(): " + AIIndustry.GetStockpiledCargo(i, j));
+ }
+ }
+ }
+ print(" Valid Industries: " + j);
+ print(" GetIndustryCount(): " + AIIndustry.GetIndustryCount());
+}
+
+function Regression::IndustryList()
+{
+ local list = AIIndustryList();
+
+ print("");
+ print("--IndustryList--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AIIndustry.GetLocation);
+ print(" Location ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIIndustry.GetDistanceManhattanToTile, 30000);
+ print(" DistanceManhattanToTile(30000) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIIndustry.GetDistanceSquareToTile, 30000);
+ print(" DistanceSquareToTile(30000) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIIndustry.GetAmountOfStationsAround);
+ print(" GetAmountOfStationsAround(30000) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIIndustry.IsCargoAccepted, 1);
+ print(" CargoAccepted(1) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIIndustry.GetProduction, 1);
+ list.KeepAboveValue(50);
+ print(" KeepAboveValue(50): done");
+ print(" Count(): " + list.Count());
+ print(" Production ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list = AIIndustryList_CargoAccepting(1);
+ print("--IndustryList_CargoAccepting--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AIIndustry.GetLocation);
+ print(" Location ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list = AIIndustryList_CargoProducing(1);
+ print("--IndustryList_CargoProducing--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AIIndustry.GetLocation);
+ print(" Location ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+}
+
+function Regression::IndustryTypeList()
+{
+ local list = AIIndustryTypeList();
+
+ print("");
+ print("--IndustryTypeList--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AIIndustry.GetLocation);
+ print(" Location ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" Id: " + i);
+ print(" IsRawIndustry(): " + AIIndustryType.IsRawIndustry(i));
+ print(" ProductionCanIncrease(): " + AIIndustryType.ProductionCanIncrease(i));
+ print(" GetConstructionCost(): " + AIIndustryType.GetConstructionCost(i));
+ print(" GetName(): " + AIIndustryType.GetName(i));
+ print(" CanBuildIndustry(): " + AIIndustryType.CanBuildIndustry(i));
+ print(" CanProspectIndustry(): " + AIIndustryType.CanProspectIndustry(i));
+ }
+}
+
+function CustomValuator(list_id)
+{
+ return list_id * 4343;
+}
+
+function Regression::List()
+{
+ local list = AIList();
+
+ print("");
+ print("--List--");
+
+ print(" IsEmpty(): " + list.IsEmpty());
+ list.AddItem(1, 1);
+ list.AddItem(2, 2);
+ for (local i = 1000; i < 1100; i++) {
+ list.AddItem(i, i);
+ }
+ list.RemoveItem(1050);
+ list.RemoveItem(1150);
+ list.ChangeItem(1051, 12);
+ print(" Count(): " + list.Count());
+ print(" HasItem(1050): " + list.HasItem(1050));
+ print(" HasItem(1051): " + list.HasItem(1051));
+ print(" IsEmpty(): " + list.IsEmpty());
+ list.Sort(AIAbstractList.SORT_BY_ITEM, true);
+ print(" List Dump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(CustomValuator);
+ print(" Custom ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(function (a) { return a * 42; });
+ print(" Custom ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIBase.RandItem);
+ print(" Randomize ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list.KeepTop(10);
+ print(" KeepTop(10):");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.KeepBottom(8);
+ print(" KeepBottom(8):");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.RemoveBottom(2);
+ print(" RemoveBottom(2):");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.RemoveTop(2);
+ print(" RemoveTop(2):");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ local list2 = AIList();
+ list2.AddItem(1003, 0);
+ list2.AddItem(1004, 0);
+ list.RemoveList(list2);
+ print(" RemoveList({1003, 1004}):");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list2.AddItem(1005, 0);
+ list.KeepList(list2);
+ print(" KeepList({1003, 1004, 1005}):");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list2.Clear();
+ for (local i = 4000; i < 4003; i++) {
+ list2.AddItem(i, i * 2);
+ }
+ list2.AddItem(1005, 1005);
+ list.AddList(list2);
+ print(" AddList({1005, 4000, 4001, 4002}):");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list[4000] = 50;
+ list[4006] = 12;
+
+ print(" foreach():");
+ foreach (idx, val in list) {
+ print(" " + idx + " => " + val);
+ }
+ print(" []:");
+ print(" 4000 => " + list[4000]);
+
+ list.Clear();
+ print(" IsEmpty(): " + list.IsEmpty());
+}
+
+function Regression::Map()
+{
+ print("");
+ print("--Map--");
+ print(" GetMapSize(): " + AIMap.GetMapSize());
+ print(" GetMapSizeX(): " + AIMap.GetMapSizeX());
+ print(" GetMapSizeY(): " + AIMap.GetMapSizeY());
+ print(" GetTileX(123): " + AIMap.GetTileX(123));
+ print(" GetTileY(123): " + AIMap.GetTileY(123));
+ print(" GetTileIndex(): " + AIMap.GetTileIndex(123, 0));
+ print(" GetTileIndex(): " + AIMap.GetTileIndex(0, 123));
+ print(" GetTileIndex(): " + AIMap.GetTileIndex(0, 0));
+ print(" GetTileIndex(): " + AIMap.GetTileIndex(-1, -1));
+ print(" GetTileIndex(): " + AIMap.GetTileIndex(10000, 10000));
+ print(" IsValidTile(123): " + AIMap.IsValidTile(123));
+ print(" GetTileX(124): " + AIMap.GetTileX(124));
+ print(" GetTileY(124): " + AIMap.GetTileY(124));
+ print(" IsValidTile(124): " + AIMap.IsValidTile(124));
+ print(" IsValidTile(0): " + AIMap.IsValidTile(0));
+ print(" IsValidTile(-1): " + AIMap.IsValidTile(-1));
+ print(" IsValidTile(): " + AIMap.IsValidTile(AIMap.GetMapSize()));
+ print(" IsValidTile(): " + AIMap.IsValidTile(AIMap.GetMapSize() - AIMap.GetMapSizeX() - 2));
+ print(" DemolishTile(): " + AITile.DemolishTile(19592));
+ print(" DemolishTile(): " + AITile.DemolishTile(19335));
+ print(" Distance");
+ print(" DistanceManhattan(): " + AIMap.DistanceManhattan(1, 10000));
+ print(" DistanceMax(): " + AIMap.DistanceMax(1, 10000));
+ print(" DistanceSquare(): " + AIMap.DistanceSquare(1, 10000));
+ print(" DistanceFromEdge(): " + AIMap.DistanceFromEdge(10000));
+}
+
+function Regression::Marine()
+{
+ print("");
+ print("--AIMarine--");
+
+ print(" IsWaterDepotTile(): " + AIMarine.IsWaterDepotTile(32116));
+ print(" IsDockTile(): " + AIMarine.IsDockTile(32116));
+ print(" IsBuoyTile(): " + AIMarine.IsBuoyTile(32116));
+ print(" IsLockTile(): " + AIMarine.IsLockTile(32116));
+ print(" IsCanalTile(): " + AIMarine.IsCanalTile(32116));
+
+ print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
+ print(" BuildWaterDepot(): " + AIMarine.BuildWaterDepot(28479, false));
+ print(" BuildDock(): " + AIMarine.BuildDock(29253, true));
+ print(" BuildBuoy(): " + AIMarine.BuildBuoy(28481));
+ print(" BuildLock(): " + AIMarine.BuildLock(28487));
+ print(" HasTransportType(): " + AITile.HasTransportType(32127, AITile.TRANSPORT_WATER));
+ print(" BuildCanal(): " + AIMarine.BuildCanal(32127));
+ print(" HasTransportType(): " + AITile.HasTransportType(32127, AITile.TRANSPORT_WATER));
+ print(" IsWaterDepotTile(): " + AIMarine.IsWaterDepotTile(28479));
+ print(" IsDockTile(): " + AIMarine.IsDockTile(29253));
+ print(" IsBuoyTile(): " + AIMarine.IsBuoyTile(28481));
+ print(" IsLockTile(): " + AIMarine.IsLockTile(28487));
+ print(" IsCanalTile(): " + AIMarine.IsCanalTile(32127));
+ print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
+
+ print(" RemoveWaterDepot(): " + AIMarine.RemoveWaterDepot(28479));
+ print(" RemoveDock(): " + AIMarine.RemoveDock(29253));
+ print(" RemoveBuoy(): " + AIMarine.RemoveBuoy(28481));
+ print(" RemoveLock(): " + AIMarine.RemoveLock(28487));
+ print(" RemoveCanal(): " + AIMarine.RemoveCanal(32127));
+ print(" IsWaterDepotTile(): " + AIMarine.IsWaterDepotTile(28479));
+ print(" IsDockTile(): " + AIMarine.IsDockTile(29253));
+ print(" IsBuoyTile(): " + AIMarine.IsBuoyTile(28481));
+ print(" IsLockTile(): " + AIMarine.IsLockTile(28487));
+ print(" IsCanalTile(): " + AIMarine.IsCanalTile(32127));
+ print(" GetBankBalance(): " + AICompany.GetBankBalance(AICompany.MY_COMPANY));
+
+ print(" BuildWaterDepot(): " + AIMarine.BuildWaterDepot(28479, false));
+ print(" BuildDock(): " + AIMarine.BuildDock(29253, true));
+}
+
+function Regression::Order()
+{
+ print("");
+ print("--Order--");
+ print(" GetOrderCount(): " + AIOrder.GetOrderCount(12));
+ print(" GetOrderDestination(): " + AIOrder.GetOrderDestination(12, 1));
+ print(" AreOrderFlagsValid(): " + AIOrder.AreOrderFlagsValid(33416, AIOrder.AIOF_TRANSFER));
+ print(" IsValidVehicleOrder(): " + AIOrder.IsValidVehicleOrder(12, 1));
+ print(" GetOrderFlags(): " + AIOrder.GetOrderFlags(12, 1));
+ print(" AppendOrder(): " + AIOrder.AppendOrder(12, 33416, AIOrder.AIOF_TRANSFER));
+ print(" InsertOrder(): " + AIOrder.InsertOrder(12, 0, 33416, AIOrder.AIOF_TRANSFER));
+ print(" GetOrderCount(): " + AIOrder.GetOrderCount(12));
+ print(" IsValidVehicleOrder(): " + AIOrder.IsValidVehicleOrder(12, 1));
+ print(" RemoveOrder(): " + AIOrder.RemoveOrder(12, 0));
+ print(" ChangeOrder(): " + AIOrder.ChangeOrder(12, 0, AIOrder.AIOF_FULL_LOAD));
+ print(" GetOrderDestination(): " + AIOrder.GetOrderDestination(12, 0));
+ print(" CopyOrders(): " + AIOrder.CopyOrders(12, 1));
+ print(" CopyOrders(): " + AIOrder.CopyOrders(13, 12));
+ print(" ShareOrders(): " + AIOrder.ShareOrders(13, 1));
+ print(" ShareOrders(): " + AIOrder.ShareOrders(13, 12));
+ print(" UnshareOrders(): " + AIOrder.UnshareOrders(13));
+ print(" AppendOrder(): " + AIOrder.AppendOrder(12, 33421, AIOrder.AIOF_NONE));
+
+ local list = AIStationList_Vehicle(12);
+
+ print("");
+ print("--StationList_Vehicle--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AIStation.GetLocation);
+ print(" Location ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIStation.GetCargoWaiting, 0);
+ print(" CargoWaiting(0) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIStation.GetCargoWaiting, 1);
+ print(" CargoWaiting(1) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIStation.GetCargoRating, 1);
+ print(" CargoRating(1) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIStation.GetDistanceManhattanToTile, 30000);
+ print(" DistanceManhattanToTile(30000) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIStation.GetDistanceSquareToTile, 30000);
+ print(" DistanceSquareToTile(30000) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIStation.IsWithinTownInfluence, 0);
+ print(" IsWithinTownInfluence(0) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list = AIVehicleList_Station(3);
+
+ print("");
+ print("--VehicleList_Station--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AIVehicle.GetLocation);
+ print(" Location ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ print(" foreach():");
+ foreach (idx, val in list) {
+ print(" " + idx + " => " + val);
+ }
+}
+
+function Regression::Pathfinder()
+{
+ print("");
+ print("--PathFinder--");
+ print(" Road Between Towns:");
+
+ local pathfinder = RPF();
+
+ local path = false;
+ pathfinder.InitializePath([AITown.GetLocation(0)], [AITown.GetLocation(1)]);
+ while (path == false) path = pathfinder.FindPath(1000);
+
+ while (path != null) {
+ print(" Tile " + path.GetTile());
+ path = path.GetParent();
+ }
+}
+
+function Regression::QueueTest(queue)
+{
+ print(" Count(): " + queue.Count());
+ print(" Peek(): " + queue.Peek());
+ print(" Pop(): " + queue.Pop());
+ queue.Insert(6, 20);
+ queue.Insert(7, 40);
+ queue.Insert(2, 10);
+ queue.Insert(5, 15);
+ queue.Insert(8, 60);
+ queue.Insert(1, 5);
+ queue.Insert(3, 10);
+ queue.Insert(9, 90);
+ queue.Insert(4, 10);
+ print(" Count(): " + queue.Count());
+ print(" Peek(): " + queue.Peek());
+ for (local i = 4; i > 0; i--) {
+ print(" Pop(): " + queue.Pop());
+ }
+ queue.Insert(1, 5);
+ queue.Insert(10, 100);
+ for (local i = queue.Count(); i > 0; i--) {
+ print(" Pop(): " + queue.Pop());
+ }
+ print(" Peek(): " + queue.Peek());
+ print(" Pop(): " + queue.Pop());
+ print(" Count(): " + queue.Count());
+}
+
+function Regression::Queues()
+{
+ print("");
+ print("--PriorityQueue--");
+ QueueTest(PQ());
+ print("");
+ print("--BinaryHeap--");
+ QueueTest(BH());
+ print("");
+ print("--FibonacciHeap--");
+ QueueTest(FH());
+}
+
+function Regression::RailTypeList()
+{
+ local list = AIRailTypeList();
+
+ print("");
+ print("--RailTypeList--");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" RailType: " + i);
+ print(" IsRailTypeAvailable(): " + AIRail.IsRailTypeAvailable(i));
+ }
+}
+
+function Regression::Rail()
+{
+ AIRail.SetCurrentRailType(0);
+
+ print("");
+ print("--Rail--");
+ print(" IsRailTile(): " + AIRail.IsRailTile(10002));
+ print(" BuildRailTrack(): " + AIRail.BuildRailTrack(10002, AIRail.RAILTRACK_NW_SE));
+ print(" BuildSignal(): " + AIRail.BuildSignal(10002, 10258, AIRail.SIGNALTYPE_PBS));
+ print(" RemoveRailTrack(): " + AIRail.RemoveRailTrack(10002, AIRail.RAILTRACK_NW_NE));
+ print(" RemoveRailTrack(): " + AIRail.RemoveRailTrack(10002, AIRail.RAILTRACK_NW_SE));
+ print(" BuildRail(): " + AIRail.BuildRail(10002, 10003, 10006));
+ print(" HasTransportType(): " + AITile.HasTransportType(10005, AITile.TRANSPORT_RAIL));
+ print(" HasTransportType(): " + AITile.HasTransportType(10006, AITile.TRANSPORT_RAIL));
+ print(" RemoveRail(): " + AIRail.RemoveRail(10005, 10004, 10001));
+
+ print(" Depot");
+ print(" IsRailTile(): " + AIRail.IsRailTile(33411));
+ print(" BuildRailDepot(): " + AIRail.BuildRailDepot(0, 1));
+ print(" BuildRailDepot(): " + AIRail.BuildRailDepot(33411, 33411));
+ print(" BuildRailDepot(): " + AIRail.BuildRailDepot(33411, 33414));
+ print(" BuildRailDepot(): " + AIRail.BuildRailDepot(33411, 33412));
+ print(" GetRailDepotFrontTile(): " + AIRail.GetRailDepotFrontTile(33411));
+ print(" IsBuildable(): " + AITile.IsBuildable(33411));
+ local list = AIDepotList(AITile.TRANSPORT_RAIL);
+ print(" DepotList");
+ print(" Count(): " + list.Count());
+ list.Valuate(AITile.GetDistanceManhattanToTile, 0);
+ print(" Depot distance from (0,0) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ print(" RemoveDepot(): " + AITile.DemolishTile(33411));
+
+ print(" Station");
+ print(" BuildRailStation(): " + AIRail.BuildRailStation(0, AIRail.RAILTRACK_NE_SW, 1, 1, false));
+ print(" BuildRailStation(): " + AIRail.BuildRailStation(7958, AIRail.RAILTRACK_NE_SW, 4, 5, false));
+ print(" IsRailStationTile(): " + AIRail.IsRailStationTile(7957));
+ print(" IsRailStationTile(): " + AIRail.IsRailStationTile(7958));
+ print(" IsRailStationTile(): " + AIRail.IsRailStationTile(7959));
+ print(" RemoveRailStationTileRect(): " + AIRail.RemoveRailStationTileRect(7959, 7959));
+ print(" IsRailStationTile(): " + AIRail.IsRailStationTile(7957));
+ print(" IsRailStationTile(): " + AIRail.IsRailStationTile(7958));
+ print(" IsRailStationTile(): " + AIRail.IsRailStationTile(7959));
+ print(" DemolishTile(): " + AITile.DemolishTile(7960));
+ print(" IsRailStationTile(): " + AIRail.IsRailStationTile(7957));
+ print(" IsRailStationTile(): " + AIRail.IsRailStationTile(7958));
+ print(" IsRailStationTile(): " + AIRail.IsRailStationTile(7959));
+}
+
+function Regression::Road()
+{
+ print("");
+ print("--Road--");
+ print(" Road");
+ print(" IsRoadTile(): " + AIRoad.IsRoadTile(33411));
+ print(" BuildRoad(): " + AIRoad.BuildRoad(0, 1));
+ print(" BuildRoad(): " + AIRoad.BuildRoad(33411, 33411));
+ print(" HasTransportType(): " + AITile.HasTransportType(33413, AITile.TRANSPORT_ROAD));
+ print(" BuildRoad(): " + AIRoad.BuildRoad(33411, 33414));
+ print(" HasTransportType(): " + AITile.HasTransportType(33413, AITile.TRANSPORT_ROAD));
+ print(" AreRoadTilesConnected(): " + AIRoad.AreRoadTilesConnected(33412, 33413));
+ print(" IsRoadTile(): " + AIRoad.IsRoadTile(33411));
+ print(" HasRoadType(Road): " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_ROAD));
+ print(" HasRoadType(Tram): " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_TRAM));
+ print(" GetNeighbourRoadCount(): " + AIRoad.GetNeighbourRoadCount(33412));
+ print(" RemoveRoad(): " + AIRoad.RemoveRoad(33411, 33411));
+ print(" RemoveRoad(): " + AIRoad.RemoveRoad(33411, 33412));
+ print(" RemoveRoad(): " + AIRoad.RemoveRoad(19590, 19590));
+ print(" RemoveRoad(): " + AIRoad.RemoveRoad(33411, 33414));
+ print(" BuildOneWayRoad(): " + AIRoad.BuildOneWayRoad(33411, 33414));
+ print(" AreRoadTilesConnected(): " + AIRoad.AreRoadTilesConnected(33412, 33413));
+ print(" AreRoadTilesConnected(): " + AIRoad.AreRoadTilesConnected(33413, 33412));
+ print(" BuildOneWayRoad(): " + AIRoad.BuildOneWayRoad(33413, 33412));
+ print(" AreRoadTilesConnected(): " + AIRoad.AreRoadTilesConnected(33412, 33413));
+ print(" AreRoadTilesConnected(): " + AIRoad.AreRoadTilesConnected(33413, 33412));
+ print(" BuildOneWayRoad(): " + AIRoad.BuildOneWayRoad(33412, 33413));
+ print(" BuildOneWayRoad(): " + AIRoad.BuildOneWayRoad(33413, 33412));
+ print(" AreRoadTilesConnected(): " + AIRoad.AreRoadTilesConnected(33412, 33413));
+ print(" AreRoadTilesConnected(): " + AIRoad.AreRoadTilesConnected(33413, 33412));
+ print(" RemoveRoad(): " + AIRoad.RemoveRoad(33411, 33412));
+ print(" IsRoadTypeAvailable(Road): " + AIRoad.IsRoadTypeAvailable(AIRoad.ROADTYPE_ROAD));
+ print(" IsRoadTypeAvailable(Tram): " + AIRoad.IsRoadTypeAvailable(AIRoad.ROADTYPE_TRAM));
+ print(" SetCurrentRoadType(Tram): " + AIRoad.SetCurrentRoadType(AIRoad.ROADTYPE_TRAM));
+ print(" GetCurrentRoadType(): " + AIRoad.GetCurrentRoadType());
+
+ print(" Depot");
+ print(" IsRoadTile(): " + AIRoad.IsRoadTile(33411));
+ print(" BuildRoadDepot(): " + AIRoad.BuildRoadDepot(0, 1));
+ print(" BuildRoadDepot(): " + AIRoad.BuildRoadDepot(33411, 33411));
+ print(" BuildRoadDepot(): " + AIRoad.BuildRoadDepot(33411, 33414));
+ print(" BuildRoadDepot(): " + AIRoad.BuildRoadDepot(33411, 33412));
+ print(" HasRoadType(Road): " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_ROAD));
+ print(" HasRoadType(Tram): " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_TRAM));
+ print(" GetLastError(): " + AIError.GetLastError());
+ print(" GetLastErrorString(): " + AIError.GetLastErrorString());
+ print(" GetErrorCategory(): " + AIError.GetErrorCategory());
+ print(" IsRoadTile(): " + AIRoad.IsRoadTile(33411));
+ print(" GetRoadDepotFrontTile(): " + AIRoad.GetRoadDepotFrontTile(33411));
+ print(" IsRoadDepotTile(): " + AIRoad.IsRoadDepotTile(33411));
+ print(" IsBuildable(): " + AITile.IsBuildable(33411));
+ local list = AIDepotList(AITile.TRANSPORT_ROAD);
+ print(" DepotList");
+ print(" Count(): " + list.Count());
+ list.Valuate(AITile.GetDistanceManhattanToTile, 0);
+ print(" Depot distance from (0,0) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ print(" RemoveRoadDepot(): " + AIRoad.RemoveRoadDepot(33411));
+ print(" RemoveRoadDepot(): " + AIRoad.RemoveRoadDepot(33411));
+
+ print(" Station");
+ print(" IsRoadTile(): " + AIRoad.IsRoadTile(33411));
+ print(" BuildRoadStation(): " + AIRoad.BuildRoadStation(0, 1, false, false, true));
+ print(" BuildRoadStation(): " + AIRoad.BuildRoadStation(33411, 33411, false, false, true));
+ print(" BuildRoadStation(): " + AIRoad.BuildRoadStation(33411, 33414, false, false, true));
+ print(" BuildRoadStation(): " + AIRoad.BuildRoadStation(33411, 33412, false, false, true));
+ print(" IsStationTile(): " + AITile.IsStationTile(33411));
+ print(" IsStationTile(): " + AITile.IsStationTile(33412));
+ print(" HasRoadType(Road): " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_ROAD));
+ print(" HasRoadType(Tram): " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_TRAM));
+ print(" IsRoadTile(): " + AIRoad.IsRoadTile(33411));
+ print(" GetDriveThroughBackTile(): " + AIRoad.GetDriveThroughBackTile(33411));
+ print(" GetRoadStationFrontTile(): " + AIRoad.GetRoadStationFrontTile(33411));
+ print(" IsRoadStationTile(): " + AIRoad.IsRoadStationTile(33411));
+ print(" IsDriveThroughRoadStationTile: " + AIRoad.IsDriveThroughRoadStationTile(33411));
+ print(" RemoveRoadStation(): " + AIRoad.RemoveRoadStation(33411));
+ print(" RemoveRoadStation(): " + AIRoad.RemoveRoadStation(33411));
+
+ print(" Station Types");
+ print(" BuildRoadStation(bus): " + AIRoad.BuildRoadStation(33411, 33410, false, false, true));
+ print(" BuildRoadStation(truck): " + AIRoad.BuildRoadStation(33421, 33422, true, false, true));
+ print(" BuildRoadStation(truck): " + AIRoad.BuildRoadStation(33412, 33413, true, false, true));
+ print(" BuildRoadStation(bus): " + AIRoad.BuildRoadStation(33411 + 256, 33411, false, false, true));
+ print(" BuildRoadStation(truck): " + AIRoad.BuildRoadStation(33412 + 256, 33412 + 256 + 256, true, false, true));
+ print(" BuildRoadStation(bus-drive): " + AIRoad.BuildRoadStation(33413, 33412, false, true, true));
+ print(" BuildRoadStation(truck-drive): " + AIRoad.BuildRoadStation(33414, 33413, true, true, true));
+ print(" BuildRoadStation(bus-drive): " + AIRoad.BuildRoadStation(33415, 33414, false, true, true));
+ print(" BuildRoadStation(truck-drive): " + AIRoad.BuildRoadStation(33416, 33415, true, true, true));
+ print(" BuildRoadDepot(): " + AIRoad.BuildRoadDepot(33417, 33418));
+ print(" GetRoadStationFrontTile(): " + AIRoad.GetRoadStationFrontTile(33411 + 256));
+ print(" GetRoadStationFrontTile(): " + AIRoad.GetRoadStationFrontTile(33412 + 256));
+ print(" IsDriveThroughRoadStationTile: " + AIRoad.IsDriveThroughRoadStationTile(33415));
+ print(" IsBuildable(): " + AITile.IsBuildable(33415));
+ print(" GetDriveThroughBackTile(): " + AIRoad.GetDriveThroughBackTile(33415));
+ print(" GetRoadStationFrontTile(): " + AIRoad.GetRoadStationFrontTile(33415));
+ print(" IsRoadTile(): " + AIRoad.IsRoadTile(33415));
+}
+
+function Regression::Sign()
+{
+ local j = 0;
+
+ print("");
+ print("--Sign--");
+ print(" BuildSign(33410, 'Some Sign'): " + AISign.BuildSign(33410, "Some Sign"));
+ print(" BuildSign(33411, 'Test'): " + AISign.BuildSign(33411, "Test"));
+ print(" SetName(1, 'Test2'): " + AISign.SetName(1, "Test2"));
+ local sign_id = AISign.BuildSign(33409, "Some other Sign");
+ print(" BuildSign(33409, 'Some other Sign'): " + sign_id);
+ print(" RemoveSign(" + sign_id + "): " + AISign.RemoveSign(sign_id));
+ print("");
+ print(" GetMaxSignID(): " + AISign.GetMaxSignID());
+ for (local i = -1; i < AISign.GetMaxSignID() + 1; i++) {
+ if (AISign.IsValidSign(i)) j++;
+ print(" Sign " + i);
+ print(" IsValidSign(): " + AISign.IsValidSign(i));
+ print(" GetName(): " + AISign.GetName(i));
+ print(" GetLocation(): " + AISign.GetLocation(i));
+ }
+ print(" Valid Signs: " + j);
+}
+
+function Regression::Station()
+{
+ print("");
+ print("--Station--");
+ print(" IsValidStation(0): " + AIStation.IsValidStation(0));
+ print(" IsValidStation(1000): " + AIStation.IsValidStation(1000));
+ print(" GetName(0): " + AIStation.GetName(0));
+ print(" SetName(0): " + AIStation.SetName(0, "Look, a station"));
+ print(" GetName(0): " + AIStation.GetName(0));
+ print(" GetLocation(1): " + AIStation.GetLocation(1));
+ print(" GetLocation(1000): " + AIStation.GetLocation(1000));
+ print(" GetStationID(33411): " + AIStation.GetStationID(33411));
+ print(" GetStationID(34411): " + AIStation.GetStationID(34411));
+ print(" GetCargoWaiting(0, 0): " + AIStation.GetCargoWaiting(0, 0));
+ print(" GetCargoWaiting(1000, 0): " + AIStation.GetCargoWaiting(1000, 0));
+ print(" GetCargoWaiting(0, 1000): " + AIStation.GetCargoWaiting(0, 1000));
+
+ print(" GetStationID(33411): " + AIStation.GetStationID(33411));
+ print(" HasRoadType(3, TRAM): " + AIStation.HasRoadType(3, AIRoad.ROADTYPE_TRAM));
+ print(" HasRoadType(3, ROAD): " + AIStation.HasRoadType(3, AIRoad.ROADTYPE_ROAD));
+ print(" HasRoadType(33411, TRAM): " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_TRAM));
+ print(" HasRoadType(33411, ROAD): " + AIRoad.HasRoadType(33411, AIRoad.ROADTYPE_ROAD));
+ print(" HasStationType(3, BUS): " + AIStation.HasStationType(3, AIStation.STATION_BUS_STOP));
+ print(" HasStationType(3, TRAIN): " + AIStation.HasStationType(3, AIStation.STATION_TRAIN));
+
+ print(" GetCoverageRadius(BUS): " + AIStation.GetCoverageRadius(AIStation.STATION_BUS_STOP));
+ print(" GetCoverageRadius(TRUCK): " + AIStation.GetCoverageRadius(AIStation.STATION_TRUCK_STOP));
+ print(" GetCoverageRadius(TRAIN): " + AIStation.GetCoverageRadius(AIStation.STATION_TRAIN));
+
+ print(" GetNearestTown(): " + AIStation.GetNearestTown(0));
+ print(" GetNearestTown(): " + AIStation.GetNearestTown(10000));
+ print(" GetNearestTown(): " + AIStation.GetNearestTown(3));
+
+ local list = AIStationList(AIStation.STATION_BUS_STOP + AIStation.STATION_TRUCK_STOP);
+
+ print("");
+ print("--StationList--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AIStation.GetLocation);
+ print(" Location ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIStation.GetCargoWaiting, 0);
+ print(" CargoWaiting(0) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIStation.GetCargoWaiting, 1);
+ print(" CargoWaiting(1) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+}
+
+function Regression::Tile()
+{
+ print("");
+ print("--Tile--");
+ print(" HasTreeOnTile(): " + AITile.HasTreeOnTile(33148));
+ print(" IsFarmTile(): " + AITile.IsFarmTile(32892));
+ print(" IsRockTile(): " + AITile.IsRockTile(31606));
+ print(" IsRoughTile(): " + AITile.IsRoughTile(33674));
+ print(" HasTreeOnTile(): " + AITile.HasTreeOnTile(33404));
+ print(" IsFarmTile(): " + AITile.IsFarmTile(33404));
+ print(" IsRockTile(): " + AITile.IsRockTile(33404));
+ print(" IsRoughTile(): " + AITile.IsRoughTile(33404));
+ print(" IsSnowTile(): " + AITile.IsSnowTile(33404));
+ print(" IsDesertTile(): " + AITile.IsDesertTile(33404));
+ print(" PlantTree(): " + AITile.PlantTree(33404));
+ print(" HasTreeOnTile(): " + AITile.HasTreeOnTile(33404));
+ print(" PlantTree(): " + AITile.PlantTree(33404));
+ print(" HasTreeOnTile(): " + AITile.HasTreeOnTile(33661));
+ print(" PlantTreeRectangle(): " + AITile.PlantTreeRectangle(33404, 2, 2));
+ print(" HasTreeOnTile(): " + AITile.HasTreeOnTile(33661));
+}
+
+function Regression::TileList()
+{
+ local list = AITileList();
+
+ print("");
+ print("--TileList--");
+ print(" Count(): " + list.Count());
+ list.AddRectangle(27631 - 256 * 1, 256 * 1 + 27631 + 2);
+ print(" Count(): " + list.Count());
+
+ list.Valuate(AITile.GetSlope);
+ print(" Slope(): done");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ print(" " + i + " => " + AITile.GetComplementSlope(list.GetValue(i)));
+ print(" " + i + " => " + AITile.IsSteepSlope(list.GetValue(i)));
+ print(" " + i + " => " + AITile.IsHalftileSlope(list.GetValue(i)));
+ }
+ list.Clear();
+
+ print("");
+ print("--TileList--");
+ print(" Count(): " + list.Count());
+ list.AddRectangle(41895 - 256 * 2, 256 * 2 + 41895 + 8);
+ print(" Count(): " + list.Count());
+
+ list.Valuate(AITile.GetHeight);
+ print(" Height(): done");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list.Valuate(AITile.GetSlope);
+ list.KeepValue(0);
+ print(" Slope(): done");
+ print(" KeepValue(0): done");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list.Valuate(AITile.IsBuildable);
+ list.KeepValue(1);
+ print(" Buildable(): done");
+ print(" KeepValue(1): done");
+ print(" Count(): " + list.Count());
+
+ list.Valuate(AITile.IsBuildableRectangle, 3, 3);
+ print(" BuildableRectangle(3, 3) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AITile.GetDistanceManhattanToTile, 30000);
+ print(" DistanceManhattanToTile(30000) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AITile.GetDistanceSquareToTile, 30000);
+ print(" DistanceSquareToTile(30000) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AITile.GetOwner);
+ print(" GetOwner() ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AITile.GetClosestTown);
+ print(" GetClosestTown() ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list.Valuate(AITile.GetCargoAcceptance, 0, 1, 1, 3);
+ list.KeepAboveValue(10);
+ print(" CargoAcceptance(): done");
+ print(" KeepAboveValue(10): done");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list.Valuate(AIRoad.IsRoadTile);
+ list.KeepValue(1);
+ print(" RoadTile(): done");
+ print(" KeepValue(1): done");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list.Valuate(AIRoad.GetNeighbourRoadCount);
+ list.KeepValue(1);
+ print(" NeighbourRoadCount():done");
+ print(" KeepValue(1): done");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list.AddRectangle(54421 - 256 * 2, 256 * 2 + 54421 + 8);
+ list.Valuate(AITile.IsWaterTile);
+ print(" Water(): done");
+ print(" Count(): " + list.Count());
+ print(" ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list = AITileList_IndustryAccepting(0, 3);
+ print("");
+ print("--TileList_IndustryAccepting--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AITile.GetCargoAcceptance, 3, 1, 1, 3);
+ print(" Location ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list = AITileList_IndustryProducing(1, 3);
+ print("");
+ print("--TileList_IndustryProducing--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AITile.GetCargoProduction, 7, 1, 1, 3);
+ print(" Location ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ list = AITileList_StationType(4, AIStation.STATION_BUS_STOP);
+ print("");
+ print("--TileList_StationType--");
+ print(" Count(): " + list.Count());
+ print(" Location ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+}
+
+function Regression::Town()
+{
+ local j = 0;
+
+ print("");
+ print("--Town--");
+ print(" GetMaxTownID(): " + AITown.GetMaxTownID());
+ print(" GetTownCount(): " + AITown.GetTownCount());
+ for (local i = -1; i < AITown.GetMaxTownID() + 1; i++) {
+ if (AITown.IsValidTown(i)) j++;
+ print(" Town " + i);
+ print(" IsValidTown(): " + AITown.IsValidTown(i));
+ print(" GetName(): " + AITown.GetName(i));
+ print(" GetPopulation(): " + AITown.GetPopulation(i));
+ print(" GetLocation(): " + AITown.GetLocation(i));
+ print(" GetHouseCount(): " + AITown.GetHouseCount(i));
+ print(" GetRating(): " + AITown.GetRating(i, AICompany.MY_COMPANY));
+ }
+ print(" Valid Towns: " + j);
+ print(" GetTownCount(): " + AITown.GetTownCount());
+}
+
+function Regression::TownList()
+{
+ local list = AITownList();
+
+ print("");
+ print("--TownList--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AITown.GetLocation);
+ print(" Location ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AITown.GetDistanceManhattanToTile, 30000);
+ print(" DistanceManhattanToTile(30000) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AITown.GetDistanceSquareToTile, 30000);
+ print(" DistanceSquareToTile(30000) ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AITown.IsWithinTownInfluence, AITown.GetLocation(0));
+ print(" IsWithinTownInfluence(" + AITown.GetLocation(0) + ") ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AITown.GetAllowedNoise);
+ print(" GetAllowedNoise() ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AITown.GetPopulation);
+ list.KeepAboveValue(500);
+ print(" KeepAboveValue(500): done");
+ print(" Count(): " + list.Count());
+ print(" Population ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+
+ print(" HasStatue(): " + AITown.HasStatue(list.Begin()));
+ print(" GetRoadReworkDuration(): " + AITown.GetRoadReworkDuration(list.Begin()));
+ print(" GetExclusiveRightsCompany(): " + AITown.GetExclusiveRightsCompany(list.Begin()));
+ print(" GetExclusiveRightsDuration(): " + AITown.GetExclusiveRightsDuration(list.Begin()));
+ print(" IsActionAvailable(BUILD_STATUE): " + AITown.IsActionAvailable(list.Begin(), AITown.TOWN_ACTION_BUILD_STATUE));
+ print(" PerformTownAction(BUILD_STATUE): " + AITown.PerformTownAction(list.Begin(), AITown.TOWN_ACTION_BUILD_STATUE));
+ print(" IsActionAvailable(BUILD_STATUE): " + AITown.IsActionAvailable(list.Begin(), AITown.TOWN_ACTION_BUILD_STATUE));
+ print(" HasStatue(): " + AITown.HasStatue(list.Begin()));
+}
+
+function Regression::Tunnel()
+{
+ print("");
+ print("--Tunnel--");
+ print(" IsTunnelTile(): " + AITunnel.IsTunnelTile(29050));
+ print(" RemoveTunnel(): " + AITunnel.RemoveTunnel(29050));
+ print(" GetOtherTunnelEnd(): " + AITunnel.GetOtherTunnelEnd(29050));
+ print(" BuildTunnel(): " + AITunnel.BuildTunnel(AIVehicle.VEHICLE_ROAD, 29050));
+ print(" GetOtherTunnelEnd(): " + AITunnel.GetOtherTunnelEnd(29050));
+ print(" IsTunnelTile(): " + AITunnel.IsTunnelTile(29050));
+ print(" IsTunnelTile(): " + AITunnel.IsTunnelTile(28026));
+ print(" RemoveTunnel(): " + AITunnel.RemoveTunnel(29050));
+ print(" IsTunnelTile(): " + AITunnel.IsTunnelTile(29050));
+
+ print(" --Errors--");
+ print(" BuildTunnel(): " + AITunnel.BuildTunnel(AIVehicle.VEHICLE_ROAD, 7529));
+ print(" BuildTunnel(): " + AITunnel.BuildTunnel(AIVehicle.VEHICLE_ROAD, 8043));
+ print(" GetLastErrorString(): " + AIError.GetLastErrorString());
+ print(" RemoveTunnel(): " + AITunnel.RemoveTunnel(7529));
+}
+
+function Regression::Vehicle()
+{
+ local accounting = AIAccounting();
+
+ print("");
+ print("--Vehicle--");
+ print(" IsValidVehicle(-1): " + AIVehicle.IsValidVehicle(-1));
+ print(" IsValidVehicle(0): " + AIVehicle.IsValidVehicle(0));
+ print(" IsValidVehicle(12): " + AIVehicle.IsValidVehicle(12));
+ print(" ISValidVehicle(9999): " + AIVehicle.IsValidVehicle(9999));
+
+ local bank = AICompany.GetBankBalance(AICompany.MY_COMPANY);
+
+ print(" BuildVehicle(): " + AIVehicle.BuildVehicle(33417, 153));
+ print(" IsValidVehicle(12): " + AIVehicle.IsValidVehicle(12));
+ print(" CloneVehicle(): " + AIVehicle.CloneVehicle(33417, 12, true));
+
+ local bank_after = AICompany.GetBankBalance(AICompany.MY_COMPANY);
+
+ print(" --Accounting--");
+ print(" GetCosts(): " + accounting.GetCosts());
+ print(" Should be: " + (bank - bank_after));
+ print(" ResetCosts(): " + accounting.ResetCosts());
+
+ bank = AICompany.GetBankBalance(AICompany.MY_COMPANY);
+
+ print(" SellVehicle(13): " + AIVehicle.SellVehicle(13));
+ print(" IsInDepot(): " + AIVehicle.IsInDepot(12));
+ print(" IsStoppedInDepot(): " + AIVehicle.IsStoppedInDepot(12));
+ print(" StartStopVehicle(): " + AIVehicle.StartStopVehicle(12));
+ print(" IsInDepot(): " + AIVehicle.IsInDepot(12));
+ print(" IsStoppedInDepot(): " + AIVehicle.IsStoppedInDepot(12));
+ print(" SendVehicleToDepot(): " + AIVehicle.SendVehicleToDepot(12));
+ print(" IsInDepot(): " + AIVehicle.IsInDepot(12));
+ print(" IsStoppedInDepot(): " + AIVehicle.IsStoppedInDepot(12));
+
+ bank_after = AICompany.GetBankBalance(AICompany.MY_COMPANY);
+
+ print(" --Accounting--");
+ print(" GetCosts(): " + accounting.GetCosts());
+ print(" Should be: " + (bank - bank_after));
+
+ print(" GetName(): " + AIVehicle.GetName(12));
+ print(" SetName(): " + AIVehicle.SetName(12, "MyVehicleName"));
+ print(" GetName(): " + AIVehicle.GetName(12));
+ print(" CloneVehicle(): " + AIVehicle.CloneVehicle(33417, 12, true));
+
+ print(" --VehicleData--");
+ print(" GetLocation(): " + AIVehicle.GetLocation(12));
+ print(" GetEngineType(): " + AIVehicle.GetEngineType(12));
+ print(" GetUnitNumber(): " + AIVehicle.GetUnitNumber(12));
+ print(" GetAge(): " + AIVehicle.GetAge(12));
+ print(" GetMaxAge(): " + AIVehicle.GetMaxAge(12));
+ print(" GetAgeLeft(): " + AIVehicle.GetAgeLeft(12));
+ print(" GetCurrentSpeed(): " + AIVehicle.GetCurrentSpeed(12));
+ print(" GetRunningCost(): " + AIVehicle.GetRunningCost(12));
+ print(" GetProfitThisYear(): " + AIVehicle.GetProfitThisYear(12));
+ print(" GetProfitLastYear(): " + AIVehicle.GetProfitLastYear(12));
+ print(" GetCurrentValue(): " + AIVehicle.GetCurrentValue(12));
+ print(" GetVehicleType(): " + AIVehicle.GetVehicleType(12));
+ print(" GetRoadType(): " + AIVehicle.GetRoadType(12));
+ print(" GetCapacity(): " + AIVehicle.GetCapacity(12, 10));
+ print(" GetCargoLoad(): " + AIVehicle.GetCargoLoad(12, 10));
+ print(" IsInDepot(): " + AIVehicle.IsInDepot(12));
+ print(" GetNumWagons(): " + AIVehicle.GetNumWagons(12));
+ print(" GetWagonEngineType(): " + AIVehicle.GetWagonEngineType(12, 0));
+ print(" GetWagonAge(): " + AIVehicle.GetWagonAge(12, 0));
+ print(" GetLength(): " + AIVehicle.GetLength(12));
+
+ print(" GetOwner(): " + AITile.GetOwner(32119));
+ print(" BuildVehicle(): " + AIVehicle.BuildVehicle(32119, 219));
+ print(" IsValidVehicle(14): " + AIVehicle.IsValidVehicle(14));
+ print(" IsInDepot(14): " + AIVehicle.IsInDepot(14));
+ print(" IsStoppedInDepot(14): " + AIVehicle.IsStoppedInDepot(14));
+ print(" IsValidVehicle(15): " + AIVehicle.IsValidVehicle(15));
+ print(" IsInDepot(15): " + AIVehicle.IsInDepot(15));
+ print(" IsStoppedInDepot(15): " + AIVehicle.IsStoppedInDepot(15));
+
+ print(" BuildVehicle(): " + AIVehicle.BuildVehicle(28479, 204));
+ print(" IsValidVehicle(16): " + AIVehicle.IsValidVehicle(16));
+ print(" IsInDepot(16): " + AIVehicle.IsInDepot(16));
+ print(" IsStoppedInDepot(16): " + AIVehicle.IsStoppedInDepot(16));
+
+ print(" BuildRailDepot(): " + AIRail.BuildRailDepot(10008, 10000));
+ print(" BuildVehicle(): " + AIVehicle.BuildVehicle(10008, 9));
+ print(" BuildVehicle(): " + AIVehicle.BuildVehicle(10008, 27));
+ print(" BuildVehicle(): " + AIVehicle.BuildVehicle(10008, 27));
+ print(" MoveWagon(): " + AIVehicle.MoveWagon(18, 0, true, 17, 0));
+ print(" GetNumWagons(): " + AIVehicle.GetNumWagons(17));
+ print(" GetLength(): " + AIVehicle.GetLength(17));
+ print(" GetWagonEngineType(): " + AIVehicle.GetWagonEngineType(17, 0));
+ print(" GetWagonAge(): " + AIVehicle.GetWagonAge(17, 0));
+ print(" GetWagonEngineType(): " + AIVehicle.GetWagonEngineType(17, 1));
+ print(" GetWagonAge(): " + AIVehicle.GetWagonAge(17, 1));
+ print(" GetWagonEngineType(): " + AIVehicle.GetWagonEngineType(17 2));
+ print(" GetWagonAge(): " + AIVehicle.GetWagonAge(17, 2));
+ print(" GetWagonEngineType(): " + AIVehicle.GetWagonEngineType(17 3));
+ print(" GetWagonAge(): " + AIVehicle.GetWagonAge(17, 3));
+
+ print(" --Errors--");
+ print(" RefitVehicle(): " + AIVehicle.RefitVehicle(12, 0));
+ print(" GetLastErrorString(): " + AIError.GetLastErrorString());
+ print(" SellVehicle(): " + AIVehicle.SellVehicle(12));
+ print(" GetLastErrorString(): " + AIError.GetLastErrorString());
+ print(" SendVehicleToDepot(): " + AIVehicle.SendVehicleToDepot(13));
+ print(" GetLastErrorString(): " + AIError.GetLastErrorString());
+
+ local list = AIVehicleList();
+
+ print("");
+ print("--VehicleList--");
+ print(" Count(): " + list.Count());
+ list.Valuate(AIVehicle.GetLocation);
+ print(" Location ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetEngineType);
+ print(" EngineType ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetUnitNumber);
+ print(" UnitNumber ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetAge);
+ print(" Age ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetMaxAge);
+ print(" MaxAge ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetAgeLeft);
+ print(" AgeLeft ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetCurrentSpeed);
+ print(" CurrentSpeed ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetRunningCost);
+ print(" RunningCost ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetProfitThisYear);
+ print(" ProfitThisYear ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetProfitLastYear);
+ print(" ProfitLastYear ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetCurrentValue);
+ print(" CurrentValue ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetVehicleType);
+ print(" VehicleType ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetRoadType);
+ print(" RoadType ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetCapacity, 10);
+ print(" VehicleType ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+ list.Valuate(AIVehicle.GetCargoLoad, 10);
+ print(" VehicleType ListDump:");
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ print(" " + i + " => " + list.GetValue(i));
+ }
+}
+
+function Regression::PrintSubsidy(subsidy_id)
+{
+ print(" --Subsidy (" + subsidy_id + ") --");
+ print(" IsValidSubsidy(): " + AISubsidy.IsValidSubsidy(subsidy_id));
+ print(" IsAwarded(): " + AISubsidy.IsAwarded(subsidy_id));
+ print(" GetAwardedTo(): " + AISubsidy.GetAwardedTo(subsidy_id));
+ print(" GetExpireDate(): " + AISubsidy.GetExpireDate(subsidy_id));
+ print(" SourceIsTown(): " + AISubsidy.SourceIsTown(subsidy_id));
+ print(" GetSource(): " + AISubsidy.GetSource(subsidy_id));
+ print(" DestionationIsTown(): " + AISubsidy.DestinationIsTown(subsidy_id));
+ print(" GetDestionation(): " + AISubsidy.GetDestination(subsidy_id));
+ print(" GetCargoType(): " + AISubsidy.GetCargoType(subsidy_id));
+}
+
+
+function Regression::Start()
+{
+ this.TestInit();
+ this.Std();
+ this.Base();
+ this.List();
+ this.Airport();
+ this.Bridge();
+ this.BridgeList();
+ this.Cargo();
+ this.CargoList();
+ this.Company();
+ this.Engine();
+ this.EngineList();
+ this.Graph();
+ this.Group();
+ this.Industry();
+ this.IndustryList();
+ this.IndustryTypeList();
+ this.Map();
+ this.Marine();
+ this.Pathfinder();
+ this.Queues();
+ this.Rail();
+ this.RailTypeList();
+ this.Road();
+ this.Sign();
+ this.Station();
+ this.Tile();
+ this.TileList();
+ this.Town();
+ this.TownList();
+ this.Tunnel();
+ this.Vehicle();
+ /* Order has to be after Vehicle */
+ this.Order();
+ print("");
+ print(" First Subsidy Test");
+ PrintSubsidy(0);
+
+ while (AIEventController.IsEventWaiting()) {
+ local e = AIEventController.GetNextEvent();
+ print(" GetNextEvent: " + (e == null ? "null" : "instance"));
+ print(" GetEventType: " + e.GetEventType());
+ switch (e.GetEventType()) {
+ case AIEvent.AI_ET_SUBSIDY_OFFER: {
+ local c = AIEventSubsidyOffer.Convert(e);
+ print(" EventName: SubsidyOffer");
+ PrintSubsidy(c.GetSubsidyID());
+ } break;
+
+ case AIEvent.AI_ET_VEHICLE_WAITING_IN_DEPOT: {
+ local c = AIEventVehicleWaitingInDepot.Convert(e);
+ print(" EventName: VehicleWaitingInDepot");
+ print(" VehicleID: " + c.GetVehicleID());
+ } break;
+
+ default:
+ print(" Unknown Event");
+ break;
+ }
+ }
+ print(" IsEventWaiting: false");
+}
+
diff --git a/bin/ai/regression/regression.sav b/bin/ai/regression/regression.sav
new file mode 100644
index 000000000..84a1cf6b7
--- /dev/null
+++ b/bin/ai/regression/regression.sav
Binary files differ
diff --git a/bin/ai/regression/regression.txt b/bin/ai/regression/regression.txt
new file mode 100644
index 000000000..3a9bb0ffa
--- /dev/null
+++ b/bin/ai/regression/regression.txt
@@ -0,0 +1,7824 @@
+
+--TestInit--
+ TickTest: 1
+ TickTest: 2
+ SetCommandDelay: (null : 0x00000000)
+ IsValid(vehicle.plane_speed): true
+ vehicle.plane_speed: 2
+ Required this file
+ min(6, 3): 3
+ min(3, 6): 3
+ max(6, 3): 6
+ max(3, 6): 6
+ AIList Consistency Tests
+
+ Value Descending
+ 40
+ 25
+ 10
+
+ 40
+ 30
+ 20
+ 10
+ 40
+ 30
+ 20
+ 10
+
+ 40
+ 30
+ 20
+ 10
+
+ Value Ascending
+ 5
+ 20
+ 35
+
+ 10
+ 20
+ 30
+ 40
+ 10
+ 20
+ 30
+ 40
+
+ 10
+ 20
+ 30
+ 40
+
+ Item Descending
+ 40
+ 25
+ 10
+
+ 40
+ 30
+ 20
+ 10
+
+ 40
+ 30
+ 20
+ 10
+
+ Item Ascending
+ 5
+ 20
+ 35
+
+ 10
+ 20
+ 30
+ 40
+
+ 10
+ 20
+ 30
+ 40
+
+--Std--
+ abs(-21): 21
+ abs( 21): 21
+
+--AIBase--
+ Rand(): -394267821
+ Rand(): -1103663825
+ Rand(): 158728217
+ RandRange(0): 0
+ RandRange(0): 0
+ RandRange(0): 0
+ RandRange(1): 0
+ RandRange(1): 0
+ RandRange(1): 0
+ RandRange(2): 1
+ RandRange(2): 0
+ RandRange(2): 1
+ RandRange(9): 6
+ RandRange(9): 0
+ RandRange(9): 5
+ Chance(1, 2): true
+ Chance(1, 2): true
+ Chance(1, 2): false
+
+--List--
+ IsEmpty(): true
+ Count(): 101
+ HasItem(1050): false
+ HasItem(1051): true
+ IsEmpty(): false
+ List Dump:
+ 1 => 1
+ 2 => 2
+ 1000 => 1000
+ 1001 => 1001
+ 1002 => 1002
+ 1003 => 1003
+ 1004 => 1004
+ 1005 => 1005
+ 1006 => 1006
+ 1007 => 1007
+ 1008 => 1008
+ 1009 => 1009
+ 1010 => 1010
+ 1011 => 1011
+ 1012 => 1012
+ 1013 => 1013
+ 1014 => 1014
+ 1015 => 1015
+ 1016 => 1016
+ 1017 => 1017
+ 1018 => 1018
+ 1019 => 1019
+ 1020 => 1020
+ 1021 => 1021
+ 1022 => 1022
+ 1023 => 1023
+ 1024 => 1024
+ 1025 => 1025
+ 1026 => 1026
+ 1027 => 1027
+ 1028 => 1028
+ 1029 => 1029
+ 1030 => 1030
+ 1031 => 1031
+ 1032 => 1032
+ 1033 => 1033
+ 1034 => 1034
+ 1035 => 1035
+ 1036 => 1036
+ 1037 => 1037
+ 1038 => 1038
+ 1039 => 1039
+ 1040 => 1040
+ 1041 => 1041
+ 1042 => 1042
+ 1043 => 1043
+ 1044 => 1044
+ 1045 => 1045
+ 1046 => 1046
+ 1047 => 1047
+ 1048 => 1048
+ 1049 => 1049
+ 1051 => 12
+ 1052 => 1052
+ 1053 => 1053
+ 1054 => 1054
+ 1055 => 1055
+ 1056 => 1056
+ 1057 => 1057
+ 1058 => 1058
+ 1059 => 1059
+ 1060 => 1060
+ 1061 => 1061
+ 1062 => 1062
+ 1063 => 1063
+ 1064 => 1064
+ 1065 => 1065
+ 1066 => 1066
+ 1067 => 1067
+ 1068 => 1068
+ 1069 => 1069
+ 1070 => 1070
+ 1071 => 1071
+ 1072 => 1072
+ 1073 => 1073
+ 1074 => 1074
+ 1075 => 1075
+ 1076 => 1076
+ 1077 => 1077
+ 1078 => 1078
+ 1079 => 1079
+ 1080 => 1080
+ 1081 => 1081
+ 1082 => 1082
+ 1083 => 1083
+ 1084 => 1084
+ 1085 => 1085
+ 1086 => 1086
+ 1087 => 1087
+ 1088 => 1088
+ 1089 => 1089
+ 1090 => 1090
+ 1091 => 1091
+ 1092 => 1092
+ 1093 => 1093
+ 1094 => 1094
+ 1095 => 1095
+ 1096 => 1096
+ 1097 => 1097
+ 1098 => 1098
+ 1099 => 1099
+ Custom ListDump:
+ 1 => 4343
+ 2 => 8686
+ 1000 => 4343000
+ 1001 => 4347343
+ 1002 => 4351686
+ 1003 => 4356029
+ 1004 => 4360372
+ 1005 => 4364715
+ 1006 => 4369058
+ 1007 => 4373401
+ 1008 => 4377744
+ 1009 => 4382087
+ 1010 => 4386430
+ 1011 => 4390773
+ 1012 => 4395116
+ 1013 => 4399459
+ 1014 => 4403802
+ 1015 => 4408145
+ 1016 => 4412488
+ 1017 => 4416831
+ 1018 => 4421174
+ 1019 => 4425517
+ 1020 => 4429860
+ 1021 => 4434203
+ 1022 => 4438546
+ 1023 => 4442889
+ 1024 => 4447232
+ 1025 => 4451575
+ 1026 => 4455918
+ 1027 => 4460261
+ 1028 => 4464604
+ 1029 => 4468947
+ 1030 => 4473290
+ 1031 => 4477633
+ 1032 => 4481976
+ 1033 => 4486319
+ 1034 => 4490662
+ 1035 => 4495005
+ 1036 => 4499348
+ 1037 => 4503691
+ 1038 => 4508034
+ 1039 => 4512377
+ 1040 => 4516720
+ 1041 => 4521063
+ 1042 => 4525406
+ 1043 => 4529749
+ 1044 => 4534092
+ 1045 => 4538435
+ 1046 => 4542778
+ 1047 => 4547121
+ 1048 => 4551464
+ 1049 => 4555807
+ 1051 => 4564493
+ 1052 => 4568836
+ 1053 => 4573179
+ 1054 => 4577522
+ 1055 => 4581865
+ 1056 => 4586208
+ 1057 => 4590551
+ 1058 => 4594894
+ 1059 => 4599237
+ 1060 => 4603580
+ 1061 => 4607923
+ 1062 => 4612266
+ 1063 => 4616609
+ 1064 => 4620952
+ 1065 => 4625295
+ 1066 => 4629638
+ 1067 => 4633981
+ 1068 => 4638324
+ 1069 => 4642667
+ 1070 => 4647010
+ 1071 => 4651353
+ 1072 => 4655696
+ 1073 => 4660039
+ 1074 => 4664382
+ 1075 => 4668725
+ 1076 => 4673068
+ 1077 => 4677411
+ 1078 => 4681754
+ 1079 => 4686097
+ 1080 => 4690440
+ 1081 => 4694783
+ 1082 => 4699126
+ 1083 => 4703469
+ 1084 => 4707812
+ 1085 => 4712155
+ 1086 => 4716498
+ 1087 => 4720841
+ 1088 => 4725184
+ 1089 => 4729527
+ 1090 => 4733870
+ 1091 => 4738213
+ 1092 => 4742556
+ 1093 => 4746899
+ 1094 => 4751242
+ 1095 => 4755585
+ 1096 => 4759928
+ 1097 => 4764271
+ 1098 => 4768614
+ 1099 => 4772957
+ Custom ListDump:
+ 1 => 42
+ 2 => 84
+ 1000 => 42000
+ 1001 => 42042
+ 1002 => 42084
+ 1003 => 42126
+ 1004 => 42168
+ 1005 => 42210
+ 1006 => 42252
+ 1007 => 42294
+ 1008 => 42336
+ 1009 => 42378
+ 1010 => 42420
+ 1011 => 42462
+ 1012 => 42504
+ 1013 => 42546
+ 1014 => 42588
+ 1015 => 42630
+ 1016 => 42672
+ 1017 => 42714
+ 1018 => 42756
+ 1019 => 42798
+ 1020 => 42840
+ 1021 => 42882
+ 1022 => 42924
+ 1023 => 42966
+ 1024 => 43008
+ 1025 => 43050
+ 1026 => 43092
+ 1027 => 43134
+ 1028 => 43176
+ 1029 => 43218
+ 1030 => 43260
+ 1031 => 43302
+ 1032 => 43344
+ 1033 => 43386
+ 1034 => 43428
+ 1035 => 43470
+ 1036 => 43512
+ 1037 => 43554
+ 1038 => 43596
+ 1039 => 43638
+ 1040 => 43680
+ 1041 => 43722
+ 1042 => 43764
+ 1043 => 43806
+ 1044 => 43848
+ 1045 => 43890
+ 1046 => 43932
+ 1047 => 43974
+ 1048 => 44016
+ 1049 => 44058
+ 1051 => 44142
+ 1052 => 44184
+ 1053 => 44226
+ 1054 => 44268
+ 1055 => 44310
+ 1056 => 44352
+ 1057 => 44394
+ 1058 => 44436
+ 1059 => 44478
+ 1060 => 44520
+ 1061 => 44562
+ 1062 => 44604
+ 1063 => 44646
+ 1064 => 44688
+ 1065 => 44730
+ 1066 => 44772
+ 1067 => 44814
+ 1068 => 44856
+ 1069 => 44898
+ 1070 => 44940
+ 1071 => 44982
+ 1072 => 45024
+ 1073 => 45066
+ 1074 => 45108
+ 1075 => 45150
+ 1076 => 45192
+ 1077 => 45234
+ 1078 => 45276
+ 1079 => 45318
+ 1080 => 45360
+ 1081 => 45402
+ 1082 => 45444
+ 1083 => 45486
+ 1084 => 45528
+ 1085 => 45570
+ 1086 => 45612
+ 1087 => 45654
+ 1088 => 45696
+ 1089 => 45738
+ 1090 => 45780
+ 1091 => 45822
+ 1092 => 45864
+ 1093 => 45906
+ 1094 => 45948
+ 1095 => 45990
+ 1096 => 46032
+ 1097 => 46074
+ 1098 => 46116
+ 1099 => 46158
+ Randomize ListDump:
+ 1 => -453900829
+ 2 => -1311244773
+ 1000 => -1189761104
+ 1001 => -767645542
+ 1002 => 1177121049
+ 1003 => 530150361
+ 1004 => -114394334
+ 1005 => 1655826028
+ 1006 => -634606345
+ 1007 => -16200093
+ 1008 => -1589979998
+ 1009 => -931781688
+ 1010 => -1612519575
+ 1011 => 232355847
+ 1012 => 1937567155
+ 1013 => 293923071
+ 1014 => 77413166
+ 1015 => -996268195
+ 1016 => 954454457
+ 1017 => -2120647595
+ 1018 => -1826344393
+ 1019 => 1036590466
+ 1020 => 1340694939
+ 1021 => 1328898286
+ 1022 => 1212995644
+ 1023 => 212080778
+ 1024 => -1116031315
+ 1025 => 2059557569
+ 1026 => -1351733639
+ 1027 => -16225284
+ 1028 => 12042907
+ 1029 => -2118970966
+ 1030 => -625495409
+ 1031 => -803433375
+ 1032 => 206484827
+ 1033 => -1275117685
+ 1034 => -1660494268
+ 1035 => 439308575
+ 1036 => 689118657
+ 1037 => 18162819
+ 1038 => 279178838
+ 1039 => -811026766
+ 1040 => -102146912
+ 1041 => 761316313
+ 1042 => -446973157
+ 1043 => 1860931649
+ 1044 => -936809412
+ 1045 => 2009637934
+ 1046 => 146746237
+ 1047 => -1122456903
+ 1048 => 496979353
+ 1049 => 1330321624
+ 1051 => 1221526431
+ 1052 => 312894323
+ 1053 => -1967316408
+ 1054 => -306362667
+ 1055 => 463694131
+ 1056 => 1180912503
+ 1057 => 962965831
+ 1058 => -1686452466
+ 1059 => 1770363784
+ 1060 => -974655700
+ 1061 => 1137105824
+ 1062 => -1195585394
+ 1063 => 814828850
+ 1064 => -319033517
+ 1065 => -1069246310
+ 1066 => 730090633
+ 1067 => -453449540
+ 1068 => -1568189245
+ 1069 => 1938098163
+ 1070 => 582038708
+ 1071 => -1513512696
+ 1072 => 2023080545
+ 1073 => 1451475423
+ 1074 => 2115922500
+ 1075 => 1714395178
+ 1076 => -1794465095
+ 1077 => 711436717
+ 1078 => 2080995690
+ 1079 => 1888980586
+ 1080 => 1441996214
+ 1081 => 2068563628
+ 1082 => 1839052927
+ 1083 => -1569187741
+ 1084 => 1117258463
+ 1085 => -373025294
+ 1086 => 836256008
+ 1087 => 894909721
+ 1088 => 320878623
+ 1089 => -324398855
+ 1090 => -2069211627
+ 1091 => 1181351335
+ 1092 => 1628415271
+ 1093 => 1998896274
+ 1094 => 1296141199
+ 1095 => 144363466
+ 1096 => -2068665023
+ 1097 => 301553896
+ 1098 => -509674842
+ 1099 => -1486885398
+ KeepTop(10):
+ 1 => -453900829
+ 2 => -1311244773
+ 1000 => -1189761104
+ 1001 => -767645542
+ 1002 => 1177121049
+ 1003 => 530150361
+ 1004 => -114394334
+ 1005 => 1655826028
+ 1006 => -634606345
+ 1007 => -16200093
+ KeepBottom(8):
+ 1000 => -1189761104
+ 1001 => -767645542
+ 1002 => 1177121049
+ 1003 => 530150361
+ 1004 => -114394334
+ 1005 => 1655826028
+ 1006 => -634606345
+ 1007 => -16200093
+ RemoveBottom(2):
+ 1000 => -1189761104
+ 1001 => -767645542
+ 1002 => 1177121049
+ 1003 => 530150361
+ 1004 => -114394334
+ 1005 => 1655826028
+ RemoveTop(2):
+ 1002 => 1177121049
+ 1003 => 530150361
+ 1004 => -114394334
+ 1005 => 1655826028
+ RemoveList({1003, 1004}):
+ 1002 => 1177121049
+ 1005 => 1655826028
+ KeepList({1003, 1004, 1005}):
+ 1005 => 1655826028
+ AddList({1005, 4000, 4001, 4002}):
+ 1005 => 1005
+ 4000 => 8000
+ 4001 => 8002
+ 4002 => 8004
+ foreach():
+ 1005 => 1005
+ 4000 => 50
+ 4001 => 8002
+ 4002 => 8004
+ 4006 => 12
+ []:
+ 4000 => 50
+ IsEmpty(): true
+
+--AIAirport--
+ IsHangarTile(): false
+ IsAirportTile(): false
+ GetHangarOfAirport(): -1
+ GetAirportType(): 255
+ IsValidAirportType(-1): false
+ AirportAvailable(-1): false
+ GetAirportWidth(-1): -1
+ GetAirportHeight(-1): -1
+ GetAirportCoverageRadius(-1): -1
+ IsValidAirportType(0): true
+ AirportAvailable(0): true
+ GetAirportWidth(0): 4
+ GetAirportHeight(0): 3
+ GetAirportCoverageRadius(0): 4
+ IsValidAirportType(1): true
+ AirportAvailable(1): false
+ GetAirportWidth(1): 6
+ GetAirportHeight(1): 6
+ GetAirportCoverageRadius(1): 5
+ IsValidAirportType(2): true
+ AirportAvailable(2): false
+ GetAirportWidth(2): 1
+ GetAirportHeight(2): 1
+ GetAirportCoverageRadius(2): 4
+ IsValidAirportType(3): true
+ AirportAvailable(3): false
+ GetAirportWidth(3): 6
+ GetAirportHeight(3): 6
+ GetAirportCoverageRadius(3): 6
+ IsValidAirportType(4): true
+ AirportAvailable(4): false
+ GetAirportWidth(4): 7
+ GetAirportHeight(4): 7
+ GetAirportCoverageRadius(4): 8
+ IsValidAirportType(5): true
+ AirportAvailable(5): false
+ GetAirportWidth(5): 5
+ GetAirportHeight(5): 4
+ GetAirportCoverageRadius(5): 4
+ IsValidAirportType(6): true
+ AirportAvailable(6): false
+ GetAirportWidth(6): 2
+ GetAirportHeight(6): 2
+ GetAirportCoverageRadius(6): 4
+ IsValidAirportType(7): true
+ AirportAvailable(7): false
+ GetAirportWidth(7): 9
+ GetAirportHeight(7): 11
+ GetAirportCoverageRadius(7): 10
+ IsValidAirportType(8): true
+ AirportAvailable(8): false
+ GetAirportWidth(8): 4
+ GetAirportHeight(8): 2
+ GetAirportCoverageRadius(8): 4
+ IsValidAirportType(9): false
+ AirportAvailable(9): false
+ GetAirportWidth(9): -1
+ GetAirportHeight(9): -1
+ GetAirportCoverageRadius(9): -1
+ GetBankBalance(): 100000
+ BuildAirport(): true
+ IsHangarTile(): false
+ IsAirportTile(): true
+ GetAirportType(): 0
+ GetHangarOfAirport(): 32119
+ IsHangarTile(): true
+ IsAirportTile(): true
+ GetAirportType(): 0
+ GetBankBalance(): 199108
+ RemoveAirport(): true
+ IsHangarTile(): false
+ IsAirportTile(): false
+ GetBankBalance(): 298300
+ BuildAirport(): true
+
+--Bridge--
+ Bridge -1
+ IsValidBridge(): false
+ GetName(): (null : 0x00000000)
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxLength(): -1
+ GetMinLength(): -1
+ GetYearAvailable(): -1
+ Bridge 0
+ IsValidBridge(): true
+ GetName(): Wooden rail bridge
+ GetMaxSpeed(): 32
+ GetPrice(): 10
+ GetMaxLength(): 102
+ GetMinLength(): 2
+ GetYearAvailable(): 0
+ Bridge 1
+ IsValidBridge(): true
+ GetName(): Concrete rail bridge
+ GetMaxSpeed(): 48
+ GetPrice(): 15
+ GetMaxLength(): 4
+ GetMinLength(): 2
+ GetYearAvailable(): 0
+ Bridge 2
+ IsValidBridge(): true
+ GetName(): Steel girder rail bridge
+ GetMaxSpeed(): 64
+ GetPrice(): 19
+ GetMaxLength(): 7
+ GetMinLength(): 2
+ GetYearAvailable(): 1930
+ Bridge 3
+ IsValidBridge(): true
+ GetName(): Reinforced concrete suspension rail bridge
+ GetMaxSpeed(): 80
+ GetPrice(): 22
+ GetMaxLength(): 12
+ GetMinLength(): 4
+ GetYearAvailable(): 0
+ Bridge 4
+ IsValidBridge(): true
+ GetName(): Steel suspension rail bridge
+ GetMaxSpeed(): 96
+ GetPrice(): 25
+ GetMaxLength(): 102
+ GetMinLength(): 5
+ GetYearAvailable(): 1930
+ Bridge 5
+ IsValidBridge(): true
+ GetName(): Steel suspension rail bridge
+ GetMaxSpeed(): 112
+ GetPrice(): 26
+ GetMaxLength(): 102
+ GetMinLength(): 5
+ GetYearAvailable(): 1930
+ Bridge 6
+ IsValidBridge(): true
+ GetName(): Steel cantilever rail bridge
+ GetMaxSpeed(): 160
+ GetPrice(): 30
+ GetMaxLength(): 9
+ GetMinLength(): 5
+ GetYearAvailable(): 1930
+ Bridge 7
+ IsValidBridge(): true
+ GetName(): Steel cantilever rail bridge
+ GetMaxSpeed(): 208
+ GetPrice(): 31
+ GetMaxLength(): 10
+ GetMinLength(): 5
+ GetYearAvailable(): 1930
+ Bridge 8
+ IsValidBridge(): true
+ GetName(): Steel cantilever rail bridge
+ GetMaxSpeed(): 240
+ GetPrice(): 33
+ GetMaxLength(): 11
+ GetMinLength(): 5
+ GetYearAvailable(): 1930
+ Bridge 9
+ IsValidBridge(): true
+ GetName(): Steel girder rail bridge
+ GetMaxSpeed(): 256
+ GetPrice(): 32
+ GetMaxLength(): 4
+ GetMinLength(): 2
+ GetYearAvailable(): 1930
+ Bridge 10
+ IsValidBridge(): true
+ GetName(): Tubular rail bridge
+ GetMaxSpeed(): 320
+ GetPrice(): 34
+ GetMaxLength(): 102
+ GetMinLength(): 4
+ GetYearAvailable(): 1995
+ Bridge 11
+ IsValidBridge(): true
+ GetName(): Tubular rail bridge
+ GetMaxSpeed(): 512
+ GetPrice(): 51
+ GetMaxLength(): 102
+ GetMinLength(): 4
+ GetYearAvailable(): 2005
+ Bridge 12
+ IsValidBridge(): true
+ GetName(): Tubular rail bridge
+ GetMaxSpeed(): 608
+ GetPrice(): 69
+ GetMaxLength(): 102
+ GetMinLength(): 4
+ GetYearAvailable(): 2010
+ Bridge 13
+ IsValidBridge(): false
+ GetName(): (null : 0x00000000)
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxLength(): -1
+ GetMinLength(): -1
+ GetYearAvailable(): -1
+ Valid Bridges: 13
+ IsBridgeTile(): false
+ RemoveBridge(): false
+ GetLastErrorString(): ERR_PRECONDITION_FAILED
+ GetOtherBridgeEnd(): -1
+ BuildBridge(): true
+ IsBridgeTile(): true
+ IsBridgeTile(): true
+ GetOtherBridgeEnd(): 33155
+ BuildBridge(): false
+ GetLastErrorString(): ERR_ALREADY_BUILT
+ RemoveBridge(): true
+ IsBridgeTile(): false
+
+--BridgeList--
+ Count(): 10
+ MaxSpeed ListDump:
+ 9 => 256
+ 8 => 240
+ 7 => 208
+ 6 => 160
+ 5 => 112
+ 4 => 96
+ 3 => 80
+ 2 => 64
+ 1 => 48
+ 0 => 32
+ Price ListDump:
+ 8 => 33
+ 9 => 32
+ 7 => 31
+ 6 => 30
+ 5 => 26
+ 4 => 25
+ 3 => 22
+ 2 => 19
+ 1 => 15
+ 0 => 10
+ MaxLength ListDump:
+ 5 => 102
+ 4 => 102
+ 0 => 102
+ 3 => 12
+ 8 => 11
+ 7 => 10
+ 6 => 9
+ 2 => 7
+ 9 => 4
+ 1 => 4
+ MinLength ListDump:
+ 8 => 5
+ 7 => 5
+ 6 => 5
+ 5 => 5
+ 4 => 5
+ 3 => 4
+ 9 => 2
+ 2 => 2
+ 1 => 2
+ 0 => 2
+ YearAvailable ListDump:
+ 9 => 1930
+ 8 => 1930
+ 7 => 1930
+ 6 => 1930
+ 5 => 1930
+ 4 => 1930
+ 2 => 1930
+ 3 => 0
+ 1 => 0
+ 0 => 0
+
+--BridgeList_Length--
+ Count(): 3
+ MaxSpeed ListDump:
+ 5 => 112
+ 4 => 96
+ 0 => 32
+ Price ListDump:
+ 5 => 73
+ 4 => 70
+ 0 => 30
+
+--AICargo--
+ Cargo -1
+ IsValidCargo(): false
+ GetCargoLabel(): '(null : 0x00000000)'
+ IsFreight(): false
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): -1
+ GetCargoIncome(10, 10): -1
+ GetCargoIncome(100, 10): -1
+ GetCargoIncome(10, 100): -1
+ Cargo 0
+ IsValidCargo(): true
+ GetCargoLabel(): 'PASS'
+ IsFreight(): false
+ HasCargoClass(): true
+ GetTownEffect(): 1
+ GetCargoIncome(0, 0): 0
+ GetCargoIncome(10, 10): 4
+ GetCargoIncome(100, 10): 40
+ GetCargoIncome(10, 100): 3
+ Cargo 1
+ IsValidCargo(): true
+ GetCargoLabel(): 'COAL'
+ IsFreight(): true
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): 0
+ GetCargoIncome(10, 10): 7
+ GetCargoIncome(100, 10): 75
+ GetCargoIncome(10, 100): 6
+ Cargo 2
+ IsValidCargo(): true
+ GetCargoLabel(): 'MAIL'
+ IsFreight(): false
+ HasCargoClass(): false
+ GetTownEffect(): 2
+ GetCargoIncome(0, 0): 0
+ GetCargoIncome(10, 10): 5
+ GetCargoIncome(100, 10): 58
+ GetCargoIncome(10, 100): 5
+ Cargo 3
+ IsValidCargo(): true
+ GetCargoLabel(): 'OIL_'
+ IsFreight(): true
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): 0
+ GetCargoIncome(10, 10): 5
+ GetCargoIncome(100, 10): 56
+ GetCargoIncome(10, 100): 5
+ Cargo 4
+ IsValidCargo(): true
+ GetCargoLabel(): 'LVST'
+ IsFreight(): true
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): 0
+ GetCargoIncome(10, 10): 5
+ GetCargoIncome(100, 10): 55
+ GetCargoIncome(10, 100): 4
+ Cargo 5
+ IsValidCargo(): true
+ GetCargoLabel(): 'GOOD'
+ IsFreight(): true
+ HasCargoClass(): false
+ GetTownEffect(): 3
+ GetCargoIncome(0, 0): 0
+ GetCargoIncome(10, 10): 7
+ GetCargoIncome(100, 10): 78
+ GetCargoIncome(10, 100): 6
+ Cargo 6
+ IsValidCargo(): true
+ GetCargoLabel(): 'GRAI'
+ IsFreight(): true
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): 0
+ GetCargoIncome(10, 10): 6
+ GetCargoIncome(100, 10): 60
+ GetCargoIncome(10, 100): 5
+ Cargo 7
+ IsValidCargo(): true
+ GetCargoLabel(): 'WOOD'
+ IsFreight(): true
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): 0
+ GetCargoIncome(10, 10): 6
+ GetCargoIncome(100, 10): 63
+ GetCargoIncome(10, 100): 5
+ Cargo 8
+ IsValidCargo(): true
+ GetCargoLabel(): 'IORE'
+ IsFreight(): true
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): 0
+ GetCargoIncome(10, 10): 6
+ GetCargoIncome(100, 10): 65
+ GetCargoIncome(10, 100): 5
+ Cargo 9
+ IsValidCargo(): true
+ GetCargoLabel(): 'STEL'
+ IsFreight(): true
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): 0
+ GetCargoIncome(10, 10): 7
+ GetCargoIncome(100, 10): 72
+ GetCargoIncome(10, 100): 6
+ Cargo 10
+ IsValidCargo(): true
+ GetCargoLabel(): 'VALU'
+ IsFreight(): true
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): 0
+ GetCargoIncome(10, 10): 9
+ GetCargoIncome(100, 10): 94
+ GetCargoIncome(10, 100): 7
+ Cargo 11
+ IsValidCargo(): false
+ GetCargoLabel(): '(null : 0x00000000)'
+ IsFreight(): false
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): -1
+ GetCargoIncome(10, 10): -1
+ GetCargoIncome(100, 10): -1
+ GetCargoIncome(10, 100): -1
+ Cargo 12
+ IsValidCargo(): false
+ GetCargoLabel(): '(null : 0x00000000)'
+ IsFreight(): false
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): -1
+ GetCargoIncome(10, 10): -1
+ GetCargoIncome(100, 10): -1
+ GetCargoIncome(10, 100): -1
+ Cargo 13
+ IsValidCargo(): false
+ GetCargoLabel(): '(null : 0x00000000)'
+ IsFreight(): false
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): -1
+ GetCargoIncome(10, 10): -1
+ GetCargoIncome(100, 10): -1
+ GetCargoIncome(10, 100): -1
+ Cargo 14
+ IsValidCargo(): false
+ GetCargoLabel(): '(null : 0x00000000)'
+ IsFreight(): false
+ HasCargoClass(): false
+ GetTownEffect(): 0
+ GetCargoIncome(0, 0): -1
+ GetCargoIncome(10, 10): -1
+ GetCargoIncome(100, 10): -1
+ GetCargoIncome(10, 100): -1
+
+--CargoList--
+ Count(): 11
+ IsFreight ListDump:
+ 10 => 1
+ 9 => 1
+ 8 => 1
+ 7 => 1
+ 6 => 1
+ 5 => 1
+ 4 => 1
+ 3 => 1
+ 1 => 1
+ 2 => 0
+ 0 => 0
+ CargoIncomes(100, 100) ListDump:
+ 10 => 78
+ 5 => 65
+ 1 => 65
+ 9 => 63
+ 8 => 57
+ 7 => 57
+ 3 => 53
+ 2 => 53
+ 6 => 52
+ 4 => 43
+ 0 => 31
+
+--CargoList_IndustryAccepting--
+ Count(): 1
+ ListDump:
+ 7
+
+--CargoList_IndustryProducing--
+ Count(): 1
+ ListDump:
+ 7
+
+--Company--
+ SetName(): true
+ SetName(): true
+ SetName(): true
+ SetName(): false
+ GetLastErrorString(): ERR_NAME_IS_NOT_UNIQUE
+ GetName(): Regression
+ GetPresidentName(): K. O'Donnell
+ SetPresidentName(): true
+ GetPresidentName(): Regression AI
+ GetCompanyValue(): 355454
+ GetBankBalance(): 455204
+ GetName(): (null : 0x00000000)
+ GetLoanAmount(): 100000
+ GetMaxLoanAmount(): 300000
+ GetLoanInterval(): 10000
+ SetLoanAmount(1): false
+ SetLoanAmount(100): false
+ SetLoanAmount(10000): true
+ GetLastErrorString(): ERR_NONE
+ GetBankBalance(): 365204
+ GetLoanAmount(): 10000
+ SetMinimumLoanAmount(31337): true
+ GetBankBalance(): 395204
+ GetLoanAmount(): 40000
+ SetLoanAmount(10000): true
+ GetBankBalance(): 655204
+ GetLoanAmount(): 300000
+ GetCompanyHQ(): -1
+ BuildCompanyHQ(): true
+ GetCompanyHQ(): 33151
+ BuildCompanyHQ(): true
+ GetCompanyHQ(): 33153
+ BuildCompanyHQ(): false
+ GetLastErrorString(): ERR_AREA_NOT_CLEAR
+ GetAutoRenewStatus(); false
+ SetAutoRenewStatus(true); true
+ GetAutoRenewStatus(); true
+ SetAutoRenewStatus(true); false
+ SetAutoRenewStatus(false); true
+ GetAutoRenewMonths(); -6
+ SetAutoRenewMonths(-12); true
+ GetAutoRenewMonths(); -12
+ SetAutoRenewMonths(-12); false
+ SetAutoRenewMonths(6); true
+ GetAutoRenewMoney(); 100000
+ SetAutoRenewMoney(200000); true
+ GetAutoRenewMoney(); 200000
+ SetAutoRenewMoney(200000); false
+ SetAutoRenewMoney(100000); true
+
+--Engine--
+ Engine -1
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 0
+ IsValidEngine(): true
+ GetName(): Kirby Paul Tank (Steam)
+ GetCargoType(): 0
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): 74
+ GetMaxSpeed(): 64
+ GetPrice(): 22
+ GetMaxAge(): 5490
+ GetRunningCost(): 7
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 1
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 2
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 3
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 4
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 5
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 6
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 7
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 8
+ IsValidEngine(): true
+ GetName(): Chaney 'Jubilee' (Steam)
+ GetCargoType(): 0
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): 79
+ GetMaxSpeed(): 112
+ GetPrice(): 41
+ GetMaxAge(): 7686
+ GetRunningCost(): 18
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 9
+ IsValidEngine(): true
+ GetName(): Ginzu 'A4' (Steam)
+ GetCargoType(): 0
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): 83
+ GetMaxSpeed(): 128
+ GetPrice(): 61
+ GetMaxAge(): 7320
+ GetRunningCost(): 21
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 10
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 11
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 12
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 13
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 14
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 15
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 16
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 17
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 18
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 19
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 20
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 21
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 22
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 23
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 24
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 25
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 26
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 27
+ IsValidEngine(): true
+ GetName(): Passenger Carriage
+ GetCargoType(): 0
+ CanRefitCargo(): false
+ GetCapacity(): 40
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 795
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 28
+ IsValidEngine(): true
+ GetName(): Mail Van
+ GetCargoType(): 2
+ CanRefitCargo(): false
+ GetCapacity(): 30
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 733
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 29
+ IsValidEngine(): true
+ GetName(): Coal Truck
+ GetCargoType(): 1
+ CanRefitCargo(): true
+ GetCapacity(): 30
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 566
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 30
+ IsValidEngine(): true
+ GetName(): Oil Tanker
+ GetCargoType(): 3
+ CanRefitCargo(): false
+ GetCapacity(): 30
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 643
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 31
+ IsValidEngine(): true
+ GetName(): Livestock Van
+ GetCargoType(): 4
+ CanRefitCargo(): false
+ GetCapacity(): 25
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 618
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 32
+ IsValidEngine(): true
+ GetName(): Goods Van
+ GetCargoType(): 5
+ CanRefitCargo(): false
+ GetCapacity(): 25
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 611
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 33
+ IsValidEngine(): true
+ GetName(): Grain Hopper
+ GetCargoType(): 6
+ CanRefitCargo(): false
+ GetCapacity(): 30
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 585
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 34
+ IsValidEngine(): true
+ GetName(): Wood Truck
+ GetCargoType(): 7
+ CanRefitCargo(): false
+ GetCapacity(): 30
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 582
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 35
+ IsValidEngine(): true
+ GetName(): Iron Ore Hopper
+ GetCargoType(): 8
+ CanRefitCargo(): false
+ GetCapacity(): 30
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 576
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 36
+ IsValidEngine(): true
+ GetName(): Steel Truck
+ GetCargoType(): 9
+ CanRefitCargo(): false
+ GetCapacity(): 20
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 630
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 37
+ IsValidEngine(): true
+ GetName(): Armoured Van
+ GetCargoType(): 10
+ CanRefitCargo(): false
+ GetCapacity(): 20
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 820
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 0
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 38
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 39
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 40
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 41
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 42
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 43
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 44
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 45
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 46
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 47
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 48
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 49
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 50
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 51
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 52
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 53
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 54
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 55
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 56
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 57
+ IsValidEngine(): true
+ GetName(): Passenger Carriage
+ GetCargoType(): 0
+ CanRefitCargo(): false
+ GetCapacity(): 45
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 795
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 2
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 58
+ IsValidEngine(): true
+ GetName(): Mail Van
+ GetCargoType(): 2
+ CanRefitCargo(): false
+ GetCapacity(): 35
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 733
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 2
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 59
+ IsValidEngine(): true
+ GetName(): Coal Truck
+ GetCargoType(): 1
+ CanRefitCargo(): true
+ GetCapacity(): 35
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 566
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 2
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 60
+ IsValidEngine(): true
+ GetName(): Oil Tanker
+ GetCargoType(): 3
+ CanRefitCargo(): false
+ GetCapacity(): 35
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 643
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 2
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 61
+ IsValidEngine(): true
+ GetName(): Livestock Van
+ GetCargoType(): 4
+ CanRefitCargo(): false
+ GetCapacity(): 30
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 618
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 2
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 62
+ IsValidEngine(): true
+ GetName(): Goods Van
+ GetCargoType(): 5
+ CanRefitCargo(): false
+ GetCapacity(): 30
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 611
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 2
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 63
+ IsValidEngine(): true
+ GetName(): Grain Hopper
+ GetCargoType(): 6
+ CanRefitCargo(): false
+ GetCapacity(): 35
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 585
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 2
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 64
+ IsValidEngine(): true
+ GetName(): Wood Truck
+ GetCargoType(): 7
+ CanRefitCargo(): false
+ GetCapacity(): 35
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 582
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 2
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 65
+ IsValidEngine(): true
+ GetName(): Iron Ore Hopper
+ GetCargoType(): 8
+ CanRefitCargo(): false
+ GetCapacity(): 35
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 576
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 2
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 66
+ IsValidEngine(): true
+ GetName(): Steel Truck
+ GetCargoType(): 9
+ CanRefitCargo(): false
+ GetCapacity(): 25
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 630
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 2
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 67
+ IsValidEngine(): true
+ GetName(): Armoured Van
+ GetCargoType(): 10
+ CanRefitCargo(): false
+ GetCapacity(): 25
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 820
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 2
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 68
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 69
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 70
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 71
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 72
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 73
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 74
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 75
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 76
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 77
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 78
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 79
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 80
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 81
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 82
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 83
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 84
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 85
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 86
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 87
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 88
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 89
+ IsValidEngine(): true
+ GetName(): Passenger Carriage
+ GetCargoType(): 0
+ CanRefitCargo(): false
+ GetCapacity(): 47
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 795
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 3
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 90
+ IsValidEngine(): true
+ GetName(): Mail Van
+ GetCargoType(): 2
+ CanRefitCargo(): false
+ GetCapacity(): 37
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 733
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 3
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 91
+ IsValidEngine(): true
+ GetName(): Coal Truck
+ GetCargoType(): 1
+ CanRefitCargo(): true
+ GetCapacity(): 37
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 566
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 3
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 92
+ IsValidEngine(): true
+ GetName(): Oil Tanker
+ GetCargoType(): 3
+ CanRefitCargo(): false
+ GetCapacity(): 37
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 643
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 3
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 93
+ IsValidEngine(): true
+ GetName(): Livestock Van
+ GetCargoType(): 4
+ CanRefitCargo(): false
+ GetCapacity(): 32
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 618
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 3
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 94
+ IsValidEngine(): true
+ GetName(): Goods Van
+ GetCargoType(): 5
+ CanRefitCargo(): false
+ GetCapacity(): 32
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 611
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 3
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 95
+ IsValidEngine(): true
+ GetName(): Grain Hopper
+ GetCargoType(): 6
+ CanRefitCargo(): false
+ GetCapacity(): 37
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 585
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 3
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 96
+ IsValidEngine(): true
+ GetName(): Wood Truck
+ GetCargoType(): 7
+ CanRefitCargo(): false
+ GetCapacity(): 37
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 582
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 3
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 97
+ IsValidEngine(): true
+ GetName(): Iron Ore Hopper
+ GetCargoType(): 8
+ CanRefitCargo(): false
+ GetCapacity(): 37
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 576
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 3
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 98
+ IsValidEngine(): true
+ GetName(): Steel Truck
+ GetCargoType(): 9
+ CanRefitCargo(): false
+ GetCapacity(): 27
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 630
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 3
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 99
+ IsValidEngine(): true
+ GetName(): Armoured Van
+ GetCargoType(): 10
+ CanRefitCargo(): false
+ GetCapacity(): 27
+ GetReliability(): 0
+ GetMaxSpeed(): 0
+ GetPrice(): 820
+ GetMaxAge(): 7320
+ GetRunningCost(): 0
+ GetVehicleType(): 0
+ GetRailType(): 3
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 100
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 101
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 102
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 103
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 104
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 105
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 106
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 107
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 108
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 109
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 110
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 111
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 112
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 113
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 114
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 115
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 116
+ IsValidEngine(): true
+ GetName(): MPS Regal Bus
+ GetCargoType(): 0
+ CanRefitCargo(): false
+ GetCapacity(): 31
+ GetReliability(): 78
+ GetMaxSpeed(): 56
+ GetPrice(): 386
+ GetMaxAge(): 4392
+ GetRunningCost(): 14
+ GetVehicleType(): 1
+ GetRailType(): 255
+ GetRoadType(): 0
+ GetPlaneType(): -1
+ Engine 117
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 118
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 119
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 120
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 121
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 122
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 123
+ IsValidEngine(): true
+ GetName(): Balogh Coal Truck
+ GetCargoType(): 1
+ CanRefitCargo(): true
+ GetCapacity(): 20
+ GetReliability(): 76
+ GetMaxSpeed(): 48
+ GetPrice(): 347
+ GetMaxAge(): 5490
+ GetRunningCost(): 14
+ GetVehicleType(): 1
+ GetRailType(): 255
+ GetRoadType(): 0
+ GetPlaneType(): -1
+ Engine 124
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 125
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 126
+ IsValidEngine(): true
+ GetName(): MPS Mail Truck
+ GetCargoType(): 2
+ CanRefitCargo(): false
+ GetCapacity(): 22
+ GetReliability(): 91
+ GetMaxSpeed(): 48
+ GetPrice(): 370
+ GetMaxAge(): 5490
+ GetRunningCost(): 14
+ GetVehicleType(): 1
+ GetRailType(): 255
+ GetRoadType(): 0
+ GetPlaneType(): -1
+ Engine 127
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 128
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 129
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 130
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 131
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 132
+ IsValidEngine(): true
+ GetName(): Witcombe Oil Tanker
+ GetCargoType(): 3
+ CanRefitCargo(): false
+ GetCapacity(): 21
+ GetReliability(): 97
+ GetMaxSpeed(): 48
+ GetPrice(): 354
+ GetMaxAge(): 5490
+ GetRunningCost(): 14
+ GetVehicleType(): 1
+ GetRailType(): 255
+ GetRoadType(): 0
+ GetPlaneType(): -1
+ Engine 133
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 134
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 135
+ IsValidEngine(): true
+ GetName(): Talbott Livestock Van
+ GetCargoType(): 4
+ CanRefitCargo(): false
+ GetCapacity(): 14
+ GetReliability(): 96
+ GetMaxSpeed(): 48
+ GetPrice(): 337
+ GetMaxAge(): 5490
+ GetRunningCost(): 14
+ GetVehicleType(): 1
+ GetRailType(): 255
+ GetRoadType(): 0
+ GetPlaneType(): -1
+ Engine 136
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 137
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 138
+ IsValidEngine(): true
+ GetName(): Balogh Goods Truck
+ GetCargoType(): 5
+ CanRefitCargo(): false
+ GetCapacity(): 14
+ GetReliability(): 86
+ GetMaxSpeed(): 48
+ GetPrice(): 344
+ GetMaxAge(): 5490
+ GetRunningCost(): 14
+ GetVehicleType(): 1
+ GetRailType(): 255
+ GetRoadType(): 0
+ GetPlaneType(): -1
+ Engine 139
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 140
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 141
+ IsValidEngine(): true
+ GetName(): Hereford Grain Truck
+ GetCargoType(): 6
+ CanRefitCargo(): false
+ GetCapacity(): 20
+ GetReliability(): 96
+ GetMaxSpeed(): 48
+ GetPrice(): 366
+ GetMaxAge(): 5490
+ GetRunningCost(): 14
+ GetVehicleType(): 1
+ GetRailType(): 255
+ GetRoadType(): 0
+ GetPlaneType(): -1
+ Engine 142
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 143
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 144
+ IsValidEngine(): true
+ GetName(): Witcombe Wood Truck
+ GetCargoType(): 7
+ CanRefitCargo(): false
+ GetCapacity(): 20
+ GetReliability(): 97
+ GetMaxSpeed(): 48
+ GetPrice(): 379
+ GetMaxAge(): 5490
+ GetRunningCost(): 14
+ GetVehicleType(): 1
+ GetRailType(): 255
+ GetRoadType(): 0
+ GetPlaneType(): -1
+ Engine 145
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 146
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 147
+ IsValidEngine(): true
+ GetName(): MPS Iron Ore Truck
+ GetCargoType(): 8
+ CanRefitCargo(): false
+ GetCapacity(): 22
+ GetReliability(): 96
+ GetMaxSpeed(): 48
+ GetPrice(): 389
+ GetMaxAge(): 5490
+ GetRunningCost(): 14
+ GetVehicleType(): 1
+ GetRailType(): 255
+ GetRoadType(): 0
+ GetPlaneType(): -1
+ Engine 148
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 149
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 150
+ IsValidEngine(): true
+ GetName(): Balogh Steel Truck
+ GetCargoType(): 9
+ CanRefitCargo(): false
+ GetCapacity(): 15
+ GetReliability(): 81
+ GetMaxSpeed(): 48
+ GetPrice(): 360
+ GetMaxAge(): 5490
+ GetRunningCost(): 14
+ GetVehicleType(): 1
+ GetRailType(): 255
+ GetRoadType(): 0
+ GetPlaneType(): -1
+ Engine 151
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 152
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 153
+ IsValidEngine(): true
+ GetName(): Balogh Armoured Truck
+ GetCargoType(): 10
+ CanRefitCargo(): false
+ GetCapacity(): 12
+ GetReliability(): 75
+ GetMaxSpeed(): 48
+ GetPrice(): 466
+ GetMaxAge(): 5490
+ GetRunningCost(): 14
+ GetVehicleType(): 1
+ GetRailType(): 255
+ GetRoadType(): 0
+ GetPlaneType(): -1
+ Engine 154
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 155
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 156
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 157
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 158
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 159
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 160
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 161
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 162
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 163
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 164
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 165
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 166
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 167
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 168
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 169
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 170
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 171
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 172
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 173
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 174
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 175
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 176
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 177
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 178
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 179
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 180
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 181
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 182
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 183
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 184
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 185
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 186
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 187
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 188
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 189
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 190
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 191
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 192
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 193
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 194
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 195
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 196
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 197
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 198
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 199
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 200
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 201
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 202
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 203
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 204
+ IsValidEngine(): true
+ GetName(): MPS Oil Tanker
+ GetCargoType(): 3
+ CanRefitCargo(): false
+ GetCapacity(): 220
+ GetReliability(): 98
+ GetMaxSpeed(): 24
+ GetPrice(): 515
+ GetMaxAge(): 10980
+ GetRunningCost(): 21
+ GetVehicleType(): 2
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 205
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 206
+ IsValidEngine(): true
+ GetName(): MPS Passenger Ferry
+ GetCargoType(): 0
+ CanRefitCargo(): false
+ GetCapacity(): 100
+ GetReliability(): 87
+ GetMaxSpeed(): 32
+ GetPrice(): 309
+ GetMaxAge(): 10980
+ GetRunningCost(): 14
+ GetVehicleType(): 2
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 207
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 208
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 209
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 210
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 211
+ IsValidEngine(): true
+ GetName(): Yate Cargo ship
+ GetCargoType(): 5
+ CanRefitCargo(): true
+ GetCapacity(): 160
+ GetReliability(): 81
+ GetMaxSpeed(): 24
+ GetPrice(): 412
+ GetMaxAge(): 10980
+ GetRunningCost(): 23
+ GetVehicleType(): 2
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 212
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 213
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 214
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 215
+ IsValidEngine(): true
+ GetName(): Sampson U52
+ GetCargoType(): 0
+ CanRefitCargo(): false
+ GetCapacity(): 25
+ GetReliability(): 58
+ GetMaxSpeed(): 238
+ GetPrice(): 45
+ GetMaxAge(): 7320
+ GetRunningCost(): 13
+ GetVehicleType(): 3
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): 1
+ Engine 216
+ IsValidEngine(): true
+ GetName(): Coleman Count
+ GetCargoType(): 0
+ CanRefitCargo(): false
+ GetCapacity(): 65
+ GetReliability(): 95
+ GetMaxSpeed(): 238
+ GetPrice(): 48
+ GetMaxAge(): 8784
+ GetRunningCost(): 15
+ GetVehicleType(): 3
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): 1
+ Engine 217
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 218
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 219
+ IsValidEngine(): true
+ GetName(): Bakewell Cotswald LB-3
+ GetCargoType(): 0
+ CanRefitCargo(): false
+ GetCapacity(): 30
+ GetReliability(): 76
+ GetMaxSpeed(): 238
+ GetPrice(): 48
+ GetMaxAge(): 10980
+ GetRunningCost(): 15
+ GetVehicleType(): 3
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): 1
+ Engine 220
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 221
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 222
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 223
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 224
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 225
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 226
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 227
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 228
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 229
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 230
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 231
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 232
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 233
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 234
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 235
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 236
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 237
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 238
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 239
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 240
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 241
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 242
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 243
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 244
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 245
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 246
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 247
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 248
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 249
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 250
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 251
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 252
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 253
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 254
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 255
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Engine 256
+ IsValidEngine(): false
+ GetName(): (null : 0x00000000)
+ GetCargoType(): 255
+ CanRefitCargo(): false
+ GetCapacity(): -1
+ GetReliability(): -1
+ GetMaxSpeed(): -1
+ GetPrice(): -1
+ GetMaxAge(): -1
+ GetRunningCost(): -1
+ GetVehicleType(): 255
+ GetRailType(): 255
+ GetRoadType(): -1
+ GetPlaneType(): -1
+ Valid Engines: 53
+
+--EngineList--
+ Count(): 11
+ CargoType ListDump:
+ 153 => 10
+ 150 => 9
+ 147 => 8
+ 144 => 7
+ 141 => 6
+ 138 => 5
+ 135 => 4
+ 132 => 3
+ 126 => 2
+ 123 => 1
+ 116 => 0
+ Capacity ListDump:
+ 116 => 31
+ 147 => 22
+ 126 => 22
+ 132 => 21
+ 144 => 20
+ 141 => 20
+ 123 => 20
+ 150 => 15
+ 138 => 14
+ 135 => 14
+ 153 => 12
+ Reliability ListDump:
+ 144 => 97
+ 132 => 97
+ 147 => 96
+ 141 => 96
+ 135 => 96
+ 126 => 91
+ 138 => 86
+ 150 => 81
+ 116 => 78
+ 123 => 76
+ 153 => 75
+ MaxSpeed ListDump:
+ 116 => 56
+ 153 => 48
+ 150 => 48
+ 147 => 48
+ 144 => 48
+ 141 => 48
+ 138 => 48
+ 135 => 48
+ 132 => 48
+ 126 => 48
+ 123 => 48
+ Price ListDump:
+ 153 => 466
+ 147 => 389
+ 116 => 386
+ 144 => 379
+ 126 => 370
+ 141 => 366
+ 150 => 360
+ 132 => 354
+ 123 => 347
+ 138 => 344
+ 135 => 337
+--AyStar--
+ Fastest path:
+ Tile 10
+ Tile 9
+ Tile 8
+ Tile 7
+ Tile 6
+ Tile 5
+ Tile 4
+ Tile 3
+ Tile 2
+ Tile 1
+
+--Group--
+ SetAutoReplace(): false
+ GetEngineReplacement(): 65535
+ GetNumEngines(): 0
+ AIRoad.BuildRoadDepot(): true
+ AIVehicle.BuildVehicle(): 12
+ GetNumEngines(): 1
+ CreateGroup(): 0
+ MoveVehicle(): true
+ GetNumEngines(): 1
+ GetNumEngines(): 1
+ GetNumEngines(): 0
+ GetName(): Group 0
+ GetName(): (null : 0x00000000)
+ AIVehicle.SellVehicle(): true
+ AITile.DemolishTile(): true
+ HasWagonRemoval(): false
+ EnableWagonRemoval(): true
+ HasWagonRemoval(): true
+ EnableWagonRemoval(): true
+ EnableWagonRemoval(): true
+ HasWagonRemoval(): false
+
+--Industry--
+ GetMaxIndustryID(): 71
+ GetIndustryCount(): 71
+ Industry -1
+ IsValidIndustry(): false
+ GetName(): (null : 0x00000000)
+ GetLocation(): -1
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 0
+ IsValidIndustry(): true
+ GetName(): Kennville Oil Refinery
+ GetLocation(): 19695
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 1
+ IsValidIndustry(): true
+ GetName(): Sadtown Forest
+ GetLocation(): 45122
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 72
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 2
+ IsValidIndustry(): true
+ GetName(): Fudinghattan Forest
+ GetLocation(): 41929
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 72
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 3
+ IsValidIndustry(): true
+ GetName(): Benville Forest
+ GetLocation(): 44640
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 80
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 4
+ IsValidIndustry(): true
+ GetName(): Netfingbridge Forest
+ GetLocation(): 8793
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 135
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 5
+ IsValidIndustry(): true
+ GetName(): Hutfingford Forest
+ GetLocation(): 55429
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 99
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 6
+ IsValidIndustry(): true
+ GetName(): Great Hinninghall Forest
+ GetLocation(): 6533
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 72
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 7
+ IsValidIndustry(): true
+ GetName(): Tondston Forest
+ GetLocation(): 27609
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 117
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 8
+ IsValidIndustry(): true
+ GetName(): Planfield Sawmill
+ GetLocation(): 17318
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 9
+ IsValidIndustry(): true
+ GetName(): Hutfingford Sawmill
+ GetLocation(): 60050
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 10
+ IsValidIndustry(): true
+ GetName(): Naborough Sawmill
+ GetLocation(): 54184
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 11
+ IsValidIndustry(): true
+ GetName(): Prundinghall Sawmill
+ GetLocation(): 48499
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 12
+ IsValidIndustry(): true
+ GetName(): Fraston Sawmill
+ GetLocation(): 51419
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 13
+ IsValidIndustry(): true
+ GetName(): Fort Frindston Sawmill
+ GetLocation(): 15950
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 14
+ IsValidIndustry(): true
+ GetName(): Grinnway Sawmill
+ GetLocation(): 20001
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 15
+ IsValidIndustry(): true
+ GetName(): Trenningville Coal Mine
+ GetLocation(): 51854
+ GetProduction(): 104
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 117
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 16
+ IsValidIndustry(): true
+ GetName(): Kennville Coal Mine
+ GetLocation(): 11734
+ GetProduction(): 96
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 99
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 17
+ IsValidIndustry(): true
+ GetName(): Great Hinninghall Coal Mine
+ GetLocation(): 13947
+ GetProduction(): 152
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 152
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 18
+ IsValidIndustry(): true
+ GetName(): Little Fruford Coal Mine
+ GetLocation(): 23682
+ GetProduction(): 112
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 126
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 19
+ IsValidIndustry(): true
+ GetName(): Hutfingford Coal Mine
+ GetLocation(): 57429
+ GetProduction(): 88
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 88
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 20
+ IsValidIndustry(): true
+ GetName(): Mendingston Coal Mine
+ GetLocation(): 8562
+ GetProduction(): 152
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 171
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 21
+ IsValidIndustry(): true
+ GetName(): Tondston Coal Mine
+ GetLocation(): 29147
+ GetProduction(): 104
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 117
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 22
+ IsValidIndustry(): true
+ GetName(): Quartfingfield Coal Mine
+ GetLocation(): 27822
+ GetProduction(): 136
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 136
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 23
+ IsValidIndustry(): true
+ GetName(): Muningville Coal Mine
+ GetLocation(): 43035
+ GetProduction(): 80
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 90
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 24
+ IsValidIndustry(): true
+ GetName(): Grinnway Coal Mine
+ GetLocation(): 17943
+ GetProduction(): 32
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 32
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 25
+ IsValidIndustry(): true
+ GetName(): Sadtown Power Station
+ GetLocation(): 48182
+ GetProduction(): -1
+ IsCargoAccepted(): true
+ Industry 26
+ IsValidIndustry(): true
+ GetName(): Tunford Power Station
+ GetLocation(): 33934
+ GetProduction(): -1
+ IsCargoAccepted(): true
+ Industry 27
+ IsValidIndustry(): true
+ GetName(): Quartfingfield Power Station
+ GetLocation(): 23714
+ GetProduction(): -1
+ IsCargoAccepted(): true
+ Industry 28
+ IsValidIndustry(): true
+ GetName(): Kennville Power Station
+ GetLocation(): 20170
+ GetProduction(): -1
+ IsCargoAccepted(): true
+ Industry 29
+ IsValidIndustry(): true
+ GetName(): Nuntfingburg Power Station
+ GetLocation(): 6685
+ GetProduction(): -1
+ IsCargoAccepted(): true
+ Industry 30
+ IsValidIndustry(): true
+ GetName(): Bedburg Power Station
+ GetLocation(): 29022
+ GetProduction(): -1
+ IsCargoAccepted(): true
+ Industry 31
+ IsValidIndustry(): true
+ GetName(): Benville Power Station
+ GetLocation(): 44160
+ GetProduction(): -1
+ IsCargoAccepted(): true
+ Industry 32
+ IsValidIndustry(): true
+ GetName(): Fort Frindston Oil Wells
+ GetLocation(): 14701
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 108
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 33
+ IsValidIndustry(): true
+ GetName(): Nuntfingburg Oil Wells
+ GetLocation(): 5659
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 50
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 34
+ IsValidIndustry(): true
+ GetName(): Benville Oil Wells
+ GetLocation(): 36728
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 72
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 35
+ IsValidIndustry(): true
+ GetName(): Grinnway Oil Wells
+ GetLocation(): 14361
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 56
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 36
+ IsValidIndustry(): true
+ GetName(): Muningville Oil Wells
+ GetLocation(): 36908
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 64
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 37
+ IsValidIndustry(): true
+ GetName(): Tondston Oil Wells
+ GetLocation(): 34237
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 96
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 38
+ IsValidIndustry(): true
+ GetName(): Fort Frindston Iron Ore Mine
+ GetLocation(): 17742
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 108
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 39
+ IsValidIndustry(): true
+ GetName(): Tondston Iron Ore Mine
+ GetLocation(): 25545
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 24
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 40
+ IsValidIndustry(): true
+ GetName(): Fudinghattan Iron Ore Mine
+ GetLocation(): 47838
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 64
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 41
+ IsValidIndustry(): true
+ GetName(): Nuntfingburg Iron Ore Mine
+ GetLocation(): 8763
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 72
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 42
+ IsValidIndustry(): true
+ GetName(): Lardborough Iron Ore Mine
+ GetLocation(): 60866
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 72
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 43
+ IsValidIndustry(): true
+ GetName(): Tunford Iron Ore Mine
+ GetLocation(): 41155
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 96
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 44
+ IsValidIndustry(): true
+ GetName(): Chentfingbourne Iron Ore Mine
+ GetLocation(): 19529
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 120
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 45
+ IsValidIndustry(): true
+ GetName(): Naborough Farm
+ GetLocation(): 52931
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 81
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ GetLastMonthProduction(): 81
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 46
+ IsValidIndustry(): true
+ GetName(): Lardborough Farm
+ GetLocation(): 59604
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 72
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ GetLastMonthProduction(): 40
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 47
+ IsValidIndustry(): true
+ GetName(): Chentfingbourne Farm
+ GetLocation(): 24366
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 56
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ GetLastMonthProduction(): 24
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 48
+ IsValidIndustry(): true
+ GetName(): Wrundtown Farm
+ GetLocation(): 36847
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 72
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ GetLastMonthProduction(): 126
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 49
+ IsValidIndustry(): true
+ GetName(): Little Fruford Farm
+ GetLocation(): 28287
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 90
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ GetLastMonthProduction(): 40
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 50
+ IsValidIndustry(): true
+ GetName(): Hutfingford Farm
+ GetLocation(): 57432
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 117
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ GetLastMonthProduction(): 90
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 51
+ IsValidIndustry(): true
+ GetName(): Tondston Farm
+ GetLocation(): 23519
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 72
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ GetLastMonthProduction(): 48
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 52
+ IsValidIndustry(): true
+ GetName(): Nuntfingburg Farm
+ GetLocation(): 10773
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 126
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ GetLastMonthProduction(): 63
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 53
+ IsValidIndustry(): true
+ GetName(): Sadtown Farm
+ GetLocation(): 48206
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 50
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ GetLastMonthProduction(): 50
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 54
+ IsValidIndustry(): true
+ GetName(): Quartfingfield Farm
+ GetLocation(): 24005
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ GetLastMonthProduction(): 64
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ GetLastMonthProduction(): 72
+ GetLastMonthTransported(): 0
+ GetStockpiledCargo(): -1
+ Industry 55
+ IsValidIndustry(): true
+ GetName(): Little Fruford Steel Mill
+ GetLocation(): 21107
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 56
+ IsValidIndustry(): true
+ GetName(): Quartfingfield Steel Mill
+ GetLocation(): 23727
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 57
+ IsValidIndustry(): true
+ GetName(): Bedburg Steel Mill
+ GetLocation(): 41813
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 58
+ IsValidIndustry(): true
+ GetName(): Franinghead Steel Mill
+ GetLocation(): 8852
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 59
+ IsValidIndustry(): true
+ GetName(): Lardborough Steel Mill
+ GetLocation(): 59867
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 60
+ IsValidIndustry(): true
+ GetName(): Sadtown Steel Mill
+ GetLocation(): 55360
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 61
+ IsValidIndustry(): true
+ GetName(): Fraston Steel Mill
+ GetLocation(): 52953
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 62
+ IsValidIndustry(): true
+ GetName(): Chentfingbourne Factory
+ GetLocation(): 24893
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 63
+ IsValidIndustry(): true
+ GetName(): Fort Frindston Factory
+ GetLocation(): 20819
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 64
+ IsValidIndustry(): true
+ GetName(): Fudinghattan Factory
+ GetLocation(): 46278
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 65
+ IsValidIndustry(): true
+ GetName(): Prundinghall Factory
+ GetLocation(): 53096
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 66
+ IsValidIndustry(): true
+ GetName(): Kennville Factory
+ GetLocation(): 14818
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 67
+ IsValidIndustry(): true
+ GetName(): Muningville Factory
+ GetLocation(): 34375
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 68
+ IsValidIndustry(): true
+ GetName(): Trenningville Factory
+ GetLocation(): 44181
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 69
+ IsValidIndustry(): true
+ GetName(): Wrundtown Oil Refinery
+ GetLocation(): 39663
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Industry 70
+ IsValidIndustry(): true
+ GetName(): Mendingston Power Station
+ GetLocation(): 6498
+ GetProduction(): -1
+ IsCargoAccepted(): true
+ Industry 71
+ IsValidIndustry(): false
+ GetName(): (null : 0x00000000)
+ GetLocation(): -1
+ GetProduction(): -1
+ IsCargoAccepted(): false
+ Valid Industries: 71
+ GetIndustryCount(): 71
+
+--IndustryList--
+ Count(): 71
+ Location ListDump:
+ 42 => 60866
+ 9 => 60050
+ 59 => 59867
+ 46 => 59604
+ 50 => 57432
+ 19 => 57429
+ 5 => 55429
+ 60 => 55360
+ 10 => 54184
+ 65 => 53096
+ 61 => 52953
+ 45 => 52931
+ 15 => 51854
+ 12 => 51419
+ 11 => 48499
+ 53 => 48206
+ 25 => 48182
+ 40 => 47838
+ 64 => 46278
+ 1 => 45122
+ 3 => 44640
+ 68 => 44181
+ 31 => 44160
+ 23 => 43035
+ 2 => 41929
+ 57 => 41813
+ 43 => 41155
+ 69 => 39663
+ 36 => 36908
+ 48 => 36847
+ 34 => 36728
+ 67 => 34375
+ 37 => 34237
+ 26 => 33934
+ 21 => 29147
+ 30 => 29022
+ 49 => 28287
+ 22 => 27822
+ 7 => 27609
+ 39 => 25545
+ 62 => 24893
+ 47 => 24366
+ 54 => 24005
+ 56 => 23727
+ 27 => 23714
+ 18 => 23682
+ 51 => 23519
+ 55 => 21107
+ 63 => 20819
+ 28 => 20170
+ 14 => 20001
+ 0 => 19695
+ 44 => 19529
+ 24 => 17943
+ 38 => 17742
+ 8 => 17318
+ 13 => 15950
+ 66 => 14818
+ 32 => 14701
+ 35 => 14361
+ 17 => 13947
+ 16 => 11734
+ 52 => 10773
+ 58 => 8852
+ 4 => 8793
+ 41 => 8763
+ 20 => 8562
+ 29 => 6685
+ 6 => 6533
+ 70 => 6498
+ 33 => 5659
+ DistanceManhattanToTile(30000) ListDump:
+ 59 => 287
+ 46 => 279
+ 42 => 266
+ 61 => 258
+ 12 => 254
+ 40 => 243
+ 66 => 238
+ 16 => 238
+ 45 => 236
+ 0 => 232
+ 69 => 228
+ 48 => 217
+ 9 => 215
+ 10 => 214
+ 64 => 213
+ 51 => 201
+ 2 => 199
+ 28 => 193
+ 43 => 190
+ 5 => 184
+ 58 => 183
+ 15 => 179
+ 7 => 179
+ 6 => 177
+ 21 => 175
+ 54 => 173
+ 39 => 171
+ 8 => 168
+ 37 => 157
+ 68 => 156
+ 56 => 152
+ 20 => 150
+ 50 => 147
+ 65 => 146
+ 19 => 144
+ 70 => 142
+ 27 => 139
+ 11 => 139
+ 17 => 138
+ 31 => 135
+ 22 => 135
+ 4 => 124
+ 32 => 121
+ 33 => 116
+ 60 => 115
+ 29 => 110
+ 26 => 109
+ 18 => 107
+ 3 => 105
+ 55 => 102
+ 52 => 102
+ 53 => 101
+ 34 => 98
+ 41 => 94
+ 49 => 86
+ 13 => 85
+ 35 => 84
+ 57 => 83
+ 38 => 78
+ 25 => 77
+ 1 => 77
+ 24 => 72
+ 23 => 72
+ 63 => 71
+ 44 => 66
+ 14 => 54
+ 30 => 50
+ 67 => 40
+ 62 => 33
+ 36 => 31
+ 47 => 24
+ DistanceSquareToTile(30000) ListDump:
+ 59 => 42697
+ 46 => 40121
+ 0 => 38162
+ 69 => 37850
+ 48 => 37157
+ 61 => 36482
+ 12 => 36130
+ 42 => 35716
+ 66 => 35284
+ 40 => 35037
+ 16 => 32740
+ 51 => 31301
+ 45 => 29530
+ 21 => 29257
+ 7 => 28661
+ 64 => 26469
+ 2 => 25525
+ 28 => 25237
+ 39 => 23733
+ 43 => 23458
+ 9 => 23293
+ 10 => 23236
+ 54 => 22777
+ 37 => 20137
+ 5 => 17026
+ 58 => 16889
+ 56 => 16754
+ 8 => 16424
+ 15 => 16061
+ 22 => 15957
+ 6 => 15689
+ 27 => 13621
+ 68 => 13226
+ 50 => 13049
+ 19 => 12818
+ 20 => 11412
+ 65 => 11236
+ 70 => 10964
+ 60 => 10057
+ 11 => 9673
+ 17 => 9594
+ 33 => 9466
+ 31 => 9425
+ 26 => 9061
+ 29 => 8642
+ 4 => 8570
+ 18 => 7349
+ 32 => 7321
+ 41 => 7010
+ 52 => 6354
+ 49 => 6290
+ 53 => 5941
+ 34 => 5860
+ 55 => 5714
+ 3 => 5553
+ 25 => 5077
+ 35 => 4250
+ 13 => 3925
+ 1 => 3805
+ 57 => 3485
+ 38 => 3204
+ 23 => 3042
+ 24 => 2834
+ 63 => 2521
+ 44 => 2306
+ 30 => 2132
+ 14 => 1746
+ 67 => 818
+ 36 => 745
+ 62 => 569
+ 47 => 488
+ GetAmountOfStationsAround(30000) ListDump:
+ 70 => 0
+ 69 => 0
+ 68 => 0
+ 67 => 0
+ 66 => 0
+ 65 => 0
+ 64 => 0
+ 63 => 0
+ 62 => 0
+ 61 => 0
+ 60 => 0
+ 59 => 0
+ 58 => 0
+ 57 => 0
+ 56 => 0
+ 55 => 0
+ 54 => 0
+ 53 => 0
+ 52 => 0
+ 51 => 0
+ 50 => 0
+ 49 => 0
+ 48 => 0
+ 47 => 0
+ 46 => 0
+ 45 => 0
+ 44 => 0
+ 43 => 0
+ 42 => 0
+ 41 => 0
+ 40 => 0
+ 39 => 0
+ 38 => 0
+ 37 => 0
+ 36 => 0
+ 35 => 0
+ 34 => 0
+ 33 => 0
+ 32 => 0
+ 31 => 0
+ 30 => 0
+ 29 => 0
+ 28 => 0
+ 27 => 0
+ 26 => 0
+ 25 => 0
+ 24 => 0
+ 23 => 0
+ 22 => 0
+ 21 => 0
+ 20 => 0
+ 19 => 0
+ 18 => 0
+ 17 => 0
+ 16 => 0
+ 15 => 0
+ 14 => 0
+ 13 => 0
+ 12 => 0
+ 11 => 0
+ 10 => 0
+ 9 => 0
+ 8 => 0
+ 7 => 0
+ 6 => 0
+ 5 => 0
+ 4 => 0
+ 3 => 0
+ 2 => 0
+ 1 => 0
+ 0 => 0
+ CargoAccepted(1) ListDump:
+ 70 => 1
+ 31 => 1
+ 30 => 1
+ 29 => 1
+ 28 => 1
+ 27 => 1
+ 26 => 1
+ 25 => 1
+ 69 => 0
+ 68 => 0
+ 67 => 0
+ 66 => 0
+ 65 => 0
+ 64 => 0
+ 63 => 0
+ 62 => 0
+ 61 => 0
+ 60 => 0
+ 59 => 0
+ 58 => 0
+ 57 => 0
+ 56 => 0
+ 55 => 0
+ 54 => 0
+ 53 => 0
+ 52 => 0
+ 51 => 0
+ 50 => 0
+ 49 => 0
+ 48 => 0
+ 47 => 0
+ 46 => 0
+ 45 => 0
+ 44 => 0
+ 43 => 0
+ 42 => 0
+ 41 => 0
+ 40 => 0
+ 39 => 0
+ 38 => 0
+ 37 => 0
+ 36 => 0
+ 35 => 0
+ 34 => 0
+ 33 => 0
+ 32 => 0
+ 24 => 0
+ 23 => 0
+ 22 => 0
+ 21 => 0
+ 20 => 0
+ 19 => 0
+ 18 => 0
+ 17 => 0
+ 16 => 0
+ 15 => 0
+ 14 => 0
+ 13 => 0
+ 12 => 0
+ 11 => 0
+ 10 => 0
+ 9 => 0
+ 8 => 0
+ 7 => 0
+ 6 => 0
+ 5 => 0
+ 4 => 0
+ 3 => 0
+ 2 => 0
+ 1 => 0
+ 0 => 0
+ KeepAboveValue(50): done
+ Count(): 9
+ Production ListDump:
+ 20 => 152
+ 17 => 152
+ 22 => 136
+ 18 => 112
+ 21 => 104
+ 15 => 104
+ 16 => 96
+ 19 => 88
+ 23 => 80
+--IndustryList_CargoAccepting--
+ Count(): 8
+ Location ListDump:
+ 25 => 48182
+ 31 => 44160
+ 26 => 33934
+ 30 => 29022
+ 27 => 23714
+ 28 => 20170
+ 29 => 6685
+ 70 => 6498
+--IndustryList_CargoProducing--
+ Count(): 10
+ Location ListDump:
+ 19 => 57429
+ 15 => 51854
+ 23 => 43035
+ 21 => 29147
+ 22 => 27822
+ 18 => 23682
+ 24 => 17943
+ 17 => 13947
+ 16 => 11734
+ 20 => 8562
+
+--IndustryTypeList--
+ Count(): 12
+ Location ListDump:
+ Id: 9
+ IsRawIndustry(): true
+ ProductionCanIncrease(): true
+ GetConstructionCost(): 823289
+ GetName(): Farm
+ CanBuildIndustry(): false
+ CanProspectIndustry(): false
+ Id: 5
+ IsRawIndustry(): true
+ ProductionCanIncrease(): true
+ GetConstructionCost(): 823289
+ GetName(): Oil Rig
+ CanBuildIndustry(): false
+ CanProspectIndustry(): false
+ Id: 12
+ IsRawIndustry(): false
+ ProductionCanIncrease(): true
+ GetConstructionCost(): 823289
+ GetName(): Bank
+ CanBuildIndustry(): true
+ CanProspectIndustry(): false
+ Id: 11
+ IsRawIndustry(): true
+ ProductionCanIncrease(): false
+ GetConstructionCost(): 823289
+ GetName(): Oil Wells
+ CanBuildIndustry(): false
+ CanProspectIndustry(): false
+ Id: 1
+ IsRawIndustry(): false
+ ProductionCanIncrease(): true
+ GetConstructionCost(): 774860
+ GetName(): Power Station
+ CanBuildIndustry(): true
+ CanProspectIndustry(): false
+ Id: 3
+ IsRawIndustry(): true
+ ProductionCanIncrease(): true
+ GetConstructionCost(): 823289
+ GetName(): Forest
+ CanBuildIndustry(): false
+ CanProspectIndustry(): false
+ Id: 2
+ IsRawIndustry(): false
+ ProductionCanIncrease(): true
+ GetConstructionCost(): 723203
+ GetName(): Sawmill
+ CanBuildIndustry(): true
+ CanProspectIndustry(): false
+ Id: 18
+ IsRawIndustry(): true
+ ProductionCanIncrease(): true
+ GetConstructionCost(): 823289
+ GetName(): Iron Ore Mine
+ CanBuildIndustry(): false
+ CanProspectIndustry(): false
+ Id: 0
+ IsRawIndustry(): true
+ ProductionCanIncrease(): true
+ GetConstructionCost(): 823289
+ GetName(): Coal Mine
+ CanBuildIndustry(): false
+ CanProspectIndustry(): false
+ Id: 8
+ IsRawIndustry(): false
+ ProductionCanIncrease(): true
+ GetConstructionCost(): 694145
+ GetName(): Steel Mill
+ CanBuildIndustry(): true
+ CanProspectIndustry(): false
+ Id: 4
+ IsRawIndustry(): false
+ ProductionCanIncrease(): true
+ GetConstructionCost(): 787774
+ GetName(): Oil Refinery
+ CanBuildIndustry(): true
+ CanProspectIndustry(): false
+ Id: 6
+ IsRawIndustry(): false
+ ProductionCanIncrease(): true
+ GetConstructionCost(): 671545
+ GetName(): Factory
+ CanBuildIndustry(): true
+ CanProspectIndustry(): false
+
+--Map--
+ GetMapSize(): 65536
+ GetMapSizeX(): 256
+ GetMapSizeY(): 256
+ GetTileX(123): 123
+ GetTileY(123): 0
+ GetTileIndex(): 123
+ GetTileIndex(): 31488
+ GetTileIndex(): 0
+ GetTileIndex(): -257
+ GetTileIndex(): 2570000
+ IsValidTile(123): true
+ GetTileX(124): 124
+ GetTileY(124): 0
+ IsValidTile(124): true
+ IsValidTile(0): true
+ IsValidTile(-1): false
+ IsValidTile(): false
+ IsValidTile(): true
+ DemolishTile(): false
+ DemolishTile(): true
+ Distance
+ DistanceManhattan(): 54
+ DistanceMax(): 39
+ DistanceSquare(): 1746
+ DistanceFromEdge(): 16
+
+--AIMarine--
+ IsWaterDepotTile(): false
+ IsDockTile(): false
+ IsBuoyTile(): false
+ IsLockTile(): false
+ IsCanalTile(): false
+ GetBankBalance(): 766678
+ BuildWaterDepot(): true
+ BuildDock(): true
+ BuildBuoy(): true
+ BuildLock(): true
+ HasTransportType(): false
+ BuildCanal(): true
+ HasTransportType(): true
+ IsWaterDepotTile(): true
+ IsDockTile(): true
+ IsBuoyTile(): true
+ IsLockTile(): true
+ IsCanalTile(): true
+ GetBankBalance(): 805921
+ RemoveWaterDepot(): true
+ RemoveDock(): true
+ RemoveBuoy(): true
+ RemoveLock(): true
+ RemoveCanal(): true
+ IsWaterDepotTile(): false
+ IsDockTile(): false
+ IsBuoyTile(): false
+ IsLockTile(): false
+ IsCanalTile(): false
+ GetBankBalance(): 855517
+ BuildWaterDepot(): true
+ BuildDock(): true
+
+--PathFinder--
+ Road Between Towns:
+ Tile 46751
+ Tile 46495
+ Tile 46239
+ Tile 45983
+ Tile 45727
+ Tile 45471
+ Tile 45470
+ Tile 45469
+ Tile 45468
+ Tile 45467
+ Tile 45466
+ Tile 45210
+ Tile 44954
+ Tile 44698
+ Tile 44442
+ Tile 44186
+ Tile 43930
+ Tile 43929
+ Tile 43928
+ Tile 43927
+ Tile 43926
+ Tile 43925
+ Tile 43669
+ Tile 43413
+ Tile 43157
+ Tile 42901
+ Tile 42645
+ Tile 42389
+ Tile 42133
+ Tile 41877
+ Tile 41621
+ Tile 41365
+ Tile 41109
+ Tile 40853
+ Tile 40597
+ Tile 40341
+ Tile 40085
+ Tile 39829
+ Tile 39573
+ Tile 39317
+ Tile 39061
+ Tile 38805
+ Tile 38549
+ Tile 38293
+ Tile 38037
+ Tile 37781
+ Tile 37525
+ Tile 37269
+ Tile 37013
+ Tile 36757
+ Tile 36501
+ Tile 36245
+ Tile 35989
+ Tile 35733
+ Tile 35477
+ Tile 35221
+ Tile 34965
+ Tile 34709
+ Tile 34453
+ Tile 34197
+ Tile 33941
+ Tile 33685
+ Tile 33429
+ Tile 33173
+ Tile 32917
+ Tile 32661
+ Tile 32405
+ Tile 32149
+ Tile 31893
+ Tile 31637
+ Tile 31381
+ Tile 31125
+ Tile 30869
+ Tile 30613
+ Tile 30357
+ Tile 30101
+ Tile 29845
+ Tile 29589
+ Tile 29333
+ Tile 29077
+ Tile 28821
+ Tile 28565
+ Tile 28309
+ Tile 28053
+ Tile 27797
+ Tile 27541
+ Tile 27285
+ Tile 27029
+ Tile 26773
+ Tile 26517
+ Tile 26261
+ Tile 26005
+ Tile 25749
+ Tile 25493
+ Tile 25237
+ Tile 24981
+ Tile 24725
+ Tile 24469
+ Tile 24213
+ Tile 23957
+ Tile 23701
+ Tile 23445
+ Tile 23189
+ Tile 22933
+ Tile 22677
+ Tile 22421
+ Tile 22165
+ Tile 21909
+ Tile 21653
+ Tile 21397
+ Tile 21141
+ Tile 20885
+ Tile 20629
+ Tile 20373
+ Tile 20117
+ Tile 19861
+ Tile 19605
+ Tile 19349
+ Tile 19093
+ Tile 18837
+ Tile 18581
+ Tile 18325
+ Tile 18069
+ Tile 17813
+ Tile 17557
+ Tile 17301
+ Tile 17045
+ Tile 16789
+ Tile 16533
+ Tile 16277
+ Tile 16021
+ Tile 15765
+ Tile 15509
+ Tile 15508
+
+--PriorityQueue--
+ Count(): 0
+ Peek(): (null : 0x00000000)
+ Pop(): (null : 0x00000000)
+ Count(): 9
+ Peek(): 1
+ Pop(): 1
+ Pop(): 4
+ Pop(): 3
+ Pop(): 2
+ Pop(): 1
+ Pop(): 5
+ Pop(): 6
+ Pop(): 7
+ Pop(): 8
+ Pop(): 9
+ Pop(): 10
+ Peek(): (null : 0x00000000)
+ Pop(): (null : 0x00000000)
+ Count(): 0
+
+--BinaryHeap--
+ Count(): 0
+ Peek(): (null : 0x00000000)
+ Pop(): (null : 0x00000000)
+ Count(): 9
+ Peek(): 1
+ Pop(): 1
+ Pop(): 3
+ Pop(): 4
+ Pop(): 2
+ Pop(): 1
+ Pop(): 5
+ Pop(): 6
+ Pop(): 7
+ Pop(): 8
+ Pop(): 9
+ Pop(): 10
+ Peek(): (null : 0x00000000)
+ Pop(): (null : 0x00000000)
+ Count(): 0
+
+--FibonacciHeap--
+ Count(): 0
+ Peek(): (null : 0x00000000)
+ Pop(): (null : 0x00000000)
+ Count(): 9
+ Peek(): 1
+ Pop(): 1
+ Pop(): 4
+ Pop(): 3
+ Pop(): 2
+ Pop(): 1
+ Pop(): 5
+ Pop(): 6
+ Pop(): 7
+ Pop(): 8
+ Pop(): 9
+ Pop(): 10
+ Peek(): (null : 0x00000000)
+ Pop(): (null : 0x00000000)
+ Count(): 0
+
+--Rail--
+ IsRailTile(): false
+ BuildRailTrack(): true
+ BuildSignal(): true
+ RemoveRailTrack(): false
+ RemoveRailTrack(): true
+ BuildRail(): true
+ HasTransportType(): true
+ HasTransportType(): false
+ RemoveRail(): true
+ Depot
+ IsRailTile(): false
+ BuildRailDepot(): false
+ BuildRailDepot(): false
+ BuildRailDepot(): true
+ BuildRailDepot(): false
+ GetRailDepotFrontTile(): 33412
+ IsBuildable(): false
+ DepotList
+ Count(): 1
+ Depot distance from (0,0) ListDump:
+ 33411 => 261
+ RemoveDepot(): true
+ Station
+ BuildRailStation(): false
+ BuildRailStation(): true
+ IsRailStationTile(): false
+ IsRailStationTile(): true
+ IsRailStationTile(): true
+ RemoveRailStationTileRect(): true
+ IsRailStationTile(): false
+ IsRailStationTile(): true
+ IsRailStationTile(): false
+ DemolishTile(): true
+ IsRailStationTile(): false
+ IsRailStationTile(): false
+ IsRailStationTile(): false
+
+--RailTypeList--
+ Count(): 1
+ ListDump:
+ RailType: 0
+ IsRailTypeAvailable(): true
+
+--Road--
+ Road
+ IsRoadTile(): false
+ BuildRoad(): false
+ BuildRoad(): false
+ HasTransportType(): false
+ BuildRoad(): true
+ HasTransportType(): true
+ AreRoadTilesConnected(): true
+ IsRoadTile(): true
+ HasRoadType(Road): true
+ HasRoadType(Tram): false
+ GetNeighbourRoadCount(): 2
+ RemoveRoad(): true
+ RemoveRoad(): true
+ RemoveRoad(): false
+ RemoveRoad(): true
+ BuildOneWayRoad(): true
+ AreRoadTilesConnected(): true
+ AreRoadTilesConnected(): false
+ BuildOneWayRoad(): true
+ AreRoadTilesConnected(): false
+ AreRoadTilesConnected(): false
+ BuildOneWayRoad(): true
+ BuildOneWayRoad(): true
+ AreRoadTilesConnected(): true
+ AreRoadTilesConnected(): true
+ RemoveRoad(): true
+ IsRoadTypeAvailable(Road): true
+ IsRoadTypeAvailable(Tram): false
+ SetCurrentRoadType(Tram): (null : 0x00000000)
+ GetCurrentRoadType(): 0
+ Depot
+ IsRoadTile(): false
+ BuildRoadDepot(): false
+ BuildRoadDepot(): false
+ BuildRoadDepot(): true
+ BuildRoadDepot(): false
+ HasRoadType(Road): true
+ HasRoadType(Tram): false
+ GetLastError(): 260
+ GetLastErrorString(): ERR_AREA_NOT_CLEAR
+ GetErrorCategory(): 1
+ IsRoadTile(): false
+ GetRoadDepotFrontTile(): 33412
+ IsRoadDepotTile(): true
+ IsBuildable(): false
+ DepotList
+ Count(): 1
+ Depot distance from (0,0) ListDump:
+ 33411 => 261
+ RemoveRoadDepot(): true
+ RemoveRoadDepot(): false
+ Station
+ IsRoadTile(): false
+ BuildRoadStation(): false
+ BuildRoadStation(): false
+ BuildRoadStation(): true
+ BuildRoadStation(): false
+ IsStationTile(): true
+ IsStationTile(): false
+ HasRoadType(Road): true
+ HasRoadType(Tram): false
+ IsRoadTile(): false
+ GetDriveThroughBackTile(): -1
+ GetRoadStationFrontTile(): 33412
+ IsRoadStationTile(): true
+ IsDriveThroughRoadStationTile: false
+ RemoveRoadStation(): true
+ RemoveRoadStation(): false
+ Station Types
+ BuildRoadStation(bus): true
+ BuildRoadStation(truck): true
+ BuildRoadStation(truck): true
+ BuildRoadStation(bus): true
+ BuildRoadStation(truck): true
+ BuildRoadStation(bus-drive): true
+ BuildRoadStation(truck-drive): true
+ BuildRoadStation(bus-drive): true
+ BuildRoadStation(truck-drive): true
+ BuildRoadDepot(): true
+ GetRoadStationFrontTile(): 33411
+ GetRoadStationFrontTile(): 33924
+ IsDriveThroughRoadStationTile: true
+ IsBuildable(): false
+ GetDriveThroughBackTile(): 33416
+ GetRoadStationFrontTile(): 33414
+ IsRoadTile(): true
+
+--Sign--
+ BuildSign(33410, 'Some Sign'): 0
+ BuildSign(33411, 'Test'): 1
+ SetName(1, 'Test2'): true
+ BuildSign(33409, 'Some other Sign'): 2
+ RemoveSign(2): true
+
+ GetMaxSignID(): 3
+ Sign -1
+ IsValidSign(): false
+ GetName(): (null : 0x00000000)
+ GetLocation(): -1
+ Sign 0
+ IsValidSign(): true
+ GetName(): Some Sign
+ GetLocation(): 33410
+ Sign 1
+ IsValidSign(): true
+ GetName(): Test2
+ GetLocation(): 33411
+ Sign 2
+ IsValidSign(): false
+ GetName(): (null : 0x00000000)
+ GetLocation(): -1
+ Sign 3
+ IsValidSign(): false
+ GetName(): (null : 0x00000000)
+ GetLocation(): -1
+ Valid Signs: 2
+
+--Station--
+ IsValidStation(0): true
+ IsValidStation(1000): false
+ GetName(0): Benville Airport
+ SetName(0): true
+ GetName(0): Look, a station
+ GetLocation(1): 29253
+ GetLocation(1000): -1
+ GetStationID(33411): 3
+ GetStationID(34411): 65535
+ GetCargoWaiting(0, 0): 0
+ GetCargoWaiting(1000, 0): -1
+ GetCargoWaiting(0, 1000): -1
+ GetStationID(33411): 3
+ HasRoadType(3, TRAM): false
+ HasRoadType(3, ROAD): true
+ HasRoadType(33411, TRAM): false
+ HasRoadType(33411, ROAD): true
+ HasStationType(3, BUS): true
+ HasStationType(3, TRAIN): false
+ GetCoverageRadius(BUS): 3
+ GetCoverageRadius(TRUCK): 3
+ GetCoverageRadius(TRAIN): 4
+ GetNearestTown(): 15
+ GetNearestTown(): 65535
+ GetNearestTown(): 24
+
+--StationList--
+ Count(): 2
+ Location ListDump:
+ 4 => 33421
+ 3 => 33411
+ CargoWaiting(0) ListDump:
+ 4 => 0
+ 3 => 0
+ CargoWaiting(1) ListDump:
+ 4 => 0
+ 3 => 0
+
+--Tile--
+ HasTreeOnTile(): false
+ IsFarmTile(): true
+ IsRockTile(): true
+ IsRoughTile(): true
+ HasTreeOnTile(): true
+ IsFarmTile(): false
+ IsRockTile(): false
+ IsRoughTile(): false
+ IsSnowTile(): false
+ IsDesertTile(): false
+ PlantTree(): true
+ HasTreeOnTile(): true
+ PlantTree(): false
+ HasTreeOnTile(): true
+ PlantTreeRectangle(): true
+ HasTreeOnTile(): true
+
+--TileList--
+ Count(): 0
+ Count(): 9
+ Slope(): done
+ Count(): 9
+ ListDump:
+ 27631 => 29
+ 27631 => 255
+ 27631 => true
+ 27631 => false
+ 27888 => 13
+ 27888 => 2
+ 27888 => false
+ 27888 => false
+ 27376 => 12
+ 27376 => 3
+ 27376 => false
+ 27376 => false
+ 27375 => 12
+ 27375 => 3
+ 27375 => false
+ 27375 => false
+ 27889 => 9
+ 27889 => 6
+ 27889 => false
+ 27889 => false
+ 27887 => 8
+ 27887 => 7
+ 27887 => false
+ 27887 => false
+ 27632 => 8
+ 27632 => 7
+ 27632 => false
+ 27632 => false
+ 27633 => 0
+ 27633 => 15
+ 27633 => false
+ 27633 => false
+ 27377 => 0
+ 27377 => 15
+ 27377 => false
+ 27377 => false
+
+--TileList--
+ Count(): 0
+ Count(): 45
+ Height(): done
+ Count(): 45
+ ListDump:
+ 42411 => 2
+ 42410 => 2
+ 42409 => 2
+ 42408 => 2
+ 42407 => 2
+ 42154 => 2
+ 42153 => 2
+ 42152 => 2
+ 42151 => 2
+ 41898 => 2
+ 41897 => 2
+ 41896 => 2
+ 41895 => 2
+ 41642 => 2
+ 41641 => 2
+ 41640 => 2
+ 41639 => 2
+ 41386 => 2
+ 41385 => 2
+ 41384 => 2
+ 41383 => 2
+ 42415 => 1
+ 42414 => 1
+ 42413 => 1
+ 42412 => 1
+ 42159 => 1
+ 42158 => 1
+ 42157 => 1
+ 42156 => 1
+ 42155 => 1
+ 41903 => 1
+ 41902 => 1
+ 41901 => 1
+ 41900 => 1
+ 41899 => 1
+ 41647 => 1
+ 41646 => 1
+ 41645 => 1
+ 41644 => 1
+ 41643 => 1
+ 41391 => 1
+ 41390 => 1
+ 41389 => 1
+ 41388 => 1
+ 41387 => 1
+ Slope(): done
+ KeepValue(0): done
+ Count(): 38
+ ListDump:
+ 42415 => 0
+ 42414 => 0
+ 42413 => 0
+ 42410 => 0
+ 42409 => 0
+ 42408 => 0
+ 42407 => 0
+ 42159 => 0
+ 42158 => 0
+ 42157 => 0
+ 42156 => 0
+ 42153 => 0
+ 42152 => 0
+ 42151 => 0
+ 41903 => 0
+ 41902 => 0
+ 41901 => 0
+ 41900 => 0
+ 41899 => 0
+ 41897 => 0
+ 41896 => 0
+ 41895 => 0
+ 41647 => 0
+ 41646 => 0
+ 41645 => 0
+ 41644 => 0
+ 41643 => 0
+ 41641 => 0
+ 41640 => 0
+ 41639 => 0
+ 41391 => 0
+ 41390 => 0
+ 41389 => 0
+ 41388 => 0
+ 41387 => 0
+ 41385 => 0
+ 41384 => 0
+ 41383 => 0
+ Buildable(): done
+ KeepValue(1): done
+ Count(): 28
+ BuildableRectangle(3, 3) ListDump:
+ 42415 => 1
+ 42414 => 1
+ 42413 => 1
+ 42410 => 1
+ 42159 => 1
+ 42158 => 1
+ 42157 => 1
+ 42156 => 1
+ 41903 => 1
+ 41902 => 1
+ 41901 => 1
+ 41900 => 1
+ 41899 => 1
+ 41647 => 1
+ 41646 => 1
+ 41645 => 1
+ 41644 => 1
+ 41643 => 1
+ 41641 => 1
+ 41391 => 1
+ 41390 => 1
+ 41389 => 1
+ 41388 => 1
+ 41387 => 1
+ 41385 => 1
+ 42153 => 0
+ 41897 => 0
+ 41384 => 0
+ DistanceManhattanToTile(30000) ListDump:
+ 42415 => 175
+ 42414 => 174
+ 42159 => 174
+ 42413 => 173
+ 42158 => 173
+ 41903 => 173
+ 42157 => 172
+ 41902 => 172
+ 41647 => 172
+ 42156 => 171
+ 41901 => 171
+ 41646 => 171
+ 41391 => 171
+ 42410 => 170
+ 41900 => 170
+ 41645 => 170
+ 41390 => 170
+ 41899 => 169
+ 41644 => 169
+ 41389 => 169
+ 42153 => 168
+ 41643 => 168
+ 41388 => 168
+ 41897 => 167
+ 41387 => 167
+ 41641 => 166
+ 41385 => 165
+ 41384 => 164
+ DistanceSquareToTile(30000) ListDump:
+ 42415 => 18433
+ 42159 => 18338
+ 41903 => 18245
+ 42414 => 18180
+ 41647 => 18154
+ 42158 => 18085
+ 41391 => 18065
+ 41902 => 17992
+ 42413 => 17929
+ 41646 => 17901
+ 42157 => 17834
+ 41390 => 17812
+ 41901 => 17741
+ 41645 => 17650
+ 42156 => 17585
+ 41389 => 17561
+ 41900 => 17492
+ 41644 => 17401
+ 41388 => 17312
+ 41899 => 17245
+ 42410 => 17188
+ 41643 => 17154
+ 41387 => 17065
+ 42153 => 16850
+ 41897 => 16757
+ 41641 => 16666
+ 41385 => 16577
+ 41384 => 16336
+ GetOwner() ListDump:
+ 42415 => -1
+ 42414 => -1
+ 42413 => -1
+ 42410 => -1
+ 42159 => -1
+ 42158 => -1
+ 42157 => -1
+ 42156 => -1
+ 42153 => -1
+ 41903 => -1
+ 41902 => -1
+ 41901 => -1
+ 41900 => -1
+ 41899 => -1
+ 41897 => -1
+ 41647 => -1
+ 41646 => -1
+ 41645 => -1
+ 41644 => -1
+ 41643 => -1
+ 41641 => -1
+ 41391 => -1
+ 41390 => -1
+ 41389 => -1
+ 41388 => -1
+ 41387 => -1
+ 41385 => -1
+ 41384 => -1
+ GetClosestTown() ListDump:
+ 42415 => 3
+ 42414 => 3
+ 42413 => 3
+ 42410 => 3
+ 42159 => 3
+ 42158 => 3
+ 42157 => 3
+ 42156 => 3
+ 42153 => 3
+ 41903 => 3
+ 41902 => 3
+ 41901 => 3
+ 41900 => 3
+ 41899 => 3
+ 41897 => 3
+ 41647 => 3
+ 41646 => 3
+ 41645 => 3
+ 41644 => 3
+ 41643 => 3
+ 41641 => 3
+ 41391 => 3
+ 41390 => 3
+ 41389 => 3
+ 41388 => 3
+ 41387 => 3
+ 41385 => 3
+ 41384 => 3
+ CargoAcceptance(): done
+ KeepAboveValue(10): done
+ Count(): 9
+ ListDump:
+ 41897 => 29
+ 41385 => 26
+ 41384 => 26
+ 42153 => 25
+ 41641 => 23
+ 41899 => 17
+ 41387 => 17
+ 41643 => 14
+ 42410 => 13
+ RoadTile(): done
+ KeepValue(1): done
+ Count(): 0
+ ListDump:
+ NeighbourRoadCount():done
+ KeepValue(1): done
+ Count(): 0
+ ListDump:
+ Water(): done
+ Count(): 45
+ 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
+
+--TileList_IndustryAccepting--
+ Count(): 47
+ Location ListDump:
+ 21234 => 16
+ 21233 => 16
+ 21232 => 16
+ 21231 => 16
+ 21230 => 16
+ 21229 => 16
+ 20978 => 16
+ 20977 => 16
+ 20976 => 16
+ 20975 => 16
+ 20974 => 16
+ 20973 => 16
+ 20722 => 16
+ 20718 => 16
+ 20717 => 16
+ 20466 => 16
+ 20462 => 16
+ 20461 => 16
+ 20210 => 16
+ 20206 => 16
+ 20205 => 16
+ 19954 => 16
+ 19950 => 16
+ 19949 => 16
+ 21490 => 8
+ 21489 => 8
+ 21488 => 8
+ 21487 => 8
+ 21486 => 8
+ 21485 => 8
+ 21484 => 8
+ 21235 => 8
+ 21228 => 8
+ 20979 => 8
+ 20972 => 8
+ 20723 => 8
+ 20716 => 8
+ 20467 => 8
+ 20460 => 8
+ 20211 => 8
+ 20204 => 8
+ 19955 => 8
+ 19948 => 8
+ 19699 => 8
+ 19698 => 8
+ 19694 => 8
+ 19693 => 8
+
+--TileList_IndustryProducing--
+ Count(): 90
+ Location ListDump:
+ 46149 => 14
+ 46146 => 14
+ 45894 => 14
+ 45889 => 14
+ 45638 => 14
+ 45633 => 14
+ 45382 => 14
+ 45377 => 14
+ 45126 => 12
+ 45121 => 12
+ 44869 => 12
+ 44868 => 12
+ 44867 => 12
+ 44866 => 12
+ 46150 => 11
+ 46145 => 11
+ 46405 => 10
+ 46404 => 10
+ 46403 => 10
+ 46402 => 10
+ 45895 => 9
+ 45888 => 9
+ 45639 => 9
+ 45632 => 9
+ 45383 => 9
+ 45376 => 9
+ 44870 => 9
+ 44865 => 9
+ 46406 => 8
+ 46401 => 8
+ 45127 => 8
+ 45120 => 8
+ 44613 => 8
+ 44612 => 8
+ 44611 => 8
+ 44610 => 8
+ 46151 => 7
+ 46144 => 7
+ 46661 => 6
+ 46660 => 6
+ 46659 => 6
+ 46658 => 6
+ 44871 => 6
+ 44864 => 6
+ 44614 => 6
+ 44609 => 6
+ 46662 => 5
+ 46657 => 5
+ 46407 => 5
+ 46400 => 5
+ 45896 => 4
+ 45887 => 4
+ 45640 => 4
+ 45631 => 4
+ 45384 => 4
+ 45375 => 4
+ 45128 => 4
+ 45119 => 4
+ 44615 => 4
+ 44608 => 4
+ 44357 => 4
+ 44356 => 4
+ 44355 => 4
+ 44354 => 4
+ 46663 => 3
+ 46656 => 3
+ 46152 => 3
+ 46143 => 3
+ 44872 => 3
+ 44863 => 3
+ 44358 => 3
+ 44353 => 3
+ 46918 => 2
+ 46917 => 2
+ 46916 => 2
+ 46915 => 2
+ 46914 => 2
+ 46913 => 2
+ 46408 => 2
+ 46399 => 2
+ 44616 => 2
+ 44607 => 2
+ 44359 => 2
+ 44352 => 2
+ 46919 => 1
+ 46912 => 1
+ 46664 => 1
+ 46655 => 1
+ 44360 => 1
+ 44351 => 1
+
+--TileList_StationType--
+ Count(): 0
+ Location ListDump:
+
+--Town--
+ GetMaxTownID(): 31
+ GetTownCount(): 28
+ Town -1
+ IsValidTown(): false
+ GetName(): (null : 0x00000000)
+ GetPopulation(): -1
+ GetLocation(): -1
+ GetHouseCount(): -1
+ GetRating(): -1
+ Town 0
+ IsValidTown(): true
+ GetName(): Planfield
+ GetPopulation(): 757
+ GetLocation(): 15508
+ GetHouseCount(): 30
+ GetRating(): 5
+ Town 1
+ IsValidTown(): true
+ GetName(): Trenningville
+ GetPopulation(): 343
+ GetLocation(): 46751
+ GetHouseCount(): 17
+ GetRating(): 5
+ Town 2
+ IsValidTown(): true
+ GetName(): Tondston
+ GetPopulation(): 380
+ GetLocation(): 28365
+ GetHouseCount(): 19
+ GetRating(): 0
+ Town 3
+ IsValidTown(): true
+ GetName(): Tunford
+ GetPopulation(): 176
+ GetLocation(): 41895
+ GetHouseCount(): 11
+ GetRating(): 5
+ Town 4
+ IsValidTown(): true
+ GetName(): Wrundtown
+ GetPopulation(): 426
+ GetLocation(): 41450
+ GetHouseCount(): 18
+ GetRating(): 0
+ Town 5
+ IsValidTown(): true
+ GetName(): Fraston
+ GetPopulation(): 205
+ GetLocation(): 55007
+ GetHouseCount(): 11
+ GetRating(): 0
+ Town 6
+ IsValidTown(): true
+ GetName(): Muningville
+ GetPopulation(): 679
+ GetLocation(): 38200
+ GetHouseCount(): 28
+ GetRating(): 0
+ Town 7
+ IsValidTown(): true
+ GetName(): Hutfingford
+ GetPopulation(): 1006
+ GetLocation(): 59234
+ GetHouseCount(): 33
+ GetRating(): 0
+ Town 8
+ IsValidTown(): true
+ GetName(): Sadtown
+ GetPopulation(): 358
+ GetLocation(): 51267
+ GetHouseCount(): 20
+ GetRating(): 0
+ Town 9
+ IsValidTown(): true
+ GetName(): Frindinghattan
+ GetPopulation(): 478
+ GetLocation(): 5825
+ GetHouseCount(): 18
+ GetRating(): 0
+ Town 10
+ IsValidTown(): true
+ GetName(): Nuntfingburg
+ GetPopulation(): 737
+ GetLocation(): 6446
+ GetHouseCount(): 26
+ GetRating(): 5
+ Town 11
+ IsValidTown(): true
+ GetName(): Fort Frindston
+ GetPopulation(): 180
+ GetLocation(): 14935
+ GetHouseCount(): 13
+ GetRating(): 5
+ Town 12
+ IsValidTown(): true
+ GetName(): Ginborough
+ GetPopulation(): 982
+ GetLocation(): 32740
+ GetHouseCount(): 28
+ GetRating(): 0
+ Town 13
+ IsValidTown(): true
+ GetName(): Great Hinninghall
+ GetPopulation(): 310
+ GetLocation(): 9595
+ GetHouseCount(): 14
+ GetRating(): 5
+ Town 14
+ IsValidTown(): true
+ GetName(): Prundinghall
+ GetPopulation(): 432
+ GetLocation(): 51298
+ GetHouseCount(): 18
+ GetRating(): 0
+ Town 15
+ IsValidTown(): true
+ GetName(): Benville
+ GetPopulation(): 807
+ GetLocation(): 42338
+ GetHouseCount(): 33
+ GetRating(): 5
+ Town 16
+ IsValidTown(): true
+ GetName(): Kennville
+ GetPopulation(): 767
+ GetLocation(): 17345
+ GetHouseCount(): 33
+ GetRating(): 5
+ Town 17
+ IsValidTown(): true
+ GetName(): Quartfingfield
+ GetPopulation(): 218
+ GetLocation(): 24252
+ GetHouseCount(): 13
+ GetRating(): 5
+ Town 18
+ IsValidTown(): true
+ GetName(): Netfingbridge
+ GetPopulation(): 262
+ GetLocation(): 10574
+ GetHouseCount(): 13
+ GetRating(): 5
+ Town 19
+ IsValidTown(): true
+ GetName(): Mendingston
+ GetPopulation(): 243
+ GetLocation(): 6511
+ GetHouseCount(): 14
+ GetRating(): 0
+ Town 20
+ IsValidTown(): true
+ GetName(): Chentfingbourne
+ GetPopulation(): 437
+ GetLocation(): 22585
+ GetHouseCount(): 15
+ GetRating(): 5
+ Town 21
+ IsValidTown(): true
+ GetName(): Franinghead
+ GetPopulation(): 772
+ GetLocation(): 9634
+ GetHouseCount(): 27
+ GetRating(): 5
+ Town 22
+ IsValidTown(): true
+ GetName(): Naborough
+ GetPopulation(): 221
+ GetLocation(): 51891
+ GetHouseCount(): 12
+ GetRating(): 0
+ Town 23
+ IsValidTown(): true
+ GetName(): Lardborough
+ GetPopulation(): 752
+ GetLocation(): 59622
+ GetHouseCount(): 27
+ GetRating(): 0
+ Town 24
+ IsValidTown(): true
+ GetName(): Little Fruford
+ GetPopulation(): 668
+ GetLocation(): 19596
+ GetHouseCount(): 34
+ GetRating(): 4
+ Town 25
+ IsValidTown(): true
+ GetName(): Grinnway
+ GetPopulation(): 563
+ GetLocation(): 16433
+ GetHouseCount(): 15
+ GetRating(): 5
+ Town 26
+ IsValidTown(): true
+ GetName(): Bedburg
+ GetPopulation(): 362
+ GetLocation(): 39505
+ GetHouseCount(): 18
+ GetRating(): 0
+ Town 27
+ IsValidTown(): true
+ GetName(): Fudinghattan
+ GetPopulation(): 390
+ GetLocation(): 45525
+ GetHouseCount(): 19
+ GetRating(): 0
+ Town 28
+ IsValidTown(): false
+ GetName(): (null : 0x00000000)
+ GetPopulation(): -1
+ GetLocation(): -1
+ GetHouseCount(): -1
+ GetRating(): -1
+ Town 29
+ IsValidTown(): false
+ GetName(): (null : 0x00000000)
+ GetPopulation(): -1
+ GetLocation(): -1
+ GetHouseCount(): -1
+ GetRating(): -1
+ Town 30
+ IsValidTown(): false
+ GetName(): (null : 0x00000000)
+ GetPopulation(): -1
+ GetLocation(): -1
+ GetHouseCount(): -1
+ GetRating(): -1
+ Town 31
+ IsValidTown(): false
+ GetName(): (null : 0x00000000)
+ GetPopulation(): -1
+ GetLocation(): -1
+ GetHouseCount(): -1
+ GetRating(): -1
+ Valid Towns: 28
+ GetTownCount(): 28
+
+--TownList--
+ Count(): 28
+ Location ListDump:
+ 23 => 59622
+ 7 => 59234
+ 5 => 55007
+ 22 => 51891
+ 14 => 51298
+ 8 => 51267
+ 1 => 46751
+ 27 => 45525
+ 15 => 42338
+ 3 => 41895
+ 4 => 41450
+ 26 => 39505
+ 6 => 38200
+ 12 => 32740
+ 2 => 28365
+ 17 => 24252
+ 20 => 22585
+ 24 => 19596
+ 16 => 17345
+ 25 => 16433
+ 0 => 15508
+ 11 => 14935
+ 18 => 10574
+ 21 => 9634
+ 13 => 9595
+ 19 => 6511
+ 10 => 6446
+ 9 => 5825
+ DistanceManhattanToTile(30000) ListDump:
+ 23 => 297
+ 5 => 272
+ 9 => 240
+ 4 => 230
+ 27 => 225
+ 22 => 216
+ 16 => 195
+ 21 => 194
+ 12 => 190
+ 1 => 176
+ 3 => 165
+ 7 => 164
+ 2 => 164
+ 17 => 163
+ 0 => 157
+ 19 => 155
+ 13 => 155
+ 24 => 133
+ 14 => 133
+ 18 => 106
+ 8 => 102
+ 15 => 98
+ 11 => 98
+ 10 => 94
+ 26 => 70
+ 25 => 54
+ 6 => 40
+ 20 => 38
+ DistanceSquareToTile(30000) ListDump:
+ 23 => 46349
+ 5 => 40034
+ 4 => 36532
+ 12 => 32500
+ 27 => 30825
+ 9 => 30050
+ 2 => 24698
+ 22 => 24386
+ 16 => 23525
+ 17 => 20129
+ 21 => 19396
+ 1 => 16546
+ 3 => 16277
+ 7 => 15496
+ 0 => 13249
+ 19 => 12433
+ 13 => 12025
+ 24 => 10145
+ 14 => 9389
+ 10 => 8468
+ 8 => 7250
+ 18 => 6676
+ 11 => 5002
+ 15 => 4804
+ 25 => 2810
+ 26 => 2458
+ 6 => 1088
+ 20 => 922
+ IsWithinTownInfluence(15508) ListDump:
+ 0 => 1
+ 27 => 0
+ 26 => 0
+ 25 => 0
+ 24 => 0
+ 23 => 0
+ 22 => 0
+ 21 => 0
+ 20 => 0
+ 19 => 0
+ 18 => 0
+ 17 => 0
+ 16 => 0
+ 15 => 0
+ 14 => 0
+ 13 => 0
+ 12 => 0
+ 11 => 0
+ 10 => 0
+ 9 => 0
+ 8 => 0
+ 7 => 0
+ 6 => 0
+ 5 => 0
+ 4 => 0
+ 3 => 0
+ 2 => 0
+ 1 => 0
+ GetAllowedNoise() ListDump:
+ 27 => 2
+ 26 => 2
+ 25 => 2
+ 24 => 2
+ 23 => 2
+ 22 => 2
+ 21 => 2
+ 20 => 2
+ 19 => 2
+ 18 => 2
+ 17 => 2
+ 16 => 2
+ 14 => 2
+ 13 => 2
+ 12 => 2
+ 11 => 2
+ 10 => 2
+ 9 => 2
+ 8 => 2
+ 7 => 2
+ 6 => 2
+ 5 => 2
+ 4 => 2
+ 3 => 2
+ 2 => 2
+ 1 => 2
+ 0 => 2
+ 15 => 1
+ KeepAboveValue(500): done
+ Count(): 11
+ Population ListDump:
+ 7 => 1006
+ 12 => 982
+ 15 => 807
+ 21 => 772
+ 16 => 767
+ 0 => 757
+ 23 => 752
+ 10 => 737
+ 6 => 679
+ 24 => 668
+ 25 => 563
+ HasStatue(): false
+ GetRoadReworkDuration(): 0
+ GetExclusiveRightsCompany(): -1
+ GetExclusiveRightsDuration(): 0
+ IsActionAvailable(BUILD_STATUE): true
+ PerformTownAction(BUILD_STATUE): true
+ IsActionAvailable(BUILD_STATUE): false
+ HasStatue(): true
+
+--Tunnel--
+ IsTunnelTile(): false
+ RemoveTunnel(): false
+ GetOtherTunnelEnd(): 28026
+ BuildTunnel(): true
+ GetOtherTunnelEnd(): 28026
+ IsTunnelTile(): true
+ IsTunnelTile(): true
+ RemoveTunnel(): true
+ IsTunnelTile(): false
+ --Errors--
+ BuildTunnel(): true
+ BuildTunnel(): false
+ GetLastErrorString(): ERR_TUNNEL_ANOTHER_TUNNEL_IN_THE_WAY
+ RemoveTunnel(): true
+
+--Vehicle--
+ IsValidVehicle(-1): false
+ IsValidVehicle(0): false
+ IsValidVehicle(12): false
+ ISValidVehicle(9999): false
+ BuildVehicle(): 12
+ IsValidVehicle(12): true
+ CloneVehicle(): 13
+ --Accounting--
+ GetCosts(): 932
+ Should be: 932
+ ResetCosts(): (null : 0x00000000)
+ SellVehicle(13): true
+ IsInDepot(): true
+ IsStoppedInDepot(): true
+ StartStopVehicle(): true
+ IsInDepot(): false
+ IsStoppedInDepot(): false
+ SendVehicleToDepot(): true
+ IsInDepot(): false
+ IsStoppedInDepot(): false
+ --Accounting--
+ GetCosts(): -466
+ Should be: -466
+ GetName(): Road Vehicle 1
+ SetName(): true
+ GetName(): MyVehicleName
+ CloneVehicle(): 13
+ --VehicleData--
+ GetLocation(): 33417
+ GetEngineType(): 153
+ GetUnitNumber(): 1
+ GetAge(): 0
+ GetMaxAge(): 5490
+ GetAgeLeft(): 5490
+ GetCurrentSpeed(): 4
+ GetRunningCost(): 14
+ GetProfitThisYear(): 0
+ GetProfitLastYear(): 0
+ GetCurrentValue(): 466
+ GetVehicleType(): 1
+ GetRoadType(): 0
+ GetCapacity(): 12
+ GetCargoLoad(): 0
+ IsInDepot(): false
+ GetNumWagons(): 1
+ GetWagonEngineType(): 153
+ GetWagonAge(): 0
+ GetLength(): 8
+ GetOwner(): 1
+ BuildVehicle(): 14
+ IsValidVehicle(14): true
+ IsInDepot(14): true
+ IsStoppedInDepot(14): true
+ IsValidVehicle(15): false
+ IsInDepot(15): false
+ IsStoppedInDepot(15): false
+ BuildVehicle(): 16
+ IsValidVehicle(16): true
+ IsInDepot(16): true
+ IsStoppedInDepot(16): true
+ BuildRailDepot(): true
+ BuildVehicle(): 17
+ BuildVehicle(): 18
+ BuildVehicle(): 19
+ MoveWagon(): true
+ GetNumWagons(): 3
+ GetLength(): 24
+ GetWagonEngineType(): 9
+ GetWagonAge(): 0
+ GetWagonEngineType(): 27
+ GetWagonAge(): 0
+ GetWagonEngineType(): 27
+ GetWagonAge(): 0
+ GetWagonEngineType(): 65535
+ GetWagonAge(): -1
+ --Errors--
+ RefitVehicle(): false
+ GetLastErrorString(): ERR_VEHICLE_NOT_IN_DEPOT
+ SellVehicle(): false
+ GetLastErrorString(): ERR_VEHICLE_NOT_IN_DEPOT
+ SendVehicleToDepot(): false
+ GetLastErrorString(): ERR_UNKNOWN
+
+--VehicleList--
+ Count(): 5
+ Location ListDump:
+ 13 => 33417
+ 12 => 33417
+ 14 => 32119
+ 16 => 28479
+ 17 => 10008
+ EngineType ListDump:
+ 14 => 219
+ 16 => 204
+ 13 => 153
+ 12 => 153
+ 17 => 9
+ UnitNumber ListDump:
+ 13 => 2
+ 17 => 1
+ 16 => 1
+ 14 => 1
+ 12 => 1
+ Age ListDump:
+ 17 => 0
+ 16 => 0
+ 14 => 0
+ 13 => 0
+ 12 => 0
+ MaxAge ListDump:
+ 16 => 10980
+ 14 => 10980
+ 17 => 7320
+ 13 => 5490
+ 12 => 5490
+ AgeLeft ListDump:
+ 16 => 10980
+ 14 => 10980
+ 17 => 7320
+ 13 => 5490
+ 12 => 5490
+ CurrentSpeed ListDump:
+ 12 => 13
+ 17 => 0
+ 16 => 0
+ 14 => 0
+ 13 => 0
+ RunningCost ListDump:
+ 17 => 21
+ 16 => 21
+ 14 => 15
+ 13 => 14
+ 12 => 14
+ ProfitThisYear ListDump:
+ 17 => 0
+ 16 => 0
+ 14 => 0
+ 13 => 0
+ 12 => 0
+ ProfitLastYear ListDump:
+ 17 => 0
+ 16 => 0
+ 14 => 0
+ 13 => 0
+ 12 => 0
+ CurrentValue ListDump:
+ 16 => 515
+ 13 => 466
+ 12 => 466
+ 17 => 61
+ 14 => 48
+ VehicleType ListDump:
+ 14 => 3
+ 16 => 2
+ 13 => 1
+ 12 => 1
+ 17 => 0
+ RoadType ListDump:
+ 13 => 0
+ 12 => 0
+ 17 => -1
+ 16 => -1
+ 14 => -1
+ VehicleType ListDump:
+ 13 => 12
+ 12 => 12
+ 17 => 0
+ 16 => 0
+ 14 => 0
+ VehicleType ListDump:
+ 17 => 0
+ 16 => 0
+ 14 => 0
+ 13 => 0
+ 12 => 0
+
+--Order--
+ GetOrderCount(): 0
+ GetOrderDestination(): -1
+ AreOrderFlagsValid(): true
+ IsValidVehicleOrder(): false
+ GetOrderFlags(): 65535
+ AppendOrder(): true
+ InsertOrder(): true
+ GetOrderCount(): 2
+ IsValidVehicleOrder(): true
+ RemoveOrder(): true
+ ChangeOrder(): true
+ GetOrderDestination(): 33411
+ CopyOrders(): false
+ CopyOrders(): true
+ ShareOrders(): false
+ ShareOrders(): true
+ UnshareOrders(): true
+ AppendOrder(): true
+
+--StationList_Vehicle--
+ Count(): 2
+ Location ListDump:
+ 4 => 33421
+ 3 => 33411
+ CargoWaiting(0) ListDump:
+ 4 => 0
+ 3 => 0
+ CargoWaiting(1) ListDump:
+ 4 => 0
+ 3 => 0
+ CargoRating(1) ListDump:
+ 4 => 69
+ 3 => 69
+ DistanceManhattanToTile(30000) ListDump:
+ 4 => 106
+ 3 => 96
+ DistanceSquareToTile(30000) ListDump:
+ 4 => 8818
+ 3 => 7058
+ IsWithinTownInfluence(0) ListDump:
+ 4 => 0
+ 3 => 0
+
+--VehicleList_Station--
+ Count(): 1
+ Location ListDump:
+ 12 => 33417
+ foreach():
+ 12 => 33417
+
+ First Subsidy Test
+ --Subsidy (0) --
+ IsValidSubsidy(): false
+ IsAwarded(): false
+ GetAwardedTo(): -1
+ GetExpireDate(): -1
+ SourceIsTown(): false
+ GetSource(): 65535
+ DestionationIsTown(): false
+ GetDestionation(): 65535
+ GetCargoType(): 255
+ GetNextEvent: instance
+ GetEventType: 2
+ EventName: SubsidyOffer
+ --Subsidy (4) --
+ IsValidSubsidy(): true
+ IsAwarded(): false
+ GetAwardedTo(): -1
+ GetExpireDate(): 714414
+ SourceIsTown(): true
+ GetSource(): 10
+ DestionationIsTown(): true
+ GetDestionation(): 25
+ GetCargoType(): 0
+ GetNextEvent: instance
+ GetEventType: 6
+ Unknown Event
+ GetNextEvent: instance
+ GetEventType: 3
+ Unknown Event
+ GetNextEvent: instance
+ GetEventType: 3
+ Unknown Event
+ IsEventWaiting: false
+ERROR: The AI died unexpectedly.
diff --git a/bin/ai/regression/regression_info.nut b/bin/ai/regression/regression_info.nut
new file mode 100644
index 000000000..9ddd3daa2
--- /dev/null
+++ b/bin/ai/regression/regression_info.nut
@@ -0,0 +1,11 @@
+class Regression extends AIInfo {
+ function GetAuthor() { return "OpenTTD NoAI Developers Team"; }
+ function GetName() { return "Regression"; }
+ function GetDescription() { return "This runs regression-tests on all commands. On the same map the result should always be the same."; }
+ function GetVersion() { return 1; }
+ function GetDate() { return "2007-03-18"; }
+ function CreateInstance() { return "Regression"; }
+}
+
+RegisterAI(Regression());
+
diff --git a/bin/ai/regression/require.nut b/bin/ai/regression/require.nut
new file mode 100644
index 000000000..806f5df45
--- /dev/null
+++ b/bin/ai/regression/require.nut
@@ -0,0 +1,3 @@
+
+print(" Required this file");
+
diff --git a/bin/ai/regression/run.sh b/bin/ai/regression/run.sh
new file mode 100644
index 000000000..3f9819e91
--- /dev/null
+++ b/bin/ai/regression/run.sh
@@ -0,0 +1,49 @@
+#!/bin/sh
+
+if ! [ -f ai/regression/regression.nut ]; then
+ echo "Make sure you are in the root of OpenTTD before starting this script."
+ exit 1
+fi
+
+cp ai/regression/regression.nut ai/regression/main.nut
+cp ai/regression/regression_info.nut ai/regression/info.nut
+
+if [ -f scripts/game_start.scr ]; then
+ mv scripts/game_start.scr scripts/game_start.src.regression
+fi
+
+params=""
+gdb=""
+if [ "$1" != "-r" ]; then
+ params="-snull -mnull -vnull:ticks=30000"
+fi
+if [ "$1" = "-g" ]; then
+ gdb="gdb --ex run --args "
+fi
+if [ -n "$gdb" ]; then
+ $gdb ./openttd -x -c ai/regression/regression.cfg $params -g ai/regression/regression.sav
+else
+ ./openttd -x -c ai/regression/regression.cfg $params -g ai/regression/regression.sav -d ai=2 2>&1 | awk '{ gsub("0x\\(nil\\)", "0x00000000", $0); gsub("^dbg: \\[ai\\]", "", $0); gsub("^ ", "ERROR: ", $0); gsub("ERROR: \\[1\\] ", "", $0); gsub("\\[P\\] ", "", $0); print $0; }' > tmp.regression
+fi
+
+if [ -z "$gdb" ]; then
+ res="`diff -ub ai/regression/regression.txt tmp.regression`"
+ if [ -z "$res" ]; then
+ echo "Regression test passed!"
+ else
+ echo "Regression test failed! Difference:"
+ echo "$res"
+ fi
+ echo ""
+ echo "Regression test done"
+fi
+
+rm -f ai/regression/main.nut ai/regression/info.nut
+
+if [ -f scripts/game_start.scr.regression ]; then
+ mv scripts/game_start.scr.regression scripts/game_start.src
+fi
+
+if [ "$1" != "-k" ]; then
+ rm -f tmp.regression
+fi
diff --git a/bin/ai/wrightai/info.nut b/bin/ai/wrightai/info.nut
new file mode 100644
index 000000000..3cd7cfa90
--- /dev/null
+++ b/bin/ai/wrightai/info.nut
@@ -0,0 +1,15 @@
+/* $Id$ */
+
+class WrightAI extends AIInfo {
+ function GetAuthor() { return "OpenTTD NoAI Developers Team"; }
+ function GetName() { return "WrightAI"; }
+ function GetDescription() { return "A simple AI that tries to beat you with only aircrafts"; }
+ function GetVersion() { return 2; }
+ function GetDate() { return "2008-02-24"; }
+ function CreateInstance() { return "WrightAI"; }
+ function GetSettings() {
+ AddSetting({name = "min_town_size", description = "The minimal size of towns to work on", min_value = 100, max_value = 1000, easy_value = 500, medium_value = 400, hard_value = 300, custom_value = 500, flags = 0});
+ }
+}
+
+RegisterAI(WrightAI());
diff --git a/bin/ai/wrightai/main.nut b/bin/ai/wrightai/main.nut
new file mode 100644
index 000000000..53b387b2e
--- /dev/null
+++ b/bin/ai/wrightai/main.nut
@@ -0,0 +1,387 @@
+/* $Id$ */
+
+class WrightAI extends AIController {
+ name = null;
+ towns_used = null;
+ route_1 = null;
+ route_2 = null;
+ distance_of_route = {};
+ vehicle_to_depot = {};
+ delay_build_airport_route = 1000;
+ passenger_cargo_id = -1;
+
+ function Start();
+
+ constructor() {
+ this.towns_used = AIList();
+ this.route_1 = AIList();
+ this.route_2 = AIList();
+
+ local list = AICargoList();
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ if (AICargo.HasCargoClass(i, AICargo.CC_PASSENGERS)) {
+ this.passenger_cargo_id = i;
+ break;
+ }
+ }
+ }
+};
+
+/**
+ * Check if we have enough money (via loan and on bank).
+ */
+function WrightAI::HasMoney(money)
+{
+ if (AICompany.GetBankBalance(AICompany.MY_COMPANY) + (AICompany.GetMaxLoanAmount() - AICompany.GetLoanAmount()) > money) return true;
+ return false;
+}
+
+/**
+ * Get the amount of money requested, loan if needed.
+ */
+function WrightAI::GetMoney(money)
+{
+ if (!this.HasMoney(money)) return;
+ if (AICompany.GetBankBalance(AICompany.MY_COMPANY) > money) return;
+
+ local loan = money - AICompany.GetBankBalance(AICompany.MY_COMPANY) + AICompany.GetLoanInterval() + AICompany.GetLoanAmount();
+ loan = loan - loan % AICompany.GetLoanInterval();
+ AILog.Info("Need a loan to get " + money + ": " + loan);
+ AICompany.SetLoanAmount(loan);
+}
+
+/**
+ * Build an airport route. Find 2 cities that are big enough and try to build airport in both cities.
+ * Then we can build an aircraft and make some money.
+ */
+function WrightAI::BuildAirportRoute()
+{
+ local airport_type = (AIAirport.AirportAvailable(AIAirport.AT_SMALL) ? AIAirport.AT_SMALL : AIAirport.AT_LARGE);
+
+ /* Get enough money to work with */
+ this.GetMoney(150000);
+
+ AILog.Info("Trying to build an airport route");
+
+ local tile_1 = this.FindSuitableAirportSpot(airport_type, 0);
+ if (tile_1 < 0) return -1;
+ local tile_2 = this.FindSuitableAirportSpot(airport_type, tile_1);
+ if (tile_2 < 0) {
+ this.towns_used.RemoveValue(tile_1);
+ return -2;
+ }
+
+ /* Build the airports for real */
+ if (!AIAirport.BuildAirport(tile_1, airport_type, true)) {
+ AILog.Error("Although the testing told us we could build 2 airports, it still failed on the first airport at tile " + tile_1 + ".");
+ this.towns_used.RemoveValue(tile_1);
+ this.towns_used.RemoveValue(tile_2);
+ return -3;
+ }
+ if (!AIAirport.BuildAirport(tile_2, airport_type, true)) {
+ AILog.Error("Although the testing told us we could build 2 airports, it still failed on the second airport at tile " + tile_2 + ".");
+ AIAirport.RemoveAirport(tile_1);
+ this.towns_used.RemoveValue(tile_1);
+ this.towns_used.RemoveValue(tile_2);
+ return -4;
+ }
+
+ local ret = this.BuildAircraft(tile_1, tile_2);
+ if (ret < 0) {
+ AIAirport.RemoveAirport(tile_1);
+ AIAirport.RemoveAirport(tile_2);
+ this.towns_used.RemoveValue(tile_1);
+ this.towns_used.RemoveValue(tile_2);
+ return ret;
+ }
+
+ AILog.Info("Done building a route");
+ return ret;
+}
+
+/**
+ * Build an aircraft with orders from tile_1 to tile_2.
+ * The best available aircraft of that time will be bought.
+ */
+function WrightAI::BuildAircraft(tile_1, tile_2)
+{
+ /* Build an aircraft */
+ local hangar = AIAirport.GetHangarOfAirport(tile_1);
+ local engine = null;
+
+ local engine_list = AIEngineList(AIVehicle.VEHICLE_AIR);
+
+ /* When bank balance < 300000, buy cheaper planes */
+ local balance = AICompany.GetBankBalance(AICompany.MY_COMPANY);
+ engine_list.Valuate(AIEngine.GetPrice);
+ engine_list.KeepBelowValue(balance < 300000 ? 50000 : (balance < 1000000 ? 300000 : 1000000));
+
+ engine_list.Valuate(AIEngine.GetCargoType);
+ engine_list.KeepValue(this.passenger_cargo_id);
+
+ engine_list.Valuate(AIEngine.GetCapacity);
+ engine_list.KeepTop(1);
+
+ engine = engine_list.Begin();
+
+ if (!AIEngine.IsValidEngine(engine)) {
+ AILog.Error("Couldn't find a suitable engine");
+ return -5;
+ }
+ local vehicle = AIVehicle.BuildVehicle(hangar, engine);
+ if (!AIVehicle.IsValidVehicle(vehicle)) {
+ AILog.Error("Couldn't build the aircraft");
+ return -6;
+ }
+ /* Send him on his way */
+ AIOrder.AppendOrder(vehicle, tile_1, AIOrder.AIOF_NONE);
+ AIOrder.AppendOrder(vehicle, tile_2, AIOrder.AIOF_NONE);
+ AIVehicle.StartStopVehicle(vehicle);
+ this.distance_of_route.rawset(vehicle, AIMap.DistanceManhattan(tile_1, tile_2));
+ this.route_1.AddItem(vehicle, tile_1);
+ this.route_2.AddItem(vehicle, tile_2);
+
+ AILog.Info("Done building an aircraft");
+
+ return 0;
+}
+
+/**
+ * Find a suitable spot for an airport, walking all towns hoping to find one.
+ * When a town is used, it is marked as such and not re-used.
+ */
+function WrightAI::FindSuitableAirportSpot(airport_type, center_tile)
+{
+ local airport_x, airport_y, airport_rad;
+
+ airport_x = AIAirport.GetAirportWidth(airport_type);
+ airport_y = AIAirport.GetAirportHeight(airport_type);
+ airport_rad = AIAirport.GetAirportCoverageRadius(airport_type);
+
+ local town_list = AITownList();
+ /* Remove all the towns we already used */
+ town_list.RemoveList(this.towns_used);
+
+ town_list.Valuate(AITown.GetPopulation);
+ town_list.KeepAboveValue(GetSetting("min_town_size"));
+ /* Keep the best 10, if we can't find 2 stations in there, just leave it anyway */
+ town_list.KeepTop(10);
+ town_list.Valuate(AIBase.RandItem);
+
+ /* Now find 2 suitable towns */
+ for (local town = town_list.Begin(); town_list.HasNext(); town = town_list.Next()) {
+ /* Don't make this a CPU hog */
+ Sleep(1);
+
+ local tile = AITown.GetLocation(town);
+
+ /* Create a 30x30 grid around the core of the town and see if we can find a spot for a small airport */
+ local list = AITileList();
+ /* XXX -- We assume we are more than 15 tiles away from the border! */
+ list.AddRectangle(tile - AIMap.GetTileIndex(15, 15), tile + AIMap.GetTileIndex(15, 15));
+ list.Valuate(AITile.IsBuildableRectangle, airport_x, airport_y);
+ list.KeepValue(1);
+ if (center_tile != 0) {
+ /* If we have a tile defined, we don't want to be within 25 tiles of this tile */
+ list.Valuate(AITile.GetDistanceSquareToTile, center_tile);
+ list.KeepAboveValue(625);
+ }
+ /* Sort on acceptance, remove places that don't have acceptance */
+ list.Valuate(AITile.GetCargoAcceptance, this.passenger_cargo_id, airport_x, airport_y, airport_rad);
+ list.RemoveBelowValue(10);
+
+ /* Couldn't find a suitable place for this town, skip to the next */
+ if (list.Count() == 0) continue;
+ /* Walk all the tiles and see if we can build the airport at all */
+ {
+ local test = AITestMode();
+ local good_tile = 0;
+
+ for (tile = list.Begin(); list.HasNext(); tile = list.Next()) {
+ Sleep(1);
+ if (!AIAirport.BuildAirport(tile, airport_type, true)) continue;
+ good_tile = tile;
+ break;
+ }
+
+ /* Did we found a place to build the airport on? */
+ if (good_tile == 0) continue;
+ }
+
+ AILog.Info("Found a good spot for an airport in town " + town + " at tile " + tile);
+
+ /* Make the town as used, so we don't use it again */
+ this.towns_used.AddItem(town, tile);
+
+ return tile;
+ }
+
+ AILog.Info("Couldn't find a suitable town to build an airport in");
+ return -1;
+}
+
+function WrightAI::ManageAirRoutes()
+{
+ local list = AIVehicleList();
+ list.Valuate(AIVehicle.GetAge);
+ /* Give the plane at least 2 years to make a difference */
+ list.KeepAboveValue(365 * 2);
+ list.Valuate(AIVehicle.GetProfitLastYear);
+
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ local profit = list.GetValue(i);
+ /* Profit last year and this year bad? Let's sell the vehicle */
+ if (profit < 10000 && AIVehicle.GetProfitThisYear(i) < 10000) {
+ /* Send the vehicle to depot if we didn't do so yet */
+ if (!vehicle_to_depot.rawin(i) || vehicle_to_depot.rawget(i) != true) {
+ AILog.Info("Sending " + i + " to depot as profit is: " + profit + " / " + AIVehicle.GetProfitThisYear(i));
+ AIVehicle.SendVehicleToDepot(i);
+ vehicle_to_depot.rawset(i, true);
+ }
+ }
+ /* Try to sell it over and over till it really is in the depot */
+ if (vehicle_to_depot.rawin(i) && vehicle_to_depot.rawget(i) == true) {
+ if (AIVehicle.SellVehicle(i)) {
+ AILog.Info("Selling " + i + " as it finally is in a depot.");
+ /* Check if we are the last one serving those airports; else sell the airports */
+ local list2 = AIVehicleList_Station(AIStation.GetStationID(this.route_1.GetValue(i)));
+ if (list2.Count() == 0) this.SellAirports(i);
+ vehicle_to_depot.rawdelete(i);
+ }
+ }
+ }
+
+ /* Don't try to add planes when we are short on cash */
+ if (!this.HasMoney(50000)) return;
+
+ list = AIStationList(AIStation.STATION_AIRPORT);
+ list.Valuate(AIStation.GetCargoWaiting, this.passenger_cargo_id);
+ list.KeepAboveValue(250);
+
+ for (local i = list.Begin(); list.HasNext(); i = list.Next()) {
+ local list2 = AIVehicleList_Station(i);
+ /* No vehicles going to this station, abort and sell */
+ if (list2.Count() == 0) {
+ this.SellAirports(i);
+ continue;
+ };
+
+ /* Find the first vehicle that is going to this station */
+ local v = list2.Begin();
+ local dist = this.distance_of_route.rawget(v);
+
+ list2.Valuate(AIVehicle.GetAge);
+ list2.KeepBelowValue(dist);
+ /* Do not build a new vehicle if we bought a new one in the last DISTANCE days */
+ if (list2.Count() != 0) continue;
+
+ AILog.Info("Station " + i + " (" + AIStation.GetLocation(i) + ") has too many cargo, adding a new vehicle for the route.");
+
+ /* Make sure we have enough money */
+ this.GetMoney(50000);
+
+ return this.BuildAircraft(this.route_1.GetValue(v), this.route_2.GetValue(v));
+ }
+}
+
+/**
+ * Sells the airports from route index i
+ * Removes towns from towns_used list too
+ */
+function WrightAI::SellAirports(i) {
+ /* Remove the airports */
+ AILog.Info("Removing airports as nobody serves them anymore.");
+ AIAirport.RemoveAirport(this.route_1.GetValue(i));
+ AIAirport.RemoveAirport(this.route_2.GetValue(i));
+ /* Free the towns_used entries */
+ this.towns_used.RemoveValue(this.route_1.GetValue(i));
+ this.towns_used.RemoveValue(this.route_2.GetValue(i));
+ /* Remove the route */
+ this.route_1.RemoveItem(i);
+ this.route_2.RemoveItem(i);
+}
+
+function WrightAI::HandleEvents()
+{
+ while (AIEventController.IsEventWaiting()) {
+ local e = AIEventController.GetNextEvent();
+ switch (e.GetEventType()) {
+ case AIEvent.AI_ET_VEHICLE_CRASHED: {
+ local ec = AIEventVehicleCrashed.Convert(e);
+ local v = ec.GetVehicleID();
+ AILog.Info("We have a crashed vehicle (" + v + "), buying a new one as replacement");
+ this.BuildAircraft(this.route_1.GetValue(v), this.route_2.GetValue(v));
+ this.route_1.RemoveItem(v);
+ this.route_2.RemoveItem(v);
+ } break;
+
+ default:
+ break;
+ }
+ }
+}
+
+function WrightAI::Start()
+{
+ if (this.passenger_cargo_id == -1) {
+ AILog.Error("WrightAI could not find the passenger cargo");
+ return;
+ }
+
+ /* Give the boy a name */
+ if (!AICompany.SetName("WrightAI")) {
+ local i = 2;
+ while (!AICompany.SetName("WrightAI #" + i)) {
+ i++;
+ }
+ }
+ this.name = AICompany.GetName(AICompany.MY_COMPANY);
+ /* Say hello to the user */
+ AILog.Info("Welcome to WrightAI. I will be building airports all day long.");
+ AILog.Info(" - Minimum Town Size: " + GetSetting("min_town_size"));
+
+ /* We start with almost no loan, and we take a loan when we want to build something */
+ AICompany.SetLoanAmount(AICompany.GetLoanInterval());
+
+ /* We need our local ticker, as GetTick() will skip ticks */
+ local ticker = 0;
+ /* Determine time we may sleep */
+ local sleepingtime = 100;
+ if (this.delay_build_airport_route < sleepingtime)
+ sleepingtime = this.delay_build_airport_route;
+
+ /* Let's go on for ever */
+ while (true) {
+ /* Once in a while, with enough money, try to build something */
+ if ((ticker % this.delay_build_airport_route == 0 || ticker == 0) && this.HasMoney(100000)) {
+ local ret = this.BuildAirportRoute();
+ if (ret == -1 && ticker != 0) {
+ /* No more route found, delay even more before trying to find an other */
+ this.delay_build_airport_route = 10000;
+ }
+ else if (ret < 0 && ticker == 0) {
+ /* The AI failed to build a first airport and is deemed */
+ AICompany.SetName("Failed " + this.name);
+ AILog.Error("Failed to build first airport route, now giving up building. Repaying loan. Have a nice day!");
+ AICompany.SetLoanAmount(0);
+ return;
+ }
+ }
+ /* Manage the routes once in a while */
+ if (ticker % 2000 == 0) {
+ this.ManageAirRoutes();
+ }
+ /* Try to get ride of our loan once in a while */
+ if (ticker % 5000 == 0) {
+ AICompany.SetLoanAmount(0);
+ }
+ /* Check for events once in a while */
+ if (ticker % 100 == 0) {
+ this.HandleEvents();
+ }
+ /* Make sure we do not create infinite loops */
+ Sleep(sleepingtime);
+ ticker += sleepingtime;
+ }
+}
+
diff --git a/bin/scripts/game_start.scr.example b/bin/scripts/game_start.scr.example
new file mode 100644
index 000000000..5a3620141
--- /dev/null
+++ b/bin/scripts/game_start.scr.example
@@ -0,0 +1,2 @@
+start_ai MyAI
+