src/ai/trolly/pathfinder.cpp
author rubidium
Tue, 25 Dec 2007 11:26:07 +0000
changeset 8627 448ebf3a8291
parent 8612 6414fc21c2f3
child 8635 3bbb6f87fced
permissions -rw-r--r--
(svn r11692) -Codechange: move some functions from 'functions.h' to a more logical place and remove about 50% of the includes of 'functions.h'
2186
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     1
/* $Id$ */
461a2aff3486 (svn r2701) Insert Id tags into all source files
tron
parents: 2163
diff changeset
     2
2381
de9053fe2a2c (svn r2907) -Codechange: splitted the AIs to their own directory. AINew becomes 'trolly', AIOld becomes 'default', both in their own dir in the 'ai' dir. More AIs to come.
truelight
parents: 2366
diff changeset
     3
#include "../../stdafx.h"
de9053fe2a2c (svn r2907) -Codechange: splitted the AIs to their own directory. AINew becomes 'trolly', AIOld becomes 'default', both in their own dir in the 'ai' dir. More AIs to come.
truelight
parents: 2366
diff changeset
     4
#include "../../openttd.h"
3234
986c30171e92 (svn r3907) Replace many bridge related direct map accesses with calls to shiny new functions and mark some strange constructs with XXX
tron
parents: 3184
diff changeset
     5
#include "../../bridge_map.h"
2381
de9053fe2a2c (svn r2907) -Codechange: splitted the AIs to their own directory. AINew becomes 'trolly', AIOld becomes 'default', both in their own dir in the 'ai' dir. More AIs to come.
truelight
parents: 2366
diff changeset
     6
#include "../../debug.h"
de9053fe2a2c (svn r2907) -Codechange: splitted the AIs to their own directory. AINew becomes 'trolly', AIOld becomes 'default', both in their own dir in the 'ai' dir. More AIs to come.
truelight
parents: 2366
diff changeset
     7
#include "../../map.h"
8612
6414fc21c2f3 (svn r11677) -Codechange: move price and command related types/functions to their respective places.
rubidium
parents: 8604
diff changeset
     8
#include "../../command_func.h"
2381
de9053fe2a2c (svn r2907) -Codechange: splitted the AIs to their own directory. AINew becomes 'trolly', AIOld becomes 'default', both in their own dir in the 'ai' dir. More AIs to come.
truelight
parents: 2366
diff changeset
     9
#include "trolly.h"
de9053fe2a2c (svn r2907) -Codechange: splitted the AIs to their own directory. AINew becomes 'trolly', AIOld becomes 'default', both in their own dir in the 'ai' dir. More AIs to come.
truelight
parents: 2366
diff changeset
    10
#include "../../depot.h"
3179
774b1e6553a7 (svn r3816) Use existing accessors
tron
parents: 3157
diff changeset
    11
#include "../../tunnel_map.h"
3359
d4316b1af327 (svn r4154) -Moved MAX_BRIDGES in bridge.h and made it an enum. This makes two drops ...
celestar
parents: 3234
diff changeset
    12
#include "../../bridge.h"
8579
3efbb430092e (svn r11644) -Codechange: merge some functions from tunnel_map.h and bridge_map.h into tunnelbridge_map.h
smatz
parents: 8424
diff changeset
    13
#include "../../tunnelbridge_map.h"
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2549
diff changeset
    14
#include "../ai.h"
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    15
8579
3efbb430092e (svn r11644) -Codechange: merge some functions from tunnel_map.h and bridge_map.h into tunnelbridge_map.h
smatz
parents: 8424
diff changeset
    16
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    17
#define TEST_STATION_NO_DIR 0xFF
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    18
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    19
// Tests if a station can be build on the given spot
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    20
// TODO: make it train compatible
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1962
diff changeset
    21
static bool TestCanBuildStationHere(TileIndex tile, byte dir)
1095
90220990fd7c (svn r1596) Add some more statics
tron
parents: 1047
diff changeset
    22
{
1962
51ee4f459268 (svn r2468) -Codechange: Got rid of DEREF_PLAYER and replaced it by GetPlayer
celestar
parents: 1891
diff changeset
    23
	Player *p = GetPlayer(_current_player);
1713
d970350410b2 (svn r2217) - Fix: [ 1184201 ] AI orders its vehicles to a competitor's truck stop. Added a CmdFailed() check to all command returns of the AI instead of the simple == / != CMD_ERROR check. This should fix the problem.
Darkvater
parents: 1617
diff changeset
    24
d970350410b2 (svn r2217) - Fix: [ 1184201 ] AI orders its vehicles to a competitor's truck stop. Added a CmdFailed() check to all command returns of the AI instead of the simple == / != CMD_ERROR check. This should fix the problem.
Darkvater
parents: 1617
diff changeset
    25
	if (dir == TEST_STATION_NO_DIR) {
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7218
diff changeset
    26
		CommandCost ret;
1713
d970350410b2 (svn r2217) - Fix: [ 1184201 ] AI orders its vehicles to a competitor's truck stop. Added a CmdFailed() check to all command returns of the AI instead of the simple == / != CMD_ERROR check. This should fix the problem.
Darkvater
parents: 1617
diff changeset
    27
		// TODO: currently we only allow spots that can be access from al 4 directions...
d970350410b2 (svn r2217) - Fix: [ 1184201 ] AI orders its vehicles to a competitor's truck stop. Added a CmdFailed() check to all command returns of the AI instead of the simple == / != CMD_ERROR check. This should fix the problem.
Darkvater
parents: 1617
diff changeset
    28
		//  should be fixed!!!
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
    29
		for (dir = 0; dir < 4; dir++) {
1713
d970350410b2 (svn r2217) - Fix: [ 1184201 ] AI orders its vehicles to a competitor's truck stop. Added a CmdFailed() check to all command returns of the AI instead of the simple == / != CMD_ERROR check. This should fix the problem.
Darkvater
parents: 1617
diff changeset
    30
			ret = AiNew_Build_Station(p, p->ainew.tbt, tile, 1, 1, dir, DC_QUERY_COST);
7442
a4f7989f27d4 (svn r10200) -Codechange: add "shortcut" for !CmdFailed (CmdSucceeded).
rubidium
parents: 7439
diff changeset
    31
			if (CmdSucceeded(ret)) return true;
1713
d970350410b2 (svn r2217) - Fix: [ 1184201 ] AI orders its vehicles to a competitor's truck stop. Added a CmdFailed() check to all command returns of the AI instead of the simple == / != CMD_ERROR check. This should fix the problem.
Darkvater
parents: 1617
diff changeset
    32
		}
d970350410b2 (svn r2217) - Fix: [ 1184201 ] AI orders its vehicles to a competitor's truck stop. Added a CmdFailed() check to all command returns of the AI instead of the simple == / != CMD_ERROR check. This should fix the problem.
Darkvater
parents: 1617
diff changeset
    33
		return false;
d970350410b2 (svn r2217) - Fix: [ 1184201 ] AI orders its vehicles to a competitor's truck stop. Added a CmdFailed() check to all command returns of the AI instead of the simple == / != CMD_ERROR check. This should fix the problem.
Darkvater
parents: 1617
diff changeset
    34
	}
d970350410b2 (svn r2217) - Fix: [ 1184201 ] AI orders its vehicles to a competitor's truck stop. Added a CmdFailed() check to all command returns of the AI instead of the simple == / != CMD_ERROR check. This should fix the problem.
Darkvater
parents: 1617
diff changeset
    35
d970350410b2 (svn r2217) - Fix: [ 1184201 ] AI orders its vehicles to a competitor's truck stop. Added a CmdFailed() check to all command returns of the AI instead of the simple == / != CMD_ERROR check. This should fix the problem.
Darkvater
parents: 1617
diff changeset
    36
	// return true if command succeeded, so the inverse of CmdFailed()
7442
a4f7989f27d4 (svn r10200) -Codechange: add "shortcut" for !CmdFailed (CmdSucceeded).
rubidium
parents: 7439
diff changeset
    37
	return CmdSucceeded(AiNew_Build_Station(p, p->ainew.tbt, tile, 1, 1, dir, DC_QUERY_COST));
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    38
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    39
1047
d4c04332d837 (svn r1548) Move AI_PATHFINDER_IS_ROAD from ai.h to ai_pathfinder.c to avoid global namespace pollution, turn it into a function called IsRoad and improve the commments a bit
tron
parents: 1035
diff changeset
    40
d4c04332d837 (svn r1548) Move AI_PATHFINDER_IS_ROAD from ai.h to ai_pathfinder.c to avoid global namespace pollution, turn it into a function called IsRoad and improve the commments a bit
tron
parents: 1035
diff changeset
    41
static bool IsRoad(TileIndex tile)
d4c04332d837 (svn r1548) Move AI_PATHFINDER_IS_ROAD from ai.h to ai_pathfinder.c to avoid global namespace pollution, turn it into a function called IsRoad and improve the commments a bit
tron
parents: 1035
diff changeset
    42
{
d4c04332d837 (svn r1548) Move AI_PATHFINDER_IS_ROAD from ai.h to ai_pathfinder.c to avoid global namespace pollution, turn it into a function called IsRoad and improve the commments a bit
tron
parents: 1035
diff changeset
    43
	return
7866
e19fda04e8d3 (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 7831
diff changeset
    44
		// MP_ROAD, but not a road depot?
e19fda04e8d3 (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 7831
diff changeset
    45
		(IsTileType(tile, MP_ROAD) && !IsTileDepotType(tile, TRANSPORT_ROAD)) ||
8584
a8b6dffead63 (svn r11649) -Codechange: some code can be simplified thanks to changes in r11642
smatz
parents: 8579
diff changeset
    46
		(IsTileType(tile, MP_TUNNELBRIDGE) && GetTunnelBridgeTransportType(tile) == TRANSPORT_ROAD);
1047
d4c04332d837 (svn r1548) Move AI_PATHFINDER_IS_ROAD from ai.h to ai_pathfinder.c to avoid global namespace pollution, turn it into a function called IsRoad and improve the commments a bit
tron
parents: 1035
diff changeset
    47
}
d4c04332d837 (svn r1548) Move AI_PATHFINDER_IS_ROAD from ai.h to ai_pathfinder.c to avoid global namespace pollution, turn it into a function called IsRoad and improve the commments a bit
tron
parents: 1035
diff changeset
    48
d4c04332d837 (svn r1548) Move AI_PATHFINDER_IS_ROAD from ai.h to ai_pathfinder.c to avoid global namespace pollution, turn it into a function called IsRoad and improve the commments a bit
tron
parents: 1035
diff changeset
    49
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    50
// Checks if a tile 'a' is between the tiles 'b' and 'c'
926
bd4312619522 (svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents: 906
diff changeset
    51
#define TILES_BETWEEN(a, b, c) (TileX(a) >= TileX(b) && TileX(a) <= TileX(c) && TileY(a) >= TileY(b) && TileY(a) <= TileY(c))
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    52
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
    53
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    54
// Check if the current tile is in our end-area
1617
55878ca5ada9 (svn r2121) -Fix: changed the 2nd param of AyStar_EndNodeCheck back to what it should be
truelight
parents: 1494
diff changeset
    55
static int32 AyStar_AiPathFinder_EndNodeCheck(AyStar *aystar, OpenListNode *current)
1095
90220990fd7c (svn r1596) Add some more statics
tron
parents: 1047
diff changeset
    56
{
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    57
	const Ai_PathFinderInfo* PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
4000
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3644
diff changeset
    58
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    59
	// It is not allowed to have a station on the end of a bridge or tunnel ;)
1617
55878ca5ada9 (svn r2121) -Fix: changed the 2nd param of AyStar_EndNodeCheck back to what it should be
truelight
parents: 1494
diff changeset
    60
	if (current->path.node.user_data[0] != 0) return AYSTAR_DONE;
55878ca5ada9 (svn r2121) -Fix: changed the 2nd param of AyStar_EndNodeCheck back to what it should be
truelight
parents: 1494
diff changeset
    61
	if (TILES_BETWEEN(current->path.node.tile, PathFinderInfo->end_tile_tl, PathFinderInfo->end_tile_br))
55878ca5ada9 (svn r2121) -Fix: changed the 2nd param of AyStar_EndNodeCheck back to what it should be
truelight
parents: 1494
diff changeset
    62
		if (IsTileType(current->path.node.tile, MP_CLEAR) || IsTileType(current->path.node.tile, MP_TREES))
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
    63
			if (current->path.parent == NULL || TestCanBuildStationHere(current->path.node.tile, AiNew_GetDirection(current->path.parent->node.tile, current->path.node.tile)))
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
    64
				return AYSTAR_FOUND_END_NODE;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
    65
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    66
	return AYSTAR_DONE;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    67
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    68
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
    69
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    70
// Calculates the hash
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    71
//   Currently it is a 10 bit hash, so the hash array has a max depth of 6 bits (so 64)
1095
90220990fd7c (svn r1596) Add some more statics
tron
parents: 1047
diff changeset
    72
static uint AiPathFinder_Hash(uint key1, uint key2)
90220990fd7c (svn r1596) Add some more statics
tron
parents: 1047
diff changeset
    73
{
926
bd4312619522 (svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents: 906
diff changeset
    74
	return (TileX(key1) & 0x1F) + ((TileY(key1) & 0x1F) << 5);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    75
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    76
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
    77
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    78
// Clear the memory of all the things
1095
90220990fd7c (svn r1596) Add some more statics
tron
parents: 1047
diff changeset
    79
static void AyStar_AiPathFinder_Free(AyStar *aystar)
90220990fd7c (svn r1596) Add some more statics
tron
parents: 1047
diff changeset
    80
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    81
	AyStarMain_Free(aystar);
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    82
	delete aystar;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    83
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    84
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
    85
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    86
static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current, OpenListNode *parent);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    87
static int32 AyStar_AiPathFinder_CalculateH(AyStar *aystar, AyStarNode *current, OpenListNode *parent);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    88
static void AyStar_AiPathFinder_FoundEndNode(AyStar *aystar, OpenListNode *current);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    89
static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *current);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    90
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
    91
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    92
// This creates the AiPathFinder
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
    93
AyStar *new_AyStar_AiPathFinder(int max_tiles_around, Ai_PathFinderInfo *PathFinderInfo)
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
    94
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    95
	PathNode start_node;
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
    96
	uint x;
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
    97
	uint y;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    98
	// Create AyStar
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
    99
	AyStar *result = new AyStar();
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   100
	init_AyStar(result, AiPathFinder_Hash, 1 << 10);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   101
	// Set the function pointers
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   102
	result->CalculateG = AyStar_AiPathFinder_CalculateG;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   103
	result->CalculateH = AyStar_AiPathFinder_CalculateH;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   104
	result->EndNodeCheck = AyStar_AiPathFinder_EndNodeCheck;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   105
	result->FoundEndNode = AyStar_AiPathFinder_FoundEndNode;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   106
	result->GetNeighbours = AyStar_AiPathFinder_GetNeighbours;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   107
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   108
	result->free = AyStar_AiPathFinder_Free;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   109
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   110
	// Set some information
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   111
	result->loops_per_tick = AI_PATHFINDER_LOOPS_PER_TICK;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   112
	result->max_path_cost = 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   113
	result->max_search_nodes = AI_PATHFINDER_MAX_SEARCH_NODES;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   114
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   115
	// Set the user_data to the PathFinderInfo
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   116
	result->user_target = PathFinderInfo;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   117
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   118
	// Set the start node
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   119
	start_node.parent = NULL;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   120
	start_node.node.direction = 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   121
	start_node.node.user_data[0] = 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   122
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   123
	// Now we add all the starting tiles
926
bd4312619522 (svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents: 906
diff changeset
   124
	for (x = TileX(PathFinderInfo->start_tile_tl); x <= TileX(PathFinderInfo->start_tile_br); x++) {
bd4312619522 (svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents: 906
diff changeset
   125
		for (y = TileY(PathFinderInfo->start_tile_tl); y <= TileY(PathFinderInfo->start_tile_br); y++) {
1981
de031d2aed47 (svn r2487) Replace TILE_XY by TileXY/TileDiffXY
tron
parents: 1977
diff changeset
   126
			start_node.node.tile = TileXY(x, y);
1777
d328484bd6f2 (svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents: 1729
diff changeset
   127
			result->addstart(result, &start_node.node, 0);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   128
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   129
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   130
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   131
	return result;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   132
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   133
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   134
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   135
// To reuse AyStar we sometimes have to clean all the memory
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   136
void clean_AyStar_AiPathFinder(AyStar *aystar, Ai_PathFinderInfo *PathFinderInfo)
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   137
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   138
	PathNode start_node;
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   139
	uint x;
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   140
	uint y;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   141
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   142
	aystar->clear(aystar);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   143
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   144
	// Set the user_data to the PathFinderInfo
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   145
	aystar->user_target = PathFinderInfo;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   146
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   147
	// Set the start node
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   148
	start_node.parent = NULL;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   149
	start_node.node.direction = 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   150
	start_node.node.user_data[0] = 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   151
	start_node.node.tile = PathFinderInfo->start_tile_tl;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   152
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   153
	// Now we add all the starting tiles
926
bd4312619522 (svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents: 906
diff changeset
   154
	for (x = TileX(PathFinderInfo->start_tile_tl); x <= TileX(PathFinderInfo->start_tile_br); x++) {
bd4312619522 (svn r1414) Move TileIndex, TILE_MASK and GET_TILE_[XY] to map.h and turn the latter into inline functions names Tile[XY]
tron
parents: 906
diff changeset
   155
		for (y = TileY(PathFinderInfo->start_tile_tl); y <= TileY(PathFinderInfo->start_tile_br); y++) {
4000
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3644
diff changeset
   156
			TileIndex tile = TileXY(x, y);
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3644
diff changeset
   157
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3644
diff changeset
   158
			if (!IsTileType(tile, MP_CLEAR) && !IsTileType(tile, MP_TREES)) continue;
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3644
diff changeset
   159
			if (!TestCanBuildStationHere(tile, TEST_STATION_NO_DIR)) continue;
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3644
diff changeset
   160
			start_node.node.tile = tile;
1777
d328484bd6f2 (svn r2281) - Fix: [ 1115204 ] [NPF] When pressing the goto depot button, trains will now also look behind it if there is no depot in front. If so, the train reverses immediately. This also work anywhere, not just at stations.
matthijs
parents: 1729
diff changeset
   161
			aystar->addstart(aystar, &start_node.node, 0);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   162
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   163
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   164
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   165
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   166
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   167
// The h-value, simple calculation
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   168
static int32 AyStar_AiPathFinder_CalculateH(AyStar *aystar, AyStarNode *current, OpenListNode *parent)
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   169
{
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   170
	const Ai_PathFinderInfo* PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   171
	int r, r2;
4000
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3644
diff changeset
   172
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   173
	if (PathFinderInfo->end_direction != AI_PATHFINDER_NO_DIRECTION) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   174
		// The station is pointing to a direction, add a tile towards that direction, so the H-value is more accurate
4559
c853d2440065 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4077
diff changeset
   175
		r = DistanceManhattan(current->tile, PathFinderInfo->end_tile_tl + TileOffsByDiagDir(PathFinderInfo->end_direction));
c853d2440065 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4077
diff changeset
   176
		r2 = DistanceManhattan(current->tile, PathFinderInfo->end_tile_br + TileOffsByDiagDir(PathFinderInfo->end_direction));
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   177
	} else {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   178
		// No direction, so just get the fastest route to the station
1245
768d9bc95aaa (svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents: 1209
diff changeset
   179
		r = DistanceManhattan(current->tile, PathFinderInfo->end_tile_tl);
768d9bc95aaa (svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents: 1209
diff changeset
   180
		r2 = DistanceManhattan(current->tile, PathFinderInfo->end_tile_br);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   181
	}
826
0e2b569b737b (svn r1297) Language fixes in the source.. (ln-)
miham
parents: 679
diff changeset
   182
	// See if the bottomright is faster than the topleft..
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   183
	if (r2 < r) r = r2;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   184
	return r * AI_PATHFINDER_H_MULTIPLER;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   185
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   186
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   187
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   188
// We found the end.. let's get the route back and put it in an array
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   189
static void AyStar_AiPathFinder_FoundEndNode(AyStar *aystar, OpenListNode *current)
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   190
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   191
	Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
959
b031d88c76f3 (svn r1451) Fix some of the signed/unsigned comparison warnings
tron
parents: 926
diff changeset
   192
	uint i = 0;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   193
	PathNode *parent = &current->path;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   194
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   195
	do {
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   196
		PathFinderInfo->route_extra[i] = parent->node.user_data[0];
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   197
		PathFinderInfo->route[i++] = parent->node.tile;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   198
		if (i > lengthof(PathFinderInfo->route)) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   199
			// We ran out of space for the PathFinder
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 4559
diff changeset
   200
			DEBUG(ai, 0, "No more space in pathfinder route[] array");
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   201
			PathFinderInfo->route_length = -1; // -1 indicates out of space
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   202
			return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   203
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   204
		parent = parent->parent;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   205
	} while (parent != NULL);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   206
	PathFinderInfo->route_length = i;
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 4559
diff changeset
   207
	DEBUG(ai, 1, "Found route of %d nodes long in %d nodes of searching", i, Hash_Size(&aystar->ClosedListHash));
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   208
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   209
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   210
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   211
// What tiles are around us.
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   212
static void AyStar_AiPathFinder_GetNeighbours(AyStar *aystar, OpenListNode *current)
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   213
{
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7218
diff changeset
   214
	CommandCost ret;
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   215
	int dir;
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   216
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   217
	Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   218
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   219
	aystar->num_neighbours = 0;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   220
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   221
	// Go through all surrounding tiles and check if they are within the limits
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   222
	for (DiagDirection i = DIAGDIR_BEGIN; i < DIAGDIR_END; i++) {
1716
943f28e3f2a0 (svn r2220) Put two TileIndices into temporary variables to improve readability
tron
parents: 1714
diff changeset
   223
		TileIndex ctile = current->path.node.tile; // Current tile
4559
c853d2440065 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4077
diff changeset
   224
		TileIndex atile = ctile + TileOffsByDiagDir(i); // Adjacent tile
1716
943f28e3f2a0 (svn r2220) Put two TileIndices into temporary variables to improve readability
tron
parents: 1714
diff changeset
   225
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   226
		if (TileX(atile) > 1 && TileX(atile) < MapMaxX() - 1 &&
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   227
				TileY(atile) > 1 && TileY(atile) < MapMaxY() - 1) {
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   228
			// We also directly test if the current tile can connect to this tile..
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   229
			//  We do this simply by just building the tile!
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   230
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   231
			// If the next step is a bridge, we have to enter it the right way
1716
943f28e3f2a0 (svn r2220) Put two TileIndices into temporary variables to improve readability
tron
parents: 1714
diff changeset
   232
			if (!PathFinderInfo->rail_or_road && IsRoad(atile)) {
943f28e3f2a0 (svn r2220) Put two TileIndices into temporary variables to improve readability
tron
parents: 1714
diff changeset
   233
				if (IsTileType(atile, MP_TUNNELBRIDGE)) {
8584
a8b6dffead63 (svn r11649) -Codechange: some code can be simplified thanks to changes in r11642
smatz
parents: 8579
diff changeset
   234
					if (GetTunnelBridgeDirection(atile) != i) continue;
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   235
				}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   236
			}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   237
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   238
			if ((AI_PATHFINDER_FLAG_BRIDGE & current->path.node.user_data[0]) != 0 ||
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   239
					(AI_PATHFINDER_FLAG_TUNNEL & current->path.node.user_data[0]) != 0) {
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   240
				// We are a bridge/tunnel, how cool!!
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   241
				//  This means we can only point forward.. get the direction from the user_data
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   242
				if ((uint)i != (current->path.node.user_data[0] >> 8)) continue;
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   243
			}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   244
			dir = 0;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   245
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   246
			// First, check if we have a parent
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   247
			if (current->path.parent == NULL && current->path.node.user_data[0] == 0) {
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   248
				// If not, this means we are at the starting station
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   249
				if (PathFinderInfo->start_direction != AI_PATHFINDER_NO_DIRECTION) {
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   250
					// We do need a direction?
1716
943f28e3f2a0 (svn r2220) Put two TileIndices into temporary variables to improve readability
tron
parents: 1714
diff changeset
   251
					if (AiNew_GetDirection(ctile, atile) != PathFinderInfo->start_direction) {
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   252
						// We are not pointing the right way, invalid tile
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   253
						continue;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   254
					}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   255
				}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   256
			} else if (current->path.node.user_data[0] == 0) {
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   257
				if (PathFinderInfo->rail_or_road) {
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   258
					// Rail check
1716
943f28e3f2a0 (svn r2220) Put two TileIndices into temporary variables to improve readability
tron
parents: 1714
diff changeset
   259
					dir = AiNew_GetRailDirection(current->path.parent->node.tile, ctile, atile);
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2549
diff changeset
   260
					ret = AI_DoCommand(ctile, 0, dir, DC_AUTO | DC_NO_WATER, CMD_BUILD_SINGLE_RAIL);
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   261
					if (CmdFailed(ret)) continue;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   262
#ifdef AI_PATHFINDER_NO_90DEGREES_TURN
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   263
					if (current->path.parent->parent != NULL) {
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   264
						// Check if we don't make a 90degree curve
1716
943f28e3f2a0 (svn r2220) Put two TileIndices into temporary variables to improve readability
tron
parents: 1714
diff changeset
   265
						int dir1 = AiNew_GetRailDirection(current->path.parent->parent->node.tile, current->path.parent->node.tile, ctile);
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   266
						if (_illegal_curves[dir1] == dir || _illegal_curves[dir] == dir1) {
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   267
							continue;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   268
						}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   269
					}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   270
#endif
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   271
				} else {
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   272
					// Road check
1716
943f28e3f2a0 (svn r2220) Put two TileIndices into temporary variables to improve readability
tron
parents: 1714
diff changeset
   273
					dir = AiNew_GetRoadDirection(current->path.parent->node.tile, ctile, atile);
943f28e3f2a0 (svn r2220) Put two TileIndices into temporary variables to improve readability
tron
parents: 1714
diff changeset
   274
					if (IsRoad(ctile)) {
943f28e3f2a0 (svn r2220) Put two TileIndices into temporary variables to improve readability
tron
parents: 1714
diff changeset
   275
						if (IsTileType(ctile, MP_TUNNELBRIDGE)) {
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   276
							// We have a bridge, how nicely! We should mark it...
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   277
							dir = 0;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   278
						} else {
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   279
							// It already has road.. check if we miss any bits!
7218
be09ee05aa14 (svn r9954) -Fix [FS#811]: trolley AI crashed when trying to determine what the roadbits are.
rubidium
parents: 7177
diff changeset
   280
							if ((GetAnyRoadBits(ctile, ROADTYPE_ROAD) & dir) != dir) {
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   281
								// We do miss some pieces :(
7218
be09ee05aa14 (svn r9954) -Fix [FS#811]: trolley AI crashed when trying to determine what the roadbits are.
rubidium
parents: 7177
diff changeset
   282
								dir &= ~GetAnyRoadBits(ctile, ROADTYPE_ROAD);
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   283
							} else {
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   284
								dir = 0;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   285
							}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   286
						}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   287
					}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   288
					// Only destruct things if it is MP_CLEAR of MP_TREES
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   289
					if (dir != 0) {
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2549
diff changeset
   290
						ret = AI_DoCommand(ctile, dir, 0, DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD);
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   291
						if (CmdFailed(ret)) continue;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   292
					}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   293
				}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   294
			}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   295
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   296
			// The tile can be connected
1716
943f28e3f2a0 (svn r2220) Put two TileIndices into temporary variables to improve readability
tron
parents: 1714
diff changeset
   297
			aystar->neighbours[aystar->num_neighbours].tile = atile;
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   298
			aystar->neighbours[aystar->num_neighbours].user_data[0] = 0;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   299
			aystar->neighbours[aystar->num_neighbours++].direction = 0;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   300
		}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   301
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   302
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   303
	// Next step, check for bridges and tunnels
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   304
	if (current->path.parent != NULL && current->path.node.user_data[0] == 0) {
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   305
		// First we get the dir from this tile and his parent
3644
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   306
		DiagDirection dir = AiNew_GetDirection(current->path.parent->node.tile, current->path.node.tile);
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   307
		// It means we can only walk with the track, so the bridge has to be in the same direction
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   308
		TileIndex tile = current->path.node.tile;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   309
		TileIndex new_tile = tile;
3644
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   310
		Slope tileh = GetTileSlope(tile, NULL);
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   311
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   312
		// Bridges can only be build on land that is not flat
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   313
		//  And if there is a road or rail blocking
3644
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   314
		if (tileh != SLOPE_FLAT ||
7866
e19fda04e8d3 (svn r10733) -Codechange: change MP_STREET into MP_ROAD as we use the word "road" everywhere except in the tile type.
rubidium
parents: 7831
diff changeset
   315
				(PathFinderInfo->rail_or_road && IsTileType(tile + TileOffsByDiagDir(dir), MP_ROAD)) ||
4559
c853d2440065 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4077
diff changeset
   316
				(!PathFinderInfo->rail_or_road && IsTileType(tile + TileOffsByDiagDir(dir), MP_RAILWAY))) {
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   317
			for (;;) {
4559
c853d2440065 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4077
diff changeset
   318
				new_tile += TileOffsByDiagDir(dir);
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   319
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   320
				// Precheck, is the length allowed?
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   321
				if (!CheckBridge_Stuff(0, GetBridgeLength(tile, new_tile))) break;
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   322
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   323
				// Check if we hit the station-tile.. we don't like that!
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   324
				if (TILES_BETWEEN(new_tile, PathFinderInfo->end_tile_tl, PathFinderInfo->end_tile_br)) break;
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   325
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   326
				// Try building the bridge..
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2549
diff changeset
   327
				ret = AI_DoCommand(tile, new_tile, (0 << 8) + (MAX_BRIDGES / 2), DC_AUTO, CMD_BUILD_BRIDGE);
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   328
				if (CmdFailed(ret)) continue;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   329
				// We can build a bridge here.. add him to the neighbours
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   330
				aystar->neighbours[aystar->num_neighbours].tile = new_tile;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   331
				aystar->neighbours[aystar->num_neighbours].user_data[0] = AI_PATHFINDER_FLAG_BRIDGE + (dir << 8);
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   332
				aystar->neighbours[aystar->num_neighbours++].direction = 0;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   333
				// We can only have 12 neighbours, and we need 1 left for tunnels
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   334
				if (aystar->num_neighbours == 11) break;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   335
			}
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   336
		}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   337
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   338
		// Next, check for tunnels!
3644
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   339
		// Tunnels can only be built on slopes corresponding to the direction
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   340
		//  For now, we check both sides for this tile.. terraforming gives fuzzy result
3644
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   341
		if ((dir == DIAGDIR_NE && tileh == SLOPE_NE) ||
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   342
				(dir == DIAGDIR_SE && tileh == SLOPE_SE) ||
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   343
				(dir == DIAGDIR_SW && tileh == SLOPE_SW) ||
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   344
				(dir == DIAGDIR_NW && tileh == SLOPE_NW)) {
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   345
			// Now simply check if a tunnel can be build
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2549
diff changeset
   346
			ret = AI_DoCommand(tile, (PathFinderInfo->rail_or_road?0:0x200), 0, DC_AUTO, CMD_BUILD_TUNNEL);
3055
25fd76668365 (svn r3644) Don't use FindLandscapeHeightByTile() when it's overkill - often it was just a complicated way of writing GetTileSlope(tile, NULL)
tron
parents: 3033
diff changeset
   347
			tileh = GetTileSlope(_build_tunnel_endtile, NULL);
7442
a4f7989f27d4 (svn r10200) -Codechange: add "shortcut" for !CmdFailed (CmdSucceeded).
rubidium
parents: 7439
diff changeset
   348
			if (CmdSucceeded(ret) && (tileh == SLOPE_SW || tileh == SLOPE_SE || tileh == SLOPE_NW || tileh == SLOPE_NE)) {
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   349
				aystar->neighbours[aystar->num_neighbours].tile = _build_tunnel_endtile;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   350
				aystar->neighbours[aystar->num_neighbours].user_data[0] = AI_PATHFINDER_FLAG_TUNNEL + (dir << 8);
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   351
				aystar->neighbours[aystar->num_neighbours++].direction = 0;
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   352
			}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   353
		}
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   354
	}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   355
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   356
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   357
7831
5dded9b03500 (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7801
diff changeset
   358
extern Foundation GetRailFoundation(Slope tileh, TrackBits bits); // XXX function declaration in .c
5dded9b03500 (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7801
diff changeset
   359
extern Foundation GetRoadFoundation(Slope tileh, RoadBits bits); // XXX function declaration in .c
5dded9b03500 (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7801
diff changeset
   360
extern Foundation GetBridgeFoundation(Slope tileh, Axis); // XXX function declaration in .c
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6336
diff changeset
   361
enum BridgeFoundation {
1714
2b8e37f8f18c (svn r2218) Indentation
tron
parents: 1713
diff changeset
   362
	BRIDGE_NO_FOUNDATION = 1 << 0 | 1 << 3 | 1 << 6 | 1 << 9 | 1 << 12,
6574
e1d1a12faaf7 (svn r9051) -Codechange: typedef [enum|struct] Y {} X; -> [enum|struct] X {};
rubidium
parents: 6336
diff changeset
   363
};
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   364
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   365
// The most important function: it calculates the g-value
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   366
static int32 AyStar_AiPathFinder_CalculateG(AyStar *aystar, AyStarNode *current, OpenListNode *parent)
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   367
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   368
	Ai_PathFinderInfo *PathFinderInfo = (Ai_PathFinderInfo*)aystar->user_target;
7831
5dded9b03500 (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7801
diff changeset
   369
	int res = 0;
3644
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   370
	Slope tileh = GetTileSlope(current->tile, NULL);
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   371
	Slope parent_tileh = GetTileSlope(parent->path.node.tile, NULL);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   372
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   373
	// Check if we hit the end-tile
1729
d27130c7d9ef (svn r2233) Bracing, whitespace, indendation
tron
parents: 1716
diff changeset
   374
	if (TILES_BETWEEN(current->tile, PathFinderInfo->end_tile_tl, PathFinderInfo->end_tile_br)) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   375
		// We are at the end-tile, check if we had a direction or something...
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   376
		if (PathFinderInfo->end_direction != AI_PATHFINDER_NO_DIRECTION && AiNew_GetDirection(current->tile, parent->path.node.tile) != PathFinderInfo->end_direction) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   377
			// We are not pointing the right way, invalid tile
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   378
			return AYSTAR_INVALID_NODE;
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   379
		}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   380
		// If it was valid, drop out.. we don't build on the endtile
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   381
		return 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   382
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   383
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   384
	// Give everything a small penalty
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   385
	res += AI_PATHFINDER_PENALTY;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   386
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   387
	if (!PathFinderInfo->rail_or_road) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   388
		// Road has the lovely advantage it can use other road... check if
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   389
		//  the current tile is road, and if so, give a good bonus
1047
d4c04332d837 (svn r1548) Move AI_PATHFINDER_IS_ROAD from ai.h to ai_pathfinder.c to avoid global namespace pollution, turn it into a function called IsRoad and improve the commments a bit
tron
parents: 1035
diff changeset
   390
		if (IsRoad(current->tile)) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   391
			res -= AI_PATHFINDER_ROAD_ALREADY_EXISTS_BONUS;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   392
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   393
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   394
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   395
	// We should give a penalty when the tile is going up or down.. this is one way to do so!
1494
36882c64a497 (svn r1998) Give penalty 100 to the AI for using foundations (buildonslopes). This prevents it from building long road lines on foundations unless really necessary.
pasky
parents: 1459
diff changeset
   396
	//  Too bad we have to count it from the parent.. but that is not so bad.
36882c64a497 (svn r1998) Give penalty 100 to the AI for using foundations (buildonslopes). This prevents it from building long road lines on foundations unless really necessary.
pasky
parents: 1459
diff changeset
   397
	// We also dislike long routes on slopes, since they do not look too realistic
36882c64a497 (svn r1998) Give penalty 100 to the AI for using foundations (buildonslopes). This prevents it from building long road lines on foundations unless really necessary.
pasky
parents: 1459
diff changeset
   398
	//  when there is a flat land all around, they are more expensive to build, and
36882c64a497 (svn r1998) Give penalty 100 to the AI for using foundations (buildonslopes). This prevents it from building long road lines on foundations unless really necessary.
pasky
parents: 1459
diff changeset
   399
	//  especially they essentially block the ability to connect or cross the road
36882c64a497 (svn r1998) Give penalty 100 to the AI for using foundations (buildonslopes). This prevents it from building long road lines on foundations unless really necessary.
pasky
parents: 1459
diff changeset
   400
	//  from one side.
3644
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   401
	if (parent_tileh != SLOPE_FLAT && parent->path.parent != NULL) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   402
		// Skip if the tile was from a bridge or tunnel
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   403
		if (parent->path.node.user_data[0] == 0 && current->user_data[0] == 0) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   404
			if (PathFinderInfo->rail_or_road) {
7831
5dded9b03500 (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7801
diff changeset
   405
				Foundation f = GetRailFoundation(parent_tileh, (TrackBits)(1 << AiNew_GetRailDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile)));
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   406
				// Maybe is BRIDGE_NO_FOUNDATION a bit strange here, but it contains just the right information..
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7929
diff changeset
   407
				if (IsInclinedFoundation(f) || (!IsFoundation(f) && HasBit(BRIDGE_NO_FOUNDATION, parent_tileh))) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   408
					res += AI_PATHFINDER_TILE_GOES_UP_PENALTY;
1494
36882c64a497 (svn r1998) Give penalty 100 to the AI for using foundations (buildonslopes). This prevents it from building long road lines on foundations unless really necessary.
pasky
parents: 1459
diff changeset
   409
				} else {
36882c64a497 (svn r1998) Give penalty 100 to the AI for using foundations (buildonslopes). This prevents it from building long road lines on foundations unless really necessary.
pasky
parents: 1459
diff changeset
   410
					res += AI_PATHFINDER_FOUNDATION_PENALTY;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   411
				}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   412
			} else {
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
   413
				if (!IsRoad(parent->path.node.tile) || !IsTileType(parent->path.node.tile, MP_TUNNELBRIDGE)) {
7831
5dded9b03500 (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7801
diff changeset
   414
					Foundation f = GetRoadFoundation(parent_tileh, (RoadBits)AiNew_GetRoadDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile));
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7929
diff changeset
   415
					if (IsInclinedFoundation(f) || (!IsFoundation(f) && HasBit(BRIDGE_NO_FOUNDATION, parent_tileh))) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   416
						res += AI_PATHFINDER_TILE_GOES_UP_PENALTY;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
   417
					} else {
1494
36882c64a497 (svn r1998) Give penalty 100 to the AI for using foundations (buildonslopes). This prevents it from building long road lines on foundations unless really necessary.
pasky
parents: 1459
diff changeset
   418
						res += AI_PATHFINDER_FOUNDATION_PENALTY;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
   419
					}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   420
				}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   421
			}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   422
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   423
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   424
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   425
	// Are we part of a tunnel?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   426
	if ((AI_PATHFINDER_FLAG_TUNNEL & current->user_data[0]) != 0) {
7831
5dded9b03500 (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7801
diff changeset
   427
		int r;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   428
		// Tunnels are very expensive when build on long routes..
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   429
		// Ironicly, we are using BridgeCode here ;)
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   430
		r = AI_PATHFINDER_TUNNEL_PENALTY * GetBridgeLength(current->tile, parent->path.node.tile);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   431
		res += r + (r >> 8);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   432
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   433
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   434
	// Are we part of a bridge?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   435
	if ((AI_PATHFINDER_FLAG_BRIDGE & current->user_data[0]) != 0) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   436
		// That means for every length a penalty
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   437
		res += AI_PATHFINDER_BRIDGE_PENALTY * GetBridgeLength(current->tile, parent->path.node.tile);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   438
		// Check if we are going up or down, first for the starting point
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   439
		// In user_data[0] is at the 8th bit the direction
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7929
diff changeset
   440
		if (!HasBit(BRIDGE_NO_FOUNDATION, parent_tileh)) {
7831
5dded9b03500 (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7801
diff changeset
   441
			if (IsLeveledFoundation(GetBridgeFoundation(parent_tileh, (Axis)((current->user_data[0] >> 8) & 1)))) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   442
				res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
4000
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3644
diff changeset
   443
			}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   444
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   445
		// Second for the end point
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 7929
diff changeset
   446
		if (!HasBit(BRIDGE_NO_FOUNDATION, tileh)) {
7831
5dded9b03500 (svn r10698) -Codechange [FS#1082]: simplify the code related to foundations. Primarily removal of (duplicated|magic) code and introduction of few helper functions to ease foundation determination. Patch by frosch.
rubidium
parents: 7801
diff changeset
   447
			if (IsLeveledFoundation(GetBridgeFoundation(tileh, (Axis)((current->user_data[0] >> 8) & 1)))) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   448
				res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
4000
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3644
diff changeset
   449
			}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   450
		}
3644
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   451
		if (parent_tileh == SLOPE_FLAT) res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3484
diff changeset
   452
		if (tileh == SLOPE_FLAT) res += AI_PATHFINDER_BRIDGE_GOES_UP_PENALTY;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   453
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   454
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   455
	//  To prevent the AI from taking the fastest way in tiles, but not the fastest way
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   456
	//    in speed, we have to give a good penalty to direction changing
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   457
	//  This way, we get almost the fastest way in tiles, and a very good speed on the track
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   458
	if (!PathFinderInfo->rail_or_road) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   459
		if (parent->path.parent != NULL &&
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   460
				AiNew_GetDirection(current->tile, parent->path.node.tile) != AiNew_GetDirection(parent->path.node.tile, parent->path.parent->node.tile)) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   461
			// When road exists, we don't like turning, but its free, so don't be to piggy about it
4000
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3644
diff changeset
   462
			if (IsRoad(parent->path.node.tile)) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   463
				res += AI_PATHFINDER_DIRECTION_CHANGE_ON_EXISTING_ROAD_PENALTY;
4000
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3644
diff changeset
   464
			} else {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   465
				res += AI_PATHFINDER_DIRECTION_CHANGE_PENALTY;
4000
bab1ebc37da0 (svn r5210) Many small changes which piled up: const, unsigned, variable scope, CSE for readability, DeMorgan, if cascades -> switch, whitespace, parentheses, bracing, misc.
tron
parents: 3644
diff changeset
   466
			}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   467
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   468
	} else {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   469
		// For rail we have 1 exeption: diagonal rail..
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   470
		// So we fetch 2 raildirection. That of the current one, and of the one before that
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   471
		if (parent->path.parent != NULL && parent->path.parent->parent != NULL) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   472
			int dir1 = AiNew_GetRailDirection(parent->path.parent->node.tile, parent->path.node.tile, current->tile);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   473
			int dir2 = AiNew_GetRailDirection(parent->path.parent->parent->node.tile, parent->path.parent->node.tile, parent->path.node.tile);
826
0e2b569b737b (svn r1297) Language fixes in the source.. (ln-)
miham
parents: 679
diff changeset
   474
			// First, see if we are on diagonal path, that is better than straight path
3033
e4f7c60a1742 (svn r3613) Some more const, indentation, whitespace and similar stuff
tron
parents: 2916
diff changeset
   475
			if (dir1 > 1) res -= AI_PATHFINDER_DIAGONAL_BONUS;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   476
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   477
			// First see if they are different
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   478
			if (dir1 != dir2) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   479
				// dir 2 and 3 are 1 diagonal track, and 4 and 5.
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   480
				if (!(((dir1 == 2 || dir1 == 3) && (dir2 == 2 || dir2 == 3)) || ((dir1 == 4 || dir1 == 5) && (dir2 == 4 || dir2 == 5)))) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   481
					// It is not, so we changed of direction
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   482
					res += AI_PATHFINDER_DIRECTION_CHANGE_PENALTY;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   483
				}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   484
				if (parent->path.parent->parent->parent != NULL) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   485
					int dir3 = AiNew_GetRailDirection(parent->path.parent->parent->parent->node.tile, parent->path.parent->parent->node.tile, parent->path.parent->node.tile);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   486
					// Check if we changed 3 tiles of direction in 3 tiles.. bad!!!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   487
					if ((dir1 == 0 || dir1 == 1) && dir2 > 1 && (dir3 == 0 || dir3 == 1)) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   488
						res += AI_PATHFINDER_CURVE_PENALTY;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   489
					}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   490
				}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   491
			}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   492
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   493
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   494
2549
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
   495
	return (res < 0) ? 0 : res;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   496
}