Files @ r20758:f233b5e2cdd2
Branch filter:

Location: cpp/openttd-patchpack/source/src/command_type.h - annotation

translators
(svn r25801) -Update from WebTranslator v3.0:
estonian - 4 changes by notAbot
japanese - 5 changes by guppy
slovenian - 1 changes by matej1245
  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r12768:980ae0491352
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8123:dde0a9a84019
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8230:33d57fce0ec2
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r17828:bcc2d03aefbe
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r17828:bcc2d03aefbe
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r17828:bcc2d03aefbe
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r17828:bcc2d03aefbe
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r18782:6453522c2154
r8841:4a1440f514a4
r8841:4a1440f514a4
r8841:4a1440f514a4
r8116:df67d3c5e4fd
r14549:56c5f10f6f93
r14547:a4cc19b19cd3
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r10238:f2215d7dd22b
r8116:df67d3c5e4fd
r18782:6453522c2154
r8841:4a1440f514a4
r8841:4a1440f514a4
r8841:4a1440f514a4
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r18782:6453522c2154
r8841:4a1440f514a4
r8841:4a1440f514a4
r8841:4a1440f514a4
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r18782:6453522c2154
r8841:4a1440f514a4
r8841:4a1440f514a4
r8841:4a1440f514a4
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r14813:2dc255bde71a
r14813:2dc255bde71a
r14222:128de2aca190
r14222:128de2aca190
r14222:128de2aca190
r14222:128de2aca190
r14222:128de2aca190
r14222:128de2aca190
r14222:128de2aca190
r14222:128de2aca190
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r14222:128de2aca190
r9928:94206085695f
r14888:176181db43bf
r9928:94206085695f
r9928:94206085695f
r9928:94206085695f
r9928:94206085695f
r14888:176181db43bf
r9928:94206085695f
r9928:94206085695f
r9928:94206085695f
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r18782:6453522c2154
r8841:4a1440f514a4
r8841:4a1440f514a4
r8841:4a1440f514a4
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r18782:6453522c2154
r8841:4a1440f514a4
r8841:4a1440f514a4
r8841:4a1440f514a4
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r15173:a59afd6301a6
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r12542:0440fd34fe28
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r15734:ae8e2e185874
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r12542:0440fd34fe28
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r12542:0440fd34fe28
r8500:936f1fe6d36a
r12542:0440fd34fe28
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r15839:2b7528d029e3
r15840:d15dd78ef53e
r15844:ff366b80a3cf
r16065:69bb359ad9c9
r8116:df67d3c5e4fd
r15840:d15dd78ef53e
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r15855:2be9e0211a54
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r10207:a1fc2f2a33db
r15653:ffcac5890102
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r10151:bd7d25dbc2ae
r8500:936f1fe6d36a
r10151:bd7d25dbc2ae
r10151:bd7d25dbc2ae
r8500:936f1fe6d36a
r15162:d47b50bb10ac
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r13092:7d6dcd5428fd
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r18762:ec777ff0426a
r18762:ec777ff0426a
r18768:3747fd5dec42
r15647:143f3f9972e7
r15648:c23281f890bf
r8116:df67d3c5e4fd
r17674:8ba1e586d6d1
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r20745:b1ebcc10c74a
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r18770:fe0f5aab3963
r10207:a1fc2f2a33db
r18769:52b4e8d83a42
r18772:80ffc4ed8122
r18772:80ffc4ed8122
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r18872:35e831d058c7
r18872:35e831d058c7
r20329:0b11d054e50d
r20329:0b11d054e50d
r20329:0b11d054e50d
r20329:0b11d054e50d
r20339:ff8e383cfb7d
r20329:0b11d054e50d
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r10207:a1fc2f2a33db
r11069:3f09c162966b
r19944:25a78576fb5e
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r9921:aec40d69882b
r8500:936f1fe6d36a
r9928:94206085695f
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r13757:cb9ca7946c57
r16923:67617ddad8d5
r19224:da5678df5fbc
r19224:da5678df5fbc
r18737:1ee35da7fa2f
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r11090:9276cea703d4
r11103:9bc6bfde0b10
r11103:9bc6bfde0b10
r11103:9bc6bfde0b10
r11103:9bc6bfde0b10
r11103:9bc6bfde0b10
r11103:9bc6bfde0b10
r11103:9bc6bfde0b10
r11103:9bc6bfde0b10
r11103:9bc6bfde0b10
r18824:4a8ec7bae9c5
r18824:4a8ec7bae9c5
r18824:4a8ec7bae9c5
r18824:4a8ec7bae9c5
r8116:df67d3c5e4fd
r14900:c679fdaeebe6
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r15173:a59afd6301a6
r10607:ff1f071daa41
r10604:3c1ed1b55521
r10604:3c1ed1b55521
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r15173:a59afd6301a6
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18745:f30e2b3b8a58
r8116:df67d3c5e4fd
r18369:bc3de8f003de
r8116:df67d3c5e4fd
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r17266:fd37372a3e14
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r10499:570896340d7a
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r11090:9276cea703d4
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r18369:bc3de8f003de
r18369:bc3de8f003de
r18369:bc3de8f003de
r18369:bc3de8f003de
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r14220:2b66d13ca715
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r14220:2b66d13ca715
r8116:df67d3c5e4fd
r10623:f0fe12cafe3a
r10623:f0fe12cafe3a
r10623:f0fe12cafe3a
r10623:f0fe12cafe3a
r16662:9972c29ce194
r16662:9972c29ce194
r16662:9972c29ce194
r16662:9972c29ce194
r16662:9972c29ce194
r16662:9972c29ce194
r10623:f0fe12cafe3a
r10623:f0fe12cafe3a
r8116:df67d3c5e4fd
/* $Id$ */

/*
 * This file is part of OpenTTD.
 * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2.
 * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
 * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see <http://www.gnu.org/licenses/>.
 */

/** @file command_type.h Types related to commands. */

#ifndef COMMAND_TYPE_H
#define COMMAND_TYPE_H

#include "economy_type.h"
#include "strings_type.h"
#include "tile_type.h"

/**
 * Common return value for all commands. Wraps the cost and
 * a possible error message/state together.
 */
class CommandCost {
	ExpensesType expense_type; ///< the type of expence as shown on the finances view
	Money cost;       ///< The cost of this action
	StringID message; ///< Warning message for when success is unset
	bool success;     ///< Whether the comment went fine up to this moment
	uint textref_stack_size;   ///< Number of uint32 values to put on the #TextRefStack for the error message.

	static uint32 textref_stack[16];

public:
	/**
	 * Creates a command cost return with no cost and no error
	 */
	CommandCost() : expense_type(INVALID_EXPENSES), cost(0), message(INVALID_STRING_ID), success(true), textref_stack_size(0) {}

	/**
	 * Creates a command return value the is failed with the given message
	 */
	explicit CommandCost(StringID msg) : expense_type(INVALID_EXPENSES), cost(0), message(msg), success(false), textref_stack_size(0) {}

	/**
	 * Creates a command cost with given expense type and start cost of 0
	 * @param ex_t the expense type
	 */
	explicit CommandCost(ExpensesType ex_t) : expense_type(ex_t), cost(0), message(INVALID_STRING_ID), success(true), textref_stack_size(0) {}

	/**
	 * Creates a command return value with the given start cost and expense type
	 * @param ex_t the expense type
	 * @param cst the initial cost of this command
	 */
	CommandCost(ExpensesType ex_t, const Money &cst) : expense_type(ex_t), cost(cst), message(INVALID_STRING_ID), success(true), textref_stack_size(0) {}


	/**
	 * Adds the given cost to the cost of the command.
	 * @param cost the cost to add
	 */
	inline void AddCost(const Money &cost)
	{
		this->cost += cost;
	}

	void AddCost(const CommandCost &cmd_cost);

	/**
	 * Multiplies the cost of the command by the given factor.
	 * @param factor factor to multiply the costs with
	 */
	inline void MultiplyCost(int factor)
	{
		this->cost *= factor;
	}

	/**
	 * The costs as made up to this moment
	 * @return the costs
	 */
	inline Money GetCost() const
	{
		return this->cost;
	}

	/**
	 * The expense type of the cost
	 * @return the expense type
	 */
	inline ExpensesType GetExpensesType() const
	{
		return this->expense_type;
	}

	/**
	 * Makes this #CommandCost behave like an error command.
	 * @param message The error message.
	 */
	void MakeError(StringID message)
	{
		assert(message != INVALID_STRING_ID);
		this->success = false;
		this->message = message;
	}

	void UseTextRefStack(uint num_registers);

	/**
	 * Returns the number of uint32 values for the #TextRefStack of the error message.
	 * @return number of uint32 values.
	 */
	uint GetTextRefStackSize() const
	{
		return this->textref_stack_size;
	}

	/**
	 * Returns a pointer to the values for the #TextRefStack of the error message.
	 * @return uint32 values for the #TextRefStack
	 */
	const uint32 *GetTextRefStack() const
	{
		return textref_stack;
	}

	/**
	 * Returns the error message of a command
	 * @return the error message, if succeeded #INVALID_STRING_ID
	 */
	StringID GetErrorMessage() const
	{
		if (this->success) return INVALID_STRING_ID;
		return this->message;
	}

	/**
	 * Did this command succeed?
	 * @return true if and only if it succeeded
	 */
	inline bool Succeeded() const
	{
		return this->success;
	}

	/**
	 * Did this command fail?
	 * @return true if and only if it failed
	 */
	inline bool Failed() const
	{
		return !this->success;
	}
};

/**
 * List of commands.
 *
 * This enum defines all possible commands which can be executed to the game
 * engine. Observing the game like the query-tool or checking the profit of a
 * vehicle don't result in a command which should be executed in the engine
 * nor send to the server in a network game.
 *
 * @see _command_proc_table
 */
enum Commands {
	CMD_BUILD_RAILROAD_TRACK,         ///< build a rail track
	CMD_REMOVE_RAILROAD_TRACK,        ///< remove a rail track
	CMD_BUILD_SINGLE_RAIL,            ///< build a single rail track
	CMD_REMOVE_SINGLE_RAIL,           ///< remove a single rail track
	CMD_LANDSCAPE_CLEAR,              ///< demolish a tile
	CMD_BUILD_BRIDGE,                 ///< build a bridge
	CMD_BUILD_RAIL_STATION,           ///< build a rail station
	CMD_BUILD_TRAIN_DEPOT,            ///< build a train depot
	CMD_BUILD_SIGNALS,                ///< build a signal
	CMD_REMOVE_SIGNALS,               ///< remove a signal
	CMD_TERRAFORM_LAND,               ///< terraform a tile
	CMD_BUILD_OBJECT,                 ///< build an object
	CMD_BUILD_TUNNEL,                 ///< build a tunnel

	CMD_REMOVE_FROM_RAIL_STATION,     ///< remove a (rectangle of) tiles from a rail station
	CMD_CONVERT_RAIL,                 ///< convert a rail type

	CMD_BUILD_RAIL_WAYPOINT,          ///< build a waypoint
	CMD_RENAME_WAYPOINT,              ///< rename a waypoint
	CMD_REMOVE_FROM_RAIL_WAYPOINT,    ///< remove a (rectangle of) tiles from a rail waypoint

	CMD_BUILD_ROAD_STOP,              ///< build a road stop
	CMD_REMOVE_ROAD_STOP,             ///< remove a road stop
	CMD_BUILD_LONG_ROAD,              ///< build a complete road (not a "half" one)
	CMD_REMOVE_LONG_ROAD,             ///< remove a complete road (not a "half" one)
	CMD_BUILD_ROAD,                   ///< build a "half" road
	CMD_BUILD_ROAD_DEPOT,             ///< build a road depot

	CMD_BUILD_AIRPORT,                ///< build an airport

	CMD_BUILD_DOCK,                   ///< build a dock

	CMD_BUILD_SHIP_DEPOT,             ///< build a ship depot
	CMD_BUILD_BUOY,                   ///< build a buoy

	CMD_PLANT_TREE,                   ///< plant a tree

	CMD_BUILD_VEHICLE,                ///< build a vehicle
	CMD_SELL_VEHICLE,                 ///< sell a vehicle
	CMD_REFIT_VEHICLE,                ///< refit the cargo space of a vehicle
	CMD_SEND_VEHICLE_TO_DEPOT,        ///< send a vehicle to a depot

	CMD_MOVE_RAIL_VEHICLE,            ///< move a rail vehicle (in the depot)
	CMD_FORCE_TRAIN_PROCEED,          ///< proceed a train to pass a red signal
	CMD_REVERSE_TRAIN_DIRECTION,      ///< turn a train around

	CMD_CLEAR_ORDER_BACKUP,           ///< clear the order backup of a given user/tile
	CMD_MODIFY_ORDER,                 ///< modify an order (like set full-load)
	CMD_SKIP_TO_ORDER,                ///< skip an order to the next of specific one
	CMD_DELETE_ORDER,                 ///< delete an order
	CMD_INSERT_ORDER,                 ///< insert a new order

	CMD_CHANGE_SERVICE_INT,           ///< change the server interval of a vehicle

	CMD_BUILD_INDUSTRY,               ///< build a new industry

	CMD_SET_COMPANY_MANAGER_FACE,     ///< set the manager's face of the company
	CMD_SET_COMPANY_COLOUR,           ///< set the colour of the company

	CMD_INCREASE_LOAN,                ///< increase the loan from the bank
	CMD_DECREASE_LOAN,                ///< decrease the loan from the bank

	CMD_WANT_ENGINE_PREVIEW,          ///< confirm the preview of an engine

	CMD_RENAME_VEHICLE,               ///< rename a whole vehicle
	CMD_RENAME_ENGINE,                ///< rename a engine (in the engine list)
	CMD_RENAME_COMPANY,               ///< change the company name
	CMD_RENAME_PRESIDENT,             ///< change the president name
	CMD_RENAME_STATION,               ///< rename a station
	CMD_RENAME_DEPOT,                 ///< rename a depot

	CMD_PLACE_SIGN,                   ///< place a sign
	CMD_RENAME_SIGN,                  ///< rename a sign

	CMD_TURN_ROADVEH,                 ///< turn a road vehicle around

	CMD_PAUSE,                        ///< pause the game

	CMD_BUY_SHARE_IN_COMPANY,         ///< buy a share from a company
	CMD_SELL_SHARE_IN_COMPANY,        ///< sell a share from a company
	CMD_BUY_COMPANY,                  ///< buy a company which is bankrupt

	CMD_FOUND_TOWN,                   ///< found a town
	CMD_RENAME_TOWN,                  ///< rename a town
	CMD_DO_TOWN_ACTION,               ///< do a action from the town detail window (like advertises or bribe)
	CMD_TOWN_CARGO_GOAL,              ///< set the goal of a cargo for a town
	CMD_TOWN_GROWTH_RATE,             ///< set the town growth rate
	CMD_TOWN_SET_TEXT,                ///< set the custom text of a town
	CMD_EXPAND_TOWN,                  ///< expand a town
	CMD_DELETE_TOWN,                  ///< delete a town

	CMD_ORDER_REFIT,                  ///< change the refit information of an order (for "goto depot" )
	CMD_CLONE_ORDER,                  ///< clone (and share) an order
	CMD_CLEAR_AREA,                   ///< clear an area

	CMD_MONEY_CHEAT,                  ///< do the money cheat
	CMD_CHANGE_BANK_BALANCE,          ///< change bank balance to charge costs or give money from a GS
	CMD_BUILD_CANAL,                  ///< build a canal

	CMD_CREATE_SUBSIDY,               ///< create a new subsidy
	CMD_COMPANY_CTRL,                 ///< used in multiplayer to create a new companies etc.
	CMD_CUSTOM_NEWS_ITEM,             ///< create a custom news message
	CMD_CREATE_GOAL,                  ///< create a new goal
	CMD_REMOVE_GOAL,                  ///< remove a goal
	CMD_SET_GOAL_TEXT,                ///< update goal text of a goal
	CMD_SET_GOAL_PROGRESS,            ///< update goal progress text of a goal
	CMD_SET_GOAL_COMPLETED,           ///< update goal completed status of a goal
	CMD_GOAL_QUESTION,                ///< ask a goal related question
	CMD_GOAL_QUESTION_ANSWER,         ///< answer(s) to CMD_GOAL_QUESTION
	CMD_CREATE_STORY_PAGE,            ///< create a new story page
	CMD_CREATE_STORY_PAGE_ELEMENT,    ///< create a new story page element
	CMD_UPDATE_STORY_PAGE_ELEMENT,    ///< update a story page element
	CMD_SET_STORY_PAGE_TITLE,         ///< update title of a story page
	CMD_SHOW_STORY_PAGE,              ///< show a story page
	CMD_REMOVE_STORY_PAGE,            ///< remove a story page
	CMD_LEVEL_LAND,                   ///< level land

	CMD_BUILD_LOCK,                   ///< build a lock

	CMD_BUILD_SIGNAL_TRACK,           ///< add signals along a track (by dragging)
	CMD_REMOVE_SIGNAL_TRACK,          ///< remove signals along a track (by dragging)

	CMD_GIVE_MONEY,                   ///< give money to another company
	CMD_CHANGE_SETTING,               ///< change a setting
	CMD_CHANGE_COMPANY_SETTING,       ///< change a company setting

	CMD_SET_AUTOREPLACE,              ///< set an autoreplace entry

	CMD_CLONE_VEHICLE,                ///< clone a vehicle
	CMD_START_STOP_VEHICLE,           ///< start or stop a vehicle
	CMD_MASS_START_STOP,              ///< start/stop all vehicles (in a depot)
	CMD_AUTOREPLACE_VEHICLE,          ///< replace/renew a vehicle while it is in a depot
	CMD_DEPOT_SELL_ALL_VEHICLES,      ///< sell all vehicles which are in a given depot
	CMD_DEPOT_MASS_AUTOREPLACE,       ///< force the autoreplace to take action in a given depot

	CMD_CREATE_GROUP,                 ///< create a new group
	CMD_DELETE_GROUP,                 ///< delete a group
	CMD_RENAME_GROUP,                 ///< rename a group
	CMD_ADD_VEHICLE_GROUP,            ///< add a vehicle to a group
	CMD_ADD_SHARED_VEHICLE_GROUP,     ///< add all other shared vehicles to a group which are missing
	CMD_REMOVE_ALL_VEHICLES_GROUP,    ///< remove all vehicles from a group
	CMD_SET_GROUP_REPLACE_PROTECTION, ///< set the autoreplace-protection for a group

	CMD_MOVE_ORDER,                   ///< move an order
	CMD_CHANGE_TIMETABLE,             ///< change the timetable for a vehicle
	CMD_SET_VEHICLE_ON_TIME,          ///< set the vehicle on time feature (timetable)
	CMD_AUTOFILL_TIMETABLE,           ///< autofill the timetable
	CMD_SET_TIMETABLE_START,          ///< set the date that a timetable should start

	CMD_OPEN_CLOSE_AIRPORT,           ///< open/close an airport to incoming aircraft

	CMD_END,                          ///< Must ALWAYS be on the end of this list!! (period)
};

/**
 * List of flags for a command.
 *
 * This enums defines some flags which can be used for the commands.
 */
enum DoCommandFlag {
	DC_NONE                  = 0x000, ///< no flag is set
	DC_EXEC                  = 0x001, ///< execute the given command
	DC_AUTO                  = 0x002, ///< don't allow building on structures
	DC_QUERY_COST            = 0x004, ///< query cost only,  don't build.
	DC_NO_WATER              = 0x008, ///< don't allow building on water
	DC_NO_RAIL_OVERLAP       = 0x010, ///< don't allow overlap of rails (used in buildrail)
	DC_NO_TEST_TOWN_RATING   = 0x020, ///< town rating does not disallow you from building
	DC_BANKRUPT              = 0x040, ///< company bankrupts, skip money check, skip vehicle on tile check in some cases
	DC_AUTOREPLACE           = 0x080, ///< autoreplace/autorenew is in progress, this shall disable vehicle limits when building, and ignore certain restrictions when undoing things (like vehicle attach callback)
	DC_NO_CARGO_CAP_CHECK    = 0x100, ///< when autoreplace/autorenew is in progress, this shall prevent truncating the amount of cargo in the vehicle to prevent testing the command to remove cargo
	DC_ALL_TILES             = 0x200, ///< allow this command also on MP_VOID tiles
	DC_NO_MODIFY_TOWN_RATING = 0x400, ///< do not change town rating
	DC_FORCE_CLEAR_TILE      = 0x800, ///< do not only remove the object on the tile, but also clear any water left on it
};
DECLARE_ENUM_AS_BIT_SET(DoCommandFlag)

/**
 * Used to combine a StringID with the command.
 *
 * This macro can be used to add a StringID (the error message to show) on a command-id
 * (CMD_xxx). Use the binary or-operator "|" to combine the command with the result from
 * this macro.
 *
 * @param x The StringID to combine with a command-id
 */
#define CMD_MSG(x) ((x) << 16)

/**
 * Defines some flags.
 *
 * This enumeration defines some flags which are binary-or'ed on a command.
 */
enum FlaggedCommands {
	CMD_NETWORK_COMMAND       = 0x0100, ///< execute the command without sending it on the network
	CMD_FLAGS_MASK            = 0xFF00, ///< mask for all command flags
	CMD_ID_MASK               = 0x00FF, ///< mask for the command ID
};

/**
 * Command flags for the command table _command_proc_table.
 *
 * This enumeration defines flags for the _command_proc_table.
 */
enum CommandFlags {
	CMD_SERVER    = 0x001, ///< the command can only be initiated by the server
	CMD_SPECTATOR = 0x002, ///< the command may be initiated by a spectator
	CMD_OFFLINE   = 0x004, ///< the command cannot be executed in a multiplayer game; single-player only
	CMD_AUTO      = 0x008, ///< set the DC_AUTO flag on this command
	CMD_ALL_TILES = 0x010, ///< allow this command also on MP_VOID tiles
	CMD_NO_TEST   = 0x020, ///< the command's output may differ between test and execute due to town rating changes etc.
	CMD_NO_WATER  = 0x040, ///< set the DC_NO_WATER flag on this command
	CMD_CLIENT_ID = 0x080, ///< set p2 with the ClientID of the sending client.
	CMD_DEITY     = 0x100, ///< the command may be executed by COMPANY_DEITY
	CMD_STR_CTRL  = 0x200, ///< the command's string may contain control strings
};
DECLARE_ENUM_AS_BIT_SET(CommandFlags)

/** Types of commands we have. */
enum CommandType {
	CMDT_LANDSCAPE_CONSTRUCTION, ///< Construction and destruction of objects on the map.
	CMDT_VEHICLE_CONSTRUCTION,   ///< Construction, modification (incl. refit) and destruction of vehicles.
	CMDT_MONEY_MANAGEMENT,       ///< Management of money, i.e. loans and shares.
	CMDT_VEHICLE_MANAGEMENT,     ///< Stopping, starting, sending to depot, turning around, replace orders etc.
	CMDT_ROUTE_MANAGEMENT,       ///< Modifications to route management (orders, groups, etc).
	CMDT_OTHER_MANAGEMENT,       ///< Renaming stuff, changing company colours, placing signs, etc.
	CMDT_COMPANY_SETTING,        ///< Changing settings related to a company.
	CMDT_SERVER_SETTING,         ///< Pausing/removing companies/server settings.
	CMDT_CHEAT,                  ///< A cheat of some sorts.

	CMDT_END,                    ///< Magic end marker.
};

/** Different command pause levels. */
enum CommandPauseLevel {
	CMDPL_NO_ACTIONS,      ///< No user actions may be executed.
	CMDPL_NO_CONSTRUCTION, ///< No construction actions may be executed.
	CMDPL_NO_LANDSCAPING,  ///< No landscaping actions may be executed.
	CMDPL_ALL_ACTIONS,     ///< All actions may be executed.
};

/**
 * Defines the callback type for all command handler functions.
 *
 * This type defines the function header for all functions which handles a CMD_* command.
 * A command handler use the parameters to act according to the meaning of the command.
 * The tile parameter defines the tile to perform an action on.
 * The flag parameter is filled with flags from the DC_* enumeration. The parameters
 * p1 and p2 are filled with parameters for the command like "which road type", "which
 * order" or "direction". Each function should mentioned in there doxygen comments
 * the usage of these parameters.
 *
 * @param tile The tile to apply a command on
 * @param flags Flags for the command, from the DC_* enumeration
 * @param p1 Additional data for the command
 * @param p2 Additional data for the command
 * @param text Additional text
 * @return The CommandCost of the command, which can be succeeded or failed.
 */
typedef CommandCost CommandProc(TileIndex tile, DoCommandFlag flags, uint32 p1, uint32 p2, const char *text);

/**
 * Define a command with the flags which belongs to it.
 *
 * This struct connect a command handler function with the flags created with
 * the #CMD_AUTO, #CMD_OFFLINE and #CMD_SERVER values.
 */
struct Command {
	CommandProc *proc;  ///< The procedure to actually executing
	const char *name;   ///< A human readable name for the procedure
	CommandFlags flags; ///< The (command) flags to that apply to this command
	CommandType type;   ///< The type of command.
};

/**
 * Define a callback function for the client, after the command is finished.
 *
 * Functions of this type are called after the command is finished. The parameters
 * are from the #CommandProc callback type. The boolean parameter indicates if the
 * command succeeded or failed.
 *
 * @param result The result of the executed command
 * @param tile The tile of the command action
 * @param p1 Additional data of the command
 * @param p1 Additional data of the command
 * @see CommandProc
 */
typedef void CommandCallback(const CommandCost &result, TileIndex tile, uint32 p1, uint32 p2);

/**
 * Structure for buffering the build command when selecting a station to join.
 */
struct CommandContainer {
	TileIndex tile;                  ///< tile command being executed on.
	uint32 p1;                       ///< parameter p1.
	uint32 p2;                       ///< parameter p2.
	uint32 cmd;                      ///< command being executed.
	CommandCallback *callback;       ///< any callback function executed upon successful completion of the command.
	char text[32 * MAX_CHAR_LENGTH]; ///< possible text sent for name changes etc, in bytes including '\0'.
};

#endif /* COMMAND_TYPE_H */