diff options
author | truebrain <truebrain@openttd.org> | 2009-01-12 17:11:45 +0000 |
---|---|---|
committer | truebrain <truebrain@openttd.org> | 2009-01-12 17:11:45 +0000 |
commit | c2406cd42d481a697602b430111a9e59af61660f (patch) | |
tree | ced1a262eb143ad6e64ec02f4a4c89835c0c32fd /bin | |
parent | ec97e1fd0d6ca942805fa25d94007437bc0ed952 (diff) | |
download | openttd-c2406cd42d481a697602b430111a9e59af61660f.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')
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 Binary files differnew file mode 100644 index 000000000..84a1cf6b7 --- /dev/null +++ b/bin/ai/regression/regression.sav 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 + |