Files @ r28630:fe3c5717ad2b
Branch filter:

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

Loïc Guilloux
Fix: [Script] Apply random deviation only at script start (#11944)
  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
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
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
r21155:4f83de14e882
r21155:4f83de14e882
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r26948:8bceb871d3e5
r26948:8bceb871d3e5
r26948:8bceb871d3e5
r26948:8bceb871d3e5
r26948:8bceb871d3e5
r27737:728d55b97775
r26948:8bceb871d3e5
r17828:bcc2d03aefbe
r27737:728d55b97775
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r23607:36c15679007d
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r26948:8bceb871d3e5
r8116:df67d3c5e4fd
r26948:8bceb871d3e5
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r23607:36c15679007d
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r8230:33d57fce0ec2
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r23607:36c15679007d
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
r26948:8bceb871d3e5
r14222:128de2aca190
r14222:128de2aca190
r14222:128de2aca190
r14222:128de2aca190
r26948:8bceb871d3e5
r14222:128de2aca190
r14222:128de2aca190
r21155:4f83de14e882
r21155:4f83de14e882
r21155:4f83de14e882
r21155:4f83de14e882
r21155:4f83de14e882
r21155:4f83de14e882
r21155:4f83de14e882
r21155:4f83de14e882
r21155:4f83de14e882
r21155:4f83de14e882
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r27737:728d55b97775
r27737:728d55b97775
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r17828:bcc2d03aefbe
r27737:728d55b97775
r17828:bcc2d03aefbe
r27737:728d55b97775
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
r26948:8bceb871d3e5
r26948:8bceb871d3e5
r26948:8bceb871d3e5
r26948:8bceb871d3e5
r26948:8bceb871d3e5
r26948:8bceb871d3e5
r26948:8bceb871d3e5
r26948:8bceb871d3e5
r26948:8bceb871d3e5
r26948:8bceb871d3e5
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
r27737:728d55b97775
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r12542:0440fd34fe28
r8500:936f1fe6d36a
r28605:5efda914b6f9
r28605:5efda914b6f9
r8500:936f1fe6d36a
r15734:ae8e2e185874
r26438:10f21bbdb775
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
r23698:1872cc5b7dd7
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
r21664:0999bd2815df
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
r26879:c9ca06904031
r26879:c9ca06904031
r26879:c9ca06904031
r27851:98395ce429bf
r8116:df67d3c5e4fd
r10207:a1fc2f2a33db
r15653:ffcac5890102
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r28615:854bbcf6faa2
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r24061:a798207d2b21
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
r8116:df67d3c5e4fd
r13092:7d6dcd5428fd
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r18762:ec777ff0426a
r18762:ec777ff0426a
r24015:cc5c1a7cb59f
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
r27553:ad2bff42f7f5
r20289:1f623493c20d
r20289:1f623493c20d
r20289:1f623493c20d
r18872:35e831d058c7
r18872:35e831d058c7
r20329:0b11d054e50d
r20329:0b11d054e50d
r20329:0b11d054e50d
r20329:0b11d054e50d
r21218:8daf27729482
r20339:ff8e383cfb7d
r20329:0b11d054e50d
r21218:8daf27729482
r22830:80781225f8f0
r24220:eba5f923a47c
r22830:80781225f8f0
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
r21353:433db3a92931
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r25225:126e4a36a4eb
r23241:d2e564fdfd80
r8116:df67d3c5e4fd
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r26688:8dd6241f354e
r8500:936f1fe6d36a
r8500:936f1fe6d36a
r13757:cb9ca7946c57
r16923:67617ddad8d5
r19224:da5678df5fbc
r19224:da5678df5fbc
r26612:e1c0fa463732
r26612:e1c0fa463732
r26612:e1c0fa463732
r26612:e1c0fa463732
r26612:e1c0fa463732
r26612:e1c0fa463732
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
r24575:230b36838c0b
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
r15173:a59afd6301a6
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18744:51d0ed99c8f2
r18745:f30e2b3b8a58
r23280:382c4bba9365
r26907:b8856ea20ba4
r8116:df67d3c5e4fd
r18369:bc3de8f003de
r8116:df67d3c5e4fd
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r16683:8141fd5ad91e
r27187:894c6b2a8e5c
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
r26094:7572e88decb3
r26099:9c675ef812ea
r26099:9c675ef812ea
r26099:9c675ef812ea
r26099:9c675ef812ea
r26134:f8d1848ac6b3
r26123:a265ab51722a
r26123:a265ab51722a
r26123:a265ab51722a
r26123:a265ab51722a
r26123:a265ab51722a
r26123:a265ab51722a
r26134:f8d1848ac6b3
r26123:a265ab51722a
r26123:a265ab51722a
r26099:9c675ef812ea
r26099:9c675ef812ea
r26094:7572e88decb3
r26094:7572e88decb3
r26094:7572e88decb3
r26094:7572e88decb3
r26094:7572e88decb3
r26102:502baaa2877d
r26102:502baaa2877d
r26134:f8d1848ac6b3
r26123:a265ab51722a
r26123:a265ab51722a
r26099:9c675ef812ea
r26094:7572e88decb3
r26094:7572e88decb3
r26094:7572e88decb3
r26094:7572e88decb3
r26094:7572e88decb3
r8116:df67d3c5e4fd
r26104:2873b00a1dac
r26104:2873b00a1dac
r26104:2873b00a1dac
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r26104:2873b00a1dac
r14220:2b66d13ca715
r8116:df67d3c5e4fd
r26122:02442b0744ee
r26122:02442b0744ee
r26122:02442b0744ee
r26122:02442b0744ee
r26122:02442b0744ee
r26122:02442b0744ee
r26122:02442b0744ee
r26122:02442b0744ee
r26122:02442b0744ee
r26122:02442b0744ee
r26122:02442b0744ee
r26122:02442b0744ee
r26122:02442b0744ee
r26122:02442b0744ee
r26104:2873b00a1dac
r26123:a265ab51722a
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
r26907:b8856ea20ba4
r8116:df67d3c5e4fd
r8116:df67d3c5e4fd
/*
 * 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"

struct GRFFile;

/**
 * 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 command went fine up to this moment
	const GRFFile *textref_stack_grffile;       ///< NewGRF providing the #TextRefStack content.
	uint textref_stack_size;                    ///< Number of uint32_t values to put on the #TextRefStack for the error message.
	StringID extra_message = INVALID_STRING_ID; ///< Additional warning message for when success is unset

	static uint32_t 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_grffile(nullptr), textref_stack_size(0) {}

	/**
	 * Creates a command return value with one, or optionally two, error message strings.
	 */
	explicit CommandCost(StringID msg, StringID extra_msg = INVALID_STRING_ID) : expense_type(INVALID_EXPENSES), cost(0), message(msg), success(false), textref_stack_grffile(nullptr), textref_stack_size(0), extra_message(extra_msg) {}

	/**
	 * 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_grffile(nullptr), 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_grffile(nullptr), 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, StringID extra_message = INVALID_STRING_ID)
	{
		assert(message != INVALID_STRING_ID);
		this->success = false;
		this->message = message;
		this->extra_message = extra_message;
	}

	void UseTextRefStack(const GRFFile *grffile, uint num_registers);

	/**
	 * Returns the NewGRF providing the #TextRefStack of the error message.
	 * @return the NewGRF.
	 */
	const GRFFile *GetTextRefStackGRF() const
	{
		return this->textref_stack_grffile;
	}

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

	/**
	 * Returns a pointer to the values for the #TextRefStack of the error message.
	 * @return uint32_t values for the #TextRefStack
	 */
	const uint32_t *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;
	}

	/**
	 * Returns the extra error message of a command
	 * @return the extra error message, if succeeded #INVALID_STRING_ID
	 */
	StringID GetExtraErrorMessage() const
	{
		if (this->success) return INVALID_STRING_ID;
		return this->extra_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 : uint16_t {
	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_SINGLE_SIGNAL,          ///< build a signal
	CMD_REMOVE_SINGLE_SIGNAL,         ///< remove a signal
	CMD_TERRAFORM_LAND,               ///< terraform a tile
	CMD_BUILD_OBJECT,                 ///< build an object
	CMD_BUILD_OBJECT_AREA,            ///< build an area of objects
	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_CONVERT_ROAD,                 ///< convert a road type

	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_SET_VEHICLE_VISIBILITY,       ///< hide or unhide a vehicle in the build vehicle and autoreplace GUIs

	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_INDUSTRY_SET_FLAGS,           ///< change industry control flags
	CMD_INDUSTRY_SET_EXCLUSIVITY,     ///< change industry exclusive consumer/supplier
	CMD_INDUSTRY_SET_TEXT,            ///< change additional text for the industry
	CMD_INDUSTRY_SET_PRODUCTION,      ///< change industry production

	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_SET_COMPANY_MAX_LOAN,         ///< sets the max loan for the company

	CMD_WANT_ENGINE_PREVIEW,          ///< confirm the preview of an engine
	CMD_ENGINE_CTRL,                  ///< control availability of the engine for companies

	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_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_RATING,                  ///< set rating of a company in a town
	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_DESTINATION,         ///< update goal destination of 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_SET_STORY_PAGE_DATE,          ///< update date of a story page
	CMD_SHOW_STORY_PAGE,              ///< show a story page
	CMD_REMOVE_STORY_PAGE,            ///< remove a story page
	CMD_REMOVE_STORY_PAGE_ELEMENT,    ///< remove a story page element
	CMD_SCROLL_VIEWPORT,              ///< scroll main viewport of players
	CMD_STORY_PAGE_BUTTON,            ///< selection via story page button

	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_ALTER_GROUP,                  ///< alter 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_FLAG,               ///< set/clear a flag for a group
	CMD_SET_GROUP_LIVERY,             ///< set the livery for a group

	CMD_MOVE_ORDER,                   ///< move an order
	CMD_CHANGE_TIMETABLE,             ///< change the timetable for a vehicle
	CMD_BULK_CHANGE_TIMETABLE,        ///< change the timetable for all orders of 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_CREATE_LEAGUE_TABLE,               ///< create a new league table
	CMD_CREATE_LEAGUE_TABLE_ELEMENT,       ///< create a new element in a league table
	CMD_UPDATE_LEAGUE_TABLE_ELEMENT_DATA,  ///< update the data fields of a league table element
	CMD_UPDATE_LEAGUE_TABLE_ELEMENT_SCORE, ///< update the score of a league table element
	CMD_REMOVE_LEAGUE_TABLE_ELEMENT,       ///< remove a league table element

	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
	// 0x010 is unused
	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)

/**
 * 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
	CMD_NO_EST    = 0x400, ///< the command is never estimated.
	CMD_LOCATION  = 0x800, ///< the command has implicit location argument.
};
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.
	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.
};


template <typename T> struct CommandFunctionTraitHelper;
template <typename... Targs>
struct CommandFunctionTraitHelper<CommandCost(*)(DoCommandFlag, Targs...)> {
	using Args = std::tuple<std::decay_t<Targs>...>;
	using RetTypes = void;
	using CbArgs = Args;
	using CbProcType = void(*)(Commands, const CommandCost &);
};
template <template <typename...> typename Tret, typename... Tretargs, typename... Targs>
struct CommandFunctionTraitHelper<Tret<CommandCost, Tretargs...>(*)(DoCommandFlag, Targs...)> {
	using Args = std::tuple<std::decay_t<Targs>...>;
	using RetTypes = std::tuple<std::decay_t<Tretargs>...>;
	using CbArgs = std::tuple<std::decay_t<Tretargs>..., std::decay_t<Targs>...>;
	using CbProcType = void(*)(Commands, const CommandCost &, Tretargs...);
};

/** Defines the traits of a command. */
template <Commands Tcmd> struct CommandTraits;

#define DEF_CMD_TRAIT(cmd_, proc_, flags_, type_) \
	template<> struct CommandTraits<cmd_> { \
		using ProcType = decltype(&proc_); \
		using Args = typename CommandFunctionTraitHelper<ProcType>::Args; \
		using RetTypes = typename CommandFunctionTraitHelper<ProcType>::RetTypes; \
		using CbArgs = typename CommandFunctionTraitHelper<ProcType>::CbArgs; \
		using RetCallbackProc = typename CommandFunctionTraitHelper<ProcType>::CbProcType; \
		static constexpr Commands cmd = cmd_; \
		static constexpr auto &proc = proc_; \
		static constexpr CommandFlags flags = (CommandFlags)(flags_); \
		static constexpr CommandType type = type_; \
		static inline constexpr const char *name = #proc_; \
	};

/** Storage buffer for serialized command data. */
typedef std::vector<byte> CommandDataBuffer;

/**
 * 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 cmd The command that was executed
 * @param result The result of the executed command
 * @param tile The tile of the command action
 * @see CommandProc
 */
typedef void CommandCallback(Commands cmd, const CommandCost &result, TileIndex tile);

/**
 * 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 cmd The command that was executed
 * @param result The result of the executed command
 * @param tile The tile of the command action
 * @param data Additional data of the command
 * @param result_data Additional returned data from the command
 * @see CommandProc
 */
typedef void CommandCallbackData(Commands cmd, const CommandCost &result, const CommandDataBuffer &data, CommandDataBuffer result_data);

#endif /* COMMAND_TYPE_H */