src/ai/trolly/build.cpp
author rubidium
Wed, 26 Dec 2007 11:45:43 +0000
changeset 8635 3bbb6f87fced
parent 8627 448ebf3a8291
child 8640 1e93b81e96d2
permissions -rw-r--r--
(svn r11701) -Codechange: removal unnecessary inclusions of map.h (and split map.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"
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
     5
#include "../../debug.h"
3157
40de8616c04c (svn r3783) Replace further ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3033
diff changeset
     6
#include "../../road_map.h"
3946
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
     7
#include "../../vehicle.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 "../../engine.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
    11
#include "../../station.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
    12
#include "../../variables.h"
3359
d4316b1af327 (svn r4154) -Moved MAX_BRIDGES in bridge.h and made it an enum. This makes two drops ...
celestar
parents: 3157
diff changeset
    13
#include "../../bridge.h"
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2639
diff changeset
    14
#include "../ai.h"
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    15
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    16
// Build HQ
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    17
//  Params:
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    18
//    tile : tile where HQ is going to be build
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1926
diff changeset
    19
bool AiNew_Build_CompanyHQ(Player *p, TileIndex tile)
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1926
diff changeset
    20
{
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2639
diff changeset
    21
	if (CmdFailed(AI_DoCommand(tile, 0, 0, DC_AUTO | DC_NO_WATER, CMD_BUILD_COMPANY_HQ)))
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    22
		return false;
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2639
diff changeset
    23
	AI_DoCommand(tile, 0, 0, DC_EXEC | DC_AUTO | DC_NO_WATER, CMD_BUILD_COMPANY_HQ);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    24
	return true;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    25
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    26
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
    27
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    28
// Build station
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    29
//  Params:
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    30
//    type : AI_TRAIN/AI_BUS/AI_TRUCK : indicates the type of station
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    31
//    tile : tile where station is going to be build
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    32
//    length : in case of AI_TRAIN: length of station
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    33
//    numtracks : in case of AI_TRAIN: tracks of station
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    34
//    direction : the direction of the station
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    35
//    flag : flag passed to DoCommand (normally 0 to get the cost or DC_EXEC to build it)
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7177
diff changeset
    36
CommandCost AiNew_Build_Station(Player *p, byte type, TileIndex tile, byte length, byte numtracks, byte direction, byte flag)
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1926
diff changeset
    37
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    38
	if (type == AI_TRAIN)
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2639
diff changeset
    39
		return AI_DoCommand(tile, direction + (numtracks << 8) + (length << 16), 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_RAILROAD_STATION);
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: 1299
diff changeset
    40
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: 1299
diff changeset
    41
	if (type == AI_BUS)
7177
08330bb931a1 (svn r9912) -Fix: the AIs could build any road(station)s.
rubidium
parents: 6987
diff changeset
    42
		return AI_DoCommand(tile, direction, ROADTYPES_ROAD << 2 | RoadStop::BUS, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP);
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: 1299
diff changeset
    43
7177
08330bb931a1 (svn r9912) -Fix: the AIs could build any road(station)s.
rubidium
parents: 6987
diff changeset
    44
	return AI_DoCommand(tile, direction, ROADTYPES_ROAD << 2 | RoadStop::TRUCK, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_STOP);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    45
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    46
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
    47
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    48
// Builds a brdige. The second best out of the ones available for this player
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    49
//  Params:
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    50
//   tile_a : starting point
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    51
//   tile_b : end point
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    52
//   flag : flag passed to DoCommand
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7177
diff changeset
    53
CommandCost AiNew_Build_Bridge(Player *p, TileIndex tile_a, TileIndex tile_b, byte flag)
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1926
diff changeset
    54
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    55
	int bridge_type, bridge_len, type, type2;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    56
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    57
	// Find a good bridgetype (the best money can buy)
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    58
	bridge_len = GetBridgeLength(tile_a, tile_b);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    59
	type = type2 = 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    60
	for (bridge_type = MAX_BRIDGES-1; bridge_type >= 0; bridge_type--) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    61
		if (CheckBridge_Stuff(bridge_type, bridge_len)) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    62
			type2 = type;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    63
			type = bridge_type;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    64
			// We found two bridges, exit
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
    65
			if (type2 != 0) break;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    66
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    67
	}
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: 3946
diff changeset
    68
	// There is only one bridge that can be built
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    69
	if (type2 == 0 && type != 0) type2 = type;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    70
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    71
	// Now, simply, build the bridge!
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: 3946
diff changeset
    72
	if (p->ainew.tbt == AI_TRAIN) {
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: 3946
diff changeset
    73
		return AI_DoCommand(tile_a, tile_b, (0x00 << 8) + type2, flag | DC_AUTO, CMD_BUILD_BRIDGE);
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: 3946
diff changeset
    74
	} else {
7177
08330bb931a1 (svn r9912) -Fix: the AIs could build any road(station)s.
rubidium
parents: 6987
diff changeset
    75
		return AI_DoCommand(tile_a, tile_b, ((0x80 | ROADTYPES_ROAD) << 8) + type2, flag | DC_AUTO, CMD_BUILD_BRIDGE);
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: 3946
diff changeset
    76
	}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    77
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    78
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    79
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    80
// Build the route part by part
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    81
// Basicly what this function do, is build that amount of parts of the route
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    82
//  that go in the same direction. It sets 'part' to the last part of the route builded.
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    83
//  The return value is the cost for the builded parts
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    84
//
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    85
//  Params:
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    86
//   PathFinderInfo : Pointer to the PathFinderInfo used for AiPathFinder
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    87
//   part : Which part we need to build
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    88
//
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    89
// TODO: skip already builded road-pieces (e.g.: cityroad)
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7177
diff changeset
    90
CommandCost AiNew_Build_RoutePart(Player *p, Ai_PathFinderInfo *PathFinderInfo, byte flag)
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
    91
{
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
    92
	int part = PathFinderInfo->position;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    93
	byte *route_extra = PathFinderInfo->route_extra;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    94
	TileIndex *route = PathFinderInfo->route;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    95
	int dir;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    96
	int old_dir = -1;
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
    97
	CommandCost cost;
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7177
diff changeset
    98
	CommandCost res;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
    99
	// We need to calculate the direction with the parent of the parent.. so we skip
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   100
	//  the first pieces and the last piece
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   101
	if (part < 1) part = 1;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   102
	// When we are done, stop 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: 3946
diff changeset
   103
	if (part >= PathFinderInfo->route_length - 1) {
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: 3946
diff changeset
   104
		PathFinderInfo->position = -2;
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   105
		return CommandCost();
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: 3946
diff changeset
   106
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   107
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   108
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   109
	if (PathFinderInfo->rail_or_road) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   110
		// Tunnel code
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   111
		if ((AI_PATHFINDER_FLAG_TUNNEL & route_extra[part]) != 0) {
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   112
			cost.AddCost(AI_DoCommand(route[part], 0, 0, flag, CMD_BUILD_TUNNEL));
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   113
			PathFinderInfo->position++;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   114
			// TODO: problems!
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   115
			if (CmdFailed(cost)) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5032
diff changeset
   116
				DEBUG(ai, 0, "[BuildPath] tunnel could not be built (0x%X)", route[part]);
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   117
				return CommandCost();
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   118
			}
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   119
			return cost;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   120
		}
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   121
		// Bridge code
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   122
		if ((AI_PATHFINDER_FLAG_BRIDGE & route_extra[part]) != 0) {
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   123
			cost.AddCost(AiNew_Build_Bridge(p, route[part], route[part - 1], flag));
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   124
			PathFinderInfo->position++;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   125
			// TODO: problems!
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   126
			if (CmdFailed(cost)) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5032
diff changeset
   127
				DEBUG(ai, 0, "[BuildPath] bridge could not be built (0x%X, 0x%X)", route[part], route[part - 1]);
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   128
				return CommandCost();
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   129
			}
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   130
			return cost;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   131
		}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   132
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   133
		// Build normal rail
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   134
		// Keep it doing till we go an other way
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: 3946
diff changeset
   135
		if (route_extra[part - 1] == 0 && route_extra[part] == 0) {
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   136
			while (route_extra[part] == 0) {
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   137
				// Get the current direction
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   138
				dir = AiNew_GetRailDirection(route[part-1], route[part], route[part+1]);
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   139
				// Is it the same as the last one?
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   140
				if (old_dir != -1 && old_dir != dir) break;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   141
				old_dir = dir;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   142
				// Build the tile
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2639
diff changeset
   143
				res = AI_DoCommand(route[part], 0, dir, flag, CMD_BUILD_SINGLE_RAIL);
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   144
				if (CmdFailed(res)) {
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   145
					// Problem.. let's just abort it all!
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   146
					p->ainew.state = AI_STATE_NOTHING;
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   147
					return CommandCost();
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   148
				}
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   149
				cost.AddCost(res);
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   150
				// Go to the next tile
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   151
				part++;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   152
				// Check if it is still in range..
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   153
				if (part >= PathFinderInfo->route_length - 1) break;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   154
			}
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   155
			part--;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   156
		}
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   157
		// We want to return the last position, so we go back one
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   158
		PathFinderInfo->position = part;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   159
	} else {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   160
		// Tunnel code
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   161
		if ((AI_PATHFINDER_FLAG_TUNNEL & route_extra[part]) != 0) {
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   162
			cost.AddCost(AI_DoCommand(route[part], 0x200 | ROADTYPES_ROAD, 0, flag, CMD_BUILD_TUNNEL));
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   163
			PathFinderInfo->position++;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   164
			// TODO: problems!
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   165
			if (CmdFailed(cost)) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5032
diff changeset
   166
				DEBUG(ai, 0, "[BuildPath] tunnel could not be built (0x%X)", route[part]);
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   167
				return CommandCost();
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   168
			}
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   169
			return cost;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   170
		}
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   171
		// Bridge code
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   172
		if ((AI_PATHFINDER_FLAG_BRIDGE & route_extra[part]) != 0) {
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   173
			cost.AddCost(AiNew_Build_Bridge(p, route[part], route[part + 1], flag));
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   174
			PathFinderInfo->position++;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   175
			// TODO: problems!
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   176
			if (CmdFailed(cost)) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5032
diff changeset
   177
				DEBUG(ai, 0, "[BuildPath] bridge could not be built (0x%X, 0x%X)", route[part], route[part + 1]);
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   178
				return CommandCost();
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   179
			}
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   180
			return cost;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   181
		}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   182
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   183
		// Build normal road
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   184
		// Keep it doing till we go an other way
8254
5de2bbd26163 (svn r11303) -Fix: EnsureNoVehicle and EnsureNoVehicleOnGround were both used to check whether there was no vehicle on the ground, except that the former didn't take care of aircraft shadows. So now we only use EnsureNoVehicleOnGround.
rubidium
parents: 7866
diff changeset
   185
		// EnsureNoVehicleOnGround makes sure we don't build on a tile where a vehicle is. This way
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   186
		//  it will wait till the vehicle is gone..
8254
5de2bbd26163 (svn r11303) -Fix: EnsureNoVehicle and EnsureNoVehicleOnGround were both used to check whether there was no vehicle on the ground, except that the former didn't take care of aircraft shadows. So now we only use EnsureNoVehicleOnGround.
rubidium
parents: 7866
diff changeset
   187
		if (route_extra[part-1] == 0 && route_extra[part] == 0 && (flag != DC_EXEC || EnsureNoVehicleOnGround(route[part]))) {
5de2bbd26163 (svn r11303) -Fix: EnsureNoVehicle and EnsureNoVehicleOnGround were both used to check whether there was no vehicle on the ground, except that the former didn't take care of aircraft shadows. So now we only use EnsureNoVehicleOnGround.
rubidium
parents: 7866
diff changeset
   188
			while (route_extra[part] == 0 && (flag != DC_EXEC || EnsureNoVehicleOnGround(route[part]))) {
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   189
				// Get the current direction
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   190
				dir = AiNew_GetRoadDirection(route[part-1], route[part], route[part+1]);
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   191
				// Is it the same as the last one?
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   192
				if (old_dir != -1 && old_dir != dir) break;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   193
				old_dir = dir;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   194
				// There is already some road, and it is a bridge.. don't build!!!
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   195
				if (!IsTileType(route[part], MP_TUNNELBRIDGE)) {
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   196
					// Build the tile
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2639
diff changeset
   197
					res = AI_DoCommand(route[part], dir, 0, flag | DC_NO_WATER, CMD_BUILD_ROAD);
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   198
					// Currently, we ignore CMD_ERRORs!
8254
5de2bbd26163 (svn r11303) -Fix: EnsureNoVehicle and EnsureNoVehicleOnGround were both used to check whether there was no vehicle on the ground, except that the former didn't take care of aircraft shadows. So now we only use EnsureNoVehicleOnGround.
rubidium
parents: 7866
diff changeset
   199
					if (CmdFailed(res) && flag == DC_EXEC && !IsTileType(route[part], MP_ROAD) && !EnsureNoVehicleOnGround(route[part])) {
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   200
						// Problem.. let's just abort it all!
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5032
diff changeset
   201
						DEBUG(ai, 0, "[BuidPath] route building failed at tile 0x%X, aborting", route[part]);
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   202
						p->ainew.state = AI_STATE_NOTHING;
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   203
						return CommandCost();
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   204
					}
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: 1299
diff changeset
   205
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   206
					if (CmdSucceeded(res)) cost.AddCost(res);
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   207
				}
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   208
				// Go to the next tile
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   209
				part++;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   210
				// Check if it is still in range..
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   211
				if (part >= PathFinderInfo->route_length - 1) break;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   212
			}
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   213
			part--;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   214
			// We want to return the last position, so we go back one
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   215
		}
8254
5de2bbd26163 (svn r11303) -Fix: EnsureNoVehicle and EnsureNoVehicleOnGround were both used to check whether there was no vehicle on the ground, except that the former didn't take care of aircraft shadows. So now we only use EnsureNoVehicleOnGround.
rubidium
parents: 7866
diff changeset
   216
		if (!EnsureNoVehicleOnGround(route[part]) && flag == DC_EXEC) part--;
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   217
		PathFinderInfo->position = part;
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   218
	}
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   219
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   220
	return cost;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   221
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   222
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   223
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   224
// This functions tries to find the best vehicle for this type of cargo
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3359
diff changeset
   225
// It returns INVALID_ENGINE if not suitable engine is found
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3359
diff changeset
   226
EngineID AiNew_PickVehicle(Player *p)
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   227
{
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   228
	if (p->ainew.tbt == AI_TRAIN) {
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   229
		// Not supported yet
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3359
diff changeset
   230
		return INVALID_ENGINE;
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   231
	} else {
5029
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   232
		EngineID best_veh_index = INVALID_ENGINE;
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   233
		int32 best_veh_rating = 0;
5016
63281a3e8548 (svn r7057) -Codechange: Remove hardcoded lists of road vehicles for each cargo type in favour of just checking the cargo type of each vehicle.
peter1138
parents: 5015
diff changeset
   234
		EngineID start = ROAD_ENGINES_INDEX;
63281a3e8548 (svn r7057) -Codechange: Remove hardcoded lists of road vehicles for each cargo type in favour of just checking the cargo type of each vehicle.
peter1138
parents: 5015
diff changeset
   235
		EngineID end   = ROAD_ENGINES_INDEX + NUM_ROAD_ENGINES;
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3359
diff changeset
   236
		EngineID i;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   237
5030
dec51dbf1380 (svn r7072) -Fix (r7070): Go up, not down, through the engines. And replace the comment too...
peter1138
parents: 5029
diff changeset
   238
		/* Loop through all road vehicles */
dec51dbf1380 (svn r7072) -Fix (r7070): Go up, not down, through the engines. And replace the comment too...
peter1138
parents: 5029
diff changeset
   239
		for (i = start; i != end; i++) {
5029
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   240
			const RoadVehicleInfo *rvi = RoadVehInfo(i);
3887
3e44ae3b1e7c (svn r4943) uint tile -> TileIndex tile, byte player -> PlayerID player
tron
parents: 3885
diff changeset
   241
			const Engine* e = GetEngine(i);
5029
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   242
			int32 rating;
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7177
diff changeset
   243
			CommandCost ret;
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3359
diff changeset
   244
5016
63281a3e8548 (svn r7057) -Codechange: Remove hardcoded lists of road vehicles for each cargo type in favour of just checking the cargo type of each vehicle.
peter1138
parents: 5015
diff changeset
   245
			/* Skip vehicles which can't take our cargo type */
5031
940b1fec4220 (svn r7073) -Feature: Add cargo refit support to both AIs for road vehicles
peter1138
parents: 5030
diff changeset
   246
			if (rvi->cargo_type != p->ainew.cargo && !CanRefitTo(i, p->ainew.cargo)) continue;
5016
63281a3e8548 (svn r7057) -Codechange: Remove hardcoded lists of road vehicles for each cargo type in favour of just checking the cargo type of each vehicle.
peter1138
parents: 5015
diff changeset
   247
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   248
			// Is it availiable?
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   249
			// Also, check if the reliability of the vehicle is above the AI_VEHICLE_MIN_RELIABILTY
8424
4a488a90ccab (svn r11481) -Codechange: Rename the HASBIT function to fit with the naming style
skidd13
parents: 8254
diff changeset
   250
			if (!HasBit(e->player_avail, _current_player) || e->reliability * 100 < AI_VEHICLE_MIN_RELIABILTY << 16) continue;
5029
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   251
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   252
			/* Rate and compare the engine by speed & capacity */
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   253
			rating = rvi->max_speed * rvi->capacity;
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   254
			if (rating <= best_veh_rating) continue;
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   255
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   256
			// Can we build it?
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2639
diff changeset
   257
			ret = AI_DoCommand(0, i, 0, DC_QUERY_COST, CMD_BUILD_ROAD_VEH);
5029
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   258
			if (CmdFailed(ret)) continue;
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   259
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   260
			best_veh_rating = rating;
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   261
			best_veh_index = i;
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   262
		}
5029
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   263
66c90d197b7b (svn r7070) -Codechange: Make the AI choose road vehicles based on a rating (currently max speed * capacity) instead of either the cost or the index of the vheicle.
peter1138
parents: 5016
diff changeset
   264
		return best_veh_index;
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   265
	}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   266
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   267
2366
a06b633fc6fd (svn r2892) Fix indentation
tron
parents: 2186
diff changeset
   268
3946
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   269
void CcAI(bool success, TileIndex tile, uint32 p1, uint32 p2)
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   270
{
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   271
	Player* p = GetPlayer(_current_player);
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   272
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   273
	if (success) {
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   274
		p->ainew.state = AI_STATE_GIVE_ORDERS;
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   275
		p->ainew.veh_id = _new_vehicle_id;
5031
940b1fec4220 (svn r7073) -Feature: Add cargo refit support to both AIs for road vehicles
peter1138
parents: 5030
diff changeset
   276
940b1fec4220 (svn r7073) -Feature: Add cargo refit support to both AIs for road vehicles
peter1138
parents: 5030
diff changeset
   277
		if (GetVehicle(p->ainew.veh_id)->cargo_type != p->ainew.cargo) {
940b1fec4220 (svn r7073) -Feature: Add cargo refit support to both AIs for road vehicles
peter1138
parents: 5030
diff changeset
   278
			/* Cargo type doesn't match, so refit it */
940b1fec4220 (svn r7073) -Feature: Add cargo refit support to both AIs for road vehicles
peter1138
parents: 5030
diff changeset
   279
			if (CmdFailed(DoCommand(tile, p->ainew.veh_id, p->ainew.cargo, DC_EXEC, CMD_REFIT_ROAD_VEH))) {
940b1fec4220 (svn r7073) -Feature: Add cargo refit support to both AIs for road vehicles
peter1138
parents: 5030
diff changeset
   280
				/* Refit failed, so sell the vehicle */
940b1fec4220 (svn r7073) -Feature: Add cargo refit support to both AIs for road vehicles
peter1138
parents: 5030
diff changeset
   281
				DoCommand(tile, p->ainew.veh_id, 0, DC_EXEC, CMD_SELL_ROAD_VEH);
940b1fec4220 (svn r7073) -Feature: Add cargo refit support to both AIs for road vehicles
peter1138
parents: 5030
diff changeset
   282
				p->ainew.state = AI_STATE_NOTHING;
940b1fec4220 (svn r7073) -Feature: Add cargo refit support to both AIs for road vehicles
peter1138
parents: 5030
diff changeset
   283
			}
940b1fec4220 (svn r7073) -Feature: Add cargo refit support to both AIs for road vehicles
peter1138
parents: 5030
diff changeset
   284
		}
3946
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   285
	} else {
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   286
		/* XXX this should be handled more gracefully */
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   287
		p->ainew.state = AI_STATE_NOTHING;
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   288
	}
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   289
}
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   290
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   291
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   292
// Builds the best vehicle possible
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7177
diff changeset
   293
CommandCost AiNew_Build_Vehicle(Player *p, TileIndex tile, byte flag)
1977
4392ae3d8e31 (svn r2483) Replace almost 500 "uint tile" (and variants) with "TileIndex tile"
tron
parents: 1926
diff changeset
   294
{
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3359
diff changeset
   295
	EngineID i = AiNew_PickVehicle(p);
193
0a7025304867 (svn r194) -Codechange: stripping trailing-spaces. Please keep this that way!
truelight
parents: 145
diff changeset
   296
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3359
diff changeset
   297
	if (i == INVALID_ENGINE) return CMD_ERROR;
2639
8a7342eb3a78 (svn r3181) -Bracing
tron
parents: 2549
diff changeset
   298
	if (p->ainew.tbt == AI_TRAIN) return CMD_ERROR;
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: 1299
diff changeset
   299
3946
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   300
	if (flag & DC_EXEC) {
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   301
		return AI_DoCommandCc(tile, i, 0, flag, CMD_BUILD_ROAD_VEH, CcAI);
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   302
	} else {
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   303
		return AI_DoCommand(tile, i, 0, flag, CMD_BUILD_ROAD_VEH);
c9e039a60682 (svn r5092) -Fix: There was a gross race condition in the AI code which made it pretty random if the AI could give a new vehicle its orders
tron
parents: 3887
diff changeset
   304
	}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   305
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   306
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7177
diff changeset
   307
CommandCost AiNew_Build_Depot(Player* p, TileIndex tile, DiagDirection direction, byte flag)
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: 1299
diff changeset
   308
{
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7177
diff changeset
   309
	CommandCost ret, ret2;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
   310
	if (p->ainew.tbt == AI_TRAIN) {
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2639
diff changeset
   311
		return AI_DoCommand(tile, 0, direction, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_TRAIN_DEPOT);
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
   312
	} else {
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
   313
		ret = AI_DoCommand(tile, direction, 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD_DEPOT);
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   314
		if (CmdFailed(ret2)) return ret;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
   315
		// Try to build the road from the depot
4559
c853d2440065 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4077
diff changeset
   316
		ret2 = AI_DoCommand(tile + TileOffsByDiagDir(direction), DiagDirToRoadBits(ReverseDiagDir(direction)), 0, flag | DC_AUTO | DC_NO_WATER, CMD_BUILD_ROAD);
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
   317
		// If it fails, ignore it..
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
   318
		if (CmdFailed(ret2)) return ret;
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   319
		ret.AddCost(ret2);
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   320
		return ret;
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
   321
	}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 84
diff changeset
   322
}