author | rubidium |
Fri, 21 Dec 2007 21:50:46 +0000 | |
changeset 8612 | 6414fc21c2f3 |
parent 8604 | 8afdd9877afd |
child 8627 | 448ebf3a8291 |
permissions | -rw-r--r-- |
2549 | 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 | 4 |
* This AI was created as a direct reaction to the big demand for some good AIs |
5 |
* in OTTD. Too bad it never left alpha-stage, and it is considered dead in its |
|
6 |
* current form. |
|
7 |
* By the time of writing this, we, the creator of this AI and a good friend of |
|
8 |
* mine, are designing a whole new AI-system that allows us to create AIs |
|
9 |
* easier and without all the fuzz we encountered while I was working on this |
|
10 |
* AI. By the time that system is finished, you can expect that this AI will |
|
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 | 13 |
* Meanwhile I wish you all much fun with this AI; if you are interested as |
14 |
* AI-developer in this AI, I advise you not stare too long to some code, some |
|
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 | 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 | 42 |
static void AiNew_State_FirstTime(Player *p) |
43 |
{ |
|
44 |
// This assert is used to protect those function from misuse |
|
45 |
// You have quickly a small mistake in the state-array |
|
46 |
// With that, everything would go wrong. Finding that, is almost impossible |
|
47 |
// With this assert, that problem can never happen. |
|
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 | 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 | 56 |
p->ainew.path_info.start_tile_tl = 0; |
57 |
p->ainew.path_info.start_tile_br = 0; |
|
58 |
p->ainew.path_info.end_tile_tl = 0; |
|
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 | 61 |
|
110
a22a6b07904b
(svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents:
95
diff
changeset
|
62 |
p->ainew.idle = 0; |
145 | 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 | 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 | 80 |
static void AiNew_State_Nothing(Player *p) |
81 |
{ |
|
82 |
assert(p->ainew.state == AI_STATE_NOTHING); |
|
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 | 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 | 98 |
static void AiNew_State_WakeUp(Player *p) |
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 | 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 | 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 | 118 |
if (p->current_loan > 0 && |
119 |
p->old_economy[1].income > AI_MINIMUM_INCOME_FOR_LOAN && |
|
120 |
c < 10) { |
|
121 |
p->ainew.action = AI_ACTION_REPAY_LOAN; |
|
145 | 122 |
} else if (p->ainew.last_vehiclecheck_date + AI_DAYS_BETWEEN_VEHICLE_CHECKS < _date) { |
123 |
// Check all vehicles once in a while |
|
124 |
p->ainew.action = AI_ACTION_CHECK_ALL_VEHICLES; |
|
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 | 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 | 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 | 142 |
|
143 |
p->ainew.counter = 0; |
|
110
a22a6b07904b
(svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents:
95
diff
changeset
|
144 |
} |
145 | 145 |
|
146 |
if (p->ainew.counter++ > AI_MAX_TRIES_FOR_SAME_ROUTE) { |
|
147 |
p->ainew.action = AI_ACTION_NONE; |
|
148 |
return; |
|
149 |
} |
|
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 | 152 |
p->ainew.action == AI_ACTION_BUS_ROUTE || |
153 |
p->ainew.action == AI_ACTION_TRUCK_ROUTE |
|
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 | 158 |
|
2365 | 159 |
if (p->ainew.action == AI_ACTION_REPAY_LOAN && |
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 | 165 |
|
166 |
if (p->ainew.action == AI_ACTION_CHECK_ALL_VEHICLES) { |
|
167 |
p->ainew.state = AI_STATE_CHECK_ALL_VEHICLES; |
|
168 |
return; |
|
169 |
} |
|
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 | 173 |
if (p->ainew.action == AI_ACTION_BUS_ROUTE && |
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 | 184 |
if (p->ainew.action == AI_ACTION_TRUCK_ROUTE && |
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 | 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 | 200 |
|
201 |
static void AiNew_State_ActionDone(Player *p) |
|
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 | 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 | 209 |
static bool AiNew_Check_City_or_Industry(Player *p, int ic, byte type) |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 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 | 332 |
|
2365 | 333 |
// This functions tries to locate a good route |
334 |
static void AiNew_State_LocateRoute(Player *p) |
|
335 |
{ |
|
336 |
assert(p->ainew.state == AI_STATE_LOCATE_ROUTE); |
|
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 | 339 |
// We don't have a route yet |
340 |
if (p->ainew.cargo == AI_NEED_CARGO) { |
|
341 |
p->ainew.new_cost = 0; // No cost yet |
|
342 |
p->ainew.temp = -1; |
|
343 |
// Reset the counter |
|
344 |
p->ainew.counter = 0; |
|
345 |
||
346 |
p->ainew.from_ic = -1; |
|
347 |
p->ainew.to_ic = -1; |
|
348 |
if (p->ainew.tbt == AI_BUS) { |
|
349 |
// For now we only have a passenger route |
|
350 |
p->ainew.cargo = CT_PASSENGERS; |
|
351 |
||
352 |
// Find a route to cities |
|
353 |
p->ainew.from_type = AI_CITY; |
|
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 | 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 | 358 |
p->ainew.from_type = AI_INDUSTRY; |
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 | 362 |
// Now we are doing initing, we wait one tick |
363 |
return; |
|
364 |
} |
|
145 | 365 |
|
2365 | 366 |
// Increase the counter and abort if it is taking too long! |
367 |
p->ainew.counter++; |
|
368 |
if (p->ainew.counter > AI_LOCATE_ROUTE_MAX_COUNTER) { |
|
369 |
// Switch back to doing nothing! |
|
370 |
p->ainew.state = AI_STATE_NOTHING; |
|
371 |
return; |
|
372 |
} |
|
145 | 373 |
|
2365 | 374 |
// We are going to locate a city from where we are going to connect |
375 |
if (p->ainew.from_ic == -1) { |
|
376 |
if (p->ainew.temp == -1) { |
|
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 | 383 |
} |
145 | 384 |
|
2365 | 385 |
if (!AiNew_Check_City_or_Industry(p, p->ainew.temp, p->ainew.from_type)) { |
386 |
// It was not a valid city |
|
387 |
// increase the temp with one, and return. We will come back later here |
|
388 |
// to try again |
|
389 |
p->ainew.temp++; |
|
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 | 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 | 394 |
} |
145 | 395 |
|
2365 | 396 |
// Don't do an attempt if we are trying the same id as the last time... |
397 |
if (p->ainew.last_id == p->ainew.temp) return; |
|
398 |
p->ainew.last_id = p->ainew.temp; |
|
399 |
||
400 |
return; |
|
401 |
} |
|
402 |
||
403 |
// We found a good city/industry, save the data of it |
|
404 |
p->ainew.from_ic = p->ainew.temp; |
|
405 |
||
406 |
// Start the next tick with finding a to-city |
|
407 |
p->ainew.temp = -1; |
|
408 |
return; |
|
409 |
} |
|
410 |
||
411 |
// Find a to-city |
|
412 |
if (p->ainew.temp == -1) { |
|
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 | 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 | 423 |
if (p->ainew.temp != p->ainew.from_ic && AiNew_Check_City_or_Industry(p, p->ainew.temp, p->ainew.to_type)) { |
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 | 430 |
|
2365 | 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 | 440 |
// max_cargo is now the amount of cargo we can move between the two cities |
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 | 443 |
// We found a good city/industry, save the data of it |
444 |
p->ainew.to_ic = p->ainew.temp; |
|
445 |
p->ainew.state = AI_STATE_FIND_STATION; |
|
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 | 449 |
p->ainew.from_ic, |
450 |
p->ainew.temp |
|
451 |
); |
|
452 |
||
453 |
p->ainew.from_tile = 0; |
|
454 |
p->ainew.to_tile = 0; |
|
455 |
||
456 |
return; |
|
457 |
} |
|
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 | 461 |
bool found = false; |
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 | 465 |
// TODO: in max_cargo, also check other cargo (beside [0]) |
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 | 474 |
p->ainew.from_deliver = true; |
475 |
p->ainew.to_deliver = false; |
|
476 |
break; |
|
477 |
} |
|
478 |
} |
|
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 | 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 | 488 |
p->ainew.from_deliver = false; |
489 |
p->ainew.to_deliver = true; |
|
490 |
break; |
|
491 |
} |
|
492 |
} |
|
493 |
} |
|
494 |
if (found) { |
|
495 |
// Yeah, they are compatible!!! |
|
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 | 501 |
p->ainew.to_ic = p->ainew.temp; |
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 | 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 | 506 |
} |
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 | 511 |
p->ainew.from_ic, |
512 |
p->ainew.temp |
|
513 |
); |
|
110
a22a6b07904b
(svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents:
95
diff
changeset
|
514 |
|
2365 | 515 |
p->ainew.from_tile = 0; |
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 | 518 |
return; |
519 |
} |
|
520 |
} |
|
521 |
} |
|
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 | 533 |
|
2365 | 534 |
// Don't do an attempt if we are trying the same id as the last time... |
535 |
if (p->ainew.last_id == p->ainew.temp) return; |
|
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 | 539 |
|
826 | 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 | 542 |
static bool AiNew_CheckVehicleStation(Player *p, Station *st) |
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 | 566 |
static void AiNew_State_FindStation(Player *p) |
567 |
{ |
|
568 |
TileIndex tile; |
|
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 | 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 | 574 |
Town *town = NULL; |
575 |
assert(p->ainew.state == AI_STATE_FIND_STATION); |
|
145 | 576 |
|
2365 | 577 |
if (p->ainew.from_tile == 0) { |
578 |
// First we scan for a station in the from-city |
|
579 |
if (p->ainew.from_type == AI_CITY) { |
|
580 |
town = GetTown(p->ainew.from_ic); |
|
581 |
tile = town->xy; |
|
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 | 584 |
} |
585 |
} else if (p->ainew.to_tile == 0) { |
|
586 |
// Second we scan for a station in the to-city |
|
587 |
if (p->ainew.to_type == AI_CITY) { |
|
588 |
town = GetTown(p->ainew.to_ic); |
|
589 |
tile = town->xy; |
|
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 | 592 |
} |
593 |
} else { |
|
594 |
// Unsupported request |
|
595 |
// Go to FIND_PATH |
|
596 |
p->ainew.temp = -1; |
|
597 |
p->ainew.state = AI_STATE_FIND_PATH; |
|
598 |
return; |
|
599 |
} |
|
110
a22a6b07904b
(svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents:
95
diff
changeset
|
600 |
|
2365 | 601 |
// First, we are going to look at the stations that already exist inside the city |
602 |
// If there is enough cargo left in the station, we take that station |
|
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 | 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 | 639 |
if (new_tile == 0 && p->ainew.tbt == AI_BUS) { |
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 | 642 |
uint best; |
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 | 646 |
// To find a good spot we scan a range from the center, a get the point |
647 |
// where we get the most cargo and where it is buildable. |
|
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 | 650 |
for (x = TileX(tile) - AI_FINDSTATION_TILE_RANGE; x <= TileX(tile) + AI_FINDSTATION_TILE_RANGE; x++) { |
651 |
for (y = TileY(tile) - AI_FINDSTATION_TILE_RANGE; y <= TileY(tile) + AI_FINDSTATION_TILE_RANGE; y++) { |
|
652 |
new_tile = TileXY(x, y); |
|
653 |
if (IsTileType(new_tile, MP_CLEAR) || IsTileType(new_tile, MP_TREES)) { |
|
654 |
// This tile we can build on! |
|
655 |
// Check acceptance |
|
656 |
// XXX - Get the catchment area |
|
657 |
GetAcceptanceAroundTiles(accepts, new_tile, 1, 1, 4); |
|
658 |
// >> 3 == 0 means no cargo |
|
659 |
if (accepts[p->ainew.cargo] >> 3 == 0) continue; |
|
660 |
// See if we can build the station |
|
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 | 663 |
// We can build it, so add it to found_spot |
664 |
found_spot[i] = new_tile; |
|
665 |
found_best[i++] = accepts[p->ainew.cargo]; |
|
666 |
} |
|
667 |
} |
|
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 | 671 |
if (i == 0) { |
672 |
p->ainew.state = AI_STATE_NOTHING; |
|
673 |
return; |
|
674 |
} |
|
110
a22a6b07904b
(svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents:
95
diff
changeset
|
675 |
|
2365 | 676 |
// Go through all the found_best and check which has the highest value |
677 |
best = 0; |
|
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 | 681 |
if (found_best[x] > best || |
682 |
(found_best[x] == best && DistanceManhattan(tile, new_tile) > DistanceManhattan(tile, found_spot[x]))) { |
|
683 |
new_tile = found_spot[x]; |
|
684 |
best = found_best[x]; |
|
685 |
} |
|
686 |
} |
|
145 | 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 | 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 | 702 |
p->ainew.from_tile = new_tile; |
703 |
p->ainew.from_direction = direction; |
|
704 |
// Now we found thisone, go in for to_tile |
|
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 | 707 |
p->ainew.to_tile = new_tile; |
708 |
p->ainew.to_direction = direction; |
|
709 |
// K, done placing stations! |
|
710 |
p->ainew.temp = -1; |
|
711 |
p->ainew.state = AI_STATE_FIND_PATH; |
|
712 |
return; |
|
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 | 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 | 718 |
static void AiNew_State_FindPath(Player *p) |
719 |
{ |
|
720 |
int r; |
|
721 |
assert(p->ainew.state == AI_STATE_FIND_PATH); |
|
145 | 722 |
|
2365 | 723 |
// First time, init some data |
724 |
if (p->ainew.temp == -1) { |
|
725 |
// Init path_info |
|
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 | 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 | 732 |
p->ainew.path_info.start_direction = p->ainew.from_direction; |
733 |
} else { |
|
734 |
p->ainew.path_info.start_tile_tl = p->ainew.from_tile; |
|
735 |
p->ainew.path_info.start_tile_br = p->ainew.from_tile; |
|
736 |
p->ainew.path_info.start_direction = p->ainew.from_direction; |
|
737 |
} |
|
110
a22a6b07904b
(svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents:
95
diff
changeset
|
738 |
|
2365 | 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 | 744 |
p->ainew.path_info.end_direction = p->ainew.to_direction; |
745 |
} else { |
|
746 |
p->ainew.path_info.end_tile_tl = p->ainew.to_tile; |
|
747 |
p->ainew.path_info.end_tile_br = p->ainew.to_tile; |
|
748 |
p->ainew.path_info.end_direction = p->ainew.to_direction; |
|
749 |
} |
|
145 | 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 | 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 | 754 |
clean_AyStar_AiPathFinder(p->ainew.pathfinder, &p->ainew.path_info); |
145 | 755 |
|
2365 | 756 |
p->ainew.temp = 0; |
110
a22a6b07904b
(svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents:
95
diff
changeset
|
757 |
} |
145 | 758 |
|
2365 | 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 | 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 | 780 |
static void AiNew_State_FindDepot(Player *p) |
781 |
{ |
|
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.. |
|
783 |
// Simple, easy, works! |
|
784 |
// To make the depot stand in the middle of the route, we start from the center.. |
|
785 |
// But first we walk through the route see if we can find a depot that is ours |
|
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 | 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 | 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 | 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 | 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 | 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 | 868 |
static int AiNew_HowManyVehicles(Player *p) |
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 | 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 | 877 |
// Passenger run.. how long is the route? |
878 |
length = p->ainew.path_info.route_length; |
|
879 |
// Calculating tiles a day a vehicle moves is not easy.. this is how it must be done! |
|
880 |
tiles_a_day = RoadVehInfo(i)->max_speed * DAY_TICKS / 256 / 16; |
|
881 |
// We want a vehicle in a station once a month at least, so, calculate it! |
|
882 |
// (the * 2 is because we have 2 stations ;)) |
|
883 |
amount = length * 2 * 2 / tiles_a_day / 30; |
|
884 |
if (amount == 0) amount = 1; |
|
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 | 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 | 893 |
// Passenger run.. how long is the route? |
894 |
length = p->ainew.path_info.route_length; |
|
895 |
// Calculating tiles a day a vehicle moves is not easy.. this is how it must be done! |
|
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 | 902 |
|
2365 | 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 | 906 |
// We want all the cargo to be gone in a month.. so, we know the cargo it delivers |
907 |
// we know what the vehicle takes with him, and we know the time it takes him |
|
908 |
// to get back here.. now let's do some math! |
|
909 |
amount = 2 * length * max_cargo / tiles_a_day / 30 / RoadVehInfo(i)->capacity; |
|
910 |
amount += 1; |
|
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 | 923 |
static void AiNew_State_VerifyRoute(Player *p) |
924 |
{ |
|
925 |
int res, i; |
|
926 |
assert(p->ainew.state == AI_STATE_VERIFY_ROUTE); |
|
145 | 927 |
|
2365 | 928 |
// Let's calculate the cost of the path.. |
929 |
// new_cost already contains the cost of the stations |
|
930 |
p->ainew.path_info.position = -1; |
|
145 | 931 |
|
2365 | 932 |
do { |
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 | 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 | 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 | 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 | 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 | 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 | 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 | 980 |
|
110
a22a6b07904b
(svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents:
95
diff
changeset
|
981 |
// Build the stations |
2365 | 982 |
static void AiNew_State_BuildStation(Player *p) |
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 | 985 |
assert(p->ainew.state == AI_STATE_BUILD_STATION); |
986 |
if (p->ainew.temp == 0) { |
|
987 |
if (!IsTileType(p->ainew.from_tile, MP_STATION)) |
|
988 |
res = AiNew_Build_Station(p, p->ainew.tbt, p->ainew.from_tile, 0, 0, p->ainew.from_direction, DC_EXEC); |
|
989 |
} else { |
|
990 |
if (!IsTileType(p->ainew.to_tile, MP_STATION)) |
|
991 |
res = AiNew_Build_Station(p, p->ainew.tbt, p->ainew.to_tile, 0, 0, p->ainew.to_direction, DC_EXEC); |
|
992 |
p->ainew.state = AI_STATE_BUILD_PATH; |
|
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 | 1001 |
} |
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 | 1005 |
|
110
a22a6b07904b
(svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents:
95
diff
changeset
|
1006 |
// Build the path |
2365 | 1007 |
static void AiNew_State_BuildPath(Player *p) |
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 | 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 | 1033 |
// If they not queue, they have to go up and down to try again at a station... |
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 | 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 | 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 | 1043 |
dir3 = p->ainew.from_direction; |
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 | 1048 |
dir3 = p->ainew.to_direction; |
1049 |
} |
|
145 | 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 | 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 | 1086 |
} |
1087 |
} |
|
145 | 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 | 1094 |
|
110
a22a6b07904b
(svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents:
95
diff
changeset
|
1095 |
// Builds the depot |
2365 | 1096 |
static void AiNew_State_BuildDepot(Player *p) |
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 | 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 | 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 | 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 | 1122 |
} |
145 | 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 | 1129 |
|
2365 | 1130 |
// Build vehicles |
1131 |
static void AiNew_State_BuildVehicle(Player *p) |
|
1132 |
{ |
|
7439
0c0e2945c890
(svn r10197) -Codechange: replace int32 with CommandCost where appropriate.
rubidium
parents:
7420
diff
changeset
|
1133 |
CommandCost res; |
2365 | 1134 |
assert(p->ainew.state == AI_STATE_BUILD_VEHICLE); |
1135 |
||
1136 |
// Check if we need to build a vehicle |
|
1137 |
if (p->ainew.amount_veh == 0) { |
|
1138 |
// Nope, we are done! |
|
1139 |
// This means: we are all done! The route is open.. go back to NOTHING |
|
1140 |
// He will idle some time and it will all start over again.. :) |
|
1141 |
p->ainew.state = AI_STATE_ACTION_DONE; |
|
1142 |
return; |
|
1143 |
} |
|
1144 |
if (--p->ainew.idle != 0) return; |
|
1145 |
// It is realistic that the AI can only build 1 vehicle a day.. |
|
1146 |
// This makes sure of that! |
|
1147 |
p->ainew.idle = AI_BUILD_VEHICLE_TIME_BETWEEN; |
|
1148 |
||
1149 |
// Build the vehicle |
|
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 | 1152 |
// This happens when the AI can't build any more vehicles! |
1153 |
p->ainew.state = AI_STATE_NOTHING; |
|
1154 |
return; |
|
1155 |
} |
|
1156 |
// Increase the current counter |
|
1157 |
p->ainew.cur_veh++; |
|
1158 |
// Decrease the total counter |
|
1159 |
p->ainew.amount_veh--; |
|
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 | 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 | 1166 |
static void AiNew_State_GiveOrders(Player *p) |
1167 |
{ |
|
1168 |
int idx; |
|
1169 |
Order order; |
|
145 | 1170 |
|
2365 | 1171 |
assert(p->ainew.state == AI_STATE_GIVE_ORDERS); |
145 | 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 | 1176 |
p->ainew.state = AI_STATE_START_VEHICLE; |
1177 |
return; |
|
1178 |
} else { |
|
1179 |
p->ainew.veh_main_id = p->ainew.veh_id; |
|
1180 |
} |
|
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 | 1199 |
idx = 0; |
1200 |
order.type = OT_GOTO_STATION; |
|
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 | 1203 |
if (p->ainew.tbt == AI_TRUCK && p->ainew.from_deliver) |
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 | 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 | 1211 |
|
110
a22a6b07904b
(svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents:
95
diff
changeset
|
1212 |
// Start the vehicle |
2365 | 1213 |
static void AiNew_State_StartVehicle(Player *p) |
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 | 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 | 1229 |
|
110
a22a6b07904b
(svn r111) -Fix: converted all linebreaks to UNIX-linebreak (\n)
truelight
parents:
95
diff
changeset
|
1230 |
// Repays money |
2365 | 1231 |
static void AiNew_State_RepayMoney(Player *p) |
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 | 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 | 1241 |
|
1242 |
static void AiNew_CheckVehicle(Player *p, Vehicle *v) |
|
1243 |
{ |
|
145 | 1244 |
// When a vehicle is under the 6 months, we don't check for anything |
1245 |
if (v->age < 180) return; |
|
1246 |
||
1247 |
// When a vehicle is older then 1 year, it should make money... |
|
1248 |
if (v->age > 360) { |
|
826 | 1249 |
// If both years together are not more than AI_MINIMUM_ROUTE_PROFIT, |
145 | 1250 |
// it is not worth the line I guess... |
1251 |
if (v->profit_last_year + v->profit_this_year < AI_MINIMUM_ROUTE_PROFIT || |
|
2365 | 1252 |
(v->reliability * 100 >> 16) < 40) { |
145 | 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 | 1255 |
// The vehicle is lost.. check the route, or else, get the vehicle |
1256 |
// back to a depot |
|
1257 |
// TODO: make this piece of code |
|
1258 |
} |
|
1259 |
||
1260 |
||
1261 |
// We are already sending him back |
|
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 | 1264 |
(v->vehstatus&VS_STOPPED)) { |
145 | 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 | 1267 |
} |
1268 |
return; |
|
1269 |
} |
|
1270 |
||
1271 |
if (!AiNew_SetSpecialVehicleFlag(p, v, AI_VEHICLEFLAG_SELL)) return; |
|
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 | 1276 |
// This means we can not find a depot :s |
2365 | 1277 |
// if (CmdFailed(ret)) |
145 | 1278 |
} |
1279 |
} |
|
1280 |
} |
|
1281 |
} |
|
1282 |
||
2365 | 1283 |
|
145 | 1284 |
// Checks all vehicles if they are still valid and make money and stuff |
2365 | 1285 |
static void AiNew_State_CheckAllVehicles(Player *p) |
1286 |
{ |
|
145 | 1287 |
Vehicle *v; |
1288 |
||
1289 |
FOR_ALL_VEHICLES(v) { |
|
1290 |
if (v->owner != p->index) continue; |
|
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 | 1293 |
|
1294 |
AiNew_CheckVehicle(p, v); |
|
1295 |
} |
|
1296 |
||
1297 |
p->ainew.state = AI_STATE_ACTION_DONE; |
|
1298 |
} |
|
1299 |
||
2365 | 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 | 1305 |
NULL, |
1306 |
AiNew_State_FirstTime, |
|
1307 |
AiNew_State_Nothing, |
|
1308 |
AiNew_State_WakeUp, |
|
1309 |
AiNew_State_LocateRoute, |
|
1310 |
AiNew_State_FindStation, |
|
1311 |
AiNew_State_FindPath, |
|
1312 |
AiNew_State_FindDepot, |
|
1313 |
AiNew_State_VerifyRoute, |
|
1314 |
AiNew_State_BuildStation, |
|
1315 |
AiNew_State_BuildPath, |
|
1316 |
AiNew_State_BuildDepot, |
|
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 | 1319 |
AiNew_State_GiveOrders, |
1320 |
AiNew_State_StartVehicle, |
|
1321 |
AiNew_State_RepayMoney, |
|
145 | 1322 |
AiNew_State_CheckAllVehicles, |
2365 | 1323 |
AiNew_State_ActionDone, |
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 | 1327 |
static void AiNew_OnTick(Player *p) |
1328 |
{ |
|
1329 |
if (_ainew_state[p->ainew.state] != NULL) |
|
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 | 1333 |
|
1334 |
void AiNewDoGameLoop(Player *p) |
|
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 | 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 | 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 |
} |