bin/ai/library/pathfinder/road/main.nut
author truebrain
Thu, 12 Jun 2008 21:07:25 +0000
branchnoai
changeset 10943 5f5a5dd407d8
child 10946 7ccfbff5698d
permissions -rw-r--r--
(svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
10943
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
     1
/* $Id$ */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
     2
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
     3
/**
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
     4
 * A Road Pathfinder.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
     5
 *  This road pathfinder tries to find a buildable / existing route for
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
     6
 *  road vehicles. You can changes the costs below using for example
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
     7
 *  roadpf.cost.turn = 30. Note that it's not allowed to change the cost
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
     8
 *  between consecutive calls to FindPath. You can change the cost before
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
     9
 *  the first call to FindPath and after FindPath has returned an actual
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    10
 *  route. To use only existing roads, set cost.no_existing_road to
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    11
 *  cost.max_cost.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    12
 */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    13
class Road
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    14
{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    15
	_aystar_class = import("graph.aystar", "", 3);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    16
	_max_cost = null;              ///< The maximum cost for a route.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    17
	_cost_tile = null;             ///< The cost for a single tile.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    18
	_cost_no_existing_road = null; ///< The cost that is added to _cost_tile if no road exists yet.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    19
	_cost_turn = null;             ///< The cost that is added to _cost_tile if the direction changes.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    20
	_cost_slope = null;            ///< The extra cost if a road tile is sloped.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    21
	_cost_bridge_per_tile = null;  ///< The cost per tile of a bridge.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    22
	_cost_tunnel_per_tile = null;  ///< The cost per tile of a tunnel.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    23
	_cost_coast = null;            ///< The extra cost for a coast tile.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    24
	_pathfinder = null;            ///< A reference to the used AyStar object.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    25
	_lowest_cost = null;           ///< min(_cost_tile, _cost_bridge_per_tile, _cost_tunnel_per_tile)
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    26
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    27
	cost = null;                   ///< Used to change the costs.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    28
	_running = null;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    29
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    30
	constructor()
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    31
	{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    32
		this._max_cost = 2000000000;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    33
		this._cost_tile = 100;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    34
		this._cost_no_existing_road = 40;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    35
		this._cost_turn = 100;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    36
		this._cost_slope = 200;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    37
		this._cost_bridge_per_tile = 105;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    38
		this._cost_tunnel_per_tile = 105;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    39
		this._cost_coast = 20;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    40
		this._pathfinder = this._aystar_class(this._Cost, this._Estimate, this._Neighbours, this, this, this);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    41
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    42
		this.cost = this.Cost(this);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    43
		this._running = false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    44
		this._lowest_cost = 0;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    45
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    46
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    47
	/**
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    48
	 * Initialize a path search between sources and goals.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    49
	 * @param sources The source nodes.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    50
	 * @param goals The target nodes.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    51
	 * @see AyStar::InitializePath()
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    52
	 */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    53
	function InitializePath(sources, goals) { this._pathfinder.InitializePath(sources, goals); }
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    54
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    55
	/**
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    56
	 * Try to find the path as indicated with InitializePath with the lowest cost.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    57
	 * @param iterations After how many iterations it should abort for a moment.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    58
	 *  This value should either be -1 for infinite, or > 0. Any other value
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    59
	 *  aborts immediatly and will never find a path.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    60
	 * @return A route if one was found, or false if the amount of iterations was
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    61
	 *  reached, or null if no path was found.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    62
	 *  You can call this function over and over as long as it returns false,
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    63
	 *  which is an indication it is not yet done looking for a route.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    64
	 * @see AyStar::FindPath()
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    65
	 */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    66
	function FindPath(iterations);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    67
}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    68
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    69
class Road.Cost
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    70
{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    71
	_main = null;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    72
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    73
	function _set(idx, val)
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    74
	{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    75
		if (this._main._running) throw("You are not allowed to change parameters of a running pathfinder.");
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    76
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    77
		switch (idx) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    78
			case "max_cost":         this._main._max_cost = val; break;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    79
			case "tile":             this._main._cost_tile = val; break;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    80
			case "no_existing_road": this._main._cost_no_existing_road = val; break;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    81
			case "turn":             this._main._cost_turn = val; break;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    82
			case "slope":            this._main._cost_slope = val; break;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    83
			case "bridge_per_tile":  this._main._cost_bridge_per_tile = val; break;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    84
			case "tunnel_per_tile":  this._main._cost_tunnel_per_tile = val; break;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    85
			case "coast":            this._main._cost_coast = val; break;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    86
			default: throw("the index '" + idx + "' does not exist");
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    87
		}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    88
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    89
		return val;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    90
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    91
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    92
	function _get(idx)
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    93
	{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    94
		switch (idx) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    95
			case "max_cost":         return this._main._max_cost;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    96
			case "tile":             return this._main._cost_tile;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    97
			case "no_existing_road": return this._main._cost_no_existing_road;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    98
			case "turn":             return this._main._cost_turn;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
    99
			case "slope":            return this._main._cost_slope;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   100
			case "bridge_per_tile":  return this._main._cost_bridge_per_tile;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   101
			case "tunnel_per_tile":  return this._main._cost_tunnel_per_tile;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   102
			case "coast":            return this._main._cost_coast;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   103
			default: throw("the index '" + idx + "' does not exist");
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   104
		}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   105
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   106
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   107
	function constructor(main)
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   108
	{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   109
		this._main = main;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   110
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   111
}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   112
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   113
function Road::FindPath(iterations)
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   114
{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   115
	this._lowest_cost = min(min(this._cost_tile, this._cost_bridge_per_tile), this._cost_tunnel_per_tile);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   116
	local ret = this._pathfinder.FindPath(iterations);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   117
	this._running = (ret == false) ? true : false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   118
	return ret;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   119
}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   120
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   121
function Road::_Cost(path, new_node, self)
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   122
{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   123
	/* path == null means this is the first node of a path, so the cost is 0. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   124
	if (path == null) return 0;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   125
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   126
	local prev_node = path.GetNode();
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   127
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   128
	/* If the new tile is a bridge / tunnel tile, check wether we came from the other
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   129
	 * end of the bridge / tunnel or if we just entered the bridge / tunnel. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   130
	if (AIBridge.IsBridgeTile(new_node)) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   131
		if (AIBridge.GetOtherBridgeEnd(new_node) != prev_node) return path.GetCost() + self._cost_tile;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   132
		return path.GetCost() + AIMap.DistanceManhattan(new_node, prev_node) * self._cost_bridge_per_tile;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   133
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   134
	if (AITunnel.IsTunnelTile(new_node)) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   135
		if (AITunnel.GetOtherTunnelEnd(new_node) != prev_node) return path.GetCost() + self._cost_tile;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   136
		return path.GetCost() + AIMap.DistanceManhattan(new_node, prev_node) * self._cost_tunnel_per_tile;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   137
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   138
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   139
	/* Check for a turn. We do this by substracting the TileID of the current node from
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   140
	 * the TileID of the previous node and comparing that to the difference between the
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   141
	 * previous node and the node before that. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   142
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   143
	local cost = self._cost_tile;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   144
	if (path.GetParent() != null && (prev_node - path.GetParent().GetNode()) != (new_node - prev_node)) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   145
		cost += self._cost_turn;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   146
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   147
	/* Check if the new tile is a coast tile. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   148
	if (AITile.IsCoastTile(new_node)) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   149
		cost += self._cost_coast;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   150
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   151
	/* Check if the last tile was sloped. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   152
	if (path.GetParent() != null && !AIBridge.IsBridgeTile(path.GetNode()) && !AITunnel.IsTunnelTile(path.GetNode()) &&
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   153
	    self._IsSlopedRoad(path.GetParent().GetNode(), path.GetNode(), new_node)) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   154
		cost += self._cost_slope;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   155
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   156
	if (!AIRoad.AreRoadTilesConnected(prev_node, new_node)) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   157
		cost += self._cost_no_existing_road;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   158
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   159
	return path.GetCost() + cost;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   160
}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   161
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   162
function Road::_Estimate(cur_tile, goal_tiles, self)
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   163
{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   164
	local min_cost = self._max_cost;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   165
	/* As estimate we multiply the lowest possible cost for a single tile with
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   166
	 * with the minimum number of tiles we need to traverse. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   167
	foreach (tile in goal_tiles) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   168
		min_cost = min(AIMap.DistanceManhattan(cur_tile, tile) * self._lowest_cost, min_cost);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   169
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   170
	return min_cost;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   171
}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   172
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   173
function Road::_Neighbours(path, cur_node, self)
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   174
{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   175
	/* self._max_cost is the maximum path cost, if we go over it, the path isn't valid. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   176
	if (path.GetCost() >= self._max_cost) return [];
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   177
	local tiles = [];
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   178
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   179
	/* Check if the current tile is part of a bridge or tunnel */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   180
	if ((AIBridge.IsBridgeTile(cur_node) || AITunnel.IsTunnelTile(cur_node)) &&
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   181
	     AITile.HasTransportType(cur_node, AITile.TRANSPORT_ROAD)) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   182
		local other_end = AIBridge.IsBridgeTile(cur_node) ? AIBridge.GetOtherBridgeEnd(cur_node) : AITunnel.GetOtherTunnelEnd(cur_node);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   183
		/* The other end of the bridge / tunnel is a neighbour. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   184
		tiles.push(other_end);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   185
		local next_tile = null;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   186
		if (other_end < cur_node) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   187
			if (other_end <= cur_node - AIMap.GetMapSizeX()) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   188
				next_tile = cur_node + AIMap.GetMapSizeX();
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   189
			} else {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   190
				next_tile = cur_node + 1;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   191
			}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   192
		} else {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   193
			if (other_end >= cur_node + AIMap.GetMapSizeX()) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   194
				next_tile = cur_node - AIMap.GetMapSizeX();
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   195
			} else {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   196
				next_tile = cur_node - 1;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   197
			}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   198
		}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   199
		if (AIRoad.AreRoadTilesConnected(cur_node, next_tile) || AITile.IsBuildable(next_tile) ||
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   200
				AIRoad.IsRoadTile(next_tile)) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   201
			tiles.push(next_tile);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   202
		}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   203
	} else {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   204
		local offsets = [AIMap.GetTileIndex(0,1), AIMap.GetTileIndex(0, -1),
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   205
		                 AIMap.GetTileIndex(1,0), AIMap.GetTileIndex(-1,0)];
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   206
		/* Check all tiles adjacent to the current tile. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   207
		foreach (offset in offsets) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   208
			local next_tile = cur_node + offset;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   209
			/* We add them to the to the neighbours-list if one of the following applies:
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   210
			 * 1) There already is a connections between the current tile and the next tile.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   211
			 * 2) We can build a road to the next tile.
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   212
			 * 3) The next tile is the entrance of a tunnel / bridge in the correct direction. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   213
			if (AIRoad.AreRoadTilesConnected(cur_node, next_tile)) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   214
				tiles.push(next_tile);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   215
			} else if ((AITile.IsBuildable(next_tile) || AIRoad.IsRoadTile(next_tile)) &&
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   216
					(path.GetParent() == null || self._CheckSlopes(path.GetParent().GetNode(), cur_node, next_tile))) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   217
				tiles.push(next_tile);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   218
			} else if (self._CheckTunnelBridge(cur_node, next_tile)) {
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   219
				tiles.push(next_tile);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   220
			}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   221
		}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   222
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   223
	return tiles;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   224
}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   225
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   226
function Road::_IsSlopedRoad(start, middle, end)
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   227
{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   228
	local NW = 0; //Set to true if we want to build a road to / from the north-west
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   229
	local NE = 0; //Set to true if we want to build a road to / from the north-east
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   230
	local SW = 0; //Set to true if we want to build a road to / from the south-west
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   231
	local SE = 0; //Set to true if we want to build a road to / from the south-east
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   232
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   233
	if (middle - AIMap.GetMapSizeX() == start || middle - AIMap.GetMapSizeX() == end) NW = 1;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   234
	if (middle - 1 == start || middle - 1 == end) NE = 1;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   235
	if (middle + AIMap.GetMapSizeX() == start || middle + AIMap.GetMapSizeX() == end) SE = 1;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   236
	if (middle + 1 == start || middle + 1 == end) SW = 1;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   237
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   238
	/* If there is a turn in the current tile, it can't be sloped. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   239
	if ((NW || SE) && (NE || SW)) return false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   240
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   241
	local slope = AITile.GetSlope(middle);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   242
	/* A road on a steep slope is always sloped. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   243
	if (AITile.IsSteepSlope(slope)) return true;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   244
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   245
	/* If only one corner is raised, the road is sloped. */
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   246
	if (slope == AITile.SLOPE_N || slope == AITile.SLOPE_W) return true;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   247
	if (slope == AITile.SLOPE_S || slope == AITile.SLOPE_E) return true;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   248
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   249
	if (NW && (slope == AITile.SLOPE_NW || slope == AITile.SLOPE_SE)) return true;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   250
	if (NE && (slope == AITile.SLOPE_NE || slope == AITile.SLOPE_SW)) return true;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   251
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   252
	return false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   253
}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   254
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   255
function Road::_CheckSlopes(start, middle, end)
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   256
{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   257
	local NW = 0; //Set to true if we want to build a road to / from the north-west
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   258
	local NE = 0; //Set to true if we want to build a road to / from the north-east
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   259
	local SW = 0; //Set to true if we want to build a road to / from the south-west
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   260
	local SE = 0; //Set to true if we want to build a road to / from the south-east
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   261
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   262
	if (middle - AIMap.GetMapSizeX() == start || middle - AIMap.GetMapSizeX() == end) NW = 1;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   263
	if (middle - 1 == start || middle - 1 == end) NE = 1;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   264
	if (middle + AIMap.GetMapSizeX() == start || middle + AIMap.GetMapSizeX() == end) SE = 1;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   265
	if (middle + 1 == start || middle + 1 == end) SW = 1;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   266
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   267
	{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   268
		local test_mode = AITestMode();
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   269
		if (!AIRoad.AreRoadTilesConnected(start, middle) && !AIRoad.BuildRoad(start, middle)) return false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   270
		if (!AIRoad.AreRoadTilesConnected(middle, end) && !AIRoad.BuildRoad(middle, end)) return false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   271
	}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   272
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   273
	if ((NW && SE) || (NE && SW)) return true;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   274
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   275
	local slope = AITile.GetSlope(middle);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   276
	if (AITile.IsSteepSlope(slope)) return false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   277
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   278
	if (slope == AITile.SLOPE_NS || slope == AITile.SLOPE_EW) return true;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   279
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   280
	if (NW && SW && (slope == AITile.SLOPE_E || slope == AITile.SLOPE_NE || slope == AITile.SLOPE_SE)) return false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   281
	if (NE && SE && (slope == AITile.SLOPE_W || slope == AITile.SLOPE_NW || slope == AITile.SLOPE_SW)) return false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   282
	if (NW && NE && (slope == AITile.SLOPE_S || slope == AITile.SLOPE_SE || slope == AITile.SLOPE_SW)) return false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   283
	if (SW && SE && (slope == AITile.SLOPE_N || slope == AITile.SLOPE_NE || slope == AITile.SLOPE_NW)) return false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   284
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   285
	return true;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   286
}
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   287
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   288
function Road::_CheckTunnelBridge(current_node, new_node)
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   289
{
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   290
	if (!AIBridge.IsBridgeTile(new_node) && !AITunnel.IsTunnelTile(new_node)) return false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   291
	local dir = new_node - current_node;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   292
	local other_end = AIBridge.IsBridgeTile(new_node) ? AIBridge.GetOtherBridgeEnd(new_node) : AITunnel.GetOtherTunnelEnd(new_node);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   293
	local dir2 = other_end - new_node;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   294
	if ((dir < 0 && dir2 > 0) || (dir > 0 && dir2 < 0)) return false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   295
	dir = abs(dir);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   296
	dir2 = abs(dir2);
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   297
	if ((dir >= AIMap.GetMapSizeX() && dir2 < AIMap.GetMapSizeX()) ||
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   298
	    (dir < AIMap.GetMapSizeX() && dir2 >= AIMap.GetMapSizeX())) return false;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   299
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   300
	return true;
5f5a5dd407d8 (svn r13497) [NoAI] -Add [Library]: pathfinder.road, a basic road pathfinder (no bridges/tunnels (yet)) (patch by Yexo, very nice job!)
truebrain
parents:
diff changeset
   301
}