src/ai/trolly/trolly.cpp
author rubidium
Fri, 21 Dec 2007 21:50:46 +0000
changeset 8612 6414fc21c2f3
parent 8604 8afdd9877afd
child 8627 448ebf3a8291
permissions -rw-r--r--
(svn r11677) -Codechange: move price and command related types/functions to their respective places.
2549
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
     1
/* $Id$ */
1490
6a13118e99f5 (svn r1994) Fix: 1159456 - hopefully prevent the new AI to get stuck in an infinite loop forlorny trying to build its haven. Unintentionally bundled with trivial tidyup.
pasky
parents: 1377
diff changeset
     2
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
     3
/*
2549
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
     4
 * This AI was created as a direct reaction to the big demand for some good AIs
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
     5
 * in OTTD. Too bad it never left alpha-stage, and it is considered dead in its
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
     6
 * current form.
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
     7
 * By the time of writing this, we, the creator of this AI and a good friend of
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
     8
 * mine, are designing a whole new AI-system that allows us to create AIs
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
     9
 * easier and without all the fuzz we encountered while I was working on this
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
    10
 * AI. By the time that system is finished, you can expect that this AI will
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
    11
 * dissapear, because it is pretty obselete and bad programmed.
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: 2365
diff changeset
    12
 *
2549
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
    13
 * Meanwhile I wish you all much fun with this AI; if you are interested as
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
    14
 * AI-developer in this AI, I advise you not stare too long to some code, some
f1d3b383d557 (svn r3078) Some more stuff, which piled up:
tron
parents: 2381
diff changeset
    15
 * things in here really are... strange ;) But in either way: enjoy :)
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: 2365
diff changeset
    16
 *
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: 2365
diff changeset
    17
 *  -- TrueLight :: 2005-09-01
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    18
 */
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    19
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: 2365
diff changeset
    20
#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: 2365
diff changeset
    21
#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: 2365
diff changeset
    22
#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: 2365
diff changeset
    23
#include "../../functions.h"
3144
426b825578f9 (svn r3763) Adapt to the new 'map accessors go in foo_map.h'-scheme
tron
parents: 3071
diff changeset
    24
#include "../../road_map.h"
3315
1f65f8260092 (svn r4079) Add GetSation{Index,ByTile}() to get the station index resp. the station from a tile
tron
parents: 3179
diff changeset
    25
#include "../../station_map.h"
5907
3ed575a60e1d (svn r8116) Undo r8113
tron
parents: 5905
diff changeset
    26
#include "table/strings.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: 2365
diff changeset
    27
#include "../../map.h"
8612
6414fc21c2f3 (svn r11677) -Codechange: move price and command related types/functions to their respective places.
rubidium
parents: 8604
diff changeset
    28
#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: 2365
diff changeset
    29
#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: 2365
diff changeset
    30
#include "../../town.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: 2365
diff changeset
    31
#include "../../industry.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: 2365
diff changeset
    32
#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: 2365
diff changeset
    33
#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: 2365
diff changeset
    34
#include "../../gui.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: 2365
diff changeset
    35
#include "../../depot.h"
3577
9e345c932ba2 (svn r4463) -Codechange. Include vehicle.h directly instead of implicitly via station.h in a number of source files
celestar
parents: 3404
diff changeset
    36
#include "../../vehicle.h"
4261
2ec8f5a9747b (svn r5887) -Cleanup: move date related functions, defines and variables to date.[ch]
rubidium
parents: 4077
diff changeset
    37
#include "../../date.h"
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
    38
#include "../ai.h"
8560
8472721356cf (svn r11625) -Codechange: add CO_* enum at some places, add includes of order.h too
smatz
parents: 8259
diff changeset
    39
#include "../../order.h"
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    40
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    41
// This function is called after StartUp. It is the init of an AI
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    42
static void AiNew_State_FirstTime(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    43
{
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    44
	// This assert is used to protect those function from misuse
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    45
	//   You have quickly a small mistake in the state-array
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    46
	//   With that, everything would go wrong. Finding that, is almost impossible
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    47
	//   With this assert, that problem can never happen.
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    48
	assert(p->ainew.state == AI_STATE_FIRST_TIME);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    49
	// We first have to init some things
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
    50
4854
383ef523793f (svn r6780) -Codechange: Remove GPMI leftovers (-b impersonisation of AI in MP).
Darkvater
parents: 4559
diff changeset
    51
	if (_current_player == 1) ShowErrorMessage(INVALID_STRING_ID, TEMP_AI_IN_PROGRESS, 0, 0);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    52
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    53
	// The PathFinder (AyStar)
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    54
	// TODO: Maybe when an AI goes bankrupt, this is de-init
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    55
	//  or when coming from a savegame.. should be checked out!
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    56
	p->ainew.path_info.start_tile_tl = 0;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    57
	p->ainew.path_info.start_tile_br = 0;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    58
	p->ainew.path_info.end_tile_tl = 0;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    59
	p->ainew.path_info.end_tile_br = 0;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    60
	p->ainew.pathfinder = new_AyStar_AiPathFinder(12, &p->ainew.path_info);
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
    61
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    62
	p->ainew.idle = 0;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
    63
	p->ainew.last_vehiclecheck_date = _date;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    64
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    65
	// We ALWAYS start with a bus route.. just some basic money ;)
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    66
	p->ainew.action = AI_ACTION_BUS_ROUTE;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    67
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    68
	// Let's popup the news, and after that, start building..
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    69
	p->ainew.state = AI_STATE_WAKE_UP;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    70
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    71
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    72
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    73
// This function just waste some time
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    74
//  It keeps it more real. The AI can build on such tempo no normal user
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    75
//  can ever keep up with that. The competitor_speed already delays a bit
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    76
//  but after the AI finished a track it really needs to go to sleep.
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    77
//
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    78
// Let's say, we sleep between one and three days if the AI is put on Very Fast.
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    79
//  This means that on Very Slow it will be between 16 and 48 days.. slow enough?
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    80
static void AiNew_State_Nothing(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    81
{
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    82
	assert(p->ainew.state == AI_STATE_NOTHING);
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    83
	// If we are done idling, start over again
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
    84
	if (p->ainew.idle == 0) p->ainew.idle = AI_RandomRange(DAY_TICKS * 2) + DAY_TICKS;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    85
	if (--p->ainew.idle == 0) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    86
		// We are done idling.. what you say? Let's do something!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    87
		// I mean.. the next tick ;)
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    88
		p->ainew.state = AI_STATE_WAKE_UP;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    89
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    90
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    91
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    92
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    93
// This function picks out a task we are going to do.
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    94
//  Currently supported:
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    95
//    - Make new route
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    96
//    - Check route
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
    97
//    - Build HQ
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    98
static void AiNew_State_WakeUp(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
    99
{
1490
6a13118e99f5 (svn r1994) Fix: 1159456 - hopefully prevent the new AI to get stuck in an infinite loop forlorny trying to build its haven. Unintentionally bundled with trivial tidyup.
pasky
parents: 1377
diff changeset
   100
	int c;
6a13118e99f5 (svn r1994) Fix: 1159456 - hopefully prevent the new AI to get stuck in an infinite loop forlorny trying to build its haven. Unintentionally bundled with trivial tidyup.
pasky
parents: 1377
diff changeset
   101
	assert(p->ainew.state == AI_STATE_WAKE_UP);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   102
	// First, check if we have a HQ
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   103
	if (p->location_of_house == 0) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   104
		// We have no HQ yet, build one on a random place
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   105
		// Random till we found a place for it!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   106
		// TODO: this should not be on a random place..
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
   107
		AiNew_Build_CompanyHQ(p, AI_Random() % MapSize());
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   108
		// Enough for now, but we want to come back here the next time
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   109
		//  so we do not change any status
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   110
		return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   111
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   112
7486
d130c10f4dab (svn r10246) -Fix (r10297): some forgotten money conversions and truncation issues. Thanks to benc for providing the patch.
rubidium
parents: 7446
diff changeset
   113
	Money money = p->player_money - AI_MINIMUM_MONEY;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   114
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   115
	// Let's pick an action!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   116
	if (p->ainew.action == AI_ACTION_NONE) {
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
   117
		c = AI_Random() & 0xFF;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   118
		if (p->current_loan > 0 &&
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   119
				p->old_economy[1].income > AI_MINIMUM_INCOME_FOR_LOAN &&
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   120
				c < 10) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   121
			p->ainew.action = AI_ACTION_REPAY_LOAN;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   122
		} else if (p->ainew.last_vehiclecheck_date + AI_DAYS_BETWEEN_VEHICLE_CHECKS < _date) {
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   123
			// Check all vehicles once in a while
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   124
			p->ainew.action = AI_ACTION_CHECK_ALL_VEHICLES;
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   125
			p->ainew.last_vehiclecheck_date = _date;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   126
		} else if (c < 100 && !_patches.ai_disable_veh_roadveh) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   127
			// Do we have any spots for road-vehicles left open?
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 5907
diff changeset
   128
			if (GetFreeUnitNumber(VEH_ROAD) <= _patches.max_roadveh) {
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: 3952
diff changeset
   129
				if (c < 85) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   130
					p->ainew.action = AI_ACTION_TRUCK_ROUTE;
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: 3952
diff changeset
   131
				} else {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   132
					p->ainew.action = AI_ACTION_BUS_ROUTE;
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: 3952
diff changeset
   133
				}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   134
			}
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: 3952
diff changeset
   135
#if 0
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: 3952
diff changeset
   136
		} else if (c < 200 && !_patches.ai_disable_veh_train) {
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 5907
diff changeset
   137
			if (GetFreeUnitNumber(VEH_TRAIN) <= _patches.max_trains) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   138
				p->ainew.action = AI_ACTION_TRAIN_ROUTE;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   139
			}
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: 3952
diff changeset
   140
#endif
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: 3952
diff changeset
   141
		}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   142
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   143
		p->ainew.counter = 0;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   144
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   146
	if (p->ainew.counter++ > AI_MAX_TRIES_FOR_SAME_ROUTE) {
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   147
		p->ainew.action = AI_ACTION_NONE;
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   148
		return;
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   149
	}
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   150
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   151
	if (_patches.ai_disable_veh_roadveh && (
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   152
				p->ainew.action == AI_ACTION_BUS_ROUTE ||
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   153
				p->ainew.action == AI_ACTION_TRUCK_ROUTE
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   154
			)) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   155
		p->ainew.action = AI_ACTION_NONE;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   156
		return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   157
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   158
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   159
	if (p->ainew.action == AI_ACTION_REPAY_LOAN &&
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   160
			money > AI_MINIMUM_LOAN_REPAY_MONEY) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   161
		// We start repaying some money..
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   162
		p->ainew.state = AI_STATE_REPAY_MONEY;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   163
		return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   164
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   165
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   166
	if (p->ainew.action == AI_ACTION_CHECK_ALL_VEHICLES) {
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   167
		p->ainew.state = AI_STATE_CHECK_ALL_VEHICLES;
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   168
		return;
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   169
	}
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   170
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   171
	// It is useless to start finding a route if we don't have enough money
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   172
	//  to build the route anyway..
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   173
	if (p->ainew.action == AI_ACTION_BUS_ROUTE &&
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   174
			money > AI_MINIMUM_BUS_ROUTE_MONEY) {
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 5907
diff changeset
   175
		if (GetFreeUnitNumber(VEH_ROAD) > _patches.max_roadveh) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   176
			p->ainew.action = AI_ACTION_NONE;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   177
			return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   178
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   179
		p->ainew.cargo = AI_NEED_CARGO;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   180
		p->ainew.state = AI_STATE_LOCATE_ROUTE;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   181
		p->ainew.tbt = AI_BUS; // Bus-route
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   182
		return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   183
	}
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   184
	if (p->ainew.action == AI_ACTION_TRUCK_ROUTE &&
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   185
			money > AI_MINIMUM_TRUCK_ROUTE_MONEY) {
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 5907
diff changeset
   186
		if (GetFreeUnitNumber(VEH_ROAD) > _patches.max_roadveh) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   187
			p->ainew.action = AI_ACTION_NONE;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   188
			return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   189
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   190
		p->ainew.cargo = AI_NEED_CARGO;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   191
		p->ainew.last_id = 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   192
		p->ainew.state = AI_STATE_LOCATE_ROUTE;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   193
		p->ainew.tbt = AI_TRUCK;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   194
		return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   195
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   196
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   197
	p->ainew.state = AI_STATE_NOTHING;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   198
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   199
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   200
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   201
static void AiNew_State_ActionDone(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   202
{
1490
6a13118e99f5 (svn r1994) Fix: 1159456 - hopefully prevent the new AI to get stuck in an infinite loop forlorny trying to build its haven. Unintentionally bundled with trivial tidyup.
pasky
parents: 1377
diff changeset
   203
	p->ainew.action = AI_ACTION_NONE;
6a13118e99f5 (svn r1994) Fix: 1159456 - hopefully prevent the new AI to get stuck in an infinite loop forlorny trying to build its haven. Unintentionally bundled with trivial tidyup.
pasky
parents: 1377
diff changeset
   204
	p->ainew.state = AI_STATE_NOTHING;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   205
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   206
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   207
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   208
// Check if a city or industry is good enough to start a route there
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   209
static bool AiNew_Check_City_or_Industry(Player *p, int ic, byte type)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   210
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   211
	if (type == AI_CITY) {
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: 3952
diff changeset
   212
		const Town* t = GetTown(ic);
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: 3952
diff changeset
   213
		const Station* st;
1377
2a418162176e (svn r1881) -Fix: [ 1119308 ] Max passengers / mail variables are now 32 bit
celestar
parents: 1330
diff changeset
   214
		uint count = 0;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   215
		int j = 0;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   216
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   217
		// We don't like roadconstructions, don't even true such a city
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   218
		if (t->road_build_months != 0) return false;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   219
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   220
		// Check if the rating in a city is high enough
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   221
		//  If not, take a chance if we want to continue
6987
b0f13039bda2 (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6585
diff changeset
   222
		if (t->ratings[_current_player] < 0 && AI_CHANCE16(1, 4)) return false;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   223
6987
b0f13039bda2 (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6585
diff changeset
   224
		if (t->max_pass - t->act_pass < AI_CHECKCITY_NEEDED_CARGO && !AI_CHANCE16(1, AI_CHECKCITY_CITY_CHANCE)) return false;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   225
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   226
		// Check if we have build a station in this town the last 6 months
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   227
		//  else we don't do it. This is done, because stat updates can be slow
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   228
		//  and sometimes it takes up to 4 months before the stats are corectly.
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   229
		//  This way we don't get 12 busstations in one city of 100 population ;)
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   230
		FOR_ALL_STATIONS(st) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   231
			// Do we own it?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   232
			if (st->owner == _current_player) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   233
				// Are we talking busses?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   234
				if (p->ainew.tbt == AI_BUS && (FACIL_BUS_STOP & st->facilities) != FACIL_BUS_STOP) continue;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   235
				// Is it the same city as we are in now?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   236
				if (st->town != t) continue;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   237
				// When was this station build?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   238
				if (_date - st->build_date < AI_CHECKCITY_DATE_BETWEEN) return false;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   239
				// Cound the amount of stations in this city that we own
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   240
				count++;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   241
			} else {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   242
				// We do not own it, request some info about the station
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   243
				//  we want to know if this station gets the same good. If so,
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   244
				//  we want to know its rating. If it is too high, we are not going
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   245
				//  to build there
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   246
				if (!st->goods[CT_PASSENGERS].last_speed) continue;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   247
				// Is it around our city
1245
768d9bc95aaa (svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents: 1209
diff changeset
   248
				if (DistanceManhattan(st->xy, t->xy) > 10) continue;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   249
				// It does take this cargo.. what is his rating?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   250
				if (st->goods[CT_PASSENGERS].rating < AI_CHECKCITY_CARGO_RATING) continue;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   251
				j++;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   252
				// When this is the first station, we build a second with no problem ;)
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   253
				if (j == 1) continue;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   254
				// The rating is high.. second station...
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   255
				//  a little chance that we still continue
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   256
				//  But if there are 3 stations of this size, we never go on...
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
   257
				if (j == 2 && AI_CHANCE16(1, AI_CHECKCITY_CARGO_RATING_CHANCE)) continue;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   258
				// We don't like this station :(
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   259
				return false;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   260
			}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   261
		}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   262
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   263
		// We are about to add one...
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   264
		count++;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   265
		// Check if we the city can provide enough cargo for this amount of stations..
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   266
		if (count * AI_CHECKCITY_CARGO_PER_STATION > t->max_pass) return false;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   267
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   268
		// All check are okay, so we can build here!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   269
		return true;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   270
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   271
	if (type == AI_INDUSTRY) {
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: 3952
diff changeset
   272
		const Industry* i = GetIndustry(ic);
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: 3952
diff changeset
   273
		const Station* st;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   274
		int count = 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   275
		int j = 0;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   276
6987
b0f13039bda2 (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6585
diff changeset
   277
		if (i->town != NULL && i->town->ratings[_current_player] < 0 && AI_CHANCE16(1, 4)) return false;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   278
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   279
		// No limits on delevering stations!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   280
		//  Or for industry that does not give anything yet
8141
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   281
		if (i->produced_cargo[0] == CT_INVALID || i->last_month_production[0] == 0) return true;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   282
7315
f1b2591ad082 (svn r10058) -Codechange: give some industry variable sensible names (like not telling "last_mo_production" when it is the production of the current month).
rubidium
parents: 7290
diff changeset
   283
		if (i->last_month_production[0] - i->last_month_transported[0] < AI_CHECKCITY_NEEDED_CARGO) return false;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   284
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   285
		// Check if we have build a station in this town the last 6 months
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   286
		//  else we don't do it. This is done, because stat updates can be slow
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   287
		//  and sometimes it takes up to 4 months before the stats are corectly.
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   288
		FOR_ALL_STATIONS(st) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   289
			// Do we own it?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   290
			if (st->owner == _current_player) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   291
				// Are we talking trucks?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   292
				if (p->ainew.tbt == AI_TRUCK && (FACIL_TRUCK_STOP & st->facilities) != FACIL_TRUCK_STOP) continue;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   293
				// Is it the same city as we are in now?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   294
				if (st->town != i->town) continue;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   295
				// When was this station build?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   296
				if (_date - st->build_date < AI_CHECKCITY_DATE_BETWEEN) return false;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   297
				// Cound the amount of stations in this city that we own
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   298
				count++;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   299
			} else {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   300
				// We do not own it, request some info about the station
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   301
				//  we want to know if this station gets the same good. If so,
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   302
				//  we want to know its rating. If it is too high, we are not going
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   303
				//  to build there
8141
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   304
				if (i->produced_cargo[0] == CT_INVALID) continue;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   305
				// It does not take this cargo
8141
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   306
				if (!st->goods[i->produced_cargo[0]].last_speed) continue;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   307
				// Is it around our industry
1245
768d9bc95aaa (svn r1749) Move the functions which calculate distances to map.[ch] and give the more meaningful names
tron
parents: 1209
diff changeset
   308
				if (DistanceManhattan(st->xy, i->xy) > 5) continue;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   309
				// It does take this cargo.. what is his rating?
8141
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   310
				if (st->goods[i->produced_cargo[0]].rating < AI_CHECKCITY_CARGO_RATING) continue;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   311
				j++;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   312
				// The rating is high.. a little chance that we still continue
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   313
				//  But if there are 2 stations of this size, we never go on...
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
   314
				if (j == 1 && AI_CHANCE16(1, AI_CHECKCITY_CARGO_RATING_CHANCE)) continue;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   315
				// We don't like this station :(
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   316
				return false;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   317
			}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   318
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   319
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   320
		// We are about to add one...
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   321
		count++;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   322
		// Check if we the city can provide enough cargo for this amount of stations..
7315
f1b2591ad082 (svn r10058) -Codechange: give some industry variable sensible names (like not telling "last_mo_production" when it is the production of the current month).
rubidium
parents: 7290
diff changeset
   323
		if (count * AI_CHECKCITY_CARGO_PER_STATION > i->last_month_production[0]) return false;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   324
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   325
		// All check are okay, so we can build here!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   326
		return true;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   327
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   328
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   329
	return true;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   330
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   331
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   332
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   333
// This functions tries to locate a good route
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   334
static void AiNew_State_LocateRoute(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   335
{
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   336
	assert(p->ainew.state == AI_STATE_LOCATE_ROUTE);
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   337
	// For now, we only support PASSENGERS, CITY and BUSSES
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   338
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   339
	// We don't have a route yet
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   340
	if (p->ainew.cargo == AI_NEED_CARGO) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   341
		p->ainew.new_cost = 0; // No cost yet
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   342
		p->ainew.temp = -1;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   343
		// Reset the counter
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   344
		p->ainew.counter = 0;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   345
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   346
		p->ainew.from_ic = -1;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   347
		p->ainew.to_ic = -1;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   348
		if (p->ainew.tbt == AI_BUS) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   349
			// For now we only have a passenger route
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   350
			p->ainew.cargo = CT_PASSENGERS;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   351
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   352
			// Find a route to cities
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   353
			p->ainew.from_type = AI_CITY;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   354
			p->ainew.to_type = AI_CITY;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   355
		} else if (p->ainew.tbt == AI_TRUCK) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   356
			p->ainew.cargo = AI_NO_CARGO;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   357
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   358
			p->ainew.from_type = AI_INDUSTRY;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   359
			p->ainew.to_type = AI_INDUSTRY;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   360
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   361
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   362
		// Now we are doing initing, we wait one tick
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   363
		return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   364
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   365
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   366
	// Increase the counter and abort if it is taking too long!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   367
	p->ainew.counter++;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   368
	if (p->ainew.counter > AI_LOCATE_ROUTE_MAX_COUNTER) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   369
		// Switch back to doing nothing!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   370
		p->ainew.state = AI_STATE_NOTHING;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   371
		return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   372
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   373
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   374
	// We are going to locate a city from where we are going to connect
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   375
	if (p->ainew.from_ic == -1) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   376
		if (p->ainew.temp == -1) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   377
			// First, we pick a random spot to search from
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: 3952
diff changeset
   378
			if (p->ainew.from_type == AI_CITY) {
5247
c3eece01af11 (svn r7372) - CodeChange: Rename all GetXXXArraySize() functions to GetNumXXX() and add GetMaxXXXIndex() functions. This prepares for the new pool interface.
matthijs
parents: 5015
diff changeset
   379
				p->ainew.temp = AI_RandomRange(GetMaxTownIndex() + 1);
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: 3952
diff changeset
   380
			} else {
5247
c3eece01af11 (svn r7372) - CodeChange: Rename all GetXXXArraySize() functions to GetNumXXX() and add GetMaxXXXIndex() functions. This prepares for the new pool interface.
matthijs
parents: 5015
diff changeset
   381
				p->ainew.temp = AI_RandomRange(GetMaxIndustryIndex() + 1);
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: 3952
diff changeset
   382
			}
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   383
		}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   384
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   385
		if (!AiNew_Check_City_or_Industry(p, p->ainew.temp, p->ainew.from_type)) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   386
			// It was not a valid city
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   387
			//  increase the temp with one, and return. We will come back later here
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   388
			//  to try again
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   389
			p->ainew.temp++;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   390
			if (p->ainew.from_type == AI_CITY) {
5247
c3eece01af11 (svn r7372) - CodeChange: Rename all GetXXXArraySize() functions to GetNumXXX() and add GetMaxXXXIndex() functions. This prepares for the new pool interface.
matthijs
parents: 5015
diff changeset
   391
				if (p->ainew.temp > GetMaxTownIndex()) p->ainew.temp = 0;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   392
			} else {
5247
c3eece01af11 (svn r7372) - CodeChange: Rename all GetXXXArraySize() functions to GetNumXXX() and add GetMaxXXXIndex() functions. This prepares for the new pool interface.
matthijs
parents: 5015
diff changeset
   393
				if (p->ainew.temp > GetMaxIndustryIndex()) p->ainew.temp = 0;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   394
			}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   395
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   396
			// Don't do an attempt if we are trying the same id as the last time...
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   397
			if (p->ainew.last_id == p->ainew.temp) return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   398
			p->ainew.last_id = p->ainew.temp;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   399
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   400
			return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   401
		}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   402
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   403
		// We found a good city/industry, save the data of it
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   404
		p->ainew.from_ic = p->ainew.temp;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   405
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   406
		// Start the next tick with finding a to-city
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   407
		p->ainew.temp = -1;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   408
		return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   409
	}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   410
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   411
	// Find a to-city
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   412
	if (p->ainew.temp == -1) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   413
		// First, we pick a random spot to search to
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: 3952
diff changeset
   414
		if (p->ainew.to_type == AI_CITY) {
5247
c3eece01af11 (svn r7372) - CodeChange: Rename all GetXXXArraySize() functions to GetNumXXX() and add GetMaxXXXIndex() functions. This prepares for the new pool interface.
matthijs
parents: 5015
diff changeset
   415
			p->ainew.temp = AI_RandomRange(GetMaxTownIndex() + 1);
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: 3952
diff changeset
   416
		} else {
5247
c3eece01af11 (svn r7372) - CodeChange: Rename all GetXXXArraySize() functions to GetNumXXX() and add GetMaxXXXIndex() functions. This prepares for the new pool interface.
matthijs
parents: 5015
diff changeset
   417
			p->ainew.temp = AI_RandomRange(GetMaxIndustryIndex() + 1);
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: 3952
diff changeset
   418
		}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   419
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   420
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   421
	// The same city is not allowed
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   422
	// Also check if the city is valid
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   423
	if (p->ainew.temp != p->ainew.from_ic && AiNew_Check_City_or_Industry(p, p->ainew.temp, p->ainew.to_type)) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   424
		// Maybe it is valid..
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   425
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: 3952
diff changeset
   426
		/* We need to know if they are not to far apart from eachother..
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: 3952
diff changeset
   427
		 * We do that by checking how much cargo we have to move and how long the
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: 3952
diff changeset
   428
		 * route is.
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: 3952
diff changeset
   429
		 */
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   430
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   431
		if (p->ainew.from_type == AI_CITY && p->ainew.tbt == AI_BUS) {
3952
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   432
			const Town* town_from = GetTown(p->ainew.from_ic);
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   433
			const Town* town_temp = GetTown(p->ainew.temp);
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   434
			uint distance = DistanceManhattan(town_from->xy, town_temp->xy);
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   435
			int max_cargo;
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   436
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   437
			max_cargo  = town_from->max_pass + town_temp->max_pass;
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   438
			max_cargo -= town_from->act_pass + town_temp->act_pass;
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   439
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   440
			// max_cargo is now the amount of cargo we can move between the two cities
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   441
			// If it is more than the distance, we allow it
3952
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   442
			if (distance <= max_cargo * AI_LOCATEROUTE_BUS_CARGO_DISTANCE) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   443
				// We found a good city/industry, save the data of it
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   444
				p->ainew.to_ic = p->ainew.temp;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   445
				p->ainew.state = AI_STATE_FIND_STATION;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   446
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5247
diff changeset
   447
				DEBUG(ai, 1, "[LocateRoute] found bus-route of %d tiles long (from %d to %d)",
3952
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   448
					distance,
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   449
					p->ainew.from_ic,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   450
					p->ainew.temp
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   451
				);
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   452
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   453
				p->ainew.from_tile = 0;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   454
				p->ainew.to_tile = 0;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   455
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   456
				return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   457
			}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   458
		} else if (p->ainew.tbt == AI_TRUCK) {
3952
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   459
			const Industry* ind_from = GetIndustry(p->ainew.from_ic);
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   460
			const Industry* ind_temp = GetIndustry(p->ainew.temp);
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   461
			bool found = false;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   462
			int max_cargo = 0;
3952
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   463
			uint i;
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   464
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   465
			// TODO: in max_cargo, also check other cargo (beside [0])
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   466
			// First we check if the from_ic produces cargo that this ic accepts
8141
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   467
			if (ind_from->produced_cargo[0] != CT_INVALID && ind_from->last_month_production[0] != 0) {
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   468
				for (i = 0; i < lengthof(ind_temp->accepts_cargo); i++) {
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   469
					if (ind_temp->accepts_cargo[i] == CT_INVALID) break;
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   470
					if (ind_from->produced_cargo[0] == ind_temp->accepts_cargo[i]) {
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: 3952
diff changeset
   471
						// Found a compatible industry
7315
f1b2591ad082 (svn r10058) -Codechange: give some industry variable sensible names (like not telling "last_mo_production" when it is the production of the current month).
rubidium
parents: 7290
diff changeset
   472
						max_cargo = ind_from->last_month_production[0] - ind_from->last_month_transported[0];
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   473
						found = true;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   474
						p->ainew.from_deliver = true;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   475
						p->ainew.to_deliver = false;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   476
						break;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   477
					}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   478
				}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   479
			}
8141
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   480
			if (!found && ind_temp->produced_cargo[0] != CT_INVALID && ind_temp->last_month_production[0] != 0) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   481
				// If not check if the current ic produces cargo that the from_ic accepts
8141
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   482
				for (i = 0; i < lengthof(ind_from->accepts_cargo); i++) {
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   483
					if (ind_from->accepts_cargo[i] == CT_INVALID) break;
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   484
					if (ind_from->produced_cargo[0] == ind_from->accepts_cargo[i]) {
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   485
						// Found a compatbiel industry
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   486
						found = true;
7315
f1b2591ad082 (svn r10058) -Codechange: give some industry variable sensible names (like not telling "last_mo_production" when it is the production of the current month).
rubidium
parents: 7290
diff changeset
   487
						max_cargo = ind_temp->last_month_production[0] - ind_temp->last_month_transported[0];
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   488
						p->ainew.from_deliver = false;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   489
						p->ainew.to_deliver = true;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   490
						break;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   491
					}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   492
				}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   493
			}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   494
			if (found) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   495
				// Yeah, they are compatible!!!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   496
				// Check the length against the amount of goods
3952
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   497
				uint distance = DistanceManhattan(ind_from->xy, ind_temp->xy);
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   498
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   499
				if (distance > AI_LOCATEROUTE_TRUCK_MIN_DISTANCE &&
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   500
						distance <= max_cargo * AI_LOCATEROUTE_TRUCK_CARGO_DISTANCE) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   501
					p->ainew.to_ic = p->ainew.temp;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   502
					if (p->ainew.from_deliver) {
8141
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   503
						p->ainew.cargo = ind_from->produced_cargo[0];
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   504
					} else {
8141
c052dc0dc029 (svn r11176) -Revert (r9867): as it is needed for newgrf callbacks 14B and 14C
glx
parents: 7866
diff changeset
   505
						p->ainew.cargo = ind_temp->produced_cargo[0];
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   506
					}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   507
					p->ainew.state = AI_STATE_FIND_STATION;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   508
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5247
diff changeset
   509
					DEBUG(ai, 1, "[LocateRoute] found truck-route of %d tiles long (from %d to %d)",
3952
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   510
						distance,
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   511
						p->ainew.from_ic,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   512
						p->ainew.temp
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   513
					);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   514
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   515
					p->ainew.from_tile = 0;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   516
					p->ainew.to_tile = 0;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   517
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   518
					return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   519
				}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   520
			}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   521
		}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   522
	}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   523
1260
c60e76928e5c (svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents: 1253
diff changeset
   524
	// It was not a valid city
c60e76928e5c (svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents: 1253
diff changeset
   525
	//  increase the temp with one, and return. We will come back later here
c60e76928e5c (svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents: 1253
diff changeset
   526
	//  to try again
c60e76928e5c (svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents: 1253
diff changeset
   527
	p->ainew.temp++;
c60e76928e5c (svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents: 1253
diff changeset
   528
	if (p->ainew.to_type == AI_CITY) {
5247
c3eece01af11 (svn r7372) - CodeChange: Rename all GetXXXArraySize() functions to GetNumXXX() and add GetMaxXXXIndex() functions. This prepares for the new pool interface.
matthijs
parents: 5015
diff changeset
   529
		if (p->ainew.temp > GetMaxTownIndex()) p->ainew.temp = 0;
1260
c60e76928e5c (svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents: 1253
diff changeset
   530
	} else {
5247
c3eece01af11 (svn r7372) - CodeChange: Rename all GetXXXArraySize() functions to GetNumXXX() and add GetMaxXXXIndex() functions. This prepares for the new pool interface.
matthijs
parents: 5015
diff changeset
   531
		if (p->ainew.temp > GetMaxIndustryIndex()) p->ainew.temp = 0;
1260
c60e76928e5c (svn r1764) -Add: dynamic towns, you can now have up to 64k towns (let me know when
truelight
parents: 1253
diff changeset
   532
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   533
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   534
	// Don't do an attempt if we are trying the same id as the last time...
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   535
	if (p->ainew.last_id == p->ainew.temp) return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   536
	p->ainew.last_id = p->ainew.temp;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   537
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   538
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   539
826
0e2b569b737b (svn r1297) Language fixes in the source.. (ln-)
miham
parents: 679
diff changeset
   540
// Check if there are not more than a certain amount of vehicles pointed to a certain
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   541
//  station. This to prevent 10 busses going to one station, which gives... problems ;)
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   542
static bool AiNew_CheckVehicleStation(Player *p, Station *st)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   543
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   544
	int count = 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   545
	Vehicle *v;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   546
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   547
	// Also check if we don't have already a lot of busses to this city...
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   548
	FOR_ALL_VEHICLES(v) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   549
		if (v->owner == _current_player) {
1024
9b06b01490a4 (svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents: 926
diff changeset
   550
			const Order *order;
9b06b01490a4 (svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents: 926
diff changeset
   551
9b06b01490a4 (svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents: 926
diff changeset
   552
			FOR_VEHICLE_ORDERS(v, order) {
4527
b18634a31a4a (svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents: 4389
diff changeset
   553
				if (order->type == OT_GOTO_STATION && GetStation(order->dest) == st) {
1024
9b06b01490a4 (svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents: 926
diff changeset
   554
					// This vehicle has this city in its list
9b06b01490a4 (svn r1525) -Codechange: rewrote the _order_array, now it can be made dynamic.
truelight
parents: 926
diff changeset
   555
					count++;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   556
				}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   557
			}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   558
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   559
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   560
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   561
	if (count > AI_CHECK_MAX_VEHICLE_PER_STATION) return false;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   562
	return true;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   563
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   564
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   565
// This function finds a good spot for a station
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   566
static void AiNew_State_FindStation(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   567
{
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   568
	TileIndex tile;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   569
	Station *st;
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
   570
	int count = 0;
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
   571
	EngineID i;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   572
	TileIndex new_tile = 0;
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
   573
	DiagDirection direction = DIAGDIR_NE;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   574
	Town *town = NULL;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   575
	assert(p->ainew.state == AI_STATE_FIND_STATION);
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   576
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   577
	if (p->ainew.from_tile == 0) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   578
		// First we scan for a station in the from-city
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   579
		if (p->ainew.from_type == AI_CITY) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   580
			town = GetTown(p->ainew.from_ic);
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   581
			tile = town->xy;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   582
		} else {
3952
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   583
			tile = GetIndustry(p->ainew.from_ic)->xy;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   584
		}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   585
	} else if (p->ainew.to_tile == 0) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   586
		// Second we scan for a station in the to-city
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   587
		if (p->ainew.to_type == AI_CITY) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   588
			town = GetTown(p->ainew.to_ic);
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   589
			tile = town->xy;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   590
		} else {
3952
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   591
			tile = GetIndustry(p->ainew.to_ic)->xy;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   592
		}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   593
	} else {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   594
		// Unsupported request
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   595
		// Go to FIND_PATH
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   596
		p->ainew.temp = -1;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   597
		p->ainew.state = AI_STATE_FIND_PATH;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   598
		return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   599
	}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   600
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   601
	// First, we are going to look at the stations that already exist inside the city
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   602
	//  If there is enough cargo left in the station, we take that station
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   603
	//  If that is not possible, and there are more than 2 stations in the city, abort
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   604
	i = AiNew_PickVehicle(p);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   605
	// Euhmz, this should not happen _EVER_
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   606
	// Quit finding a route...
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
   607
	if (i == INVALID_ENGINE) {
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
   608
		p->ainew.state = AI_STATE_NOTHING;
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
   609
		return;
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
   610
	}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   611
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   612
	FOR_ALL_STATIONS(st) {
4346
3f00094f2670 (svn r6047) -Codechange: FOR_ALL now _only_ loops valid items, and skips invalid ones
truelight
parents: 4261
diff changeset
   613
		if (st->owner == _current_player) {
3f00094f2670 (svn r6047) -Codechange: FOR_ALL now _only_ loops valid items, and skips invalid ones
truelight
parents: 4261
diff changeset
   614
			if (p->ainew.tbt == AI_BUS && (FACIL_BUS_STOP & st->facilities) == FACIL_BUS_STOP) {
3f00094f2670 (svn r6047) -Codechange: FOR_ALL now _only_ loops valid items, and skips invalid ones
truelight
parents: 4261
diff changeset
   615
				if (st->town == town) {
3f00094f2670 (svn r6047) -Codechange: FOR_ALL now _only_ loops valid items, and skips invalid ones
truelight
parents: 4261
diff changeset
   616
					// Check how much cargo there is left in the station
7506
e52d89f5c7c1 (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 7486
diff changeset
   617
					if ((int)st->goods[p->ainew.cargo].cargo.Count() > RoadVehInfo(i)->capacity * AI_STATION_REUSE_MULTIPLER) {
4346
3f00094f2670 (svn r6047) -Codechange: FOR_ALL now _only_ loops valid items, and skips invalid ones
truelight
parents: 4261
diff changeset
   618
						if (AiNew_CheckVehicleStation(p, st)) {
3f00094f2670 (svn r6047) -Codechange: FOR_ALL now _only_ loops valid items, and skips invalid ones
truelight
parents: 4261
diff changeset
   619
							// We did found a station that was good enough!
3f00094f2670 (svn r6047) -Codechange: FOR_ALL now _only_ loops valid items, and skips invalid ones
truelight
parents: 4261
diff changeset
   620
							new_tile = st->xy;
3f00094f2670 (svn r6047) -Codechange: FOR_ALL now _only_ loops valid items, and skips invalid ones
truelight
parents: 4261
diff changeset
   621
							direction = GetRoadStopDir(st->xy);
3f00094f2670 (svn r6047) -Codechange: FOR_ALL now _only_ loops valid items, and skips invalid ones
truelight
parents: 4261
diff changeset
   622
							break;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   623
						}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   624
					}
4346
3f00094f2670 (svn r6047) -Codechange: FOR_ALL now _only_ loops valid items, and skips invalid ones
truelight
parents: 4261
diff changeset
   625
					count++;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   626
				}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   627
			}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   628
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   629
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   630
	// We are going to add a new station...
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   631
	if (new_tile == 0) count++;
826
0e2b569b737b (svn r1297) Language fixes in the source.. (ln-)
miham
parents: 679
diff changeset
   632
	// No more than 2 stations allowed in a city
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   633
	//  This is because only the best 2 stations of one cargo do get any cargo
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   634
	if (count > 2) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   635
		p->ainew.state = AI_STATE_NOTHING;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   636
		return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   637
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   638
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   639
	if (new_tile == 0 && p->ainew.tbt == AI_BUS) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   640
		uint x, y, i = 0;
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7420
diff changeset
   641
		CommandCost r;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   642
		uint best;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   643
		uint accepts[NUM_CARGO];
6987
b0f13039bda2 (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6585
diff changeset
   644
		TileIndex found_spot[AI_FINDSTATION_TILE_RANGE*AI_FINDSTATION_TILE_RANGE * 4];
b0f13039bda2 (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6585
diff changeset
   645
		uint found_best[AI_FINDSTATION_TILE_RANGE*AI_FINDSTATION_TILE_RANGE * 4];
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   646
		// To find a good spot we scan a range from the center, a get the point
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   647
		//  where we get the most cargo and where it is buildable.
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   648
		// TODO: also check for station of myself and make sure we are not
7420
bd7ebdf5a44a (svn r10177) -Fix: Passengers has one A and two Es (ln)
peter1138
parents: 7315
diff changeset
   649
		//   taking eachothers passengers away (bad result when it does not)
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   650
		for (x = TileX(tile) - AI_FINDSTATION_TILE_RANGE; x <= TileX(tile) + AI_FINDSTATION_TILE_RANGE; x++) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   651
			for (y = TileY(tile) - AI_FINDSTATION_TILE_RANGE; y <= TileY(tile) + AI_FINDSTATION_TILE_RANGE; y++) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   652
				new_tile = TileXY(x, y);
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   653
				if (IsTileType(new_tile, MP_CLEAR) || IsTileType(new_tile, MP_TREES)) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   654
					// This tile we can build on!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   655
					// Check acceptance
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   656
					// XXX - Get the catchment area
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   657
					GetAcceptanceAroundTiles(accepts, new_tile, 1, 1, 4);
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   658
					// >> 3 == 0 means no cargo
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   659
					if (accepts[p->ainew.cargo] >> 3 == 0) continue;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   660
					// See if we can build the station
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   661
					r = AiNew_Build_Station(p, p->ainew.tbt, new_tile, 0, 0, 0, DC_QUERY_COST);
2737
f16e0a808897 (svn r3282) - Codechange: Replace tests against CMD_ERROR with CmdFailed()
peter1138
parents: 2684
diff changeset
   662
					if (CmdFailed(r)) continue;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   663
					// We can build it, so add it to found_spot
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   664
					found_spot[i] = new_tile;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   665
					found_best[i++] = accepts[p->ainew.cargo];
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   666
				}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   667
			}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   668
		}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   669
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: 3952
diff changeset
   670
		// If i is still zero, we did not find anything
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   671
		if (i == 0) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   672
			p->ainew.state = AI_STATE_NOTHING;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   673
			return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   674
		}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   675
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   676
		// Go through all the found_best and check which has the highest value
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   677
		best = 0;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   678
		new_tile = 0;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   679
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: 3952
diff changeset
   680
		for (x = 0; x < i; x++) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   681
			if (found_best[x] > best ||
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   682
					(found_best[x] == best && DistanceManhattan(tile, new_tile) > DistanceManhattan(tile, found_spot[x]))) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   683
				new_tile = found_spot[x];
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   684
				best = found_best[x];
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   685
			}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   686
		}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   687
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   688
		// See how much it is going to cost us...
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   689
		r = AiNew_Build_Station(p, p->ainew.tbt, new_tile, 0, 0, 0, DC_QUERY_COST);
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   690
		p->ainew.new_cost += r.GetCost();
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   691
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
   692
		direction = (DiagDirection)AI_PATHFINDER_NO_DIRECTION;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   693
	} else if (new_tile == 0 && p->ainew.tbt == AI_TRUCK) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   694
		// Truck station locater works differently.. a station can be on any place
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   695
		//  as long as it is in range. So we give back code AI_STATION_RANGE
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   696
		//  so the pathfinder routine can work it out!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   697
		new_tile = AI_STATION_RANGE;
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
   698
		direction = (DiagDirection)AI_PATHFINDER_NO_DIRECTION;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   699
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   700
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   701
	if (p->ainew.from_tile == 0) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   702
		p->ainew.from_tile = new_tile;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   703
		p->ainew.from_direction = direction;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   704
		// Now we found thisone, go in for to_tile
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   705
		return;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   706
	} else if (p->ainew.to_tile == 0) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   707
		p->ainew.to_tile = new_tile;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   708
		p->ainew.to_direction = direction;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   709
		// K, done placing stations!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   710
		p->ainew.temp = -1;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   711
		p->ainew.state = AI_STATE_FIND_PATH;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   712
		return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   713
	}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   714
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   715
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   716
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   717
// We try to find a path between 2 points
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   718
static void AiNew_State_FindPath(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   719
{
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   720
	int r;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   721
	assert(p->ainew.state == AI_STATE_FIND_PATH);
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   722
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   723
	// First time, init some data
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   724
	if (p->ainew.temp == -1) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   725
		// Init path_info
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   726
		if (p->ainew.from_tile == AI_STATION_RANGE) {
3952
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   727
			const Industry* i = GetIndustry(p->ainew.from_ic);
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   728
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   729
			// For truck routes we take a range around the industry
3952
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   730
			p->ainew.path_info.start_tile_tl = i->xy - TileDiffXY(1, 1);
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   731
			p->ainew.path_info.start_tile_br = i->xy + TileDiffXY(i->width + 1, i->height + 1);
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   732
			p->ainew.path_info.start_direction = p->ainew.from_direction;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   733
		} else {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   734
			p->ainew.path_info.start_tile_tl = p->ainew.from_tile;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   735
			p->ainew.path_info.start_tile_br = p->ainew.from_tile;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   736
			p->ainew.path_info.start_direction = p->ainew.from_direction;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   737
		}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   738
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   739
		if (p->ainew.to_tile == AI_STATION_RANGE) {
3952
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   740
			const Industry* i = GetIndustry(p->ainew.to_ic);
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   741
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   742
			p->ainew.path_info.end_tile_tl = i->xy - TileDiffXY(1, 1);
c51a2e094dde (svn r5098) Do some manual CSE and replace a few magic numbers to improve the readability of the trolly AI
tron
parents: 3951
diff changeset
   743
			p->ainew.path_info.end_tile_br = i->xy + TileDiffXY(i->width + 1, i->height + 1);
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   744
			p->ainew.path_info.end_direction = p->ainew.to_direction;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   745
		} else {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   746
			p->ainew.path_info.end_tile_tl = p->ainew.to_tile;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   747
			p->ainew.path_info.end_tile_br = p->ainew.to_tile;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   748
			p->ainew.path_info.end_direction = p->ainew.to_direction;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   749
		}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   750
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: 3952
diff changeset
   751
		p->ainew.path_info.rail_or_road = (p->ainew.tbt == AI_TRAIN);
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   752
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   753
		// First, clean the pathfinder with our new begin and endpoints
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   754
		clean_AyStar_AiPathFinder(p->ainew.pathfinder, &p->ainew.path_info);
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   755
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   756
		p->ainew.temp = 0;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   757
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   758
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   759
	// Start the pathfinder
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   760
	r = p->ainew.pathfinder->main(p->ainew.pathfinder);
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: 3952
diff changeset
   761
	switch (r) {
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: 3952
diff changeset
   762
		case AYSTAR_NO_PATH:
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5247
diff changeset
   763
			DEBUG(ai, 1, "No route found by pathfinder");
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: 3952
diff changeset
   764
			// Start all over again
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: 3952
diff changeset
   765
			p->ainew.state = AI_STATE_NOTHING;
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: 3952
diff changeset
   766
			break;
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: 3952
diff changeset
   767
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: 3952
diff changeset
   768
		case AYSTAR_FOUND_END_NODE: // We found the end-point
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: 3952
diff changeset
   769
			p->ainew.temp = -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: 3952
diff changeset
   770
			p->ainew.state = AI_STATE_FIND_DEPOT;
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: 3952
diff changeset
   771
			break;
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: 3952
diff changeset
   772
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: 3952
diff changeset
   773
		// In any other case, we are still busy finding the route
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: 3952
diff changeset
   774
		default: break;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   775
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   776
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   777
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   778
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   779
// This function tries to locate a good place for a depot!
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   780
static void AiNew_State_FindDepot(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   781
{
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   782
	// To place the depot, we walk through the route, and if we find a lovely spot (MP_CLEAR, MP_TREES), we place it there..
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   783
	// Simple, easy, works!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   784
	// To make the depot stand in the middle of the route, we start from the center..
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   785
	// But first we walk through the route see if we can find a depot that is ours
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   786
	//  this keeps things nice ;)
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7420
diff changeset
   787
	int g, i;
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7420
diff changeset
   788
	CommandCost r;
3153
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   789
	DiagDirection j;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   790
	TileIndex tile;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   791
	assert(p->ainew.state == AI_STATE_FIND_DEPOT);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   792
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   793
	p->ainew.depot_tile = 0;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   794
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   795
	for (i=2;i<p->ainew.path_info.route_length-2;i++) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   796
		tile = p->ainew.path_info.route[i];
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   797
		for (j = DIAGDIR_BEGIN; j < DIAGDIR_END; j++) {
4559
c853d2440065 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4527
diff changeset
   798
			TileIndex t = tile + TileOffsByDiagDir(j);
3153
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   799
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: 7813
diff changeset
   800
			if (IsTileType(t, MP_ROAD) &&
3793
33cdb5bf7b21 (svn r4789) - Codechange: rename RoadType to RoadTileType and ROAD_{NORMAL,CROSSING,DEPOT} to ROAD_TILE_* for consistency
rubidium
parents: 3644
diff changeset
   801
					GetRoadTileType(t) == ROAD_TILE_DEPOT &&
3153
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   802
					IsTileOwner(t, _current_player) &&
3179
774b1e6553a7 (svn r3816) Use existing accessors
tron
parents: 3157
diff changeset
   803
					GetRoadDepotDirection(t) == ReverseDiagDir(j)) {
3153
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   804
				p->ainew.depot_tile = t;
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   805
				p->ainew.depot_direction = ReverseDiagDir(j);
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   806
				p->ainew.state = AI_STATE_VERIFY_ROUTE;
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   807
				return;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   808
			}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   809
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   810
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   811
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   812
	// This routine let depot finding start in the middle, and work his way to the stations
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   813
	// It makes depot placing nicer :)
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   814
	i = p->ainew.path_info.route_length / 2;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   815
	g = 1;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   816
	while (i > 1 && i < p->ainew.path_info.route_length - 2) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   817
		i += g;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   818
		g *= -1;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   819
		(g < 0?g--:g++);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   820
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   821
		if (p->ainew.path_info.route_extra[i] != 0 || p->ainew.path_info.route_extra[i+1] != 0) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   822
			// Bridge or tunnel.. we can't place a depot there
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   823
			continue;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   824
		}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   825
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   826
		tile = p->ainew.path_info.route[i];
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   827
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   828
		for (j = DIAGDIR_BEGIN; j < DIAGDIR_END; j++) {
4559
c853d2440065 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4527
diff changeset
   829
			TileIndex t = tile + TileOffsByDiagDir(j);
3153
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   830
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   831
			// It may not be placed on the road/rail itself
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   832
			// And because it is not build yet, we can't see it on the tile..
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   833
			// So check the surrounding tiles :)
3153
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   834
			if (t == p->ainew.path_info.route[i - 1] ||
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   835
					t == p->ainew.path_info.route[i + 1]) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   836
				continue;
3153
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   837
			}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   838
			// Not around a bridge?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   839
			if (p->ainew.path_info.route_extra[i] != 0) continue;
1035
0a170deb6e33 (svn r1536) Move GET_TILEHEIGHT, GET_TILETYPE and IS_TILETYPE to map.h, turn them into inline functions and add some asserts
tron
parents: 1024
diff changeset
   840
			if (IsTileType(tile, MP_TUNNELBRIDGE)) continue;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   841
			// Is the terrain clear?
3153
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   842
			if (IsTileType(t, MP_CLEAR) || IsTileType(t, MP_TREES)) {
3644
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3577
diff changeset
   843
				// If the current tile is on a slope then we do not allow this
45a307767dc1 (svn r4553) int and magic numbers -> Slope and DiagDirection
tron
parents: 3577
diff changeset
   844
				if (GetTileSlope(tile, NULL) != SLOPE_FLAT) continue;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   845
				// Check if everything went okay..
3153
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   846
				r = AiNew_Build_Depot(p, t, ReverseDiagDir(j), 0);
2737
f16e0a808897 (svn r3282) - Codechange: Replace tests against CMD_ERROR with CmdFailed()
peter1138
parents: 2684
diff changeset
   847
				if (CmdFailed(r)) continue;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   848
				// Found a spot!
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   849
				p->ainew.new_cost += r.GetCost();
3153
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   850
				p->ainew.depot_tile = t;
301c1d71122b (svn r3776) Replace many ints and magic numbers by Direction, DiagDirection and friends
tron
parents: 3144
diff changeset
   851
				p->ainew.depot_direction = ReverseDiagDir(j); // Reverse direction
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   852
				p->ainew.state = AI_STATE_VERIFY_ROUTE;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   853
				return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   854
			}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   855
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   856
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   857
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   858
	// Failed to find a depot?
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   859
	p->ainew.state = AI_STATE_NOTHING;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   860
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   861
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   862
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   863
// This function calculates how many vehicles there are needed on this
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   864
//  traject.
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   865
// It works pretty simple: get the length, see how much we move around
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   866
//  and hussle that, and you know how many vehicles there are needed.
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   867
// It returns the cost for the vehicles
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   868
static int AiNew_HowManyVehicles(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   869
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   870
	if (p->ainew.tbt == AI_BUS) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   871
		// For bus-routes we look at the time before we are back in the station
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
   872
		EngineID i;
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
   873
		int length, tiles_a_day;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   874
		int amount;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   875
		i = AiNew_PickVehicle(p);
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
   876
		if (i == INVALID_ENGINE) return 0;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   877
		// Passenger run.. how long is the route?
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   878
		length = p->ainew.path_info.route_length;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   879
		// Calculating tiles a day a vehicle moves is not easy.. this is how it must be done!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   880
		tiles_a_day = RoadVehInfo(i)->max_speed * DAY_TICKS / 256 / 16;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   881
		// We want a vehicle in a station once a month at least, so, calculate it!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   882
		// (the * 2 is because we have 2 stations ;))
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   883
		amount = length * 2 * 2 / tiles_a_day / 30;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   884
		if (amount == 0) amount = 1;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   885
		return amount;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   886
	} else if (p->ainew.tbt == AI_TRUCK) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   887
		// For truck-routes we look at the cargo
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
   888
		EngineID i;
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
   889
		int length, amount, tiles_a_day;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   890
		int max_cargo;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   891
		i = AiNew_PickVehicle(p);
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
   892
		if (i == INVALID_ENGINE) return 0;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   893
		// Passenger run.. how long is the route?
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   894
		length = p->ainew.path_info.route_length;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   895
		// Calculating tiles a day a vehicle moves is not easy.. this is how it must be done!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   896
		tiles_a_day = RoadVehInfo(i)->max_speed * DAY_TICKS / 256 / 16;
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: 3952
diff changeset
   897
		if (p->ainew.from_deliver) {
7315
f1b2591ad082 (svn r10058) -Codechange: give some industry variable sensible names (like not telling "last_mo_production" when it is the production of the current month).
rubidium
parents: 7290
diff changeset
   898
			max_cargo = GetIndustry(p->ainew.from_ic)->last_month_production[0];
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: 3952
diff changeset
   899
		} else {
7315
f1b2591ad082 (svn r10058) -Codechange: give some industry variable sensible names (like not telling "last_mo_production" when it is the production of the current month).
rubidium
parents: 7290
diff changeset
   900
			max_cargo = GetIndustry(p->ainew.to_ic)->last_month_production[0];
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: 3952
diff changeset
   901
		}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   902
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   903
		// This is because moving 60% is more than we can dream of!
5838
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   904
		max_cargo *= 6;
9c3129cb019b (svn r8038) -Merge: the cpp branch. Effort of KUDr, Celestar, glx, Smoovius, stillunknown and pv2b.
rubidium
parents: 5835
diff changeset
   905
		max_cargo /= 10;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   906
		// We want all the cargo to be gone in a month.. so, we know the cargo it delivers
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   907
		//  we know what the vehicle takes with him, and we know the time it takes him
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   908
		//  to get back here.. now let's do some math!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   909
		amount = 2 * length * max_cargo / tiles_a_day / 30 / RoadVehInfo(i)->capacity;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   910
		amount += 1;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   911
		return amount;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   912
	} else {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   913
		// Currently not supported
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   914
		return 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   915
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   916
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   917
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   918
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   919
// This function checks:
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   920
//   - If the route went okay
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   921
//   - Calculates the amount of money needed to build the route
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   922
//   - Calculates how much vehicles needed for the route
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   923
static void AiNew_State_VerifyRoute(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   924
{
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   925
	int res, i;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   926
	assert(p->ainew.state == AI_STATE_VERIFY_ROUTE);
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   927
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   928
	// Let's calculate the cost of the path..
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   929
	//  new_cost already contains the cost of the stations
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   930
	p->ainew.path_info.position = -1;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   931
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   932
	do {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   933
		p->ainew.path_info.position++;
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   934
		p->ainew.new_cost += AiNew_Build_RoutePart(p, &p->ainew.path_info, DC_QUERY_COST).GetCost();
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   935
	} while (p->ainew.path_info.position != -2);
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   936
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   937
	// Now we know the price of build station + path. Now check how many vehicles
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   938
	//  we need and what the price for that will be
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   939
	res = AiNew_HowManyVehicles(p);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   940
	// If res == 0, no vehicle was found, or an other problem did occour
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   941
	if (res == 0) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   942
		p->ainew.state = AI_STATE_NOTHING;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   943
		return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   944
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   945
	p->ainew.amount_veh = res;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   946
	p->ainew.cur_veh = 0;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   947
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   948
	// Check how much it it going to cost us..
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   949
	for (i=0;i<res;i++) {
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   950
		p->ainew.new_cost += AiNew_Build_Vehicle(p, 0, DC_QUERY_COST).GetCost();
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   951
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   952
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   953
	// Now we know how much the route is going to cost us
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   954
	//  Check if we have enough money for it!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   955
	if (p->ainew.new_cost > p->player_money - AI_MINIMUM_MONEY) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   956
		// Too bad..
8259
127e5d73637d (svn r11312) -Codechange: implement a overflow safe integer and use that for money and don't misuses CommandCost to have a overflow safe integer. Based on a patch by Noldo.
rubidium
parents: 8254
diff changeset
   957
		DEBUG(ai, 1, "Insufficient funds to build route (%" OTTD_PRINTF64 "d)", (int64)p->ainew.new_cost);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   958
		p->ainew.state = AI_STATE_NOTHING;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   959
		return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   960
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   961
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   962
	// Now we can build the route, check the direction of the stations!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   963
	if (p->ainew.from_direction == AI_PATHFINDER_NO_DIRECTION) {
6987
b0f13039bda2 (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6585
diff changeset
   964
		p->ainew.from_direction = AiNew_GetDirection(p->ainew.path_info.route[p->ainew.path_info.route_length - 1], p->ainew.path_info.route[p->ainew.path_info.route_length - 2]);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   965
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   966
	if (p->ainew.to_direction == AI_PATHFINDER_NO_DIRECTION) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   967
		p->ainew.to_direction = AiNew_GetDirection(p->ainew.path_info.route[0], p->ainew.path_info.route[1]);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   968
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   969
	if (p->ainew.from_tile == AI_STATION_RANGE)
6987
b0f13039bda2 (svn r9672) -Cleanup: lots of coding style fixes around operands.
rubidium
parents: 6585
diff changeset
   970
		p->ainew.from_tile = p->ainew.path_info.route[p->ainew.path_info.route_length - 1];
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   971
	if (p->ainew.to_tile == AI_STATION_RANGE)
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   972
		p->ainew.to_tile = p->ainew.path_info.route[0];
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   973
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   974
	p->ainew.state = AI_STATE_BUILD_STATION;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   975
	p->ainew.temp = 0;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
   976
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5247
diff changeset
   977
	DEBUG(ai, 1, "The route is set and buildable, building 0x%X to 0x%X...", p->ainew.from_tile, p->ainew.to_tile);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   978
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   979
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   980
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   981
// Build the stations
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   982
static void AiNew_State_BuildStation(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   983
{
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
   984
	CommandCost res;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   985
	assert(p->ainew.state == AI_STATE_BUILD_STATION);
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   986
	if (p->ainew.temp == 0) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   987
		if (!IsTileType(p->ainew.from_tile, MP_STATION))
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   988
			res = AiNew_Build_Station(p, p->ainew.tbt, p->ainew.from_tile, 0, 0, p->ainew.from_direction, DC_EXEC);
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   989
	} else {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   990
		if (!IsTileType(p->ainew.to_tile, MP_STATION))
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   991
			res = AiNew_Build_Station(p, p->ainew.tbt, p->ainew.to_tile, 0, 0, p->ainew.to_direction, DC_EXEC);
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   992
		p->ainew.state = AI_STATE_BUILD_PATH;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
   993
	}
2737
f16e0a808897 (svn r3282) - Codechange: Replace tests against CMD_ERROR with CmdFailed()
peter1138
parents: 2684
diff changeset
   994
	if (CmdFailed(res)) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5247
diff changeset
   995
		DEBUG(ai, 0, "[BuildStation] station could not be built (0x%X)", p->ainew.to_tile);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   996
		p->ainew.state = AI_STATE_NOTHING;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   997
		// If the first station _was_ build, destroy it
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
   998
		if (p->ainew.temp != 0)
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
   999
			AI_DoCommand(p->ainew.from_tile, 0, 0, DC_EXEC, CMD_LANDSCAPE_CLEAR);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1000
		return;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1001
	}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1002
	p->ainew.temp++;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1003
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1004
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1005
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1006
// Build the path
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1007
static void AiNew_State_BuildPath(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1008
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1009
	assert(p->ainew.state == AI_STATE_BUILD_PATH);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1010
	// p->ainew.temp is set to -1 when this function is called for the first time
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1011
	if (p->ainew.temp == -1) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5247
diff changeset
  1012
		DEBUG(ai, 1, "Starting to build new path");
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1013
		// Init the counter
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1014
		p->ainew.counter = (4 - _opt.diff.competitor_speed) * AI_BUILDPATH_PAUSE + 1;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1015
		// Set the position to the startingplace (-1 because in a minute we do ++)
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1016
		p->ainew.path_info.position = -1;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1017
		// And don't do this again
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1018
		p->ainew.temp = 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1019
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1020
	// Building goes very fast on normal rate, so we are going to slow it down..
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1021
	//  By let the counter count from AI_BUILDPATH_PAUSE to 0, we have a nice way :)
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1022
	if (--p->ainew.counter != 0) return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1023
	p->ainew.counter = (4 - _opt.diff.competitor_speed) * AI_BUILDPATH_PAUSE + 1;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1024
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1025
	// Increase the building position
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1026
	p->ainew.path_info.position++;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1027
	// Build route
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1028
	AiNew_Build_RoutePart(p, &p->ainew.path_info, DC_EXEC);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1029
	if (p->ainew.path_info.position == -2) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1030
		// This means we are done building!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1031
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1032
		if (p->ainew.tbt == AI_TRUCK && !_patches.roadveh_queue) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1033
			// If they not queue, they have to go up and down to try again at a station...
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1034
			// We don't want that, so try building some road left or right of the station
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1035
			DiagDirection dir1, dir2, dir3;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1036
			TileIndex tile;
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7420
diff changeset
  1037
			CommandCost ret;
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7420
diff changeset
  1038
			for (int i = 0; i < 2; i++) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1039
				if (i == 0) {
4559
c853d2440065 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4527
diff changeset
  1040
					tile = p->ainew.from_tile + TileOffsByDiagDir(p->ainew.from_direction);
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1041
					dir1 = ChangeDiagDir(p->ainew.from_direction, DIAGDIRDIFF_90LEFT);
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1042
					dir2 = ChangeDiagDir(p->ainew.from_direction, DIAGDIRDIFF_90RIGHT);
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1043
					dir3 = p->ainew.from_direction;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1044
				} else {
4559
c853d2440065 (svn r6406) -Codechange: Rename TileOffsByDir to TileOffsByDiagDir because it accepts
Darkvater
parents: 4527
diff changeset
  1045
					tile = p->ainew.to_tile + TileOffsByDiagDir(p->ainew.to_direction);
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1046
					dir1 = ChangeDiagDir(p->ainew.to_direction, DIAGDIRDIFF_90LEFT);
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1047
					dir2 = ChangeDiagDir(p->ainew.to_direction, DIAGDIRDIFF_90RIGHT);
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1048
					dir3 = p->ainew.to_direction;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1049
				}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1050
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1051
				ret = AI_DoCommand(tile, DiagDirToRoadBits(ReverseDiagDir(dir1)), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
7442
a4f7989f27d4 (svn r10200) -Codechange: add "shortcut" for !CmdFailed (CmdSucceeded).
rubidium
parents: 7439
diff changeset
  1052
				if (CmdSucceeded(ret)) {
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1053
					TileIndex offset = TileOffsByDiagDir(dir1);
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1054
					if (IsTileType(tile + offset, MP_CLEAR) || IsTileType(tile + offset, MP_TREES)) {
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1055
						ret = AI_DoCommand(tile + offset, AiNew_GetRoadDirection(tile, tile + offset, tile + offset + offset), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
7442
a4f7989f27d4 (svn r10200) -Codechange: add "shortcut" for !CmdFailed (CmdSucceeded).
rubidium
parents: 7439
diff changeset
  1056
						if (CmdSucceeded(ret)) {
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1057
							if (IsTileType(tile + offset + offset, MP_CLEAR) || IsTileType(tile + offset + offset, MP_TREES))
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1058
								AI_DoCommand(tile + offset + offset, AiNew_GetRoadDirection(tile + offset, tile + offset + offset, tile + offset + offset + offset), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
146
7632a1ddadc0 (svn r147) -Fix [NewAI]: small fix for road-building when RoadQueueing is disabled
truelight
parents: 145
diff changeset
  1059
						}
7632a1ddadc0 (svn r147) -Fix [NewAI]: small fix for road-building when RoadQueueing is disabled
truelight
parents: 145
diff changeset
  1060
					}
7632a1ddadc0 (svn r147) -Fix [NewAI]: small fix for road-building when RoadQueueing is disabled
truelight
parents: 145
diff changeset
  1061
				}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1062
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1063
				ret = AI_DoCommand(tile, DiagDirToRoadBits(ReverseDiagDir(dir2)), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
7442
a4f7989f27d4 (svn r10200) -Codechange: add "shortcut" for !CmdFailed (CmdSucceeded).
rubidium
parents: 7439
diff changeset
  1064
				if (CmdSucceeded(ret)) {
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1065
					TileIndex offset = TileOffsByDiagDir(dir2);
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1066
					if (IsTileType(tile + offset, MP_CLEAR) || IsTileType(tile + offset, MP_TREES)) {
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1067
						ret = AI_DoCommand(tile + offset, AiNew_GetRoadDirection(tile, tile + offset, tile + offset + offset), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
7442
a4f7989f27d4 (svn r10200) -Codechange: add "shortcut" for !CmdFailed (CmdSucceeded).
rubidium
parents: 7439
diff changeset
  1068
						if (CmdSucceeded(ret)) {
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1069
							if (IsTileType(tile + offset + offset, MP_CLEAR) || IsTileType(tile + offset + offset, MP_TREES))
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1070
								AI_DoCommand(tile + offset + offset, AiNew_GetRoadDirection(tile + offset, tile + offset + offset, tile + offset + offset + offset), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
146
7632a1ddadc0 (svn r147) -Fix [NewAI]: small fix for road-building when RoadQueueing is disabled
truelight
parents: 145
diff changeset
  1071
						}
7632a1ddadc0 (svn r147) -Fix [NewAI]: small fix for road-building when RoadQueueing is disabled
truelight
parents: 145
diff changeset
  1072
					}
7632a1ddadc0 (svn r147) -Fix [NewAI]: small fix for road-building when RoadQueueing is disabled
truelight
parents: 145
diff changeset
  1073
				}
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1074
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1075
				ret = AI_DoCommand(tile, DiagDirToRoadBits(dir3), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
7442
a4f7989f27d4 (svn r10200) -Codechange: add "shortcut" for !CmdFailed (CmdSucceeded).
rubidium
parents: 7439
diff changeset
  1076
				if (CmdSucceeded(ret)) {
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1077
					TileIndex offset = TileOffsByDiagDir(dir3);
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1078
					if (IsTileType(tile + offset, MP_CLEAR) || IsTileType(tile + offset, MP_TREES)) {
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1079
						ret = AI_DoCommand(tile + offset, AiNew_GetRoadDirection(tile, tile + offset, tile + offset + offset), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
7442
a4f7989f27d4 (svn r10200) -Codechange: add "shortcut" for !CmdFailed (CmdSucceeded).
rubidium
parents: 7439
diff changeset
  1080
						if (CmdSucceeded(ret)) {
7813
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1081
							if (IsTileType(tile + offset + offset, MP_CLEAR) || IsTileType(tile + offset + offset, MP_TREES))
49fbe41f8a04 (svn r10672) -Codechange: typify some parameters/variables.
rubidium
parents: 7506
diff changeset
  1082
								AI_DoCommand(tile + offset + offset, AiNew_GetRoadDirection(tile + offset, tile + offset + offset, tile + offset + offset + offset), 0, DC_EXEC | DC_NO_WATER, CMD_BUILD_ROAD);
146
7632a1ddadc0 (svn r147) -Fix [NewAI]: small fix for road-building when RoadQueueing is disabled
truelight
parents: 145
diff changeset
  1083
						}
7632a1ddadc0 (svn r147) -Fix [NewAI]: small fix for road-building when RoadQueueing is disabled
truelight
parents: 145
diff changeset
  1084
					}
7632a1ddadc0 (svn r147) -Fix [NewAI]: small fix for road-building when RoadQueueing is disabled
truelight
parents: 145
diff changeset
  1085
				}
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1086
			}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1087
		}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1088
8259
127e5d73637d (svn r11312) -Codechange: implement a overflow safe integer and use that for money and don't misuses CommandCost to have a overflow safe integer. Based on a patch by Noldo.
rubidium
parents: 8254
diff changeset
  1089
		DEBUG(ai, 1, "Finished building path, cost: %" OTTD_PRINTF64 "d", (int64)p->ainew.new_cost);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1090
		p->ainew.state = AI_STATE_BUILD_DEPOT;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1091
	}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1092
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1093
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1094
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1095
// Builds the depot
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1096
static void AiNew_State_BuildDepot(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1097
{
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
  1098
	CommandCost res;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1099
	assert(p->ainew.state == AI_STATE_BUILD_DEPOT);
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1100
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: 7813
diff changeset
  1101
	if (IsTileType(p->ainew.depot_tile, MP_ROAD) && GetRoadTileType(p->ainew.depot_tile) == ROAD_TILE_DEPOT) {
1901
fb05044cf5c3 (svn r2407) Use {Get,Is}TileOwner to get/check the owner of a tile and fix some bogus reads of _map_owner
tron
parents: 1891
diff changeset
  1102
		if (IsTileOwner(p->ainew.depot_tile, _current_player)) {
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: 3952
diff changeset
  1103
			// The depot is already built
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1104
			p->ainew.state = AI_STATE_BUILD_VEHICLE;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1105
			return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1106
		} else {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1107
			// There is a depot, but not of our team! :(
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1108
			p->ainew.state = AI_STATE_NOTHING;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1109
			return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1110
		}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1111
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1112
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1113
	// There is a bus on the tile we want to build road on... idle till he is gone! (BAD PERSON! :p)
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: 8141
diff changeset
  1114
	if (!EnsureNoVehicleOnGround(p->ainew.depot_tile + TileOffsByDiagDir(p->ainew.depot_direction)))
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1115
		return;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1116
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1117
	res = AiNew_Build_Depot(p, p->ainew.depot_tile, p->ainew.depot_direction, DC_EXEC);
2737
f16e0a808897 (svn r3282) - Codechange: Replace tests against CMD_ERROR with CmdFailed()
peter1138
parents: 2684
diff changeset
  1118
	if (CmdFailed(res)) {
5568
75f13d7bfaed (svn r7565) -Codechange: Rework DEBUG functionality. Look for appropiate debugging levels to
Darkvater
parents: 5247
diff changeset
  1119
		DEBUG(ai, 0, "[BuildDepot] depot could not be built (0x%X)", p->ainew.depot_tile);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1120
		p->ainew.state = AI_STATE_NOTHING;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1121
		return;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1122
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1123
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1124
	p->ainew.state = AI_STATE_BUILD_VEHICLE;
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1125
	p->ainew.idle = 10;
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
  1126
	p->ainew.veh_main_id = INVALID_VEHICLE;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1127
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1128
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1129
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1130
// Build vehicles
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1131
static void AiNew_State_BuildVehicle(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1132
{
7439
0c0e2945c890 (svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents: 7420
diff changeset
  1133
	CommandCost res;
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1134
	assert(p->ainew.state == AI_STATE_BUILD_VEHICLE);
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1135
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1136
	// Check if we need to build a vehicle
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1137
	if (p->ainew.amount_veh == 0) {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1138
		// Nope, we are done!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1139
		// This means: we are all done! The route is open.. go back to NOTHING
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1140
		//  He will idle some time and it will all start over again.. :)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1141
		p->ainew.state = AI_STATE_ACTION_DONE;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1142
		return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1143
	}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1144
	if (--p->ainew.idle != 0) return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1145
	// It is realistic that the AI can only build 1 vehicle a day..
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1146
	// This makes sure of that!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1147
	p->ainew.idle = AI_BUILD_VEHICLE_TIME_BETWEEN;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1148
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1149
	// Build the vehicle
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1150
	res = AiNew_Build_Vehicle(p, p->ainew.depot_tile, DC_EXEC);
2737
f16e0a808897 (svn r3282) - Codechange: Replace tests against CMD_ERROR with CmdFailed()
peter1138
parents: 2684
diff changeset
  1151
	if (CmdFailed(res)) {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1152
		// This happens when the AI can't build any more vehicles!
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1153
		p->ainew.state = AI_STATE_NOTHING;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1154
		return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1155
	}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1156
	// Increase the current counter
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1157
	p->ainew.cur_veh++;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1158
	// Decrease the total counter
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1159
	p->ainew.amount_veh--;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1160
	// Go give some orders!
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: 3945
diff changeset
  1161
	p->ainew.state = AI_STATE_WAIT_FOR_BUILD;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1162
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1163
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1164
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1165
// Put the stations in the order list
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1166
static void AiNew_State_GiveOrders(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1167
{
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1168
	int idx;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1169
	Order order;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1170
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1171
	assert(p->ainew.state == AI_STATE_GIVE_ORDERS);
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1172
3885
327cdee1f0b6 (svn r4941) Replace some ints and magic numbers by proper types and enums
tron
parents: 3793
diff changeset
  1173
	if (p->ainew.veh_main_id != INVALID_VEHICLE) {
8560
8472721356cf (svn r11625) -Codechange: add CO_* enum at some places, add includes of order.h too
smatz
parents: 8259
diff changeset
  1174
		AI_DoCommand(0, p->ainew.veh_id + (p->ainew.veh_main_id << 16), CO_SHARE, DC_EXEC, CMD_CLONE_ORDER);
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1175
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1176
		p->ainew.state = AI_STATE_START_VEHICLE;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1177
		return;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1178
	} else {
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1179
		p->ainew.veh_main_id = p->ainew.veh_id;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1180
	}
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1181
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1182
	// Very handy for AI, goto depot.. but yeah, it needs to be activated ;)
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1183
	if (_patches.gotodepot) {
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1184
		idx = 0;
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1185
		order.type = OT_GOTO_DEPOT;
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1186
		order.flags = OF_UNLOAD;
4527
b18634a31a4a (svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents: 4389
diff changeset
  1187
		order.dest = GetDepotByTile(p->ainew.depot_tile)->index;
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1188
		AI_DoCommand(0, p->ainew.veh_id + (idx << 16), PackOrder(&order), DC_EXEC, CMD_INSERT_ORDER);
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1189
	}
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1190
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1191
	idx = 0;
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1192
	order.type = OT_GOTO_STATION;
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1193
	order.flags = 0;
4527
b18634a31a4a (svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents: 4389
diff changeset
  1194
	order.dest = GetStationIndex(p->ainew.to_tile);
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1195
	if (p->ainew.tbt == AI_TRUCK && p->ainew.to_deliver)
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1196
		order.flags |= OF_FULL_LOAD;
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1197
	AI_DoCommand(0, p->ainew.veh_id + (idx << 16), PackOrder(&order), DC_EXEC, CMD_INSERT_ORDER);
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1198
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1199
	idx = 0;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1200
	order.type = OT_GOTO_STATION;
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1201
	order.flags = 0;
4527
b18634a31a4a (svn r6353) -Codechange: Make DestinationID a typedef of uin16, which is as large as any type of destinataion (StationID, DepotID, WaypointID) it can hold
tron
parents: 4389
diff changeset
  1202
	order.dest = GetStationIndex(p->ainew.from_tile);
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1203
	if (p->ainew.tbt == AI_TRUCK && p->ainew.from_deliver)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1204
		order.flags |= OF_FULL_LOAD;
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1205
	AI_DoCommand(0, p->ainew.veh_id + (idx << 16), PackOrder(&order), DC_EXEC, CMD_INSERT_ORDER);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1206
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1207
	// Start the engines!
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1208
	p->ainew.state = AI_STATE_START_VEHICLE;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1209
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1210
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1211
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1212
// Start the vehicle
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1213
static void AiNew_State_StartVehicle(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1214
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1215
	assert(p->ainew.state == AI_STATE_START_VEHICLE);
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1216
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1217
	// Skip the first order if it is a second vehicle
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1218
	//  This to make vehicles go different ways..
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1219
	if (p->ainew.cur_veh & 1)
7290
647d6416cdfe (svn r10033) -Feature [FS#760]: skip to the selected order in the order list when clicking on the "skip" button while pressing CTRL.
rubidium
parents: 7132
diff changeset
  1220
		AI_DoCommand(0, p->ainew.veh_id, 1, DC_EXEC, CMD_SKIP_TO_ORDER);
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1221
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1222
	// 3, 2, 1... go! (give START_STOP command ;))
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1223
	AI_DoCommand(0, p->ainew.veh_id, 0, DC_EXEC, CMD_START_STOP_ROADVEH);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1224
	// Try to build an other vehicle (that function will stop building when needed)
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1225
	p->ainew.idle  = 10;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1226
	p->ainew.state = AI_STATE_BUILD_VEHICLE;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1227
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1228
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1229
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1230
// Repays money
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1231
static void AiNew_State_RepayMoney(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1232
{
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  1233
	uint i;
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  1234
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  1235
	for (i = 0; i < AI_LOAN_REPAY; i++) {
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1236
		AI_DoCommand(0, 0, 0, DC_EXEC, CMD_DECREASE_LOAN);
4077
d3022f976946 (svn r5391) Miscellaneous, mostly bracing and whitespace, nothing spectacular
tron
parents: 4000
diff changeset
  1237
	}
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1238
	p->ainew.state = AI_STATE_ACTION_DONE;
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1239
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1240
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1241
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1242
static void AiNew_CheckVehicle(Player *p, Vehicle *v)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1243
{
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1244
	// When a vehicle is under the 6 months, we don't check for anything
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1245
	if (v->age < 180) return;
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1246
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1247
	// When a vehicle is older then 1 year, it should make money...
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1248
	if (v->age > 360) {
826
0e2b569b737b (svn r1297) Language fixes in the source.. (ln-)
miham
parents: 679
diff changeset
  1249
		// If both years together are not more than AI_MINIMUM_ROUTE_PROFIT,
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1250
		//  it is not worth the line I guess...
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1251
		if (v->profit_last_year + v->profit_this_year < AI_MINIMUM_ROUTE_PROFIT ||
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1252
				(v->reliability * 100 >> 16) < 40) {
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1253
			// There is a possibility that the route is fucked up...
7506
e52d89f5c7c1 (svn r10266) -Codechange: keep track of the origin, time of travel and accumulated feeder share (transfers) of individual pieces of cargo. This means that cargo isn't thrown on a big pile when it's put in a station or unloaded at a station, however the GUI does not reflect these changes yet so you will not actually see it.
rubidium
parents: 7486
diff changeset
  1254
			if (v->cargo.DaysInTransit() > AI_VEHICLE_LOST_DAYS) {
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1255
				// The vehicle is lost.. check the route, or else, get the vehicle
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1256
				//  back to a depot
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1257
				// TODO: make this piece of code
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1258
			}
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1259
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1260
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1261
			// We are already sending him back
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1262
			if (AiNew_GetSpecialVehicleFlag(p, v) & AI_VEHICLEFLAG_SELL) {
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 5907
diff changeset
  1263
				if (v->type == VEH_ROAD && IsTileDepotType(v->tile, TRANSPORT_ROAD) &&
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1264
						(v->vehstatus&VS_STOPPED)) {
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1265
					// We are at the depot, sell the vehicle
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1266
					AI_DoCommand(0, v->index, 0, DC_EXEC, CMD_SELL_ROAD_VEH);
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1267
				}
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1268
				return;
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1269
			}
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1270
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1271
			if (!AiNew_SetSpecialVehicleFlag(p, v, AI_VEHICLEFLAG_SELL)) return;
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1272
			{
7446
1c4d469f986e (svn r10205) -Codechange: refactor returning of cost, so it can be more easily modified.
rubidium
parents: 7442
diff changeset
  1273
				CommandCost ret;
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 5907
diff changeset
  1274
				if (v->type == VEH_ROAD)
2682
94ca0b4dc53f (svn r3224) -Add: Allow the NewAI to work in Multiplayer Games (switchable via patch
truelight
parents: 2635
diff changeset
  1275
					ret = AI_DoCommand(0, v->index, 0, DC_EXEC, CMD_SEND_ROADVEH_TO_DEPOT);
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1276
				// This means we can not find a depot :s
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1277
				//				if (CmdFailed(ret))
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1278
			}
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1279
		}
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1280
	}
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1281
}
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1282
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1283
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1284
// Checks all vehicles if they are still valid and make money and stuff
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1285
static void AiNew_State_CheckAllVehicles(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1286
{
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1287
	Vehicle *v;
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1288
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1289
	FOR_ALL_VEHICLES(v) {
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1290
		if (v->owner != p->index) continue;
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1291
		// Currently, we only know how to handle road-vehicles
6585
7da94b26498a (svn r9068) -Codechange: capitalize the VEH_Train etc. enums to match the coding style (and rest of the code).
rubidium
parents: 5907
diff changeset
  1292
		if (v->type != VEH_ROAD) continue;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1293
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1294
		AiNew_CheckVehicle(p, v);
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1295
	}
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1296
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1297
	p->ainew.state = AI_STATE_ACTION_DONE;
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1298
}
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1299
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1300
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1301
// Using the technique simular to the original AI
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1302
//   Keeps things logical
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1303
// It really should be in the same order as the AI_STATE's are!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1304
static AiNew_StateFunction* const _ainew_state[] = {
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1305
	NULL,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1306
	AiNew_State_FirstTime,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1307
	AiNew_State_Nothing,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1308
	AiNew_State_WakeUp,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1309
	AiNew_State_LocateRoute,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1310
	AiNew_State_FindStation,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1311
	AiNew_State_FindPath,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1312
	AiNew_State_FindDepot,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1313
	AiNew_State_VerifyRoute,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1314
	AiNew_State_BuildStation,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1315
	AiNew_State_BuildPath,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1316
	AiNew_State_BuildDepot,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1317
	AiNew_State_BuildVehicle,
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: 3945
diff changeset
  1318
	NULL,
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1319
	AiNew_State_GiveOrders,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1320
	AiNew_State_StartVehicle,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1321
	AiNew_State_RepayMoney,
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1322
	AiNew_State_CheckAllVehicles,
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1323
	AiNew_State_ActionDone,
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1324
	NULL,
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1325
};
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1326
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1327
static void AiNew_OnTick(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1328
{
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1329
	if (_ainew_state[p->ainew.state] != NULL)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1330
		_ainew_state[p->ainew.state](p);
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1331
}
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1332
2365
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1333
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1334
void AiNewDoGameLoop(Player *p)
d3f8baf5b10d (svn r2891) Fix indentation
tron
parents: 2186
diff changeset
  1335
{
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1336
	if (p->ainew.state == AI_STATE_STARTUP) {
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1337
		// The AI just got alive!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1338
		p->ainew.state = AI_STATE_FIRST_TIME;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1339
		p->ainew.tick = 0;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1340
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1341
		// Only startup the AI
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1342
		return;
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1343
	}
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1344
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1345
	// We keep a ticker. We use it for competitor_speed
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1346
	p->ainew.tick++;
145
6e5468217504 (svn r146) -Fix [AI]: Tunnel/bridge bug
truelight
parents: 110
diff changeset
  1347
110
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1348
	// If we come here, we can do a tick.. do so!
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1349
	AiNew_OnTick(p);
a22a6b07904b (svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents: 95
diff changeset
  1350
}